При проектировании правил обмена в конфигурации «1С:Конвертация данных 2.1» (КД 2.1) одним из наиболее важных и в то же время запутанных этапов является настройка синхронизации (сопоставления) данных между источником и приемником. Неверно выставленные флаги в правилах конвертации объектов (ПКО) или правилах конвертации свойств (ПКС) могут привести либо к лавинообразному появлению дублей в базе-приемнике, либо к затиранию существующих данных. Если правила уже подготовлены и требуется запустить регулярную синхронизацию, можно применить решение для автоматического обмена данными между базами 1С по расписанию.
В этой статье мы подробно разберем, как ведет себя обработка загрузки УниверсальныйОбменДаннымиXML при различных комбинациях настроек поиска. Мы ответим на ключевые вопросы: как ищется объект, если отключен поиск по уникальному идентификатору (UUID), и в каких случаях срабатывает популярный обработчик событий «Поля поиска».
---
Рассмотрим ситуацию, когда в настройках ПКО вы намеренно **сняли флаг** «Искать объект приемника по внутреннему идентификатору...». При этом флаг «Продолжить поиск по полям поиска...» также не установлен, но в таблице ПКС для некоторых свойств (например, Дата и Номер для документов или ИНН и КПП для контрагентов) взведены флажки в колонке «Поиск».
Выясним, как поведет себя система в этом случае:
Проанализируем пример. Если свойствами поиска назначены Дата и Номер, система выполнит в базе-приемнике запрос, аналогичный следующему:
ВЫБРАТЬ Ссылка
ИЗ Документ.РеализацияТоваровУслуг
ГДЕ Проведен = Ложь И ПометкаУдаления = Ложь И Номер = &Номер И Дата = &Дата
Если объект с такими параметрами будет найден, система сопоставит его и перезапишет поверх новыми данными из источника. Если не найден — будет создан новый элемент.
---
Что произойдет, если в настройках ПКО вы отключили поиск по ИД, а в табличной части ПКС не отметили ни одного поля флагом «Поиск»? Рассмотрим последствия такой настройки:
---
Один из самых частых вопросов разработчиков: будет ли выполняться код в обработчике «Поля поиска», если флаг «Продолжить поиск по полям поиска» в ПКО снят?
Ответ на этот вопрос напрямую зависит от состояния флага «Искать по ИД». Давайте разберем эту зависимость с помощью таблицы:
| Искать по ИД | Продолжить поиск по полям поиска | Выполнится ли обработчик «Поля поиска»? |
|---|---|---|
| Истина | Истина | Да (но только если объект не был найден по UUID). |
| Истина | Ложь | Нет. Если объект не найден по UUID, система сразу создаст новый, не заходя в обработчик. |
| Ложь | Истина | Да. Поиск по полям выполняется сразу, обработчик сработает. |
| Ложь | Ложь | Да. Так как поиск по ИД отключен, поиск по реквизитам становится основным сценарием. Система проигнорирует значение флага «Продолжить поиск» и выполнит обработчик. |
Таким образом, если вы хотите отключить сопоставление по UUID и выполнять только кастомный поиск через обработчик, вам достаточно установить «Искать по ИД» в значение Ложь. Флаг «Продолжить поиск по полям поиска» при этом на выполнение обработчика никак не повлияет.
---
Для успешного применения обработчика «Поля поиска» недостаточно просто написать в нем код. Важно понимать внутреннюю кухню работы платформы в этот момент.
1. Доступность данных в коллекции СвойстваПоиска
Чтобы реквизиты объекта были доступны внутри обработчика через структуру СвойстваПоиска (например, СвойстваПоиска["ИНН"]), у соответствующих ПКС в правилах конвертации обязательно должен стоять флаг «Поиск». Если флаг не установлен, эти данные просто не будут выгружены в xml-файл в узел ссылки и обработчик не сможет получить к ним доступ, так как сам объект в базе-приемнике еще не считан.
2. Передача параметров поиска
Иногда требуется выполнить сопоставление по реквизиту, который не должен записываться в базу-приемник. В таком случае в ПКС для данного свойства выберите режим «Передавать данные в параметр» и установите флаг «Поиск». В обработчике это значение будет доступно через структуру ПараметрыОбъекта. Для реализации подобного сценария подойдёт пример сопоставления объектов по дополнительному реквизиту.
3. Использование многошагового поиска через НомерВариантаПоиска
КД 2.1 позволяет реализовать сложные алгоритмы каскадного поиска. Обработка загрузки запускает данный обработчик в цикле, последовательно увеличивая переменную НомерВариантаПоиска (1, 2, 3 и т.д.).
Рассмотрим пример реализации такого поиска для контрагентов. На первом шаге мы пытаемся найти контрагента по связке ИНН + КПП. Если поиск не дал результатов, на втором шаге ищем только по ИНН. Если и это не помогло — сопоставляем по Наименованию.
Если НомерВариантаПоиска = 1 Тогда
// Шаг 1: Ищем по ИНН и КПП
СтрокаИменСвойствПоиска = "ИНН, КПП";
ИначеЕсли НомерВариантаПоиска = 2 Тогда
// Шаг 2: Если не нашли, пробуем только по ИНН
СтрокаИменСвойствПоиска = "ИНН";
ИначеЕсли НомерВариантаПоиска = 3 Тогда
// Шаг 3: В крайнем случае ищем по наименованию
СтрокаИменСвойствПоиска = "Наименование";
КонецЕсли;
4. Ручное управление поиском (обход стандартного механизма)
Вы можете полностью отказаться от стандартных запросов, которые платформа генерирует автоматически. Для этого внутри обработчика напишите собственный произвольный запрос (или используйте быстрые методы менеджеров, такие как НайтиПоРеквизиту() или НайтиПоНаименованию()). Найденную ссылку нужно записать в специальную переменную СсылкаНаОбъект, после чего остановить дальнейшие шаги поиска.
Посмотрим на пример практической реализации ручного поиска:
// Пример ручного поиска контрагента по ИНН
ИННДляПоиска = СвойстваПоиска["ИНН"];
Если ЗначениеЗаполнено(ИННДляПоиска) Тогда
НайденнаяСсылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИННДляПоиска);
Если Не НайденнаяСсылка.Пустая() Тогда
СсылкаНаОбъект = НайденнаяСсылка;
ПрекратитьПоиск = Истина; // Прерываем стандартный алгоритм КД
КонецЕсли;
КонецЕсли;
---
Архитектура платформы «1С:Предприятие» накладывает жесткие правила на работу со ссылочными типами данных. При переносе объектов важно помнить, как поиск влияет на генерацию и изменение UUID в базе-приемнике:
Понимание этих нюансов позволит вам проектировать надежные и стабильные правила обмена, исключающие появление дублей и рассинхронизацию баз данных. Чтобы быстро проконтролировать корректность переноса документов и обнаружить возможные расхождения в проводках, можно использовать программу для автоматической сверки данных между базами 1С через COM-соединение.