При работе с крупными базами 1С:Управление производственным предприятием (УПП) ред. 1.3 специалисты часто сталкиваются с ситуацией, когда граница последовательности партионного учета «застревает» в глубоком прошлом. Попытки сдвинуть её стандартными или программными средствами не всегда венчаются успехом: система продолжает упорно предлагать перепроведение документов, начиная с «лохматых» годов. В этой статье мы разберем, почему так происходит и как окончательно победить сопротивление системы.
Типичная ситуация: программист пишет код для установки границы, но в интерфейсе «Проведение документов» в графе «Актуальна» вместо одной даты отображается странный интервал, например: (01.09.2019 12:00:00 ...) - (01.01.2021 23:59:59). Это первый и самый главный признак того, что в таблице границ последовательности существует несколько записей.
Проанализируем механику работы последовательностей в 1С. Последовательность — это не просто одна дата в конфигурации. Это полноценная таблица в базе данных. В УПП последовательность ПартионныйУчет имеет измерение Организация. Если вы устанавливаете границу только по конкретной организации, старые записи по другим организациям (или записи с пустой организацией) никуда не исчезают. Система при определении общей актуальности ориентируется на самую раннюю дату среди всех записей в этой таблице.
Прежде чем приступать к программным действиям, нам необходимо выяснить, что именно «держит» последовательность в прошлом. Выполним запрос к виртуальной таблице границ последовательности. Это поможет нам увидеть полную картину без фильтров, которые могут накладывать стандартные обработки.
ВЫБРАТЬ
ПартионныйУчетГраницы.Организация КАК Организация,
ПартионныйУчетГраницы.Период КАК Период,
ПартионныйУчетГраницы.Регистратор КАК Регистратор,
ПартионныйУчетГраницы.ПроведенВХронологическойПоследовательности КАК Хронология
ИЗ
Последовательность.ПартионныйУчет.Границы КАК ПартионныйУчетГраницы
Рассмотрим ситуацию, описанную в сообщениях форума. Если в результате запроса вы видите две записи для одной и той же организации (или одну с заполненной организацией, а другую — с пустой), при этом у одной из них флаг ПроведенВХронологическойПоследовательности установлен в Ложь, — именно эта запись и является «якорем». Она заставляет систему думать, что последовательность нарушена с 2019 года.
Для того чтобы корректно перенести границу, недостаточно вызвать УстановитьГраницу() один раз. Нужно убедиться, что мы «зачистили» или обновили все записи во всех измерениях. Разберем правильный подход к написанию кода для сдвига границы. Вместо того чтобы просто добавлять новую запись, мы должны перебрать существующие или принудительно установить границы для всех возможных комбинаций.
Посмотрим на пример кода, который решает проблему кардинально:
// Определяем момент времени, на который хотим сдвинуть границу
НужнаяДата = КонецДня('20201231235959');
НовыйМомент = Новый МоментВремени(НужнаяДата);
// 1. Сначала очистим или обновим границы по конкретным организациям
ВыборкаОрг = Справочники.Организации.Выбрать();
Пока ВыборкаОрг.Следующий() Цикл
Отбор = Новый Структура("Организация", ВыборкаОрг.Ссылка);
// Устанавливаем флаг Хронологии в Истина, чтобы система считала период закрытым
Последовательности.ПартионныйУчет.УстановитьГраницу(НовыйМомент, Отбор);
Последовательности.ПартионныйУчетБУ.УстановитьГраницу(НовыйМомент, Отбор);
КонецЦикла;
// 2. Важнейший момент: проверка записи с ПУСТОЙ организацией
// Иногда записи без измерений создаются при некорректной работе старых обработок
ОтборПустой = Новый Структура("Организация", Справочники.Организации.ПустаяСсылка());
Последовательности.ПартионныйУчет.УстановитьГраницу(НовыйМомент, ОтборПустой);
В УПП существует важный нюанс: если документ был изменен задним числом, в таблице границ появляется запись с флагом ПроведенВХронологическойПоследовательности = Ложь. Даже если дата этой записи совпадает с вашей новой границей, система может пытаться перепроводить документы.
Выясним причину появления дублей. Если вы видите в запросе (как в Сообщении 5) две записи на одну дату, где одна «Истина», а другая «Ложь», это означает конфликт состояний. Чтобы исправить это, необходимо программно прочитать набор записей границ и оставить только корректную информацию. Однако проще всего использовать метод УстановитьГраницу, передавая в структуру отбора все ключевые измерения. Система сама должна схлопнуть записи, если измерения идентичны.
Иногда граница последовательности установлена верно, но типовая обработка «Проведение по партиям» всё равно лезет в старые периоды. Проанализируем причину: партионный учет в УПП работает в связке с регистром сведений СписанныеТовары. Если в этом регистре остались «хвосты» — записи о товарах, которые были списаны, но партии по которым не были распределены (даже за 2019 год), обработка будет пытаться их обработать.
Рекомендация: перед сдвигом границы последовательности необходимо проверить и при необходимости очистить регистр сведений СписанныеТовары (и аналогичный для БУ) за периоды до даты новой границы. Если там есть записи, их нужно либо удалить, либо убедиться, что они не помешают работе. Без этого «Проведение по партиям» будет игнорировать дату границы последовательности, так как для него приоритетом являются накопленные задания в регистре СписанныеТовары.
Подведем итог. Чтобы успешно сдвинуть границу в УПП 1.3 и забыть про 2019 год, выполните следующие действия:
Последовательности.ПартионныйУчет.УстановитьГраницу().Организация. Если такая запись есть в таблице границ и она датирована 2019 годом — она и тянет всю последовательность назад.СписанныеТовары), которые являются «топливом» для проведения по партиям. Очистите старые записи, чтобы обработка не пыталась их «допроводить».После выполнения этих шагов «интервал» в интерфейсе исчезнет, сменившись одной актуальной датой, и система позволит вам вести учет с 2021 года, не оглядываясь на ошибки прошлых лет.