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