Вы находитесь на странице: 1из 2

Ввод перерасчетов с использованием

встроенного языка
Перерасчеты в системе 1С:Предприятие служат для хранения информации о том, для каких
записей регистров расчета необходимо перерассчитать результаты расчета (ресурсы). В
статье "Особенности настройки объекта Перерасчет" подробно рассматриваются
вопросы настройки объекта конфигурации Перерасчет, которая позволила бы автоматически
регистрировать перерасчеты в системе. В данном разделе мы рассмотрим вопросы
управления составом перерасчетов из языка.

Когда это нужно делать


Необходимость вводить записи перерасчета с использованием встроенного языка возникает
в ситуациях, когда невозможно добиться автоматического ввода таких записей.
Автоматический ввод поддерживается только в том случае, если выполняется запись
наборов записей в регистр расчета. На практике может оказаться полезным ввод записей
перерасчета не только в таких случаях, но и при редактировании "задним числом" иных
данных системы, например, регистров сведений, содержащих информацию, влияющую на
результаты расчетов.

Пример
Рассмотрим пример, когда в регистре сведений содержится информация, используемая для
расчета, как это, например, сделано в типовой конфигурации Управление производственным
предприятием.

В таком случае при записи набора записей регистра сведений необходимо выполнить
примерно те же действия, которые выполняет система при автоматическом вводе
перерасчетов.

• Сформировать запрос к регистру расчета в котором могут потенциально находится


зависящие от данных регистра сведений записи;
• Выполнить запрос;
• По результату выполнения запроса создать и заполнить наборы записей перерасчета
(по числу регистраторов "затронутых" в регистре расчета);
• Записать наборы записей без замещения информации (параметр метода Записать -
Ложь).

Выполнение запроса и запись наборов записей перерасчета необходимо выполнять дважды


- перед записью набора записей регистра сведений и при его записи.

Как сформировать запрос

При написании текст запроса, который позволит сформировать наборы записей перерасчета
необходимо руководствоваться следующими соображениями:

• Выбираемые поля, это как минимум, регистратор и те измерения регистра расчета,


которые являются измерениями таблицы перерасчета;
• Выбираться должны уникальные записи (использовать РАЗЛИЧНЫЕ в тексте запроса);
• В выборку должны попасть только такие записи, которых еще нет в таблице
перерасчета. Для этого нужно выполнить соединение с таблицей перерасчета по всем
полям таблицы перерасчета и включить в результат запроса только записи, которые
не нашли соответствия в таблице перерасчета (т.е. дополнить условие запроса
примерно так: ГДЕ Перерасчеты.ОбъектПерерасчета ЕСТЬ NULL);
• Условие запроса следует сформировать таким образом, чтобы в результат попали лишь
нужные с точки зрения периода действия или периода регистрации записи регистра
расчета. Например, проверяя, что период записи регистра сведений меньше даты
окончания периода действия записи регистра расчета;
• Рекомендуется упорядочить записи по регистратору.
Как сформировать наборы записей перерасчета

При формировании наборов записей перерасчета следует исходить из того, что эти наборы
записей могут формироваться только с отбором по объекту перерасчета. Как следствие - в
общем случае придется сформировать несколько наборов записей по разным объектам
перерасчета. Для этого можно использовать прием, применяемый в типовой конфигурации
"Управление производственным предприятием" - создать соответствие ключом которого
будет регистратор, а значением - набор записей перерасчета. Например:
Копировать в буфер обмена

Наборы =
Новый Соответствие;
Пока Выборка.Следующий()
Цикл Набор = Наборы[Выборка.Регистратор];
Если Набор = Неопределено Тогда
// сформировать набор и поместить в соответствие
КонецЕсли;
// добавить строку набора
КонецЦикла;

Почему при записи набора нужно формировать перерасчеты дважды

В рассматриваемом примере заполнения перерасчетов при записи набора записей регистра


расчета, как правило, следует выполнять такие действия дважды - перед записью набора
записей регистра сведений (обработчик ПередЗаписью(Отказ, Замещение)) и при его записи
(обработчик ПриЗаписи(Отказ, Замещение)).

Это связано с тем, что при записи набора, во-первых, удаляются "старые" записи набора,
которые уже могли повлиять на результаты расчета, а во-вторых, вводятся новые записи
набора. Перед записью набора в информационной базе еще существует прежний состав его
записей и по его состоянию будет отработан ввод записей перерасчета. При записи набора в
информационной базе уже существует новый состав записей набора и по нему также будет
отработан ввод записей перерасчета. В том случае, если содержимое набора записей
кардинально не изменялось и состав записей тот же с точностью "до измерений",
выполнение запроса при записи набора приведет к пустому результату (за счет условия
типа "ГДЕ Перерасчеты.ОбъектПерерасчета ЕСТЬ NULL") и реально запись набора
выполняться уже не будет.

Зачем выполнять запись наборов без замещения

Выполнение записи набора записей без замещения (Записать(Ложь)) позволяет нам не


выполнять предварительное считывание набора. Для того чтобы избежать проблем при
дополнении набора записей, мы выполнили запрос с проверкой наличия записей в таблице
перерасчета (см. выше).

Применение подхода описанного в данном разделе позволит сформировать перерасчеты при


редактировании любых данных, которые потенциально могут повлиять на результаты
расчета. Если прикладное решение не защищает от изменений константы, содержимое
справочников, регистров сведений и т. п., состояние которых используется при расчете
ресурсов регистров расчета, то применяя данный подход можно снабдить модули констант,
справочников, наборов записей и т. п. процедурами ввода перерасчетов.