1с ВЫРАЗИТЬ в запросе

Многие программисты 1с, особенно молодые специалисты, часто недооценивают использование в 1с запросах оператора ‘ВЫРАЗИТЬ’ (функции языка запросов). Большинство использует его исключительно для преобразования значений в примитивный тип данных (строка, число, булево):

К примеру мы хотим получить количество документов с одинаковым комментарием. Для этого мы хотим сгруппировать документы по реквизиты ‘Комментарий’ и получить количество ссылок для каждого их них. Но поскольку реквизит ‘Комментарий’ имеет тип ‘строка / неограниченная длина’, то группировку мы использовать не можем. Но мы можем преобразовать это реквизит к строке ограниченной длины (к примеру 100) и затем уже сгруппировать наши данные:

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

На этом в принципе и заканчивают использование всех возможностей оператора ‘ВЫРАЗИТЬ’, а зря! Есть более интересный момент: преобразование составного типа данных к одиночному!

Рассмотрим пример с применением SQL Profiler для отладки запросов в 1С. О том как его настроить читайте по ссылке. Допустим у нас есть регистр накопления ‘бит_ДвиженияДенежныхСредств’ и регистратор у него составного типа (4 различных документа – 4 таблицы):

Регистр накопления бит_ДвиженияДенежныхСредств.
Регистр накопления бит_ДвиженияДенежныхСредств.

И у нас есть задача: необходимо получить номера всех документов ‘ПоступлениеНаРасчетныйСчет’ (из этого регистра) с определенной даты. 95 процентов сделают так:

Решение без использование оператора ВЫРАЗИТЬ.
Решение без использование оператора ВЫРАЗИТЬ.

В принципе поставленную задачу они решат. Но если мы посмотрим план выполнения запроса (как это сделать читай здесь):

4 соединения в плане запроса.
4 соединения в плане запроса.

То увидим что у нас выполнилось 4 левых соединения – ровно столько, сколько возможно типов регистраторов. Было бы 25 типов – соответственно получили бы 25 левых соединений. Но они то нам по факту не нужны (лишняя нагрузка), так как мы хотим отобрать данные только из одной таблицы! Поэтому в данном запросе мы используем оператор ‘ВЫРАЗИТЬ’ и преобразуем наш регистратор к нужному нам типу:

Решение с использование оператора ВЫРАЗИТЬ.
Решение с использование оператора ВЫРАЗИТЬ.

И в плане запроса мы видим уже только 1 необходимое соединение:

1 соединение в плане запроса.
1 соединение в плане запроса.

Вот на таком примере мы с вами попробовали разобраться как максимально выгодно использовать оператор ‘Выразить’ в запросе. Похожий пример можете посмотреть на сайте 1с. В своей типовой конфигурации или в библиотеке стандартных подсистем вы можете найти массу примеров в коде с использованием данного оператора! В общем учитесь и всегда узнавайте что-то новое!

Всем удачи! Пока!

5+

1 комментарий

  1. Yuri

    Очень доходчиво. Спасибо!

    3+

Оставить комментарий

Ваш адрес email не будет опубликован.