Как убрать лишние договоры при выгрузке документов в 1С:Конвертация данных

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

При настройке обмена данными между конфигурациями УПП 1.3 и БП 2.0 (или любыми другими на базе 1С:Предприятие 8) программисты часто сталкиваются с проблемой «избыточности». Типичная ситуация: мы выгружаем один документ РеализацияТоваровУслуг, а в базу-приемник «прилетает» не только сам документ и один связанный договор, но и весь список договоров данного контрагента. Это засоряет базу, создает дубли и увеличивает время обмена. Разберем подробно, почему это происходит и как «закрыть дыру» в правилах конвертации.

Причина №1: Выгрузка коллекции в ПКО «Контрагенты»

Проанализируем механизм работы 1С:Конвертация данных 2.1. Когда система встречает реквизит типа СправочникСсылка.ДоговорыКонтрагентов в документе, она обращается к соответствующему Правилу Конвертации Объекта (ПКО). Однако перед этим выгружается владелец договора — Контрагент. Именно здесь чаще всего скрыта проблема.

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

Как это исправить:

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

// В обработчике ПКС "Договоры" справочника "Контрагенты"
Отказ = 1; 

Таким образом, контрагент будет выгружен только с основными реквизитами (наименование, ИНН, КПП), а конкретный договор «подтянется» отдельно, только тот, который указан непосредственно в документе.

Причина №2: Настройки Правил Выгрузки Данных (ПВД)

Выясним, нет ли лишних галочек в настройках самих правил выгрузки. Если в дереве ПВД (Правила выгрузки данных) установлена галочка напротив справочника ДоговорыКонтрагентов, система может инициировать их выгрузку независимо от документов.

Проанализируем ситуацию: если вы используете стандартную обработку V8Exchan83.epf (или аналогичную для 8.2), и в списке объектов для выгрузки выбраны и документы, и справочники, то выгрузится всё дерево зависимостей. Для корректной работы достаточно оставить ПВД только для документов. Справочники, такие как Контрагенты, Номенклатура и Договоры, система выгрузит автоматически «по ссылке».

Причина №3: Флаг «Выгружать объект полностью»

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

Диагностика через анализ XML-файла

Если визуально в правилах всё кажется верным, проанализируем сам файл обмена. Откроем сформированный XML-файл любым текстовым редактором и найдем узел конкретного контрагента. Посмотрим на вложенные узлы:

Использование обработчиков для тонкой настройки

Иногда нам нужно, чтобы договоры выгружались, но не все. Например, только «действующие». В этом случае в ПВД или в ПКО Контрагента (в ПКС коллекции договоров) можно применить следующий код:


// Пример фильтрации договоров при выгрузке коллекции контрагента
КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("Договор");

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

Важный совет: В 90% случаев для решения проблемы «лишних договоров» достаточно просто зайти в ПКО Контрагенты и отключить (снять галочку) у свойства Договоры (или ЦепочкаДоговоров). В документе Реализация ссылка на договор и так присутствует, и Конвертация данных сама позаботится о том, чтобы выгрузить этот конкретный объект по ссылке, не трогая остальной список контрагента.

Проверка уникальности и поиска

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

← На главную