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