При разработке правил обмена между конфигурациями 1С с помощью конфигурации «1С:Конвертация данных 2.1» (КД 2) начинающие разработчики часто сталкиваются с неприятной проблемой. При попытке выгрузить один или несколько документов система внезапно начинает выгружать абсолютно все элементы связанных справочников. Например, при выгрузке одного документа поступления, содержащего всего две позиции, в файл обмена «тянется» весь многотысячный справочник «Номенклатура».
Давайте подробно разберем, почему так происходит, как устроен механизм выгрузки ссылочных данных в КД 2.1, и как решить эту проблему простым и правильным способом без написания лишнего кода.
Главная причина кроется в использовании автоматического конструктора правил в «Конвертации данных». Когда мы создаем правила обмена «по букварю» и автоматически генерируем все настройки, система создает для нас три типа метаданных:
Номенклатура переносить).Когда мы запускаем выгрузку через стандартную обработку Универсальный обмен данными в формате XML (файл V8Exchan82.epf), на вкладке выгрузки по умолчанию выводятся все созданные нами ПВД. Так как автоматический конструктор создал ПВД для справочника Номенклатура, в дереве объектов обмена напротив него стоит галочка. При запуске обмена обработка честно выполняет это правило: делает запрос ко всей таблице справочника в базе-источнике и выгружает все сотни тысяч записей подряд.
В системе «1С:Конвертация данных» заложен мощный механизм автоматического прослеживания связей. Чтобы справочники выгружались только тогда, когда они реально используются в документах, нам **не нужно писать код** или переопределять стандартные выборки. Достаточно скорректировать структуру наших правил выгрузки.
Давайте разберем по шагам, как это сделать:
Номенклатура (а также для других связанных справочников, таких как Контрагенты, ДоговорыКонтрагентов, ЕдиницыИзмерения) и удалим их. Также можно просто отключить их, если вы не хотите удалять правила насовсем.Номенклатура должно оставаться активным и настроенным.Как теперь это работает? В списке объектов выгрузки в обработке обмена останутся только документы. Когда вы отметите нужный документ и запустите процесс, КД начнет выгрузку по правилу этого документа. Обрабатывая табличную часть со свойствами (через ПКС), система наткнется на реквизит типа СправочникСсылка.Номенклатура. Механизм обмена мгновенно обратится к ПКО номенклатуры и выгрузит конкретный элемент, на который ссылается документ. Таким образом, будут перенесены только те две позиции, которые указаны в документе, а весь остальной справочник останется нетронутым.
В процессе обсуждения подобных проблем часто звучат советы использовать ручной вызов выгрузки в обработчиках событий. Например, предлагают написать в обработчике «Перед выгрузкой» документа цикл по строкам и вручную отправлять номенклатуру на конвертацию.
Давайте проанализируем, как мог бы выглядеть такой код:
// Пример избыточного кода в обработчике "Перед выгрузкой" документа
Для Каждого СтрокаТЧ Из Источник.Товары Цикл
ПараметрыВыгрузки = Новый Структура;
ВыгрузитьПоПравилу(СтрокаТЧ.Номенклатура, , ПараметрыВыгрузки, , "Номенклатура");
КонецЦикла;
Использовать подобный подход для решения нашей задачи — это классическое «изобретение велосипеда». Написание такого кода вручную избыточно по нескольким причинам:
ВыгрузитьПоПравилу может нарушить логику кэширования объектов КД, что в худшем случае приведет к дублированию данных при загрузке.Использование метода ВыгрузитьПоПравилу оправдано исключительно в нестандартных ситуациях. Например, когда в базе-источнике данные хранятся в регистре сведений, а в приемнике их нужно записать в табличную часть документа, либо при сложной трансформации структуры данных «на лету».
Когда мы настраиваем перенос справочников только по ссылкам из документов, полезно знать о сопутствующих опциях в настройках ПКО и ПКС, которые помогут сделать обмен чистым и безопасным.
1. Флаг «Не выгружать объекты свойств источника по ссылкам» в ПКО
Если вы уверены, что вся необходимая номенклатура уже создана в базе-приемнике, и вам нужно передать только сам документ (чтобы позиции сопоставились по идентификатору, но реквизиты самой номенклатуры не перезаписывались), установите этот флаг в ПКО Номенклатуры. В файл обмена запишется только ссылка (УИД), без выгрузки наименования, кода, родителя и других свойств.
2. Флаг «Не создавать новые объекты в приемнике, если они не найдены»
Полезная опция для предотвращения появления «мусора» в приемнике. Если в документе источника указана позиция, которой физически нет в приемнике, система не создаст пустой или недозаполненный элемент, а просто оставит поле в документе незаполненным (или выдаст предупреждение в зависимости от настроек).
3. Флаг «Не замещать существующие объекты в приемнике при загрузке»
Если справочники в обеих базах ведутся параллельно и пользователи могут вручную изменять наименования или другие реквизиты в базе-приемнике, этот флаг защитит данные приемника от затирания старыми или отличающимися значениями из источника при повторном обмене документами.
4. Настройка полей поиска в ПКО
Для успешного сопоставления объектов крайне важно правильно определить поля поиска. Перейдите в ПКО вашей номенклатуры на вкладку «Поля поиска» и настройте правила сопоставления (например, сначала по уникальному идентификатору UID, а если не найдено — по Коду или Артикулу). Это гарантирует, что при выгрузке по ссылкам в базе-приемнике не будут плодиться дубликаты элементов.
Автоматическое создание правил обмена в 1С:Конвертация данных — отличный инструмент для быстрого старта, но его результаты всегда требуют ручной доработки. Помните золотое правило разработчика КД: «Правила выгрузки данных (ПВД) создаются только для тех объектов, которые должны являться самостоятельными инициаторами выгрузки». Для документов ПВД необходимы, а для подчиненных им справочников — практически никогда.