При длительной эксплуатации конфигурации «1С:Управление производственным предприятием 1.3» часто возникает ситуация, когда граница последовательности партионного учета оказывается далеко в прошлом (например, из-за случайного перепроведения старого документа или изменения реквизитов). Полное восстановление последовательности за несколько лет штатными средствами может занимать слишком много времени и ресурсов сервера, поэтому принимается решение перенести границу последовательности вперед вручную. Однако при попытке программной установки границы разработчики нередко сталкиваются с тем, что вызов метода не дает видимого эффекта.
Разберем детально, почему так происходит, какие ошибки допускаются в программном коде и какими стандартными инструментами конфигурации следует воспользоваться.
Рассмотрим код, который часто пытаются применить для сдвига границы:
Последовательности.ПартионныйУчет.УстановитьГраницу(ЭлементыФормы.НачПериода.Значение, Новый Структура("Организация, ПроведенВХронологическойПоследовательности", ЭтотОбъект.Организация, Ложь));
Последовательности.ПартионныйУчетБУ.УстановитьГраницу(ЭлементыФормы.НачПериода.Значение, Новый Структура("Организация, ПроведенВХронологическойПоследовательности", ЭтотОбъект.Организация, Ложь));
В этом фрагменте допущены принципиальные архитектурные ошибки, из-за которых граница не актуализируется:
ПроведенВХронологическойПоследовательности. В последовательностях ПартионныйУчет и ПартионныйУчетБУ это измерение отвечает за признак корректности проведения. Точка, до которой партии рассчитаны верно, соответствует значению Истина. Передавая Ложь, код пытается зафиксировать границу для документов, нарушивших хронологию, что не приводит к сдвигу основной рабочей границы.УстановитьГраницу() изменяет запись только в таблице границ. Если в самой таблице регистрации последовательности остаются документы с признаком ПроведенВХронологическойПоследовательности = Ложь, типовая процедура проведения по партиям при запуске выберет самый ранний документ из таблицы регистрации и все равно попытается начать расчет с 2012 года.Дата вместо объекта МоментВремени. Если передается «голая» дата начала периода, граница позиционируется на самое начало секунды без привязки к конкретному документу. Надежнее позиционировать границу на МоментВремени документа, закрывающего период, либо документа ввода остатков.В конфигурации УПП 1.3 уже предусмотрен штатный механизм для ручного управления границами, который выполняет все необходимые операции корректно. Выясним, как до него добраться:
УстановкаГраницыПоследовательностиПартионногоУчета).Если требуется выполнить операцию программно (например, в рамках внешней обработки закрытия периода), скорректируем код. Передадим в структуру отбора значение Истина и используем точный момент времени:
МоментГраницы = Новый МоментВремени(ЭлементыФормы.НачПериода.Значение);
ОтборБУ = Новый Структура;
ОтборБУ.Вставить("Организация", ЭтотОбъект.Организация);
ОтборБУ.Вставить("ПроведенВХронологическойПоследовательности", Истина);
Последовательности.ПартионныйУчетБУ.УстановитьГраницу(МоментГраницы, ОтборБУ);
// Для управленческого учета измерение Организация учитывается в зависимости от настроек,
// но отбор по признаку хронологии также обязателен:
ОтборУУ = Новый Структура;
ОтборУУ.Вставить("Организация", ЭтотОбъект.Организация);
ОтборУУ.Вставить("ПроведенВХронологическойПоследовательности", Истина);
Последовательности.ПартионныйУчет.УстановитьГраницу(МоментГраницы, ОтборУУ);
Чтобы типовое проведение по партиям не возвращалось к старым документам, необходимо убрать признак нарушения хронологии у исторических записей в таблице регистрации. Проанализируем, как это сделать программно:
ПроведенВХронологическойПоследовательности = Ложь.
Набор = Последовательности.ПартионныйУчетБУ.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
Набор.Прочитать();
Для Каждого Запись Из Набор Цикл
Запись.ПроведенВХронологическойПоследовательности = Истина;
КонецЦикла;
Набор.Записать();
Передвигая границу последовательности без фактического перепроведения документов, следует помнить о сопутствующих рисках и мерах предосторожности: