Почему при синхронизации между УТ 11 и Розница 2.3 нарушается порядок строк в документах перемещения и как это исправить?

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

Синхронизация данных между 1С:Управление торговлей 11 (УТ 11) и 1С:Розница 2.3 — это критически важный процесс для розничных сетей, обеспечивающий актуальность информации о товарах и операциях. Однако иногда возникают непредвиденные проблемы, одной из которых является нарушение порядка строк в табличных частях документов, например, в документах перемещения товаров. Представим ситуацию: вы создаете документ перемещения в УТ, проводите синхронизацию, а в Рознице получаете документ, где товары расположены в другом порядке. Почему это происходит и как это исправить? Давайте разбираться вместе.

Выясняем причину: почему порядок строк в документах может нарушаться при синхронизации?

Начнем с анализа возможных причин, по которым система может изменять последовательность строк в табличных частях документов во время обмена данными. Понимание этих причин поможет нам точнее определить источник проблемы.

  1. Отсутствие явного упорядочивания в правилах обмена.

    Это одна из наиболее частых причин. Если в правилах конвертации данных (ПКД) не задан конкретный порядок выгрузки строк табличной части, система может обрабатывать их в произвольной последовательности. Это означает, что при формировании файла обмена строки будут записываться не в том порядке, в котором они были в документе-источнике.

  2. Особенности платформы 1С:Предприятие и внутренних механизмов СУБД.

    В некоторых случаях, даже если нет явных указаний, порядок строк в табличных частях документов при их записи в базу данных или при их чтении может быть не гарантирован. Это может зависеть от внутренних алгоритмов СУБД (например, SQL Server, PostgreSQL) или от самой платформы 1С. Без явного упорядочивания через запрос или правила обмена, порядок может меняться.

  3. Использование универсальных форматов обмена без специфических настроек.

    Когда мы используем универсальные правила обмена, не учитывающие специфику сохранения порядка строк, данные могут передаваться "как есть" в рамках своей логической структуры, но без сохранения исходной визуальной или логической последовательности строк.

  4. Изменения в коде обмена или записи документа.

    Если в типовую конфигурацию вносились доработки, затрагивающие механизмы обмена данными или запись документов, эти изменения могли непреднамеренно нарушить стандартное поведение системы по сохранению порядка строк. Например, это может быть неоптимальный запрос, который выбирает строки без УПОРЯДОЧИТЬ ПО, или код, который перестраивает табличную часть при записи.

  5. Кэширование данных.

    Хотя чистка кэша сервера 1С или клиентской программы часто помогает при различных проблемах, в случае с порядком строк это редко является первопричиной. Тем не менее, как часть общей гигиены системы, этот шаг может быть выполнен, но обычно проблема кроется глубже, в логике обмена или записи.

Диагностика проблемы: определяем, где происходит искажение порядка строк

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

  1. Проверяем файл выгрузки из УТ 11.

    Это был ключевой шаг в данной конкретной ситуации. Автором было выяснено, что проблема возникает уже на этапе формирования файла обмена в УТ. То есть, даже до того, как данные попадают в Розницу, в файле выгрузки порядок строк уже нарушен.

    Как это сделать?

    В типовых конфигурациях 1С, таких как УТ и Розница, обмен обычно происходит через файлы формата XML, которые сохраняются на диске, в сетевой папке или передаются по FTP. Вам необходимо получить этот файл обмена (обычно он находится в каталоге, указанном в настройках синхронизации или на FTP-сервере) и открыть его любым текстовым редактором или специализированным XML-просмотрщиком.

    Найдите в файле XML интересующий документ перемещения (например, по номеру или дате) и его табличную часть. Визуально проанализируйте последовательность элементов, представляющих строки табличной части. Если уже здесь порядок не соответствует оригиналу в УТ, значит, причина точно в правилах выгрузки из УТ.

  2. Проверяем код записи документа (менее вероятно в данном случае).

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

Пошаговое решение: корректировка правил выгрузки для сохранения порядка строк

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

