Как программно установить границу последовательности на нужную дату в 1С

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

В процессе разработки и сопровождения конфигураций на платформе 1С:Предприятие 8.3 часто возникает необходимость программного управления последовательностями документов. Это критически важно для корректного расчета себестоимости, партионного учета и других механизмов, зависящих от хронологического порядка проведения операций. Рассмотрим подробно, как правильно установить границу последовательности, учитывая различные измерения и технические нюансы работы платформы.

Постановка задачи и основные понятия

Последовательность в 1С — это объект метаданных, который следит за актуальностью движений документов. Когда мы говорим об установке границы, мы имеем в виду определение точки во времени, до которой все документы считаются «правильно проведенными». Если документ, входящий в последовательность, перепроводится «задним числом», граница автоматически сдвигается на момент этого документа, сигнализируя о необходимости пересчета последующих данных.

Часто в последовательностях используются измерения (например, Организация). Это позволяет вести независимые границы для разных узлов учета. Если в системе ведется учет по нескольким организациям, нарушение последовательности в одной из них не должно влиять на актуальность данных в другой.

Способ 1: Установка границы на конкретную дату

Проанализируем наиболее простой и эффективный способ установки границы. Платформа 1С позволяет установить границу, передав просто значение типа Дата. В этом случае граница будет установлена на самое начало указанной секунды.

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


&НаСервере
Процедура УстановитьГраницуНаДату(ВыбраннаяДата, ВыбраннаяОрганизация)
    // Получаем менеджер нужной последовательности по имени
    ТекПоследовательность = Последовательности.дор_Себестоимость;
    
    // Формируем структуру измерений для установки границы
    ПараметрыГраницы = Новый Структура("Организация", ВыбраннаяОрганизация);
    
    // Устанавливаем границу на указанную дату
    ТекПоследовательность.УстановитьГраницу(ВыбраннаяДата, ПараметрыГраницы);
    
    Сообщить("Граница последовательности успешно установлена на: " + ВыбраннаяДата);
КонецПроцедуры

В данном примере мы используем метод УстановитьГраницу. Первый параметр — это момент времени (дата или объект Граница), второй — структура, описывающая значения измерений. Если измерений несколько, их все необходимо включить в структуру.

Способ 2: Установка границы на конкретный документ (Момент времени)

Иногда требуется установить границу не просто на время, а на конкретный документ, чтобы этот документ считался последним «верным» в цепочке. Для этого лучше использовать объект МоментВремени, который включает в себя и дату, и ссылку на документ. Это исключает неоднозначность, если в одну секунду было проведено несколько документов.

Разберем, как найти документ и установить границу на него с помощью запроса:


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

Важные технические нюансы

Проанализируем несколько критически важных моментов, которые часто вызывают вопросы у разработчиков:

  1. Положение границы (Включая/Исключая): По умолчанию, если вы передаете в метод УстановитьГраницу дату или момент времени, платформа устанавливает границу включая этот момент. Однако при использовании объекта Граница можно явно указать вид границы (ВидГраницы.Включая или ВидГраницы.Исключая).
  2. Граница между документами: Важно понимать, что граница последовательности — это не обязательно «запись на документе». Это отметка в ленте времени. Если вы установили границу на 12:00:00, а первый документ в базе создан в 12:00:01, граница будет стоять «перед» этим документом.
  3. Пустые последовательности: Если запрос к виртуальной таблице последовательности возвращает пустой результат, это может означать, что документы еще не зарегистрированы в ней. Регистрация происходит в момент проведения документа, если он входит в состав последовательности в метаданных.
  4. Измерения и производительность: Если в последовательности заданы измерения, платформа создает отдельную таблицу записей границ. Использование Структура при установке границы позволяет 1С найти нужную запись в этой таблице. Если не указать измерения, граница может не обновиться для конкретного разреза учета.

Как проверить текущее состояние границы?

Чтобы программно проверить, где сейчас находится граница, мы можем обратиться к методу ПолучитьГраницу. Это полезно перед запуском процедур восстановления, чтобы понять объем работы.


СтруктураИзмерений = Новый Структура("Организация", ТекущаяОрганизация);
ТекущаяГраница = Последовательности.дор_Себестоимость.ПолучитьГраницу(СтруктураИзмерений);

// ТекущаяГраница может быть типа Дата или МоментВремени
Если ТипЗнч(ТекущаяГраница) = Тип("МоментВремени") Тогда
    Сообщить("Граница на документе: " + ТекущаяГраница.Ссылка);
ИначеЕсли ТипЗнч(ТекущаяГраница) = Тип("Дата") Тогда
    Сообщить("Граница на дате: " + ТекущаяГраница);
КонецЕсли;

Восстановление последовательности

Установка границы вручную — это «административное» действие. Оно просто меняет флаг в базе данных. Чтобы восстановить последовательность (то есть актуализировать данные), необходимо перепроводить документы, идущие после границы.

Рассмотрим алгоритм действий при восстановлении:

Таким образом, комбинируя методы УстановитьГраницу и стандартные механизмы проведения, мы можем гибко управлять состоянием учетной системы и гарантировать достоверность отчетов.

← На главную