HelpF.pro

Классификация записей по приоритету видов расчета

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

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

Расчет записей по приоритету видов расчета
Код 1C v 8.х
 Процедура РассчитатьЗаписиРегистраРасчета(ИмяРегистра, НаборЗаписей, ТабличнаяЧасть = Неопределено) Экспорт

НаборЗаписей.Записать(Истина, Ложь);

// Определить название плана видов расчета для запроса. ИмяПланаВидовРасчета =
Метаданные.РегистрыРасчета[ИмяРегистра].ПланВидовРасчета.Имя;

// Получить массив видов расчета из набора записей. ТаблицаВидовРасчета = НаборЗаписей.Выгрузить(); ТаблицаВидовРасчета.Свернуть("ВидРасчета");
МассивВидовРасчета = ТаблицаВидовРасчета.ВыгрузитьКолонку("ВидРасчета");

// Запрос по приоритетам видов расчета. Запрос = Новый Запрос;

Запрос.Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Приоритет
|ИЗ
| ПланВидовРасчета." + ИмяПланаВидовРасчета + " КАК " +
| ИмяПланаВидовРасчета + "
|ГДЕ
| Ссылка В (&МассивВидовРасчета)
|УПОРЯДОЧИТЬ ПО
| " + ИмяПланаВидовРасчета + ".Приоритет
|ИТОГИ ПО
| Приоритет";

Запрос.УстановитьПараметр("МассивВидовРасчета", МассивВидовРасчета); ВыборкаПриоритетов = Запрос.Выполнить().
Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

// Для каждого значения приоритета выполнить расчет записей. Пока ВыборкаПриоритетов.Следующий() Цикл
РассчитатьНаборЗаписей(НаборЗаписей, ВыборкаПриоритетов.Приоритет, ТабличнаяЧасть);

// Записать набор в регистр для расчета записей следующего
// приоритета, фактический период действия не пересчитывается. НаборЗаписей.Записать(Истина, Истина);
КонецЦикла;

КонецПроцедуры


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

ПРИМЕЧАНИЕ
После расчета записей последнего приоритета набор записей можно не перезаписывать, но только в том случае, если в документе после этого не будет производиться расчет записей другого регистра, который может использовать данные текущего регистра как базу. Например, если после расчета регистра основных начислений в модуле будет сразу производиться расчет дополнительных начислений, то записи регистра основных начислений после расчета последнего приоритета должны быть перезаписаны.
Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/1458.html