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