Как правильно изменить границу последовательности партионного учета в 1С:УПП 1.3?

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет Промышленность, строительство и АПК
← На главную

При длительной эксплуатации конфигурации «1С:Управление производственным предприятием 1.3» часто возникает ситуация, когда граница последовательности партионного учета оказывается далеко в прошлом (например, из-за случайного перепроведения старого документа или изменения реквизитов). Полное восстановление последовательности за несколько лет штатными средствами может занимать слишком много времени и ресурсов сервера, поэтому принимается решение перенести границу последовательности вперед вручную. Однако при попытке программной установки границы разработчики нередко сталкиваются с тем, что вызов метода не дает видимого эффекта.

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

Анализ ошибки: почему метод УстановитьГраницу() не сработал

Рассмотрим код, который часто пытаются применить для сдвига границы:


Последовательности.ПартионныйУчет.УстановитьГраницу(ЭлементыФормы.НачПериода.Значение, Новый Структура("Организация, ПроведенВХронологическойПоследовательности", ЭтотОбъект.Организация, Ложь));
Последовательности.ПартионныйУчетБУ.УстановитьГраницу(ЭлементыФормы.НачПериода.Значение, Новый Структура("Организация, ПроведенВХронологическойПоследовательности", ЭтотОбъект.Организация, Ложь));

В этом фрагменте допущены принципиальные архитектурные ошибки, из-за которых граница не актуализируется:

  1. Неверное значение измерения ПроведенВХронологическойПоследовательности. В последовательностях ПартионныйУчет и ПартионныйУчетБУ это измерение отвечает за признак корректности проведения. Точка, до которой партии рассчитаны верно, соответствует значению Истина. Передавая Ложь, код пытается зафиксировать границу для документов, нарушивших хронологию, что не приводит к сдвигу основной рабочей границы.
  2. Разделение на таблицу границ и таблицу регистрации. Платформенный объект «Последовательность» состоит из двух таблиц: таблицы границ и таблицы регистрации движений. Метод УстановитьГраницу() изменяет запись только в таблице границ. Если в самой таблице регистрации последовательности остаются документы с признаком ПроведенВХронологическойПоследовательности = Ложь, типовая процедура проведения по партиям при запуске выберет самый ранний документ из таблицы регистрации и все равно попытается начать расчет с 2012 года.
  3. Передача типа Дата вместо объекта МоментВремени. Если передается «голая» дата начала периода, граница позиционируется на самое начало секунды без привязки к конкретному документу. Надежнее позиционировать границу на МоментВремени документа, закрывающего период, либо документа ввода остатков.

Способ 1. Использование встроенной типовой обработки

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

  1. Откроем типовую регламентную обработку «Проведение по партиям» (меню «Документы» — «Дополнительно»).
  2. В командной панели формы обработки или через меню действий откроем форму «Установка границы последовательности партионного учета» (в метаданных это отдельная обработка УстановкаГраницыПоследовательностиПартионногоУчета).
  3. Укажем организацию, необходимый момент времени (документ или дату) и применим изменения. Обработка сформирует правильный отбор по измерениям последовательности и корректно запишет границу.

Способ 2. Исправление программного кода установки границы

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


МоментГраницы = Новый МоментВремени(ЭлементыФормы.НачПериода.Значение);

ОтборБУ = Новый Структура;
ОтборБУ.Вставить("Организация", ЭтотОбъект.Организация);
ОтборБУ.Вставить("ПроведенВХронологическойПоследовательности", Истина);

Последовательности.ПартионныйУчетБУ.УстановитьГраницу(МоментГраницы, ОтборБУ);

// Для управленческого учета измерение Организация учитывается в зависимости от настроек,
// но отбор по признаку хронологии также обязателен:
ОтборУУ = Новый Структура;
ОтборУУ.Вставить("Организация", ЭтотОбъект.Организация);
ОтборУУ.Вставить("ПроведенВХронологическойПоследовательности", Истина);

Последовательности.ПартионныйУчет.УстановитьГраницу(МоментГраницы, ОтборУУ);

Способ 3. Очистка и актуализация таблицы регистрации

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

  1. Выполним запрос к виртуальной таблице последовательности за период до новой границы с отбором ПроведенВХронологическойПоследовательности = Ложь.
  2. В цикле для каждого найденного регистратора создадим набор записей последовательности:
    
    Набор = Последовательности.ПартионныйУчетБУ.СоздатьНаборЗаписей();
    Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
    Набор.Прочитать();
    
    Для Каждого Запись Из Набор Цикл
        Запись.ПроведенВХронологическойПоследовательности = Истина;
    КонецЦикла;
    
    Набор.Записать();
    
  3. При необходимости полностью исключить старые документы из контроля (если период закрыт окончательно) набор записей для них можно просто очистить.

Важные рекомендации при переносе границы

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

  1. Контроль отрицательных остатков. Искусственный сдвиг границы скрывает проблему хронологии, но не устраняет отрицательные остатки («красноту») по регистрам партий и себестоимости, возникшие в прошлых периодах. После переноса границы обязательно сформируйте отчеты по партиям товаров на складах и ведомость по учету затрат.
  2. Установка даты запрета изменения данных. После корректировки границы обязательно установите дату запрета редактирования для всех пользователей на границу перенесенного периода. Если этого не сделать, любая случайная запись документа за прошлые годы немедленно сбросит границу обратно.
  3. Альтернативное решение. Если база данных сильно нагружена, а постоянные сбои последовательности партионного учета мешают регулярному закрытию месяцев, архитектурно более правильным решением для УПП является переход с партионного учета на РАУЗ (Расширенную аналитику учета затрат), где механизм последовательностей партий не используется вовсе.
← На главную