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