Почему при синхронизации «1С:Розница 2.2» и «1С:Бухгалтерия 3.0» меняется порядок строк и как это исправить?

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

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

Причина 1: Особенности работы SQL и отсутствие сортировки в правилах

Проанализируем техническую сторону выгрузки. Современный обмен данными между Розницей и БП чаще всего строится на базе универсального формата EnterpriseData (использование КД 3.0). Процесс выгрузки объекта происходит следующим образом: система делает запрос к базе данных, получает таблицу товаров и упаковывает её в XML-файл.

Важно понимать, что СУБД (особенно Microsoft SQL Server или PostgreSQL) не гарантирует порядок строк в выборке, если в тексте запроса явно не указана инструкция УПОРЯДОЧИТЬ ПО. В типовых правилах обмена (менеджерах обмена) для экономии ресурсов сортировка по номеру строки часто отсутствует. В результате при каждой новой выгрузке строки могут «перемешиваться» случайным образом.

Причина 2: Свертка строк при загрузке в Бухгалтерию

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

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

  1. Крем Пантенол (Характеристика: 50 мл) — 5 шт.
  2. Крем Пантенол (Характеристика: 100 мл) — 10 шт.

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

Шаг 1: Проверка целостности данных в файле выгрузки

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

  1. Запустите синхронизацию и сохраните файл обмена (обычно это файл с именем Message_XX_YY.xml).
  2. Откройте данный файл любым текстовым редактором (например, Notepad++).
  3. Найдите узел нужного документа (например, поиск по сумме или номеру).
  4. Посмотрите содержимое табличной части внутри XML.

Если в XML-файле количество строк и значения уже отличаются от экранной формы в Рознице, значит, проблема в Менеджере обмена Розницы. Если же в XML всё верно, а в БП — каша, проблему нужно искать в правилах загрузки или настройках сопоставления объектов.

Шаг 2: Внесение изменений через расширение конфигурации

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

Для Розницы 2.2 и БП 3.0 это обычно методы в общем модуле МенеджерОбменаЧерезУниверсальныйФормат. Рассмотрим пример логики, которую нужно внедрить:


// В расширении перехватываем запрос выгрузки табличной части
&После("ПКО_Документ_ПоступлениеТоваров_Отправка_ПриОтправкеДанных")
Процедура Расш_ПКО_ПоступлениеТоваров_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена)
    // Добавляем принудительную сортировку коллекции перед сериализацией
    Если ДанныеИБ.Товары.Количество() > 0 Тогда
        ДанныеИБ.Товары.Очистить();
        // Заново заполняем из ИБ с явным ORDER BY
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ * ИЗ Документ.ПоступлениеТоваров.Товары ГДЕ Ссылка = &Ссылка УПОРЯДОЧИТЬ ПО НомерСтроки";
        Запрос.УстановитьПараметр("Ссылка", ДанныеИБ.Ссылка);
        ДанныеИБ.Товары.Загрузить(Запрос.Выполнить().Выгрузить());
    КонецЕсли;
КонецПроцедуры

Шаг 3: Использование внешних правил обмена

Если вы решили кардинально изменить логику (например, отказаться от свертки строк), можно воспользоваться механизмом использования внешних правил.

Проанализируем алгоритм подключения:

  1. Выгрузите типовые правила из конфигурации с помощью обработки Регистрация изменений для обмена.
  2. Отредактируйте их в программе «1С:Конвертация данных 2.0» (если используется старый формат) или 3.0.
  3. Загрузите измененные правила обратно в базу через регистр сведений «Правила для обмена данными». Это позволит программе использовать ваши кастомные алгоритмы вместо зашитых в конфигурацию.

Важные замечания по настройке сопоставления

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

Резюме: Для достижения 100% идентичности документов необходимо:

← На главную