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