Как изменить позицию документа в 1С 8.3, если дата и время совпадают?

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

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

Почему в 1С 8.3 нельзя просто «передвинуть» документ?

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

  1. Дата и время (с точностью до секунды).
  2. Уникальный идентификатор ссылки (GUID/UUID).

Когда платформа сравнивает два документа с абсолютно одинаковым временем, она начинает сравнивать их внутренние идентификаторы (ссылки). Тот документ, чья ссылка при алфавитном сравнении оказывается «меньше», всегда будет стоять выше в логической последовательности. Поскольку Ссылка объекта формируется в момент создания и является неизменяемой, мы не можем «поменять местами» два документа в одной секунде простым перетаскиванием или вызовом одного метода.

Решение 1: Изменение времени документа

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

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


// Пример программного смещения времени
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата() + 1; // Смещение на 1 секунду вперед
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);

Для интерактивной работы в конфигураторе существует полезное свойство объекта — Автовремя. Рассмотрим подробнее: если установить для документа режим «Использовать», платформа будет пытаться автоматически разносить документы в пределах дня (например, ставя чеки в конец дня, а приходы — в начало), что минимизирует конфликты позиций.

Решение 2: Управление визуальным порядком в динамических списках

Часто задача «передвинуть документ» продиктована желанием пользователя видеть их в определенном порядке в форме списка. Выясним причину: если нам важен только визуальный порядок, нам не обязательно менять МоментВремени.

Мы можем добавить в документ дополнительный реквизит, например, ДополнительныйПорядок с типом Число или Строка. При записи документа мы можем фиксировать точное время создания вплоть до миллисекунд.

Посмотрим на пример реализации в модуле объекта:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ЭтоНовый() Тогда
        // Используем универсальное время в миллисекундах для точной сортировки
        ЭтотОбъект.ДополнительныйПорядок = ТекущаяУниверсальнаяДатаВМиллисекундах();
    КонецЕсли;
КонецПроцедуры

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

Решение 3: Использование механизмов последовательностей

Если ваша задача связана с правильным расчетом остатков и порядком проведения (чтобы один документ «видел» движения другого), проанализируем механизм Последовательность. В 1С 8.3 последовательности позволяют жестко контролировать порядок влияния документов на учет.

Документы в последовательности выстраиваются строго по моменту времени. Если вам нужно изменить их очередность для корректного списания партий, единственный штатный путь — программно разносить их по времени. Помните, что оперативное проведение в 1С 8.3 автоматически устанавливает время документа как «время последнего документа + 1 секунда», если текущее время меньше или равно времени последнего проведенного документа.

Решение 4: Пересоздание объекта с новым UUID (Крайний случай)

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

Для этого используется метод УстановитьСсылкуНового(). Однако, мы крайне не рекомендуем этот способ, так как:

Подведем итоги

В отличие от 1С 7.7, где позиция была «мягкой» сущностью, в 1С 8.3 она жестко привязана к связке Дата + Ссылка. Если вам необходимо изменить позицию документа, используйте один из проверенных подходов:

  1. Смещение времени: Самый простой способ повлиять на логику проведения и учета.
  2. Дополнительные реквизиты: Идеально подходит для настройки визуального порядка в списках без изменения системных полей.
  3. Настройка Автовремени: Позволяет платформе самостоятельно управлять распределением документов в течение дня.

Таким образом, мы выяснили, что прямого аналога функции СформироватьПозициюДокумента() в 8.3 нет, но существующие инструменты позволяют решить задачу более гибко и масштабируемо.

← На главную