При использовании синхронизации данных через универсальный формат (Enterprise Data) между конфигурациями «Управление торговлей» (УТ) и «Бухгалтерия предприятия» (БП) часто возникает необходимость изменить стандартную логику сопоставления объектов. Например, типовые правила могут искать номенклатуру по внутреннему идентификатору или наименованию, в то время как бизнес-процессы требуют точного поиска по артикулу.
В этой статье мы подробно разберем, почему правки на стороне источника (УТ) не дадут результата и как правильно модифицировать правила поиска на стороне приемника (БП), не снимая конфигурацию с поддержки, что особенно актуально для баз, работающих в сервисе 1С:Fresh.
Прежде чем переходить к коду, проанализируем, как система ищет объект при загрузке XML-файла. Процесс происходит строго в три этапа:
СоответствияОбъектовИнформационныхБаз. Если объект ранее уже успешно передавался, связь зафиксирована, и поиск по полям (артикул, наименование) не выполняется.Важно понимать: логика поиска описывается в модуле менеджера обмена конфигурации-приемника. Следовательно, если вы хотите, чтобы номенклатура искалась по артикулу при загрузке в БП, изменения нужно вносить именно в БП, а не в УТ.
Если ваша база «1С:Бухгалтерия» находится на поддержке или размещена в облаке, оптимальный способ внесения изменений — создание расширения. Мы переопределим процедуру инициализации правил поиска для справочника Номенклатура.
Рассмотрим алгоритм действий по шагам:
1. Определим версию формата. В настройках синхронизации посмотрите, какая версия универсального формата используется (например, 1.3 или 1.13). От этого зависит выбор общего модуля. Для версии 1.13 это будет МенеджерОбменаЧерезУниверсальныйФормат13.
2. Создадим расширение. В расширение необходимо добавить выбранный общий модуль менеджера обмена.
3. Переопределим ПКО. Нам нужна процедура, отвечающая за получение данных номенклатуры. Обычно она называется ДобавитьПКО_Справочник_Номенклатура_Получение.
Проанализируем пример кода, который нужно разместить в модуле расширения:
&После("ДобавитьПКО_Справочник_Номенклатура_Получение")
Процедура Расш1_ДобавитьПКО_Справочник_Номенклатура_Получение(ПравилаКонвертации)
// Находим правило в коллекции
ПравилоКонвертации = ПравилаКонвертации.Найти("Справочник_Номенклатура_Получение", "ИмяПКО");
Если ПравилоКонвертации <> Неопределено Тогда
// Очищаем стандартные поля поиска
ПравилоКонвертации.ПоляПоиска.Очистить();
// Добавляем поиск по Артикулу и признаку Группы
// Запятая внутри строки означает поиск по СОВОКУПНОСТИ этих полей
ПравилоКонвертации.ПоляПоиска.Добавить("Артикул, ЭтоГруппа");
// Если нужно, чтобы при неудаче по артикулу система попробовала найти по наименованию,
// можно добавить еще одну строку (второй вариант поиска)
// ПравилоКонвертации.ПоляПоиска.Добавить("Наименование, ЭтоГруппа");
КонецЕсли;
КонецПроцедуры
Рассмотрим ситуацию с использованием метода &Вместо. Если вы полностью копируете типовой код процедуры в расширение, то при обновлении основной конфигурации ваши правила могут перестать работать или вызвать ошибки, если фирма «1С» изменит структуру инициализации ПКО. Используя &После, мы дожидаемся выполнения типового кода и лишь затем точечно корректируем коллекцию ПоляПоиска. Это гораздо более устойчивый к обновлениям подход.
Если ваша база работает в сервисе 1С:Fresh, к расширению предъявляются дополнительные требования:
&Вместо без веских причин может стать поводом для отклонения расширения. Наш пример с &После проходит аудит значительно легче.Выясним причину, по которой поиск может не заработать даже после изменения кода в БП. Правила поиска в приемнике бесполезны, если источник не передает необходимые данные. Проверьте ПКО Номенклатуры в «Управлении торговлей»:
Артикул включено в состав выгружаемых данных."Артикул, ЭтоГруппа, Родитель", то УТ также должна передавать иерархию (родителя) для каждого элемента.Рассмотрим также ситуацию с иерархией. Если вы используете поиск только по артикулу, убедитесь, что у групп номенклатуры в УТ также заполнены уникальные артикулы, либо исключите группы из логики поиска, анализируя флаг ЭтоГруппа.
Если задача разовая или объектов немного, воспользуйтесь стандартным механизмом «Сопоставление данных». В окне синхронизации при возникновении «несопоставленных данных» можно нажать кнопку «Настроить сопоставление» и вручную указать колонку «Артикул» для связи. Однако для автоматического и регулярного обмена программный метод через расширение, описанный выше, является единственным надежным решением.