Как изменить порядок документов, созданных в одну секунду (23:59:59), в 1С 7.7?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

В практике работы с платформой 1С:Предприятие 7.7 программисты и администраторы часто сталкиваются с ситуацией, когда несколько документов записываются на одну и ту же секунду — обычно это 23:59:59. Это происходит при вводе регламентных операций, закрытии месяца или массовом перестроении последовательности. Проблема заключается в том, что документы внутри этой секунды могут выстроиться в «неправильном» порядке: например, Реализация оказывается раньше, чем Переоценка или Приход, что приводит к ошибкам нехватки остатков при проведении.

В этой статье мы подробно разберем, как система определяет очередность таких документов, и рассмотрим эффективные способы управления их позицией.

Разберем технические нюансы: почему время совпадает, а порядок разный?

Проанализируем, как 1С 7.7 хранит информацию о времени. В отличие от версии 8.х, здесь нет классического GUID. За очередность внутри одной секунды отвечает уникальный идентификатор IDDOC. Это 9-символьное значение в 36-ричной системе исчисления. В общем журнале (таблица 1SJOURN) система сортирует записи по совокупному индексу: Дата + Время + IDDOC.

Важный момент: идентификатор IDDOC присваивается документу в момент его первого сохранения. Как правило, он увеличивается инкрементально. Это означает, что тот документ, который был физически создан позже, будет иметь «больший» ID и окажется ниже в списке внутри своей секунды. Простое перепроведение документа не меняет его IDDOC, а значит, и не меняет его позицию относительно соседа по секунде.

Метод 1: Ручное управление временем (Разнесение по секундам)

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

Рекомендуемый алгоритм действий:

  1. Установите время документа Приход на 23:59:50 и проведите его.
  2. Установите время документа Переоценка на 23:59:55 и проведите его.
  3. Установите время документа Реализация на 23:59:59 и проведите его.

Такой подход гарантирует, что к моменту проведения реализации все складские остатки и новые цены уже будут зафиксированы в базе данных. Помните: в 1С 7.7 секунда — это минимальный квант времени, но внутри неё порядок определяется моментом создания записи.

Метод 2: Использование программной обработки

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

Проанализируем пример кода для такой обработки:


// Создаем объект для работы с документами
Док = СоздатьОбъект("Документ");
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("ДокОбъект");
ТЗ.НоваяКолонка("ТипДок");

// Выбираем документы за нужный период (конец дня)
Док.ВыбратьДокументы(ВыбДата, ВыбДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
    ТЗ.НоваяСтрока();
    ТЗ.ДокОбъект = Док.ТекущийДокумент();
    ТЗ.ТипДок = Док.Вид();
КонецЦикла;

// Сортируем ТЗ по приоритету (сначала Приходы, потом Переоценки, потом Реализации)
// Для этого можно добавить колонку Приоритет и заполнить её
// После сортировки переустанавливаем время
ТЗ.ВыбратьСтроки();
ТекВремя = 86340; // Время в секундах (например, 23:59:00)
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    ТекДок = ТЗ.ДокОбъект;
    ТекДок.УстановитьВремя(Цел(ТекВремя/3600), Цел((ТекВремя%3600)/60), ТекВремя%60);
    ТекДок.Записать();
    ТекВремя = ТекВремя + 1;
КонецЦикла;

При использовании метода УстановитьВремя важно понимать: если вы записываете документ программно в ту же секунду, где он уже находится, его IDDOC не изменится, и он может остаться на том же месте. Чтобы «протолкнуть» документ в самый конец списка внутри секунды, в некоторых релизах помогает метод СделатьПоследним().

Метод 3: Пересоздание документа (Смена IDDOC)

Если вам критически важно, чтобы два документа остались именно на 23:59:59, но поменялись местами, единственным штатным способом в SQL-версии или DBF (без прямого редактирования таблиц) является пересоздание документа. Рассмотрим, как это работает:

  1. Скопируйте данные документа, который должен быть позже (например, Реализация).
  2. Удалите исходный документ Реализация.
  3. Создайте новый документ Реализация с теми же данными и запишите его на 23:59:59.

Поскольку новый документ будет создан позже Переоценки, его IDDOC будет больше, и в рамках одной секунды он автоматически окажется ниже в списке и проведется позже.

Рекомендации по «регламентному» времени

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

Важно: В конфигураторе для каждого вида документа можно настроить свойство «Автоматическая установка времени». Если выбрано значение «В конец дня», 1С будет пытаться поставить документ после всех существующих. Однако при массовом вводе это часто приводит к тому, что все документы оказываются на одной финальной секунде. Использование четких временных интервалов (как описано выше) — это лучший способ гарантировать корректный расчет итогов и наличие остатков на складах.

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

← На главную