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