Приветствую, прошу вашей помощи.
Для учебных целях разрабатываю базу, которая является мини-аналогом ПФР
Собственно следующая проблема — имеется справочник Физические Лица (СНИЛС,ДатаРождения), на основе которого происходят вычисления в документе «РасчётНачисленийВПФР»
В табличной части есть реквизиты «СуммаСтраховойЧасти», «СуммаНакопительнойЧасти» вычисляемые в процедурном режиме. Пытаюсь реализовать — не получается
СуммаСтраховойЧасти высчитывается как — 14%*ЗП, если дата рождения <01.01.1967
8%*ЗП, если дата >= 01.01.1967
Пытаюсь использовать процедуру…
Создаю на сервере функцию, которая будет получать ДатуРождения из справочника ФизическиеЛица
Собственно нужно использовать процедуру для расчёта реквизита табличной части документа, сославшись на реквизит справочника (Дата)
Как это реализовать?
1C | ||
|
Вернуться к обсуждению:
Использование Формулы в табличной части документа 1С
Как получить значение реквизита формы табличной части? |
Я |
24.08.22 — 15:40
Добрый день! управляемые формы, в табличноый части документа есть реквизит Номенклатура, и на форме в ТЧ из номенклатуры выведен реквизит ЕденицаИзмерения , самого реквизита ЕденицаИзмерения в табличной части объекта нет, но его вывели на форму, и надо его проверять на заполненность, если не заполнен, то выдавать сообщение и отказываться от проведения. как программно добраться до значения реквизита табличной части формы?
1 — 24.08.22 — 15:42
через точку
2 — 24.08.22 — 15:42
(0) Никак
Проведение вообще в душе не подозревает ни про какие твои формы
3 — 24.08.22 — 15:51
(2) ПередЗаписьюНаСервере() же , но автору это все равно не поможет
4 — 24.08.22 — 15:54
(3) Ты решил мне рассказать, как немного наговнокодить?
Все просто
ТС говорит про проведение, значит забывает про форму
Точка
5 — 24.08.22 — 15:58
(0)
Если Не ЗначениеЗаполнено(Номенклатура.ЕдиницаИзмерения) Тогда
// Отказ и точка!
КонецЕсли;
6 — 24.08.22 — 15:58
(4) Код из типовой бухии:
ТиповаяОперация = Форма[БухгалтерскиеОперацииКлиентСервер.ИмяРеквизитаФормыТиповаяОперация()];
Если ЗначениеЗаполнено(ТиповаяОперация)
И (ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Запись
ИЛИ ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение)
И НЕ ТиповаяОперацияСоответствуетДокументу(ТекущийОбъект, ТиповаяОперация) Тогда
СообщитьТиповаяОперацияНеСоответствуетДокументу(ТекущийОбъект, Форма);
Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
не то чтобы я считал бухию эталоном, но встречается вообще часто
7 — 24.08.22 — 15:59
(0) «как программно добраться до значения реквизита табличной» — СтрокаТаблицы.Номенклатура.ЕдиницаИзмерения
8 — 24.08.22 — 16:01
(6) И что будет, если документ тупо провести без открытия формы?
9 — 24.08.22 — 16:06
Есть же специальная процедура, называется ОбработкаПроверкиЗаполнения, https://its.1c.ru/db/v8std#content:463:hdoc
10 — 24.08.22 — 16:13
(8) ну что будет — пропустит оно проверку, понятное дело, если она там в модуле не задублирована. Я не предлагал проверять в форме — просто упомянул, что в частном случае проведения из формы в начале выловить можно, что документ проводится и контекст формы иметь.
11 — 24.08.22 — 17:28
(7) но ведь это не реквизт формы, а как получить зачение реквизита формы?
12 — 24.08.22 — 17:31
(11) Вы же сами сказали, что данный реквизит формы тянется из номенклатуры. Смысл вам ковырять элементы формы и получать, что там заполнено, если у вас есть данные объекта?
13 — 24.08.22 — 18:03
(12) ну он же на форме может быть и не заполнен, поэтому и нужно его значение проверить заполнен он или нет
14 — 24.08.22 — 18:30
(13) Заполнен или не заполнен он только в элементе справочника Номенклатура. На форме от только отображается.
Если конфа типовая, смотри механизм проведения, найди место, где проверяется заполненность, и вставляй туда свою проверку.
15 — 25.08.22 — 03:01
(0)
// В форме документа:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ТЧИзФормы = ЭтаФорма.Объект.Товары.Выгрузить(, «НомерСтроки, Номенклатура, Артикул»);
ТекущийОбъект.ДополнительныеСвойства.Вставить(«ТЧИзФормы», ТЧИзФормы);
КонецПроцедуры
// В модуле документа
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ТЧИзФормы = Неопределено;
ЭтотОбъект.ДополнительныеСвойства.Свойство(«ТЧИзФормы», ТЧИзФормы);
Если ТЧИзФормы <> Неопределено Тогда
//…
КонецЕсли;
КонецПроцедуры
Правда без открытия формы ТЧИзФормы всегда будет Неопределено
Kassern
16 — 25.08.22 — 09:10
(13) «ну он же на форме может быть и не заполнен» — назовите мне случай, когда значение в реквизите табличной части формы может отличаться от значения в реквизите номенклатуры. При условии, что в пути данных реквизита формы стоит «Объект.Товары.Номенклатура.ЕдиницаИзмерения». Я понимаю обычные формы, где приходилось оформлять заполнение ячеек и устанавливать туда текст, но вы же пишите про управляемые формы.
автоматический расчет поля реквизита (не табличной части)
Автор Hansa, 25 окт 2013, 01:03
0 Пользователей и 1 гость просматривают эту тему.
Добрый день! Как сделать так, чтобы автоматически рассчитывалась сумма (Сумма = Количество*Цена) при изменении Цены или Количества в форме документа. Это реквизиты не табличной части, а просто реквизиты документа. Для табличной части так:
СтрокаТабличнойЧасти = Элементы.Материалы.ТекущиеДанные;
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
Но у меня просто реквизит, а не реквизит таблично части.
Понимаю, что вопрос примитивен, но ответа на него не знаю.
Если реквизиты объекта то так
Объект.Сумма = Объект.Количество*Объект.Цена;
Если реквизиты формы то так
Сумма = Количество*Цена;
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
Это реквизиты формы или объекта???
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
Это реквизиты объекта (Документы)
Тогда сто пудов так
Объект.Сумма = Объект.Количество*Объект.Цена;
Главное что бы ТИПы у реквизитов были ЧИСЛО
Добавлено: 25 окт 2013, 01:49
Если ошибка, копируйте ошибку сюда полностью… Не нужно ошибки стараться перевести своими словами!
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
Так я скопировал
{Документ.Сделка.Форма.ФормаДокумента.Форма(5)}: Преобразование значения к типу Число не может быть выполнено
Элементы.СуммаОткрытия = Элементы.Количество*Элементы.ЦенаОткрытия;
Добавлено: 25 окт 2013, 07:05
Типы у реквизита точно число.
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
0
Как определить какие реквизиты имеются в табличной части документа
ПоступлениеТовара = Метаданные.Документы.ПоступлениеТовара;
Реквизиты = ПоступлениеТовара.ТабличныеЧасти.Товары.Реквизиты;
Для каждого наим из Реквизиты Цикл
Сообщить("Имя реквизита " + наим.Имя +
"; тип реквизита " + наим.Тип);
КонецЦикла;
// Результат:
// Имя реквизита Наименование; тип реквизита Справочник ссылка: Номенклатура
// Имя реквизита Количество; тип реквизита Число
// Имя реквизита Цена; тип реквизита Число
// Имя реквизита Сумма; тип реквизита Число
Увидеть полный список документов и расчётов, используемых в программе, можно в окне «Документы и расчеты», для вызова которого следует выбрать одноимённый пункт в группе «Операции» главного меню программы.
Работа с данным списком происходит так же, как и с любыми другими списками в программе. Для добавления (создания) шаблона нового документа следует воспользоваться кнопкой «Нов.» или нажать клавишу Insert. Добавить шаблон нового документа путём копирования уже имеющегося позволяет кнопка «Коп.». Удаление шаблона из списка происходит при нажатии кнопки «Уд.» или клавиши Delete.
Создание шаблона нового документа
Чтобы создать новый документ с новой структурой, в окне «Документы и расчеты» следует нажать кнопку «Нов.» и во вновь появившейся строке списка указать полное и сокращённое (графа «Сокр.») название нового документа.
Примечание: Список документов и расчётов упорядочен по их полным названиям. Поэтому, чтобы в списке можно было легко ориентироваться, схожие документы и расчёты должны начинаться с одинаковых символов (слов).
Если необходимо создать шаблон документа или расчёта, похожий на уже имеющийся в списке, но отличающийся, например, составом формируемых проводок, то создать такой шаблон будет быстрее путём копирования уже имеющегося. Для этого необходимо выделить в списке строку с исходным шаблоном и нажать кнопку «Коп.» в нижней части окна. Программа при этом создаст новый шаблон документа (расчёта), идентичный уже имеющемуся по описанию и структуре. Вам останется только подправить его полное и сокращённое название (оно тоже будет скопировано) и внести необходимые корректировки в структуру или проводки документа.
Настройка структуры нового документа
После добавления нового документа в список, необходимо щёлкнуть по кнопке «Настройка». При этом на экран будет выведено окно редактора структуры документа (см. рис. ниже). Как видно из приведённого рисунка, структура вновь созданного документа содержит два обязательных реквизита шапки (они создаются по умолчанию): «Номер» и «Дата».
Также по умолчанию в документе создаются дополнительные реквизиты вида «Комментарий», которые служат для создания и вывода комментирующих текстов в журнале операций в строке, отображающей введённый документ.
Если документ должен формировать проводки и/или будет иметь печатную форму, в поле «Файл» необходимо указать имя файла, описывающего проводки и/или содержащего шаблон печатной формы. Подробнее о создании такого файла мы поговорим чуть далее.
Если документы данного вида должны автоматически пересчитываться при пересчёте итогов, в чекбоксе «Авто пересчет» необходимо установить «галочку».
В поле «Приоритет» можно задать расположение документа и его проводок на временной оси в пределах дня. Например, документы с приоритетом 1 при вводе будут записываться на начало дня, а с приоритетом 9 — на конец дня. Явное указание приоритета необходимо, например, для операций с товарно-материальными ценностями, факт поступления которых должен предшествовать факту списания (ведь нередко и то, и другое оформляется одним днём).
Для документов, приоритет которых не указан явно, программа по умолчанию использует значение, заданное в параметрах журнала операций (см. рис. ниже).
Создание новых реквизитов
Чтобы добавить новый реквизит в структуру документа, следует нажать кнопку «Нов.» в окне редактора структуры. При этом на экран будет выведен диалог для выбора вида создаваемого реквизита (см. рис. ниже).
После выбора вида создаваемого реквизита реквизиту необходимо будет задать какое-то произвольное название (графа «Назв.»), которое в дальнейшем будет отображаться в диалоговой форме в режиме ввода документа.
Примечание: Графа «№», содержащая номер реквизита среди реквизитов одного типа, заполняется автоматически, но при необходимости этот номер можно изменить, щёлкнув по графе мышкой. Этот номер используется для ссылок на данный реквизит при описании печатной формы документа и выполнении расчётов. Номера реквизитов не могут повторяться среди реквизитов одного типа.
В структуре документа может быть задано до 30 реквизитов шапки документа, до 30 реквизитов табличной части документа и практически неограниченное количество информационных полей.
Если создаётся реквизит табличной части, в графе «Выч.» можно установить признак вычисляемого реквизита — символ «+». Наличие данного признака указывает на то, что значение данного реквизита не будет сохраняться в базе данных, а будет каждый раз вычисляться по заданной для него формуле. Вычисляемые реквизиты имеет смысл создавать, например, для включения в многострочную часть документа значений, которые всегда однозначно зависят от других реквизитов и прочих данных (субконто, констант).
Далее пользователю будет предложено подтвердить или изменить значение графы «Пор.» (по умолчанию в графу «Пор.» подставляется значение из графы «№»). Цифры в данной графе устанавливают для шапки документа порядок обхода элементов диалоговой формы документа в режиме ввода. Для табличной части документа значение данной графы определяет порядок следования столбцов таблицы в режиме ввода. То есть данная графа позволяет перемещать реквизиты в запросе параметров документа без изменения порядковых номеров этих реквизитов.
Примечание: Если при обходе в режиме ввода какой-то из элементов должен пропускаться, то для данного реквизита в нижней части окна редактора структуры необходимо включить чекбокс «Пропускать при вводе».
После ввода наименования и указания порядка следования реквизита на экран будет выведено диалоговое окно (см. рис. ниже), в котором необходимо выбрать тип значения создаваемого реквизита.
Если в данном диалоге выбирается текстовый (строковый) тип, то далее нужно будет также указать максимальную длину значения (графа «Дл.»), для числового типа — длину и точность (графа «Точн.»).
Примечание: В графе «Дл.» задаётся максимальное количество символов, которое может содержать значение данного реквизита. То есть для реквизита строкового типа это будет максимальная длина сохраняемой строки, а для реквизита числового типа — максимальное количество значащих символов (цифр в целой и дробной части), включая символ десятичной точки. Графа же «Точн.» определяет количество цифр в дробной части числа.
Для текстовых реквизитов табличной части документа дополнительно можно также указать длину представления реквизита на экране (графа «Экр.»). Значение в данной графе определяет ширину колонки, в которой значение этого реквизит будет выводиться на экране.
Если для реквизита выбирается тип «Субконто», на экран будет выведен дополнительный диалог (см. рис. ниже), в котором надлежит установить, каким образом при выводе списка значений субконто будет выбираться вид субконто.
В этом дополнительном диалоге следует выбрать один из трех способов определения вида субконто:
- Определенный — при вводе реквизита документа на экран будет выдан список субконто того вида, который установлен в запросе. В графу «Тип» структуры документа в этом случае заносится строка «Субконто n», где n — код выбранного вида субконто;
- Из поля — в поле ввода этой позиции надлежит указать номер реквизита типа «Счет». В графу «Тип» структуры документа в этом случае заносится строка «Субконто ЗНn», где n — номер реквизита типа «Счет». Тогда при вводе реквизитов документа надлежит сначала в реквизите типа «Счет» выбрать необходимый номер счёта или субсчёта, а при вводе реквизита типа «Субконто» на экран будет выдан список значений субконто того вида, который «прикреплён» к выбранному счёту или субсчёту в списке счетов;
- Выбирать — при выборе этой позиции в графу «Тип» структуры документа в этом случае заносится строка «Субконто ?». Тогда при вводе реквизита на экран будет выдан сначала список видов субконто, а затем — список значений субконто выбранного вида.
В последнюю очередь или позже для реквизита заполняется графа «Выр.», отвечающая за вычисление значений данного или других реквизитов. В данной графе могут содержаться выражения на встроенном языке 1С. Подробнее о заполнении данной графы мы поговорим чуть позже.
Примечание: У реквизитов вида «Комментарий», которые при создании нового документа добавляются по умолчанию, редактированию подлежит только графа «Выр.».
Дополнительно для реквизитов можно также указать, откуда будет копироваться значение реквизита при копировании документа в журнале операций с помощью кнопки «Коп. документ». Номер реквизита-источника указывается в поле «Копировать из реквизита» (см. рис. ниже).
Редактирование диалоговой формы документа
Чтобы отредактировать диалоговую форму документа, необходимо нажать кнопку «Диалог» в окне редактора структуры документа. При этом на экран выводится окно редактора диалогов (см. рис. ниже).
В окне редактора диалогов с помощью мыши можно любой элемент диалога переместить на другое место, а также изменить размеры этого элемента.
Примечание: Вывод дополнительной информации и дополнительных надписей в диалоговой форме документа обеспечивается с помощью дополнительных реквизитов вида «Инф. табло»:
Обычно с помощью таких дополнительных реквизитов в диалоговой форме выводится информация об итоговых суммах: «Итого сумма», «Итого НДС», «Всего с НДС» и т.п. (см. рис. выше).
Формулы для задания реквизитов документа
В графе «Выр.» структуры документа записываются формулы для реквизитов документа. Назначение формулы зависит от типа реквизита:
- для вычисляемых реквизитов табличной части документа (у которых указан признак «Выч.») формула задаёт значение данного реквизита;
- для невычисляемых реквизитов шапки и табличной части документа (у которых не установлен признак «Выч.») формула может содержать выражение, изменяющее в ходе ввода документа значения других реквизитов после ввода данного реквизита, а также выражения, выдающие контрольное сообщение;
- для реквизитов вида «Комментарий» формулы формируют комментирующие тексты и цифры, которые потом будут выводиться в журнале операций в строке, отображающей введённый документ;
- для реквизитов вида «Инф. табло» формулы определяют ту дополнительную информацию, которая будет отображаться в диалоговой форме документа (см. примечание выше).
Формулы записываются по правилам макроязыка. Они могут состоять из выражений и команд, разделённых символом «;» (точка с запятой). Команды записываются без предшествующего символа «!» (восклицательный знак).
Чаще всего в реквизитах используют команды установки периода, реже — команду СООБЩИТЬ
.
Формулы вычисляемых реквизитов
В формулах вычисляемых реквизитов задаётся значение текущего реквизита документа (расчёта). Формулы записываются по правилам макроязыка, они могут состоять из выражений и команд установки периода, разделенных символом «;». Команды установки периода в формуле (М
, KB
, KH
и т.д.) записываются без предшествующего символа «!».
Если в формуле имеется несколько выражений, то реквизиту присваивается значение последнего выражения в формуле. В выражении можно ссылаться на значение предыдущего выражения в формуле с помощью макроимени X
.
Формулы невычисляемых реквизитов
В формулах невычисляемых реквизитов описываются действия (изменения начальных значений других реквизитов), выполняемые после ввода данного реквизита. Эти действия могут быть следующими:
- Команды присваивания значений другим реквизитам. Каждая команда имеет вид:
ЗНn
=выражение — изменение значения реквизита с номеромn
шапки документа;ЗНm|n
=выражение — изменение значения реквизита с номеромn
строкиm
табличной части документа. Еслиm
илиn
не указываются, подразумевается текущая строка и текущий столбец запроса.
- Команды установки рабочего периода (
М
,КВ
,Г
и т.д.). Эти команды записываются без предшествующего символа «!».
Выражение, задающее значение реквизита, имеющего тип субконто, счёт или валюта, должно быть символьным (например, текстовой строкой в кавычках) и содержать код счёта или номер валюты, или номер субконто. Для многоуровневых субконто номер субконто состоит из номеров на каждом уровне, разделенных символом «:».
Формулы реквизитов вида «Комментарий»
Формулы для формирования первого и второго субконто («Субконто 1» и «Субконто 2») реквизитов вида «Комментарий» могут содержать только ссылки на значения реквизитов, содержащих субконто. Обычно это ссылки на соответствующие реквизиты шапки документа.
Формула для реквизита «Сумма» должна быть числовым выражением. Рекомендуется в графу «Выч.» этого реквизита помещать ссылку сумму документа (если она имеет смысл). Например, для счёта в эту графу можно помещать сумму счёта (скажем, с помощью макроимени ИТОГn
), для платежного поручения — перечисляемую сумму (скажем, с помощью макроимени ЗНn
).
Выражение, задающее краткое содержание для заголовка документа в журнале операций (реквизит «Содержание»), может иметь только текстовое значение, поэтому его не обязательно начинать со строки символов в кавычках.
Макроимена для ссылок на реквизиты документа
Для ссылок на реквизиты документа в формулах можно использовать следующие макроимена:
ЗН
— возвращает значение текущего реквизита шапки документа (точнее, соответствующего данному реквизиту элемента диалоговой формы, на который установлен курсор);ЗНn
— возвращает значение реквизита с номеромn
шапки документа;ЗН|
— возвращает значение текущего реквизита табличной части документа;ЗН|n
— возвращает значение реквизита с номеромn
текущей строки табличной части документа;ЗНm|n
— возвращает значение реквизита с номеромn
строкиm
табличной части документа;ИТОГn
— возвращает сумму значений реквизита с номеромn
всех строк табличной части документа.
Значение любому реквизиту документа можно присвоить с помощью обычного оператора присваивания, например: ЗН4=20
. При этом выражение, задающее значение реквизита, имеющего тип "
Субконто"
, "
Счет"
или "
Валюта"
, должно быть символьным (например, текстовой строкой в кавычках) и содержать код счета или номер валюты, или номер субконто (для многоуровневых — в формате «X:X»).
Если реквизит имеет тип "
Субконто"
, "
Счет"
, "
Валюта"
или "
Дата"
, сослаться его значение в стандартных макроименах можно с помощью следующих обозначений:
{n}
— для ссылки на реквизит с номеромn
шапки документа;{}
— для ссылка на текущий реквизит шапки документа;{m|n}
— для ссылка на реквизит с номеромn
строкиm
табличной части документа;{|n}
— для ссылка на реквизит с номеромn
текущей строки табличной части документа.
То есть, например, для ссылки на дебетовый остаток по счёту, указанному в четвёртом реквизите шапки документа, можно использовать макроимя СКД{4}
.
Формулы реквизитов шапки и табличной части документа, как уже говорилось ранее, могут состоять из нескольких выражений, записанных через точку с запятой. В любом выражении можно ссылаться на результат предыдущего выражения в формуле с помощью макроимени Х
. Данное макроимя возвращает результат вычисления предыдущего выражения.
Если документ должен формировать проводки
Файл документа
В том случае, если документ должен формировать проводки или содержать печатную форму (например, расходные и приходные кассовые ордера, как правило, не формируют проводок, но используются для печати бланков РКО и ПКО), то к структуре документа необходимо «привязать» дополнительный файл, имя которого следует указать в поле «Файл» структуры документа (см. рис. выше).
Имя файла — произвольное, но необходимо учитывать, что программа создавалась для старых операционных систем Windows’3, Windows’95. То есть в имени должно быть не более восьми символов (английские буквы и цифры). Регистр символов значения не имеет. Расширение имени — .gfd
.
Указанный файл будет создан программой автоматически. В нём будут храниться исходный код, формирующий проводки документа, и/или шаблон печатной формы, который вы создадите.
Поскольку в состав программы уже входит достаточное количество файлов с описаниями проводок и типовых форм, создавать новый файл с нуля возможно и не потребуется. Достаточно найти файл с уже имеющейся типовой формой и скопировать его, задав копии какое-то своё имя. Затем это имя необходимо будет указать в поле «Файл» структуры документа. И Вам останется только подкорректировать имеющееся описание проводок и имеющуюся печатную форму документа.
Внимание! Если в качестве имени файла документа вы случайно укажите имя уже имеющегося в базе файла, файл не будет перезаписан, а будет подключен к данному документу. Внеся изменения в исходный код, содержащийся в подключенном файле, вы измените проводки другого документа.
Исходный код, формирующий проводки документа
Чтобы отредактировать или написать новый исходный код, формирующий проводки документа, необходимо щёлкнуть по кнопке «Проводки» в окне редактирования структуры документа. При этом на экран будут выведено окно редактора кода.
Команда создания проводки
Для формирования каждой проводки документа используется специальная команда !ПРОВОДКА
.
В исходном коде данная команда записывается в отдельной строке. После символов «!ПРОВОДКА» в строке записывается также последовательность реквизитов проводки через точку с запятой(«;»). Причём эти реквизиты должны стоять в строго определенной последовательности:
- Дата проводки
- Счет дебета
- Счет кредита
- Сумма проводки
- Комментарий
- Субконто дебета
- Субконто кредита
- Количество
- Валюта
- Сумма в валюте
- Номер журнала операций
Обычно эти реквизиты представляют собой числовые или строковые выражения. Некоторые из реквизитов могут отсутствовать, но разделители в виде точки с запятой, соответствующие этим реквизитам, должны присутствовать, если в конце записи есть какой-то реквизит. Например:
!ПРОВОДКА ЗН1; "50"; "51"; 200.00;;;;;;;"БК"
Если все реквизиты в конце строки отсутствуют, соответствующие им разделители можно не ставить. Например:
!ПРОВОДКА ЗН1; "50"; "51"; 200.00
Дата проводки должна совпадать с датой документа, поэтому обычно в качестве даты указывают макроимя, ссылающееся на второй реквизит шапки документа — ЗН2
.
Счета дебета и кредита проводки могут указываться как:
- макроимя, ссылающееся на значение реквизита документа, имеющего тип
"
Счет"
, например:ЗН6
; - код счёта кавычках, например:
"68.1"
; - имя переменной, содержащей код счёта в виде строки символов, например:
пСчет
; - символьное выражение, начинающееся с операнда в виде пустой строки, например:
""+ЗН7+".22"
; - макроимя с символом «&», ссылающееся на текущий счёт, если использовалась команда
!ВЫБРАТЬ СЧЕТ
.
Сумма проводки указывается в виде числа или числового выражения, например: ЗН3*0.2
.
Текст комментария (содержания) проводки указывается как строковое выражение. Например: "Счет пр. "+СН{|2}
.
Субконто дебета и/или кредита проводки может быть указано как:
- значение реквизита, имеющего тип
"
Субконто"
, например:ЗН|2
; - номер вида субконто и номер субконто в кавычках, например:
"2:5:1"
; - имя переменной, содержащей номер вида субконто и номер субконто в виде строки символов. Например:
пТовар
; - макроимя с символом «&», ссылающееся на текущее субконто, если использовалась команда
!ВЫБРАТЬ СУБКОНТО
.
Количество (количественное выражение) проводки указывается в виде числа или выражения числового типа.
Валюта проводки может быть указана как:
- значение реквизита, имеющего тип
"
Валюта"
; - число, соответствующее коду валюты, например: 1;
- имя переменной, содержащей код валюты в виде числа;
- макроимя с символом «&», ссылающееся на текущую валюту, если использовалась команда
!ВЫБРАТЬ ВАЛЮТУ
.
Сумма проводки в валюте указывается в виде числа или числового выражения.
Номер журнала операций — строка из одного или двух символов, либо строковое выражение. Например: 68
или "ПР"
или ЗН|7
.
Чтобы при записи и последующем редактировании команды не запутаться с реквизитами проводки, в исходном коде команду !ПРОВОДКА
, как правило, предваряют строкой комментария со списком реквизитов, расположенных в надлежащем порядке:
* Дата; Д; К; Сумма; Содержание; Субк Д; Субк К; !ПРОВОДКА ЗН2; "50"; ЗН|4; ЗН|5; пНомер+" "+пКому; ;ЗН|7
Цикл выборки строк табличной части документа
Для обработки данных многострочной части документа и выполнения операций с ними организуется цикл последовательной выборки строк. Для этого используются следующие команды:
!ВЫБРАТЬ СТРОКИ
— открыть автоматическую выборку строк (всех по порядку) и выбрать первую строку;!СЛЕДУЮЩАЯ СТРОКА
— выбрать следующую строку из выборки и повторить все действия от команды!ВЫБРАТЬ СТРОКИ
до данной команды. Цикл повторяется до тех пор, пока не будет выбрана последняя строка.
Так как в документах, содержащих многострочную часть, проводки формируются, как правило, по каждой строке многострочной части, в исходном коде, формирующем проводки документа, внутри тела цикла !ВЫБРАТЬ СТРОКИ…СЛЕДУЮЩАЯ СТРОКА обычно размещаются команды !ПРОВОДКА
.
Пример:
!ВЫБРАТЬ СТРОКУ !пСумма=СКД41:{|2}/СКД41:{|2}Н*ЗН|3 !* Дата; Д; К; Сумма; Содержание; Субк Д; Субк К; Кол !ПРОВОДКА ЗН2; "90.2"; "41.1"; пСумма; "НК "+ЗН1+": "+СН{|2}+" по средней"; ЗН7; ЗН|2; ЗН|3 !СЛЕДУЮЩАЯ СТРОКА
Для получения значений реквизитов документа в цикле !ВЫБРАТЬ СТРОКИ…СЛЕДУЮЩАЯ СТРОКА могут использоваться следующие макроимена:
ЗНn
— возвращает значение реквизита с номеромn
шапки документа;ЗН|n
— возвращает значение реквизита с номеромn
текущей (выбранной) строки многострочной части документа;ЗНm|n
— возвращает значение реквизита с номеромn
строкиm
многострочной части документа.
Печатная форма документа
Шаблон печатной формы документа также хранится в файле документа. Для редактирования данного шаблона необходимо щёлкнуть по кнопке «Форма» в окне редактирования структуры документа. При этом откроется окно редактора шаблонов печатных форм.
Практически все действия с элементами шаблона печатной формы в редакторе шаблонов печатных форм выполняются с использованием палитры инструментов (см. рис. ниже). Если панель палитры инструментов отсутствует на экране, её можно вызвать через главное меню: «Действия -> Палитра инструментов». Здесь же в меню «Действия» продублированы основные команды панели палитры.
В назначении кнопок палитры инструментов разобраться несложно — при наведении указателя мыши на любую кнопку появляется соответствующая всплывающая подсказка. Для создания ячейки печатной формы предназначена кнопка , для создания разделителя секций — кнопка
, для вставки картинки — кнопка
и т.д.
Редактирование содержимого ячеек
Нижнее поле панели палитры (см. рис. выше) служит для редактирования содержимого вновь созданной или уже имеющейся ячейки шаблона печатной формы (данную ячейку нужно предварительно выбрать). В качестве содержимого ячейки может использоваться как обычный текст, так и текст в сочетании с выражениями (формулами) на встроенном языке. Выражения должны быть заключены в квадратные скобки (см. рис. ниже).
В выражениях могут использоваться макроимена, о которых речь шла выше, а также другие макроимена и переменные, о которых я более подробно рассказывал в предыдущей статье.
Программный код в шаблоне печатной формы
Выражения (формулы), используемые в ячейках шаблона печатной формы, должный быть простыми, то есть содержать только имена переменных или макроимена реквизитов документа, которые при формировании печатной формы будут заменены конкретными значениями. Если же для вывода какого-то показателя требуется предварительно произвести какие-то вычисления, то выполняться данные вычисления должны в программном коде, который необходимо разместить в разделителях секций шаблона.
В окне редактора шаблонов такие разделители отображаются в виде линий красного цвета. Чтобы посмотреть исходный код, содержащийся в разделителе, необходимо щёлкнуть по разделителю мышкой. Код при этом отобразится в нижнем поле панели палитры (см. рис. ниже).
Поскольку код, содержащийся в разделителе, может быть довольно объёмным, для удобства работы с ним следует щёлкнуть по кнопке «Редактировать» (). При этом на экран будет выведено окно редактора текста (см. рис. ниже).
Формирование многострочной части печатной формы
Многострочная часть печатной формы в таких документах как накладные, счета-фактуры, формируется в цикле !ВЫБРАТЬ СТРОКИ…СЛЕДУЮЩАЯ СТРОКА. Ячейки таблицы, вывод которых необходимо повторять заключаются между двумя разделителями секций. При этом в верхний разделитель помещают команду !ВЫБРАТЬ СТРОКИ, в нижний — команду !СЛЕДУЮЩАЯ СТРОКА (см. рис. ниже).
Примечание: В шаблонах печатных форм с многострочной частью после последних объектов формы (в конце документа) следует ставить дополнительный разделитель секций (см. рис. ниже). В противном случае нижняя часть документа (та, что находится ниже разделителя, содержащего команду !СЛЕДУЮЩАЯ СТРОКА) может быть перенесена на другую страницу. Это особенность данной версии программы.
Для принудительного же переноса содержимого на другую страницу, если возникнет такая необходимость, можно воспользоваться командой !НОВАЯ СТРАНИЦА
.
Другие статьи по схожей тематике
- Описание встроенного языка 1С версии 6.0
- Типовые операции в «1С:Бухгалтерия 6.0»
- Отчёты в «1С:Бухгалтерия 6.0»
Материал подготовлен совместно с
Петром Федотовым
Рассмотрим несколько примеров, когда нам необходимо не просто передать значение одного реквизита справочника DIRECTUM в аналогичный реквизит справочника 1С, а выполнить какие-нибудь вычисления с реквизитом и уже результат вычисления
передать в 1С. Для этого в карточке «Настройки обмена данными с интегрированными системами» для нужного справочника в табличной части надо создать вычисляемый реквизит и задать для него вычисление.
Пример 1. Необходимо настроить синхронизацию справочника
Организации DIRECTUM со справочником Контрагенты 1С. Нужно, чтобы реквизит «Юр. / физ. лицо» справочника Контрагенты
1С заполнялся значением «ЮрЛицо». Аналогичного реквизита в справочнике Организации DIRECTUM нет и проблему решить можно с помощью вычисляемых реквизитов. Вычисление для этого реквизита будет таким:
Result = "ЮрЛицо"
В результате в реквизит «Юр. / физ. лицо» справочника Контрагенты 1С мы постоянно будем передавать константу «ЮрЛицо».
Пример 2. Необходимо настроить синхронизацию справочника
Персоны DIRECTUM со справочником Физические лица 1С. Нужно, чтобы заполнялись реквизиты «Фамилия», «Имя» и «Отчество» справочника
Персоны DIRECTUM. В справочнике Физические Лица 1С ФИО присутствует в виде одной строки в реквизите «Наименование». В этом случае нам на помощь придут вычисляемые реквизиты:
Вычисление реквизита Фамилия:
FIO = '[Description]'
Result = SubString(FIO;' ';1)
Вычисление реквизита Имя:
FIO = '[Description]'
Result = SubString(FIO;' ';2)
Вычисление реквизита Отчество:
FIO = '[Description]'
Result = SubString(FIO;' ';3)
Пример 3. Необходимо настроить синхронизацию справочника
Договоры DIRECTUM со справочником Договоры 1С (оба справочника собственная разработка заказчика). Нужно, чтобы реквизит «Состояние договора» типа признак справочника DIRECTUM синхронизировался с реквизитом «Состояние договора» типа справочник
«Состояния договоров» справочника 1С. Можно вместо реквизита «Состояние договора» типа признак в справочнике DIRECTUM завести аналогичный реквизит типа справочник и настроить синхронизацию с ним. Можно обойти проблему с помощью вычисляемых реквизитов, но для
этого нам нужно будет узнать UUID записей справочника 1С, которые соответствуют значениям реквизита «Состояние договора» типа признак в DIRECTUM. Т.к. я в программировании 1С не силен, то просто добавил на форму записи справочника 1С кнопку и повесил на неё
такой обработчик (потом все вернул обратно, как было):
СправочникСсылка = Справочники.СостоянияДоговоров.НайтиПоКоду(1);
Сообщить("Код = 1; UUID = " + СправочникСсылка.УникальныйИдентификатор());
И повторил этот код для всех записей, благо их было не много. В результате вычисление на реквизите получилось следующее:
DogState = '[РИТСостДоговора]'
Result = "00000000-0000-0000-0000-000000000000"
if Assigned(DogState)
if DogState == "В стадии заключения"
Result = "9fa29428-d942-4ef7-b742-ccf411905e1b"
endif
if DogState == "Действующий"
Result = "f6eecbaa-a0a4-49b3-b853-627f6f59fb0e"
endif
if DogState == "Завершен"
Result = "a9f61c04-1422-4d7c-a246-46fef8f963c4"
endif
if DogState == "Расторгнут"
Result = "ff8b6418-9463-4fba-baff-fa768e4912c2"
endif
endif
Пример 4. Необходимо настроить синхронизацию справочника
Договоры DIRECTUM со справочником Договоры 1С (оба справочника собственная разработка заказчика). Нужно, чтобы в реквизит «Куратор филиала» справочника 1С заносилась информация о филиале, в котором работает руководитель подразделения заключившего
договор из справочника DIRECTUM. В справочнике DIRECTUM такого реквизита нет, но есть реквизит «Подразделение» в котором содержится информация о подразделении, заключившем договор. Справочнику
Наши организации DIRECTUM соответствует справочник Организации 1С. Предположим, что уже настроена синхронизация данных справочников, причем Код записи справочника
Организации (1C) хранится в реквизите «ISBIntNumber» справочника Наши организации (DIRECTUM). Более наглядно это видно на скриншотах (у реквизита «ISBIntNumber» заголовок «Код 1С»):
Можно добавить в справочник Договоры (DIRECTUM) реквизит «Филиал», в который записывать «Нашу организацию» руководителя подразделения и настроить синхронизацию этого реквизита с реквизитом «Куратор филиала» справочника 1С. А можно
в настройках интеграции создать вычисляемый реквизит и все вычисления произвести в нем. Рассмотрим второй вариант, тогда вычисление для этого реквизита будет таким:
IntegratedSystemCode = '1С81' //код системы 1с из справочника DIRECTUM
Environment = Object.Environment
V8AppIndex = Environment.IndexOfName('V8App') //проверяем наличие переменной окружения, созданной ранее коннектором
if V8AppIndex <> -1
V8App = Environment.Values(V8AppIndex)
else //если не нашли, то создадим
V8App = Connector1C81Get1C80Application(IntegratedSystemCode) //получаем 1С app
Environment.SetVar("V8App";V8App) //установить переменную окр. для использования в следующей итерации
endif
// Определим филиал куратора (руководителя подразделения)
PodrCode = '[Подразделение]'
Podr = References.ПОД.GetObjectByCode(PodrCode)
KuratorCode = Podr.Работник
Kurator = References.РАБ.GetObjectByCode(KuratorCode)
KuratorFilialCode = Kurator.НашаОрг
KuratorFilial = References.НОР.GetObjectByCode(KuratorFilialCode)
OrgCode = KuratorFilial.ISBIntNumber
// Обратимся к объектной модели 1С, чтобы найти запись по коду
Record1C = V8App.Справочники.Организации.НайтиПоКоду(OrgCode)
UUID = Record1C.УникальныйИдентификатор()
Result = V8App.String(UUID)
В результате в реквизит «Куратор филиала» справочника
Договоры (1С) будет передано значение UUID записи справочника Организации (1С), которому соответствует «Наша организация» (DIRECTUM) руководителя подразделения заключившего договор.
Пример 5. Необходимо настроить синхронизацию справочника
Договоры DIRECTUM со справочником Договоры 1С (оба справочника собственная разработка заказчика). Нужно, чтобы в реквизит «Куратор» справочника 1С заносилась информация о Персоне, которая является руководителем подразделения заключившего договор
из справочника DIRECTUM. В справочнике DIRECTUM такого реквизита нет, но есть реквизит «Подразделение» в котором содержится информация о подразделении, заключившем договор. Справочнику
Персоны DIRECTUM соответствует справочник Физические лица 1С. Предположим, что уже настроена синхронизация данных справочников, причем Код записи справочника
Персоны (DIRECTUM) хранится в реквизите «ВнешнийКлюч» справочника Физические лица (1С). Более наглядно это видно на скриншоте:
Опять же, можно добавить в справочник Договоры (DIRECTUM) реквизит «Куратор», в который записывать «Персону» руководителя подразделения и настроить синхронизацию этого реквизита с реквизитом «Куратор» справочника 1С. А можно в
настройках интеграции создать вычисляемый реквизит и все вычисления произвести в нем. Рассмотрим второй вариант, тогда вычисление для этого реквизита будет таким:
IntegratedSystemCode = '1С81' //код системы 1с из справочника DIRECTUM
Environment = Object.Environment
V8AppIndex = Environment.IndexOfName('V8App') //проверяем наличие переменной окружения, созданной ранее коннектором
if V8AppIndex <> -1
V8App = Environment.Values(V8AppIndex)
else //если не нашли, то создадим
V8App = Connector1C81Get1C80Application(IntegratedSystemCode) //получаем 1С app
Environment.SetVar("V8App";V8App) //установить переменную окр. для использования в следующей итерации
endif
// Определим куратора (руководителя подразделения)
PodrCode = '[Подразделение]'
Podr = References.ПОД.GetObjectByCode(PodrCode)
KuratorCode = Podr.Работник
Kurator = References.РАБ.GetObjectByCode(KuratorCode)
KuratorPersCode = Kurator.Персона
// Найдем соответствующую запись, обратившись к объектной модели 1С
// Сформируем запрос к 1С
VQuery = V8App.NewObject("Query")
VQueryText = 'select C.Code from Справочник.ФизическиеЛица as C where C.ВнешнийКлюч = "'&KuratorPersCode&'"'
VQuery.Text = VQueryText
VQueryResult = VQuery.Execute
// Обработаем результат запроса
if not VQueryResult.IsEmpty
VQueryRecords = VQueryResult.Choose
VQueryRecords.Next
VRecordCode = V8App.XMLString(VQueryRecords.Get(0))
// Найдем запись по коду
Record1C = V8App.Справочники.ФизическиеЛица.НайтиПоКоду(VRecordCode)
UUID = Record1C.УникальныйИдентификатор()
Result = V8App.String(UUID)
else
Result = "00000000-0000-0000-0000-000000000000"
endif
В результате в реквизит «Куратор» справочника Договоры (1С) будет передано значение UUID записи справочника
Физические лица (1С), которому соответствует «Персона» (DIRECTUM) руководителя подразделения заключившего договор.
Пример 6. Иногда нужно из одной записи DIRECTUM сделать две записи в разных справочниках 1С. При этом если эти записи еще и связаны между собой, т.е. в реквизите одной из записей выбрана вторая, то в этом случае
нужно иметь возможность получить UUID ссылку на первую запись, чтобы передать её в справочный реквизит второй записи. Это можно сделать только через конструкцию CHANGE_TO_UUID_IDDIR. Подобную ситуацию разберем в этом примере.
Необходимо настроить синхронизацию справочника
Договоры DIRECTUM со справочником Договоры 1С (оба справочника собственная разработка заказчика). Нужно, чтобы в реквизит «Договор» справочника 1С заносилась информация о Договоре из справочника
Договоры не газовые 1С, которому соответствует запись справочника Договоры DIRECTUM. Если соответствующего договора в справочнике
Договоры не газовые 1С нет, то нужно создать в этом справочнике запись и ссылку на неё поместить в реквизит «Договор» справочника
Договоры 1С. Предполагается, что код договора DIRECTUM хранится в реквизите «Внешний ключ» справочника
Договоры не газовые 1С. Более наглядно это видно на скриншоте:
Вычисление для реквизита «Договор» будет следующим:
IntegratedSystemCode = '1С81' //код системы 1с из справочника DIRECTUM
Environment = Object.Environment
V8AppIndex = Environment.IndexOfName('V8App') //проверяем наличие переменной окружения, созданной ранее коннектором
if V8AppIndex <> -1
V8App = Environment.Values(V8AppIndex)
else //если не нашли, то создадим
V8App = Connector1C81Get1C80Application(IntegratedSystemCode) //получаем 1С app
Environment.SetVar("V8App";V8App) //установить переменную окр. для использования в следующей итерации
endif
// Определим, есть ли такой договор в 1С
Code = '[Код]'
Dogovor = References.ДГВ.GetObjectByCode(Code)
// Найдем соответствующую запись в 1С
// Сформируем запрос к справочнику 1С
VQuery = V8AppTemp.NewObject("Query")
VQueryText = 'select C.Code from Справочник.ДоговорыНеГазовые as C where C.ВнешнийКлюч = "'&Trim(Dogovor.SYSREQ_CODE)&'"'
VQuery.Text = VQueryText
VQueryResult = VQuery.Execute
// Если такой договор есть, то получим его UUID
if not VQueryResult.IsEmpty
VQueryRecords = VQueryResult.Choose
VQueryRecords.Next
VRecordCode = V8AppTemp.XMLString(VQueryRecords.Get(0))
Record1C = V8AppTemp.Справочники.ДоговорыНеГазовые.НайтиПоКоду(VRecordCode)
UUID = Record1C.УникальныйИдентификатор()
Result = V8AppTemp.String(UUID)
else
// Если такого договора нет, то сформируем новый UUID
Result = "CHANGE_TO_UUID_" & Dogovor.SYSREQ_ID
endif
Вычисление:
Result = "CHANGE_TO_UUID_" & Dogovor.SYSREQ_ID
вернет нам сначала строку вида «CHANGE_TO_UUID_ID», которая затем будет преобразована в реальный UUID номер.
В результате в реквизит «Договор» справочника Договоры (1С) будет передано значение UUID записи справочника
Договоры не газовые (1С), которому соответствует «Договор» (DIRECTUM), либо будет сформирован новый UUID, если такого договора еще нет.
В коде вычисляемых реквизитов мы можем также использовать прикладные функции и процедуры 1С, оформленные в модулях объектов. Т.е. вычисления нужных данных можно писать в базе 1С, а в коде вычисляемого реквизита просто вызвать готовую
функцию с параметрами и получить результат её работы, например:
ЗначениеФункции = V8App.Справочники.Контрагенты.НашаФункция(Параметр)
Также нужно помнить, что при использовании подключения к 1С через вычисления или создание новой переменной окружения, приведет к использованию еще одной лицензии. Об этом не стоит забывать разрабатывая доработки к коннектору.
Приведенные выше примеры подключения для вытаскивания данных из 1С в вычисляемых реквизитах можно использовать и в обычных прикладных вычислениях DIRECTUM, например, в отчетах, в действиях справочников, в различных агентах и т.п.
Как получить имя реквизита табличной части?
Как получить имя реквизита табличной части, а именно выбранной колонки.
Задача обойти все элементы табличной части по определенному реквизиту.
UPD #1 — Перефразировал
Как получить ИМЯ реквизита колонки ТЧ находясь в ячейке ТЧ.
-
Вопрос заданболее трёх лет назад
-
2066 просмотров
Пригласить эксперта
Ответ зависит от варианта разрабатываемого интерфейса.
Обычный интерфейс:
Элемент формы связанный с табличной частью «ТаблицаДанных» — ЭлементыФормы.ТаблицаДанных
Текущая колонка — ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка
Имя реквизита формы для колонки — ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка.Имя
Имя реквизита табличной части, который связан с колонкой — ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка.Данные
Управляемый интерфейс
Элемент формы связанный с табличной частью «ТаблицаДанных» — Элементы.ТаблицаДанных
Текущая колонка — Элементы.ТаблицаДанных.ТекущийЭлемент
Имя реквизита формы для колонки — Элементы.ТаблицаДанных.ТекущийЭлемент.Имя
Имя реквизита табличной части, который связан с колонкой — Элементы.ТаблицаДанных.ТекущийЭлемент.ПутьКДанным (доступно только на сервере)
Это можно сделать запросом. Другой вариант — обойти в цикле.
-
Показать ещё
Загружается…
22 мар. 2023, в 01:01
3000 руб./за проект
22 мар. 2023, в 00:50
10000 руб./за проект
22 мар. 2023, в 00:48
10000 руб./за проект