При настройке обмена данными между базами 1С с использованием инструмента «Конвертация данных 2.1» (КД 2.1) часто возникает проблема избыточно большого XML-файла. Это происходит, когда при выгрузке типового документа по цепочке ссылок автоматически подтягиваются десятки тысяч связанных объектов: контрагенты, договоры, номенклатура и прочие справочники. Такой объем данных не только замедляет обмен, но и может приводить к ошибкам и трудностям в обработке.
Давайте вместе разберем, как можно значительно сократить размер XML-файла, не выгружая полные данные всех связанных объектов, а вместо этого осуществляя поиск этих объектов в базе-приемнике по ключевым полям. Мы рассмотрим различные подходы и настройки, которые помогут вам эффективно управлять процессом конвертации данных.
Основная идея заключается в том, чтобы не передавать весь объем данных по связанному объекту из базы-источника в базу-приемник. Вместо этого мы будем выгружать только минимальный набор ключевых полей, по которым система в базе-приемнике сможет найти соответствующий элемент. Если элемент найден, будет использована существующая ссылка на него; если нет – мы можем настроить поведение системы.
Настройка полей поиска в Правиле конвертации объектов (ПКО):
Для того чтобы не выгружать весь объект, например, «Контрагент», а только его ключевые поля (такие как ИНН, Наименование, БИН), необходимо правильно настроить соответствующее Правило конвертации объектов (ПКО) для этого справочника. Откройте ПКО для справочника «Контрагенты» (или любого другого ссылочного типа, который вы хотите оптимизировать). На вкладке «Настройки» этого ПКО найдите список реквизитов и в колонке «Поиск» отметьте галочками те реквизиты, по которым должен осуществляться поиск в базе-приемнике. Это могут быть ИНН, Наименование, БИН, Код или любые другие уникальные для вашей системы идентификаторы. Отмечая эти поля, вы даете указание системе КД 2.1 искать в базе-приемнике объект, у которого значения выбранных реквизитов совпадают с выгруженными.
Многоступенчатый поиск для повышения надежности:
Иногда одного поля для надежного поиска недостаточно, или есть несколько возможных вариантов идентификации объекта. В таких случаях мы можем организовать более сложный, многоступенчатый поиск. Например, сначала система может попытаться найти контрагента по ИНН, а если такой объект не найден, то продолжить поиск по Наименованию. Такой алгоритм настраивается в обработчике события «Поля поиска» в ПКО. Здесь вы можете написать код, который динамически будет определять, по каким полям и в какой последовательности следует производить поиск. Это дает значительную гибкость и позволяет адаптировать логику поиска под специфические требования вашего обмена.
// Пример обработчика "Поля поиска" в ПКО справочника "Контрагенты"
// Это код будет выполняться в базе-приемнике
Если Источник.ИНН <> "" Тогда
ПоляПоиска.Добавить("ИНН");
Иначе
ПоляПоиска.Добавить("Наименование");
КонецЕсли;
Отказ от поиска по внутреннему идентификатору (GUID):
По умолчанию, КД 2.1 часто пытается искать объекты по их внутреннему идентификатору (GUID). Однако, если объекты в разных базах создавались независимо или проходили через различные миграции, их GUID могут не совпадать, даже если это один и тот же логический объект (например, один и тот же контрагент). В таких случаях поиск по GUID будет неэффективен или даже вреден, так как приведет к созданию дубликатов. Для корректной работы поиска по полям может потребоваться отключить стандартный поиск по внутреннему идентификатору объекта в ПКО. Это можно сделать на вкладке «Настройки» ПКО, сняв флажок с опции, связанной с поиском по уникальному идентификатору.
После того как мы настроили механизм поиска по ключевым полям, нам необходимо определить, как система должна себя вести, если объект найден или не найден в базе-приемнике. В настройках ПКО предусмотрены флажки, которые позволяют гибко управлять этим поведением.
Что делать, если объект не найден: опция «Не создавать новые объекты в приемнике при загрузке»
Это одна из самых важных настроек для решения нашей задачи. Если мы хотим, чтобы в случае отсутствия контрагента в базе-приемнике новое его создание не происходило, а документ просто переносился без этой ссылки, мы должны установить флажок «Не создавать новые объекты в приемнике при загрузке». Этот флажок находится на вкладке «Настройки» в ПКО для ссылочного объекта (например, справочника «Контрагенты»).
Как это работает: Когда система пытается найти контрагента по заданным вами полям (ИНН, Наименование и т.д.) и не находит совпадений, вместо того чтобы создать новый элемент справочника в базе-приемнике, она просто проигнорирует создание этого элемента. В документе, который ссылался на этого контрагента, поле для контрагента останется пустым, но сам документ при этом успешно загрузится со всеми остальными реквизитами. Это именно то поведение, которое часто требуется, когда мы не хотим «засорять» базу-приемник новыми элементами НСИ из других систем.
Важно: Еще раз подчеркнем, что эту настройку мы применяем к ПКО самого справочника (например, «Контрагенты»), а не к ПКО документа, который на него ссылается. Это обеспечивает контроль над созданием элементов справочника независимо от того, из какого документа пришла ссылка.
Предотвращение изменения данных: опция «Не замещать существующие объекты в приемнике при загрузке»
Еще один полезный флажок на вкладке «Настройки» в ПКО справочника – это «Не замещать существующие объекты в приемнике при загрузке». Если вы установите этот флажок, система будет вести себя следующим образом: если контрагент по заданным полям поиска будет найден в базе-приемнике, система просто подставит ссылку на этот найденный объект в документ. Однако она при этом не будет пытаться обновлять реквизиты найденного контрагента, даже если в выгруженных данных из базы-источника есть какие-либо изменения. Эта настройка полезна в ситуациях, когда нормативно-справочная информация (НСИ) управляется строго в базе-приемнике, и мы хотим избежать несанкционированного изменения данных из внешних источников.
Использование опции «При переносе объекта по ссылке только переносить ссылку» в Правиле конвертации свойств (ПКС):
В КД 2.1 существует также настройка в Правиле конвертации свойств (ПКС), которая называется «При переносе объекта по ссылке только переносить ссылку». Когда вы устанавливаете эту галку для какого-либо реквизита документа (например, реквизита «Контрагент» в ПКС для поля документа), это предотвращает рекурсивную выгрузку связанного объекта целиком. Вместо того чтобы выгружать всю информацию о контрагенте, система выгрузит только его уникальный идентификатор (GUID). Однако, как мы уже обсуждали, прямая передача GUID может быть неэффективна или ошибочна, если GUID объектов в разных базах различаются при одинаковом логическом содержимом. Поэтому для надежного и гибкого поиска объектов предпочтительнее использовать именно настройку полей поиска в ПКО и флажок «Не создавать новые объекты», а не полагаться только на перенос ссылки.
Для реализации более сложных и специфических сценариев обмена данными в 1С:Конвертации 2.1 мы можем активно использовать обработчики событий. Они предоставляют возможность программно управлять процессом выгрузки и загрузки данных.
Обработчик «Перед выгрузкой»:
Этот обработчик срабатывает непосредственно перед тем, как объект или свойство будет выгружено. Он позволяет нам контролировать, какие данные должны попасть в XML-файл. Например, вы можете программно проанализировать объект-источник, и если он не соответствует определенным условиям (например, помечен на удаление или не актуален), вы можете отменить его выгрузку, установив параметру Отказ значение Истина. Также в этом обработчике можно передать дополнительные данные в параметры выгрузки, которые будут доступны на стороне приемника для реализации сложной логики.
Рассмотрим пример, когда мы не хотим выгружать объекты, помеченные на удаление:
// Пример кода в обработчике "ПередВыгрузкой" для ПКО
// Это код будет выполняться в базе-источнике
Если Источник.ПометкаУдаления Тогда
Отказ = Истина;
СообщениеОбОшибке = "Объект помечен на удаление, выгрузка отменена.";
КонецЕсли;
// Пример кода в обработчике "ПередВыгрузкой" для ПКС
// для свойства "Контрагент", чтобы не выгружать его полное значение,
// если это не требуется, и передать только часть информации
Если Свойство.Имя = "Контрагент" Тогда
// Если нужно просто передать ИНН для поиска, не выгружая весь объект
Значение = Источник.Контрагент.ИНН; // Передаем только ИНН
Отказ = Истина; // Отменяем стандартную выгрузку объекта по ссылке
// Далее в ПКС для ИНН контрагента будет настроен поиск
КонецЕсли;
Обработчик «После загрузки»:
Данный обработчик срабатывает уже в базе-приемнике после того, как объект был загружен или найден. Здесь мы можем выполнить дополнительные действия, которые невозможно или нецелесообразно было выполнить на этапе конвертации. Например, можно дозаполнить какие-либо реквизиты, которые не были перенесены из-за их специфики, выполнить проверки корректности загруженных данных или установить значения по умолчанию, если какие-то ссылки остались пустыми.
Давайте посмотрим, как можно обработать ситуацию, когда контрагент не был найден и поле осталось пустым:
// Пример кода в обработчике "ПослеЗагрузки" для ПКО документа
// Это код будет выполняться в базе-приемнике
Если ОбъектПриемника.Контрагент.Пустая() Тогда
// Если контрагент не был найден и поле осталось пустым,
// мы можем установить значение по умолчанию или выполнить другую логику.
// Например, найти предопределенный элемент "Неизвестный контрагент"
ОбъектПриемника.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("Неизвестный контрагент").Ссылка;
Сообщение("В документе " + ОбъектПриемника.Номер + " не найден контрагент. Установлено значение 'Неизвестный контрагент'.", СтатусСообщения.Информация);
КонецЕсли;
// Дополнительная логика, например, дозаполнение полей
Если ОбъектПриемника.ВидДоговора = Перечисления.ВидыДоговоров.Основной Тогда
ОбъектПриемника.Комментарий = "Договор является основным для данного контрагента.";
КонецЕсли;
Для еще большей оптимизации и гибкости в настройке обменов данными, мы рекомендуем рассмотреть следующие аспекты:
Создание нескольких Правил Конвертации Объектов (ПКО) для одного типа объектов:
Инструмент КД 2.1 позволяет создавать несколько правил конвертации для одного и того же типа объекта-источника (например, Справочник.Контрагенты). Это очень мощная функция для реализации сложных сценариев. Мы можем использовать одно ПКО, настроенное только для поиска по ключевым полям, с установленным флажком «Не создавать новые объекты». Это ПКО будет использоваться для всех обычных ссылок на контрагента. При этом мы можем создать второе ПКО для того же справочника, которое будет отвечать за полноценное создание нового контрагента со всеми реквизитами, но вызывать его только в строго определенных случаях, когда создание нового элемента действительно оправдано (например, если контрагент вообще не должен существовать в базе-приемнике, но его данные критичны для документа). Выбор правила, которое будет использоваться, осуществляется в Правиле конвертации свойств (ПКС), где мы можем указать конкретное ПКО по имени или по условию.
Оптимизация порядка правил конвертации:
Для повышения производительности процесса выгрузки данных рекомендуется тщательно продумать и настроить порядок следования правил выгрузки. Общее правило: зависимые объекты должны обрабатываться раньше, чем те, которые на них ссылаются. То есть, сначала должны идти правила для справочников (Контрагенты, Номенклатура), затем для регистров сведений, а уже потом правила для документов, которые на эти справочники ссылаются. Это минимизирует количество повторных обращений к базе данных и ускоряет процесс формирования XML-файла.
Выгрузка данных одним запросом:
Если в вашем Правиле конвертации объектов (ПКО) не требуется сложная программная обработка каждого объекта (например, использование обработчиков «Перед выгрузкой» или «После выгрузки»), вы можете использовать режим «Выбирать данные для выгрузки одним запросом». Этот режим находится в настройках ПКО. При его активации система будет получать все данные одного типа объекта из базы-источника одним запросом к базе данных, а не выполнять отдельные запросы для каждого объекта. Это может значительно ускорить процесс выгрузки, особенно при работе с большими объемами данных, так как сокращается накладные расходы на множественные обращения к СУБД.
Применяя эти подходы, мы сможем значительно оптимизировать процесс обмена данными, сократить размер XML-файлов, повысить производительность и обеспечить требуемую логику работы со связанными объектами, избегая нежелательного создания дубликатов или избыточного переноса информации.