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