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