Как получить список полей из выборки результата запроса в 1С:Предприятие?

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

При разработке в 1С:Предприятие часто возникают ситуации, когда необходимо динамически обработать данные, полученные из запроса, не зная заранее структуры полей. Например, если вы работаете в расширении или с универсальным механизмом, где текст запроса скрыт от вас. Разберем, как получить имена полей из объекта ВыборкаИзРезультатаЗапроса и сформировать на их основе структуру или таблицу значений.

Использование свойства Владелец для доступа к колонкам

Основная сложность заключается в том, что у самой выборки нет прямого свойства с коллекцией полей. Однако объект ВыборкаИзРезультатаЗапроса хранит ссылку на объект, породивший её — РезультатЗапроса. Именно через него мы можем получить доступ к структуре данных.

Рассмотрим основной способ получения имен полей:


РезультатЗапроса = ВыборкаДетальныеЗаписи.Владелец;
Для Каждого Кол Из РезультатЗапроса.Колонки Цикл
    Сообщить(Кол.Имя);
КонецЦикла;

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

Создание Таблицы значений на основе Выборки

Если вам нужно не просто узнать имена полей, но и скопировать данные из выборки в ТаблицаЗначений, рекомендуется использовать вспомогательный метод. Это позволит динамически создать структуру таблицы, соответствующую колонкам запроса, и заполнить её данными.


Процедура ДополнитьТаблицуЗначенийДаннымиВыборки(ТЗ, Выборка)
    Выборка.Сбросить();
    Если НЕ ТипЗнч(Выборка) = Тип("ВыборкаИзРезультатаЗапроса") Тогда
        Возврат;
    КонецЕсли;

    Если НЕ ТипЗнч(ТЗ) = Тип("ТаблицаЗначений") Тогда
        ТЗ = Новый ТаблицаЗначений;
    КонецЕсли;

    // Добавляем колонки из владельца выборки, если их еще нет в ТЗ
    Для Каждого Кол Из Выборка.Владелец.Колонки Цикл
        Если ТЗ.Колонки.Найти(Кол.Имя) = Неопределено Тогда
            ТЗ.Колонки.Добавить(Кол.Имя, Кол.ТипЗначения, Кол.Имя, Кол.Ширина);
        КонецЕсли;
    КонецЦикла;

    // Заполняем данными
    Пока Выборка.Следующий() Цикл
        новСтр = ТЗ.Добавить();
        ЗаполнитьЗначенияСвойств(новСтр, Выборка);
    КонецЦикла;
    
    Выборка.Сбросить();
КонецПроцедуры

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

Проверка наличия конкретного поля в выборке

Иногда задача стоит менее масштабно: нужно просто убедиться, что в выборке присутствует определенное поле, чтобы не вызвать ошибку обращения к несуществующему свойству. В таком случае можно воспользоваться методом ЗаполнитьЗначенияСвойств в сочетании со структурой:


СтруктураДляПоиска = Новый Структура("НаименованиеНашегоПоля", "Пусто");
ЗаполнитьЗначенияСвойств(СтруктураДляПоиска, Выборка);

Если СтруктураДляПоиска.НаименованиеНашегоПоля = "Пусто" Тогда
    Сообщить("Поле отсутствует или содержит пустое значение!");
КонецЕсли;

Важные рекомендации при работе с данными

При реализации описанных выше алгоритмов, помните о следующих нюансах:

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

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

← На главную