Как в наборе записей регистра 1С указать момент времени в качестве периода?

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

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

Технические ограничения поля Период

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

Попытка присвоить полю Период объект типа МоментВремени или Граница приведет к ошибке несоответствия типов. Разберем причинно-следственную связь:

  1. Объект МоментВремени состоит из даты/времени и ссылки на документ-регистратор. Он существует только в оперативной памяти во встроенном языке и не является типом данных для полей таблиц базы данных.
  2. В физических таблицах регистров не предусмотрено отдельное поле для хранения момента времени. Сортировка движений с одинаковой датой и временем выполняется платформой автоматически по внутренней ссылке документа-регистратора (Регистратор).
  3. Объекты МоментВремени и Граница созданы исключительно для позиционирования при получении срезов и остатков в виртуальных таблицах запросов, но не для записи в регистры.

Варианты решения задачи

Выясним, какие существующие механизмы и приемы позволяют обойти данное ограничение и корректно расположить движения в системе.

Вариант 1. Сдвиг периода движений на 1 секунду назад

Самое простое и широко применяемое решение — установить период для добавляемых записей на одну секунду раньше даты основного документа. Посмотрим на пример кода при формировании набора записей:


НабЗапасыНаСкладах = РегистрыНакопления.ЗапасыНаСкладах.СоздатьНаборЗаписей();
НабЗапасыНаСкладах.Отбор.Регистратор.Установить(Ссылка);

Движ = НабЗапасыНаСкладах.Добавить();
// Уменьшаем дату на 1 секунду для корректного попадания в остатки
Движ.Период = Реквизиты.Период - 1; 
Движ.Регистратор = Ссылка;

Преимущество: Гарантирует, что при расчете остатков на момент основного документа данные движения уже будут учтены базой данных.

Вариант 2. Использование объектов МоментВремени и Граница в запросах

Если задача заключается не в формировании движений, а в получении остатков перед проведением связанного документа, используем параметры виртуальных таблиц. Для этого передаем в запрос объект МоментВремени или Граница.

Рассмотрим пример обращения к остаткам с использованием конструктора границы:


// Получаем дату и время документа
ДатаДокумента = СсылкаНаДокумент.Дата;

// Формируем границу, не включающую движения указанной секунды
ДатаИсключая = Новый Граница(ДатаДокумента, ВидГраницы.Исключая);

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЗапасыОстатки.Номенклатура,
    |	ЗапасыОстатки.КоличествоОстаток
    |ИЗ
    |	РегистрНакопления.ЗапасыНаСкладах.Остатки(&ГраницаПериода, ) КАК ЗапасыОстатки";

Запрос.УстановитьПараметр("ГраницаПериода", ДатаИсключая);
РезультатЗапроса = Запрос.Выполнить();

Вариант 3. Использование механизма Последовательности

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

Вариант 4. Архитектурное решение через привязку к партии

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

← На главную