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