Как получить значение отдельного поля из результата запроса 1С

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

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

1. Получение отдельных колонок и элементов в встроенном языке

Если запрос уже выполнен и возвращает таблицу значений, извлечь конкретную колонку можно с помощью метода ВыгрузитьКолонку(). Важно учитывать, что данный метод возвращает объект типа Массив, а не ТаблицаЗначений.

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


РезультатТаблица = Запрос.Выполнить().Выгрузить();
МассивУИД = РезультатТаблица.ВыгрузитьКолонку("UUIDОрганизации");

Если вам требуется получить первое значение из этой колонки, можно обратиться к элементам массива по индексу 0:


РезультатТаблица = Запрос.Выполнить().Выгрузить();
МассивУИД = РезультатТаблица.ВыгрузитьКолонку("UUIDОрганизации");

Если МассивУИД.Количество() > 0 Тогда
    ЗначениеУИД = МассивУИД[0];
КонецЕсли;

Чтобы получить последнее значение из массива, используется индекс верхней границы массива ВГраница():


Если МассивУИД.Количество() > 0 Тогда
    ЗначениеУИД = МассивУИД[МассивУИД.ВГраница()];
КонецЕсли;

2. Оптимизация работы с памятью через выборку

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

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


Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    ЗначениеУИД = Выборка.UUIDОрганизации;
КонецЕсли;

Такой подход не создает неиспользуемые объекты в памяти и работает значительно быстрее на больших объемах данных.

3. Получение первой или последней записи средствами языка запросов

Порядок строк в результате запроса без явной сортировки является недетерминированным (произвольным). Попытка взять «последний» элемент из полученного массива без сортировки может возвращать разные данные при повторных запусках.

Чтобы гарантированно получить только одну нужную запись (первую или последнюю), правильнее ограничить выборку непосредственно в самом запросе с помощью ключевого слова ПЕРВЫЕ 1 и секции УПОРЯДОЧИТЬ ПО:

  1. Для получения первой записи используйте сортировку по возрастанию ВОЗР (по умолчанию):
  2. 
    ВЫБРАТЬ ПЕРВЫЕ 1
        КлассификаторВЕТИС.UUID КАК UUIDОрганизации
    ИЗ
        РегистрСведений.КлассификаторВЕТИС КАК КлассификаторВЕТИС
    УПОРЯДОЧИТЬ ПО
        КлассификаторВЕТИС.Период ВОЗР
    
  3. Для получения последней записи используйте сортировку по убыванию УБЫВ:
  4. 
    ВЫБРАТЬ ПЕРВЫЕ 1
        КлассификаторВЕТИС.UUID КАК UUIDОрганизации
    ИЗ
        РегистрСведений.КлассификаторВЕТИС КАК КлассификаторВЕТИС
    УПОРЯДОЧИТЬ ПО
        КлассификаторВЕТИС.Период УБЫВ
    

4. Логические ошибки в тексте запроса и их устранение

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

  1. Выборка поля, по которому уже установлен жесткий отбор: Если в секции ГДЕ указано условие КлассификаторВЕТИС.UUID = &UUID, то в результате запроса в поле UUIDОрганизации всегда будет возвращаться именно то значение, которое передано в параметр &UUID. Выбирать его из базы данных в таком случае бессмысленно, так как оно уже известно в коде.
  2. Выборка лишних полей: Если итоговой задаче требуется только один реквизит, не следует выбирать поля документа (Ссылка, Дата, Номер, Номенклатура и т. д.). Это увеличивает нагрузку на СУБД и сеть.
  3. Задвоение строк из-за табличных частей: Обращение к табличной части документа (например, Документ.РеализацияТоваровУслуг.Товары) разворачивает результат запроса по каждой строке табличной части. Чтобы избежать дублей, следует делать выборку из шапки документа Документ.РеализацияТоваровУслуг или использовать ВЫБРАТЬ РАЗЛИЧНЫЕ / СГРУППИРОВАТЬ ПО.
  4. Оптимизация составных типов в соединениях: Если соединение происходит по полю составного типа (например, Объект в регистрах), платформе приходится формировать сложные SQL-запросы. Для оптимизации используйте функцию ВЫРАЗИТЬ():
  5. 
    ПО РеализацияТоваровУслуг.Ссылка.Организация = 
        ВЫРАЗИТЬ(КлассификаторВЕТИС.Объект КАК Справочник.Организации)
    
  6. Сопоставление типов UUID: Поле UUID может храниться как тип УникальныйИдентификатор или как Строка. Если типы параметра и поля базы данных не совпадают, запрос вернет пустой результат. Для приведения типов в коде перед передачей в параметр применяются функции XMLСтрока() или конструктор Новый УникальныйИдентификатор().
← На главную