Почему не выгружаются данные из регистра накопления в Конвертации данных 2.1 и как это исправить

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

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

Анализ проблемы: почему стандартный подход не работает для регистров

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

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

Решение №1: Использование произвольного алгоритма в ПВД

Самый надежный способ выгрузить данные из регистра накопления — перевести ПВД в режим «Произвольный алгоритм». Это позволяет нам полностью контролировать процесс выборки данных. Рассмотрим по шагам, как это реализовать.

Во-первых, необходимо перенести программный код в обработчик ПВД Перед обработкой. Именно здесь мы инициализируем запрос, обходим результат и вызываем принудительную выгрузку по правилу. Проанализируем пример кода:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ДенежныеСредстваБезналичные.Регистратор КАК Регистратор,
    |   ДенежныеСредстваБезналичные.Организация КАК Организация,
    |   ДенежныеСредстваБезналичные.Период КАК Период
    |ИЗ
    |   РегистрНакопления.ДенежныеСредстваБезналичные КАК ДенежныеСредстваБезналичные";

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

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

// Важно! Устанавливаем Отказ, чтобы стандартный механизм ПВД не пытался искать объекты
Отказ = Истина;

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

Решение №2: Настройка ПКО для работы с входящими данными

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

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

Рассмотрим ситуацию с поиском объектов. Если в структуре ВходящиеДанные вы передаете строку или примитивный тип, а в приемнике это ссылка на справочник, не забудьте в ПКС настроить поиск. Например, если вы передаете наименование периода, убедитесь, что в ПКО для справочника "Периоды" стоит поиск по наименованию.

Типичные ошибки при программной выгрузке

Проанализируем распространенные ошибки, которые упоминались в ходе обсуждения проблемы:

1. Опечатки в именах правил. Проверьте имя ПКО в вызове ВыгрузитьПоПравилу. В КД 2 строки чувствительны к регистру и лишним пробелам. Ошибка в одной букве (например, "Взаморасчеты" вместо "Взаиморасчеты") приведет к тому, что система просто проигнорирует вызов, не сообщив об ошибке.

2. Использование не того обработчика. Как мы выяснили, код в ПослеВыгрузкиВФайл работает слишком поздно или вообще не работает для регистров без объектов-источников. Всегда используйте Перед обработкой в ПВД для инициализации выборки.

3. Отсутствие флага "Отказ = Истина". Если в ПВД с произвольным алгоритмом не установить Отказ = Истина в конце кода, система попытается выполнить стандартную выборку после вашего кода, что может привести к дублированию или ошибкам, если источник не определен.

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

Рекомендации по отладке

Если выгрузка по-прежнему показывает 0 объектов, воспользуйтесь следующими методами отладки:

Во-первых, вставьте команду Сообщить("Записей в выборке: " + РезультатЗапроса.Выгрузить().Количество()); прямо в обработчик ПВД. Если при выгрузке это сообщение не появляется или показывает 0, значит проблема в самом запросе или в условиях фильтрации (например, по периоду), которые накладывает внешняя обработка выгрузки.

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

Подводя итог, можно сказать: выгрузка из регистра накопления в КД 2 — это всегда работа с ПВД в режиме произвольного алгоритма и обязательная установка флагов «Получать из входящих данных» в ПКО. Соблюдение этой структуры гарантирует успешный перенос данных любой сложности.

← На главную