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

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

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

Постановка задачи и анализ первичной ошибки

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

Если мы просто напишем ВыборкаДанных = Запрос.Выполнить();, система выдаст ошибку, так как она ожидает объект выборки, а не сам объект результата запроса. Проанализируем, как это исправить и какие способы выгрузки существуют в КД 2.1.

Способ 1: Использование стандартного механизма ВыборкаДанных

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

В ПВД в обработчике ПередОбработкой напишем следующий код:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Графики.ГрафикРаботы КАК ГрафикРаботы,
    |   Графики.ВидВремени КАК ВидВремени,
    |   Графики.Дата КАК Дата,
    |   Графики.Значение КАК ВремяВЧасах
    |ИЗ
    |   РегистрСведений.ГрафикиРаботыПоВидамВремени КАК Графики
    |ГДЕ
    |   Графики.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";

Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);

// Важно: возвращаем именно выборку, а не результат запроса
ВыборкаДанных = Запрос.Выполнить().Выбрать();

При использовании этого метода важно помнить следующее:

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

Способ 2: Программный вызов ВыгрузитьПоПравилу с использованием ИсходящихДанных

Иногда требуется более сложная логика, когда одной строки выборки недостаточно. В этом случае мы можем вручную перебирать результаты запроса и вызывать функцию ВыгрузитьПоПравилу. Этот метод дает максимальную гибкость, но требует внимательности при настройке ПКС.

Разберем пример реализации в ПВД:


Запрос = Новый Запрос("ВЫБРАТЬ ... "); // Ваш запрос
Выборка = Запрос.Выполнить().Выбрать();

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

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

Чтобы этот способ заработал без ошибок «Поле объекта не обнаружено», необходимо правильно настроить ПКО и ПКС:

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

Разбор типичных ошибок

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

Также крайне важно соблюдать регистр букв. Если в структуре ключ называется времявчасах, а в ПКС имя свойства ВремяВЧасах, сопоставление может не сработать в зависимости от настроек платформы и версии обработчика обмена.

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

Выберем оптимальный метод в зависимости от объема данных:

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

← На главную