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

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

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

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

Использование зарезервированной переменной Отказ в ПКО

Самый простой и надежный способ исключить документ из выгрузки по сложному условию — это использование переменной Отказ в правилах конвертации объектов (ПКО). Рассмотрим ситуацию: нам нужно проверить движения документа ОперацияБух перед тем, как принять решение о его отправке в базу-приемник.

Разберем алгоритм действий в обработчике ПередВыгрузкой или ПриВыгрузке программного кода ПКО:


// Пример проверки движений документа в ПКО
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |	ХозрасчетныйДвижения.СчетДт КАК Счет
    |ИЗ
    |	РегистрБухгалтерии.Хозрасчетный КАК ХозрасчетныйДвижения
    |ГДЕ
    |	ХозрасчетныйДвижения.Регистратор = &Регистратор
    |	И ХозрасчетныйДвижения.СчетДт В (&СписокНужныхСчетов)";

Запрос.УстановитьПараметр("Регистратор", Источник);
Запрос.УстановитьПараметр("СписокНужныхСчетов", СписокНужныхСчетов);

РезультатЗапроса = Запрос.Выполнить();

Если РезультатЗапроса.Пустой() Тогда
    // Если движений по нужным счетам нет, отменяем выгрузку всего документа
    Отказ = Истина;
КонецЕсли;

Установка Отказ = Истина полностью прекращает обработку текущего объекта. Система проигнорирует этот объект и перейдет к следующему в очереди выгрузки.

Частичный перенос движений через ПКГС

Иногда задача стоит иначе: документ выгрузить нужно, но из его многочисленных движений (например, по регистру Хозрасчетный) следует перенести только часть записей. Для этого мы проанализируем работу ПКГС (Правила конвертации групп свойств).

В КД 2.1 движения документа обычно выгружаются как подчиненная коллекция. Чтобы отфильтровать записи «на лету», мы воспользуемся переменной КоллекцияОбъектов в обработчике ПередОбработкойВыгрузки для ПКГС, отвечающего за регистр.

Посмотрим на пример реализации:


// Обработчик ПКГС "ПередОбработкойВыгрузки"
// Формируем собственную коллекцию для выгрузки вместо стандартной

ТаблицаДвижений = Источник.Движения.Хозрасчетный.Выгрузить();

// Удаляем лишние строки из таблицы по условию счета
Индекс = ТаблицаДвижений.Количество() - 1;
Пока Индекс >= 0 Цикл
    Строка = ТаблицаДвижений[Индекс];
    Если Не (Строка.СчетДт = НужныйСчет Или Строка.СчетКт = НужныйСчет) Тогда
        ТаблицаДвижений.Удалить(Строка);
    КонецЕсли;
    Индекс = Индекс - 1;
КонецЦикла;

// Подменяем стандартную коллекцию нашей подготовленной таблицей
КоллекцияОбъектов = ТаблицаДвижений;

Важный момент: если вы определили КоллекцияОбъектов программно, встроенный механизм КД 2.1 не будет пытаться получить данные автоматически, а использует предоставленную вами таблицу значений или выборку.

Борьба с переполнением стека и бесконечной рекурсией

При выгрузке сложных объектов (например, бухгалтерских проводок) часто возникает ошибка «Переполнение стека встроенного языка». Это происходит из-за того, что КД пытается выгрузить объект по ссылке (например, документ расчетов в субконто), а у этого документа, в свою очередь, есть свои движения, которые тянут за собой новые ссылки. Глубина такой выгрузки может превысить допустимые пределы (обычно около 60 уровней).

Проанализируем методы решения этой проблемы:

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

Зарезервированные переменные: краткий справочник

Для эффективной работы в обработчиках КД 2.1 программисту доступен целый арсенал переменных. Выясним назначение самых важных из них:

Практические советы по ПВД

Если стандартных ПКО недостаточно, мы можем использовать ПВД (Правила выгрузки данных) с произвольным алгоритмом. Это дает максимальный контроль. Рассмотрим, как программно вызвать выгрузку объекта:


// В обработчике ПВД "ПередВыгрузкойДанных" (Произвольный алгоритм)
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг ГДЕ ...");
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    // Явный вызов выгрузки по правилу
    ВыгрузитьПоПравилу(Выборка.Ссылка, , , , "РеализацияТоваровУслуг");
КонецЦикла;

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

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

← На главную