Основная идея — явно указать системе, как упорядочивать строки табличной части при их выгрузке.

  1. Определяем, какие правила обмена используются.

    Для начала нам нужно понять, какие именно правила обмена (файл с расширением .xml или .zip, содержащий правила конвертации) используются для синхронизации между вашей УТ 11 и Розницей 2.3. Обычно эти правила находятся в каталоге конфигурации, либо их можно выгрузить из узла обмена через помощник настройки синхронизации.

    В конфигурации 1С:Управление торговлей (начиная с версии 11) и 1С:Розница (начиная с версии 2.x) для обмена данными используются механизмы, основанные на конфигурации "Конвертация данных 2.0" или "Конвертация данных 3.0". Вам потребуется внешняя обработка "Конвертация данных" (если у вас нет отдельной базы КД) или доступ к конфигуратору для редактирования правил.

  2. Открываем и редактируем правила конвертации данных.

    Запустите обработку "Конвертация данных" (часто она идет в комплекте с типовыми конфигурациями или ее можно найти на диске ИТС) и загрузите в нее файл правил обмена. Если правила встроены в конфигурацию, то их можно выгрузить через стандартные механизмы плана обмена или получить доступ к ним через конфигуратор (это сложнее и требует определенных навыков).

    После загрузки правил найдите Правило конвертации объектов (ПКО) для документа "Перемещение товаров". Обычно оно называется Документ_ПеремещениеТоваров или аналогично.

  3. Корректируем правило выгрузки табличной части "Товары".

    Внутри ПКО для документа "ПеремещениеТоваров" найдите закладку "Табличные части". Там вы увидите табличную часть Товары (или другое название, если оно было изменено).

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

    Суть доработки: Мы должны добавить упорядочивание по стандартному реквизиту НомерСтроки табличной части. Этот реквизит автоматически присваивается каждой строке при ее создании и гарантирует уникальный и последовательный порядок.

    Если правила написаны на КД 2.0, то в обработчике "Перед выгрузкой" или "После выгрузки" табличной части (или всего объекта) можно явно указать запрос с упорядочиванием.

    Если в правилах выгрузки табличной части нет явного запроса, который выбирает данные для выгрузки, и вы не видите очевидного места для добавления УПОРЯДОЧИТЬ ПО, скорее всего, система использует стандартный механизм обхода табличной части объекта. В этом случае, вам, возможно, придется перейти на закладку "Выгрузка данных" или "Загрузка данных" для табличной части и настроить там алгоритм выгрузки.

    Рассмотрим типовую ситуацию. Для табличных частей в правилах конвертации данных часто используются "Источники данных". Если Источник данных для табличной части - это сам объект-источник (например, Документ.ПеремещениеТоваров.Товары), то нам нужно влиять на то, как эти данные будут получены для выгрузки.

    В Конвертации данных 2.0/3.0 вы можете найти вкладку "Обработчики" для табличной части. Там может быть обработчик "ПередВыгрузкой" или "ПолучитьЗначения" (для источника). Если вы переопределяете выгрузку, вы можете написать свой запрос:

    
    // Пример запроса, который можно использовать или адаптировать
    // для получения строк табличной части с упорядочиванием
    // Этот код не вставляется напрямую в "правила обмена", но показывает принцип.
    // Он мог бы быть частью алгоритма, который формирует данные для выгрузки.
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ПеремещениеТоваровТовары.Номенклатура,
    |    ПеремещениеТоваровТовары.Количество,
    |    ПеремещениеТоваровТовары.ЕдиницаИзмерения,
    |    ПеремещениеТоваровТовары.Цена,
    |    ПеремещениеТоваровТовары.Сумма,
    |    ПеремещениеТоваровТовары.НомерСтроки // Важно получить номер строки
    |ИЗ
    |    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
    |ГДЕ
    |    ПеремещениеТоваровТовары.Ссылка = &СсылкаДокумента
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПеремещениеТоваровТовары.НомерСтроки"; // <-- Вот оно, ключевое упорядочивание
    
    Запрос.УстановитьПараметр("СсылкаДокумента", Источник.Ссылка); // Источник - это ссылка на документ УТ
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    // Далее ResultatZaprosa будет содержать строки в нужном порядке
    // и их нужно будет перебрать и выгрузить через правила обмена.
    // Или, если это КД3, то можно настроить "Получение данных источника" для табличной части
    // с использованием такого запроса.
    

    Если же вы используете более старые или простые правила, где нет возможности писать произвольный запрос в явном виде, то часто достаточно просто убедиться, что реквизит НомерСтроки включен в выгрузку, и при необходимости в правилах загрузки (в Рознице) добавить упорядочивание по этому реквизиту, если оно не было сохранено при выгрузке. Однако, так как проблема была в выгрузке, сосредоточимся на УТ.

  4. Сохраняем измененные правила и загружаем их в базу.

    После внесения изменений в правила конвертации обязательно сохраните их в файл (например, ПравилаОбменаУТ11Розница23_исправлено.xml). Затем эти новые правила необходимо загрузить в базу УТ, заменив старые. Это делается через форму настройки синхронизации данных, обычно в разделе "НСИ и Администрирование" -> "Синхронизация данных" -> "Настройка синхронизации данных" -> "Редактировать правила конвертации".

  5. Проводим повторную синхронизацию и проверяем результат.

    После загрузки новых правил проведите синхронизацию заново. Создайте новый документ перемещения или перепроведите существующий, который ранее выгружался некорректно. Затем запустите обмен и проверьте документ перемещения в Рознице. Порядок строк теперь должен соответствовать исходному документу в УТ.

Дополнительные рекомендации и важные моменты

  1. Используйте реквизит НомерСтроки.

    Всегда ориентируйтесь на стандартный реквизит табличной части НомерСтроки. Он является надежным идентификатором для сохранения последовательности строк. Убедитесь, что он корректно выгружается и используется для сортировки как при выгрузке, так и, если необходимо, при загрузке.

  2. Проверка актуальности релизов.

    Убедитесь, что обе ваши конфигурации (УТ 11.4.13.180 и Розница 2.3.8.27) и платформа 1С:Предприятие обновлены до актуальных и совместимых версий. Иногда проблемы с синхронизацией могут быть вызваны несоответствием версий или наличием ошибок, исправленных в более новых релизах.

  3. Контроль кода записи документа (если проблема не в выгрузке).

    Если бы после всех манипуляций с правилами выгрузки проблема все равно сохранялась (что маловероятно, учитывая диагностику автора), тогда пришлось бы углубляться в код модуля объекта документа "ПеремещениеТоваров" в Рознице, а также его подписок на события. Возможно, там есть какой-то алгоритм, который при записи или проведении документа переупорядочивает строки табличной части.

  4. Очистка кэша.

    Хотя этот шаг не является основным решением для проблемы с порядком строк, при любых изменениях в конфигурации или правилах обмена рекомендуется очистить кэш клиента и сервера 1С. Это помогает убедиться, что система использует самые актуальные данные и код.

Как мы видим, проблема с нарушением порядка строк при синхронизации между УТ и Розницей решается путем целенаправленной корректировки правил обмена. Важно провести правильную диагностику, чтобы понять, на каком этапе происходит искажение, и затем внести точечные изменения. Упорядочивание по реквизиту НомерСтроки при выгрузке данных из УТ является надежным и проверенным способом обеспечить корректную последовательность строк в документе-приемнике. Это позволит сотрудникам магазина работать с документами так, как им удобно и привычно.

← На главную