Произвольный запрос в списке справочника

Сегодня рассказ о том, как я боролся с очень занимательной штукой в 1С 8.2: формирование списка справочника по произвольному запросу. Что это такое? Раньше, в версии 7.7, когда нужно было в списке справочника отобразить вычисляемое поле, например цену из подчиненного справочника или остаток, мы вставляли в поле списка функцию, которая динамически вычислялась при выводе строк. Это жутко тормозило вывод строк, особенно при работе в сети. Теперь у разработчика есть возможность описать для списка справочника запрос, который будет определять состав списка и, самое главное, запрос будет выполнен на сервере перед выдачей списка клиенту. В этом запросе как раз и есть возможность вставлять вычисляемые поля.

Пример. Есть справочник услуг: “Номенклатура услуг” и есть регистр с ценами услуг: “Цены услуг”. В регистре значения цен хранятся в разрезах Организаций и Контрагентов, т.е. можно задавать цены по конкретной организации и/или по конкретному контрагенту и подразумевается, что запись с пустым значением измерения работает “по умолчанию” для этого измерения. Задача: при выводе списка услуг показать “общие” цены по организациям и контрагентам, т.е. те записи, у которых значения измерений пустые.

Решение простое: нужно из таблицы с ценами отобрать записи с пустыми значениями измерений Организации и Контрагенты, потом эту таблицу объединить с таблицей списка услуг. Вроде бы ничего сложного, но попалась одна загвоздка. Трудность в том, что запрос хочется составить так, чтобы не приходилось передавать в него значения параметров, а стандартными методами проверить значение на “пустоту” ссылки не получается. Пришлось сделать вложенный запрос по таблице цен и заменить в результате запроса пустые ссылки на значение типа NULL и уже в основном запросе сделать отбор по этим значениям.

Вот как это делается в конфигураторе.

1. Открыть форму списка справочника, в списке реквизитов выделить “Список” и открыть его свойства, поставить метку “Произвольный запрос”.

2011-03-22_135248

2. Теперь в пункте “Настройка списка” нажать ссылку “Открыть”, появится окно с текстом запроса:

2011-03-22_135355

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

3. Открыть конструктор запроса, нажать кнопку “Создать вложенный запрос”, откроется новое окно конструктора, в нем выбрать из базы данных таблицу регистра цен “ЦеныУслугСрезПоследних”.

4. Чтобы подменить пустые ссылки выборки на нужное значение, используем оператор языка запросов ВЫБОР, для этого нужно выбрать поле в правую часть конструктора и потом двойным щелчком открыть форму редактирования поля запроса

2011-03-22_135611

В нижней части формы можно писать текст выражения или выбирать готовые шаблоны в правой верхней части и доступные поля слева.

5. После того как вложенный запрос сформирован нужно вернуться в основной запрос, задать связь между таблицами на закладке “Связи”, отметив, что из таблицы основного справочника выбираются ВСЕ записи.

6. На закладке “Условия” нужно добавить отбор по пустым значениям, используя метод сравнения ЕСТЬ NULL.

В результате должен получиться примерно такой запрос:

2011-03-22_135736

Теперь в элементах списка, в конструкторе формы, появится поле “Цена”, останется только расположить его в форме списка.