Как изменить поля поиска номенклатуры при обмене через универсальный формат

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

При использовании синхронизации данных через универсальный формат (Enterprise Data) между конфигурациями «Управление торговлей» (УТ) и «Бухгалтерия предприятия» (БП) часто возникает необходимость изменить стандартную логику сопоставления объектов. Например, типовые правила могут искать номенклатуру по внутреннему идентификатору или наименованию, в то время как бизнес-процессы требуют точного поиска по артикулу.

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

Разбор механики поиска в Универсальном формате

Прежде чем переходить к коду, проанализируем, как система ищет объект при загрузке XML-файла. Процесс происходит строго в три этапа:

  1. Поиск по уникальному идентификатору (GUID): Система проверяет наличие записи в регистре сведений СоответствияОбъектовИнформационныхБаз. Если объект ранее уже успешно передавался, связь зафиксирована, и поиск по полям (артикул, наименование) не выполняется.
  2. Поиск по ссылке из XML: Если прямой связи в регистре нет, система пытается найти объект по GUID, переданному в текущем файле обмена.
  3. Поиск по полям поиска: Если предыдущие шаги не дали результата, вступают в силу правила, описанные в ПКО (Правилах конвертации объектов). Именно этот этап мы и будем кастомизировать.

Важно понимать: логика поиска описывается в модуле менеджера обмена конфигурации-приемника. Следовательно, если вы хотите, чтобы номенклатура искалась по артикулу при загрузке в БП, изменения нужно вносить именно в БП, а не в УТ.

Решение задачи с помощью расширения конфигурации

Если ваша база «1С:Бухгалтерия» находится на поддержке или размещена в облаке, оптимальный способ внесения изменений — создание расширения. Мы переопределим процедуру инициализации правил поиска для справочника Номенклатура.

Рассмотрим алгоритм действий по шагам:

1. Определим версию формата. В настройках синхронизации посмотрите, какая версия универсального формата используется (например, 1.3 или 1.13). От этого зависит выбор общего модуля. Для версии 1.13 это будет МенеджерОбменаЧерезУниверсальныйФормат13.

2. Создадим расширение. В расширение необходимо добавить выбранный общий модуль менеджера обмена.

3. Переопределим ПКО. Нам нужна процедура, отвечающая за получение данных номенклатуры. Обычно она называется ДобавитьПКО_Справочник_Номенклатура_Получение.

Проанализируем пример кода, который нужно разместить в модуле расширения:


&После("ДобавитьПКО_Справочник_Номенклатура_Получение")
Процедура Расш1_ДобавитьПКО_Справочник_Номенклатура_Получение(ПравилаКонвертации)
    
    // Находим правило в коллекции
    ПравилоКонвертации = ПравилаКонвертации.Найти("Справочник_Номенклатура_Получение", "ИмяПКО");
    
    Если ПравилоКонвертации <> Неопределено Тогда
        // Очищаем стандартные поля поиска
        ПравилоКонвертации.ПоляПоиска.Очистить();
        
        // Добавляем поиск по Артикулу и признаку Группы
        // Запятая внутри строки означает поиск по СОВОКУПНОСТИ этих полей
        ПравилоКонвертации.ПоляПоиска.Добавить("Артикул, ЭтоГруппа");
        
        // Если нужно, чтобы при неудаче по артикулу система попробовала найти по наименованию,
        // можно добавить еще одну строку (второй вариант поиска)
        // ПравилоКонвертации.ПоляПоиска.Добавить("Наименование, ЭтоГруппа");
    КонецЕсли;

КонецПроцедуры

Почему рекомендуется использовать &После вместо &Вместо?

Рассмотрим ситуацию с использованием метода &Вместо. Если вы полностью копируете типовой код процедуры в расширение, то при обновлении основной конфигурации ваши правила могут перестать работать или вызвать ошибки, если фирма «1С» изменит структуру инициализации ПКО. Используя &После, мы дожидаемся выполнения типового кода и лишь затем точечно корректируем коллекцию ПоляПоиска. Это гораздо более устойчивый к обновлениям подход.

Особенности работы в 1С:Fresh

Если ваша база работает в сервисе 1С:Fresh, к расширению предъявляются дополнительные требования:

Важный нюанс: Передача данных из УТ

Выясним причину, по которой поиск может не заработать даже после изменения кода в БП. Правила поиска в приемнике бесполезны, если источник не передает необходимые данные. Проверьте ПКО Номенклатуры в «Управлении торговлей»:

  1. Убедитесь, что свойство Артикул включено в состав выгружаемых данных.
  2. Проверьте, что формат артикула (наличие префиксов, пробелов) совпадает в обеих базах.
  3. Если в БП вы настроили поиск "Артикул, ЭтоГруппа, Родитель", то УТ также должна передавать иерархию (родителя) для каждого элемента.

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

Альтернативный метод (без программирования)

Если задача разовая или объектов немного, воспользуйтесь стандартным механизмом «Сопоставление данных». В окне синхронизации при возникновении «несопоставленных данных» можно нажать кнопку «Настроить сопоставление» и вручную указать колонку «Артикул» для связи. Однако для автоматического и регулярного обмена программный метод через расширение, описанный выше, является единственным надежным решением.

← На главную