Как выгрузить только номенклатуру, используемую в документе, в 1С:Конвертация данных 2.1?

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

При разработке правил обмена между конфигурациями 1С с помощью конфигурации «1С:Конвертация данных 2.1» (КД 2) начинающие разработчики часто сталкиваются с неприятной проблемой. При попытке выгрузить один или несколько документов система внезапно начинает выгружать абсолютно все элементы связанных справочников. Например, при выгрузке одного документа поступления, содержащего всего две позиции, в файл обмена «тянется» весь многотысячный справочник «Номенклатура».

Давайте подробно разберем, почему так происходит, как устроен механизм выгрузки ссылочных данных в КД 2.1, и как решить эту проблему простым и правильным способом без написания лишнего кода.

Выясняем причину: почему выгружается весь справочник?

Главная причина кроется в использовании автоматического конструктора правил в «Конвертации данных». Когда мы создаем правила обмена «по букварю» и автоматически генерируем все настройки, система создает для нас три типа метаданных:

  1. ПКО (Правила конвертации объектов) — определяют, как именно поля объекта источника сопоставляются с полями объекта приемника (например, какие реквизиты справочника Номенклатура переносить).
  2. ПКС (Правила конвертации свойств) — описывают правила переноса конкретных реквизитов внутри ПКО.
  3. ПВД (Правила выгрузки данных) — определяют, какие именно данные и по какому алгоритму нужно выбрать из базы-источника для последующей выгрузки.

Когда мы запускаем выгрузку через стандартную обработку Универсальный обмен данными в формате XML (файл V8Exchan82.epf), на вкладке выгрузки по умолчанию выводятся все созданные нами ПВД. Так как автоматический конструктор создал ПВД для справочника Номенклатура, в дереве объектов обмена напротив него стоит галочка. При запуске обмена обработка честно выполняет это правило: делает запрос ко всей таблице справочника в базе-источнике и выгружает все сотни тысяч записей подряд.

Правильное стандартное решение: выгрузка по ссылке

В системе «1С:Конвертация данных» заложен мощный механизм автоматического прослеживания связей. Чтобы справочники выгружались только тогда, когда они реально используются в документах, нам **не нужно писать код** или переопределять стандартные выборки. Достаточно скорректировать структуру наших правил выгрузки.

Давайте разберем по шагам, как это сделать:

  1. Откроем нашу настройку правил в конфигурации «Конвертация данных 2.1».
  2. Перейдем на вкладку «Правила выгрузки данных» (ПВД).
  3. Найдем в списке ПВД для справочника Номенклатура (а также для других связанных справочников, таких как Контрагенты, ДоговорыКонтрагентов, ЕдиницыИзмерения) и удалим их. Также можно просто отключить их, если вы не хотите удалять правила насовсем.
  4. Важно: правила конвертации объектов (ПКО) для этих справочников удалять ни в коем случае нельзя! ПКО для справочника Номенклатура должно оставаться активным и настроенным.
  5. Сохраним обновленные правила обмена в XML-файл и загрузим их в обработку выгрузки.

Как теперь это работает? В списке объектов выгрузки в обработке обмена останутся только документы. Когда вы отметите нужный документ и запустите процесс, КД начнет выгрузку по правилу этого документа. Обрабатывая табличную часть со свойствами (через ПКС), система наткнется на реквизит типа СправочникСсылка.Номенклатура. Механизм обмена мгновенно обратится к ПКО номенклатуры и выгрузит конкретный элемент, на который ссылается документ. Таким образом, будут перенесены только те две позиции, которые указаны в документе, а весь остальной справочник останется нетронутым.

Разбор альтернативных вариантов: стоит ли использовать код?

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

Давайте проанализируем, как мог бы выглядеть такой код:


// Пример избыточного кода в обработчике "Перед выгрузкой" документа
Для Каждого СтрокаТЧ Из Источник.Товары Цикл
    ПараметрыВыгрузки = Новый Структура;
    ВыгрузитьПоПравилу(СтрокаТЧ.Номенклатура, , ПараметрыВыгрузки, , "Номенклатура");
КонецЦикла;

Использовать подобный подход для решения нашей задачи — это классическое «изобретение велосипеда». Написание такого кода вручную избыточно по нескольким причинам:

Использование метода ВыгрузитьПоПравилу оправдано исключительно в нестандартных ситуациях. Например, когда в базе-источнике данные хранятся в регистре сведений, а в приемнике их нужно записать в табличную часть документа, либо при сложной трансформации структуры данных «на лету».

Дополнительные полезные настройки при выгрузке по ссылке

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

1. Флаг «Не выгружать объекты свойств источника по ссылкам» в ПКО
Если вы уверены, что вся необходимая номенклатура уже создана в базе-приемнике, и вам нужно передать только сам документ (чтобы позиции сопоставились по идентификатору, но реквизиты самой номенклатуры не перезаписывались), установите этот флаг в ПКО Номенклатуры. В файл обмена запишется только ссылка (УИД), без выгрузки наименования, кода, родителя и других свойств.

2. Флаг «Не создавать новые объекты в приемнике, если они не найдены»
Полезная опция для предотвращения появления «мусора» в приемнике. Если в документе источника указана позиция, которой физически нет в приемнике, система не создаст пустой или недозаполненный элемент, а просто оставит поле в документе незаполненным (или выдаст предупреждение в зависимости от настроек).

3. Флаг «Не замещать существующие объекты в приемнике при загрузке»
Если справочники в обеих базах ведутся параллельно и пользователи могут вручную изменять наименования или другие реквизиты в базе-приемнике, этот флаг защитит данные приемника от затирания старыми или отличающимися значениями из источника при повторном обмене документами.

4. Настройка полей поиска в ПКО
Для успешного сопоставления объектов крайне важно правильно определить поля поиска. Перейдите в ПКО вашей номенклатуры на вкладку «Поля поиска» и настройте правила сопоставления (например, сначала по уникальному идентификатору UID, а если не найдено — по Коду или Артикулу). Это гарантирует, что при выгрузке по ссылкам в базе-приемнике не будут плодиться дубликаты элементов.

Резюме

Автоматическое создание правил обмена в 1С:Конвертация данных — отличный инструмент для быстрого старта, но его результаты всегда требуют ручной доработки. Помните золотое правило разработчика КД: «Правила выгрузки данных (ПВД) создаются только для тех объектов, которые должны являться самостоятельными инициаторами выгрузки». Для документов ПВД необходимы, а для подчиненных им справочников — практически никогда.

← На главную