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