При настройке обмена данными между конфигурациями 1С:ERP Управление предприятием и 1С:Бухгалтерия предприятия (БП) часто возникает задача: при выгрузке одного контрагента автоматически «подтягивать» все связанные с ним объекты. По умолчанию универсальная обработка обмена может выгружать только те ссылки, которые непосредственно указаны в реквизитах объекта. Однако договоры и банковские счета являются подчиненными справочниками, и их список не всегда хранится в самой карточке контрагента.
В этой статье мы подробно разберем, как настроить правила конвертации объектов (ПКО) таким образом, чтобы при выборе одного контрагента система автоматически выгружала всю его сопутствующую информацию без необходимости ручного выбора каждой записи.
Проанализируем самый распространенный и гибкий способ — программный вызов выгрузки подчиненных объектов в обработчике события «После выгрузки» основного ПКО. Это позволяет нам вручную определить список связанных данных и инициировать их экспорт.
Рассмотрим пошагово реализацию этого механизма:
Контрагенты в конфигурации «Конвертация данных 2.1».Напишем код, который найдет все договоры данного контрагента и отправит их на выгрузку:
// Обработчик "После выгрузки" в ПКО Контрагенты
// Выгружаем договоры контрагента
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоговорыКонтрагентов.Ссылка КАК Ссылка
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
| ДоговорыКонтрагентов.Владелец = &Владелец
| И ДоговорыКонтрагентов.ПометкаУдаления = ЛОЖЬ";
Запрос.УстановитьПараметр("Владелец", Объект.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Вызываем выгрузку по конкретному правилу ПКО
ВыгрузитьПоПравилу(Выборка.Ссылка, , , , "ДоговорыКонтрагентов");
КонецЦикла;
// Аналогично выгружаем банковские счета
ЗапросСчета = Новый Запрос;
ЗапросСчета.Текст =
"ВЫБРАТЬ
| БанковскиеСчетаКонтрагентов.Ссылка КАК Ссылка
|ИЗ
| Справочник.БанковскиеСчетаКонтрагентов КАК БанковскиеСчетаКонтрагентов
|ГДЕ
| БанковскиеСчетаКонтрагентов.Владелец = &Владелец";
ЗапросСчета.УстановитьПараметр("Владелец", Объект.Ссылка);
ВыборкаСчета = ЗапросСчета.Выполнить().Выбрать();
Пока ВыборкаСчета.Следующий() Цикл
ВыгрузитьПоПравилу(ВыборкаСчета.Ссылка, , , , "БанковскиеСчетаКонтрагентов");
КонецЦикла;
Важно помнить: при вызове ВыгрузитьПоПравилу пятым параметром передается имя ПКО, которое должно быть предварительно создано в правилах конвертации. Это гарантирует, что договоры будут обработаны именно так, как вы настроили их в правилах для справочника ДоговорыКонтрагентов.
Разберем альтернативный, более структурированный подход. Если мы не хотим писать код в общих обработчиках ПКО, можно создать виртуальное ПКС (Правило конвертации свойства). Это свойство не существует в базе-источнике физически, но мы «наполняем» его данными в процессе выгрузки.
Выполним следующие действия:
Контрагенты добавим новое свойство (ПКС).
// В обработчике "Перед выгрузкой" ПКС
// Собираем массив ссылок договоров
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.ДоговорыКонтрагентов ГДЕ Владелец = &Владелец");
Запрос.УстановитьПараметр("Владелец", Объект.Ссылка);
Значение = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
В этом случае КД сама переберет массив в переменной Значение и для каждого элемента вызовет ПКО, указанное в настройках этого ПКС. Это выглядит более изящно с точки зрения архитектуры правил.
Проанализируем ситуацию, специфичную для обмена между современными конфигурациями. В ERP 2.5 используется разделение на справочники Партнеры (управленческий учет) и Контрагенты (юридические лица). В Бухгалтерии предприятия существует только справочник Контрагенты.
При выгрузке важно учитывать следующие нюансы:
ОсновнойБанковскийСчет. Чтобы он корректно заполнился, сначала должны выгрузиться все счета (через наш код выше), и только потом — сам реквизит в карточке контрагента. КД 2.1 обычно справляется с этим автоматически, но порядок следования ПКС в списке имеет значение.Если ваша база ERP содержит данные за много лет, выгрузка всех договоров может существенно замедлить процесс и захламить базу-приемник. Рассмотрим, как ограничить выборку в коде:
Добавим в запрос фильтрацию по статусу договора или по дате его последнего изменения. Например, можно выгружать только те договоры, у которых статус Действует или по которым были движения в текущем году. Это значительно сократит объем передаваемого XML-файла и ускорит загрузку в Бухгалтерию.
Рассмотрим ситуацию, когда выгрузка должна происходить не по одной кнопке в обработке, а автоматически. В этом случае мы регистрируем изменения объектов на узле плана обмена. Чтобы при изменении контрагента автоматически «подхватывались» его договоры, рекомендуется в модуле набора записей плана обмена прописать процедуру регистрации связанных объектов.
Таким образом, когда бухгалтер в ERP меняет номер телефона контрагента, система автоматически пометит к выгрузке не только самого контрагента, но и все его актуальные договоры. Это избавит пользователей от необходимости помнить о «трех галочках» при ручном обмене.
Подведем итог: использование метода ВыгрузитьПоПравилу в связке с грамотным запросом в обработчике После выгрузки — это самый надежный способ обеспечить целостность данных при миграции из ERP в Бухгалтерию предприятия.