Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.03.2019

Просмотров: 50369

Скачиваний: 8599

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

таблицы непосредственно по ссылочному полю, а затем использовать конструкцию
АВТОУПОРЯДОЧИВАНИЕ (листинг 1.19).

Листинг 1.19. Автоматическое упорядочивание записей таблицы

Мы видим, что при автоупорядочивании списка документов ЗаказТовара записи
результата запроса расположены в порядке возрастания поля Дата, а в случае, если
даты у документов одинаковые, записи упорядочиваются в порядке возрастания поля
Номер (рис. 1.21).

Рис. 1.21. Вывод записей из таблицы в автоматическом порядке

Так произошло потому, что при выполнении данного запроса для каждого ссылочного
поля были получены реальные поля, по которым его необходимо упорядочить (для
документа – это дата и номер, для справочника – основное представление), и
произведено упорядочивание по ним.

Таким образом, такого же результата можно было добиться, явно указав поля Дата и
Номер при упорядочивании таблицы документа (листинг 1.20).

Листинг 1.20. Упорядочивание списка документов по полям «Дата» и «Номер»


background image

Но в общем случае, чтобы расположить записи результата запроса в наиболее
ожидаемом (естественном) порядке, рекомендуется более универсальный первый
вариант – упорядочить записи таблицы непосредственно по ссылочному полю, а затем
использовать конструкцию АВТОУПОРЯДОЧИВАНИЕ. В остальных случаях
использовать автоупорядочивание записей результата запроса не рекомендуется.

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

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

Например, рассмотрим простой запрос, выводящий записи регистра накопления
ОстаткиТоваров (листинг 1.21).

Листинг 1.21. Получение ссылочных полей в запросе

Поля выборки запроса включают два ссылочных поля – Регистратор и Товар. Заменим
значения этих полей их текстовыми представлениями. Это можно сделать с помощью
полей Представление и функции ПРЕДСТАВЛЕНИЕ(). Рассмотрим их подробнее.

Каждая объектная таблица в информационной базе имеет виртуальное поле –
Представление. Это текстовое представление объекта. Поскольку это поле –
виртуальное, то при получении данного поля из базы данных запрос получает несколько
полей, которые соответствуют прикладной сущности объекта, а при получении значения
поля из результата запроса преобразовывает полученные значения в строку.

Для большинства объектов конфигурации (справочников, планов видов характеристик,
планов счетов и т. п.) представление ссылок задается разработчиком в свойстве
Основное представление. А для документов и бизнес-процессов система предоставляет


background image

единственное неизменяемое представление ссылочных значений в виде совокупности
синонима документа или бизнес-процесса, его номера и даты. Например: «Приходная
накладная 000000003 от 03.11.2012 15:35:27».

В версии платформы 8.3 появилась возможность во встроенном языке задавать
произвольные представления для ссылочных полей. Для этого у менеджеров
справочников, документов и т. п. добавлены два обработчика:
ОбработкаПолученияПолейПредставления и ОбработкаПолученияПредставления, в
которых можно задать собственный алгоритм, формирующий представление.

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

Функция ПРЕДСТАВЛЕНИЕ() предназначена для получения текстового представления
любого значения, которое может быть получено при помощи языка запросов. В качестве
параметра в функцию могут передаваться как ссылочные, так и примитивных типы
данных.

Для ссылочных типов результат функции полностью аналогичен получению поля
Представление от ссылки, переданной в качестве параметра функции. Например,
ПРЕДСТАВЛЕНИЕ(Товар) в данном случае аналогично Товар.Представление, но первый
вариант предпочтительнее.

Поэтому предыдущий запрос можно переписать в следующем виде (листинг 1.22).

Листинг 1.22. Получение ссылочных полей в запросе

В первом варианте запроса из базы данных будут получены сами ссылочные значения, а


background image

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

Практически в каждом примере мы выводим в консоли запросов значения ссылочных
полей. В них мы не используем представления этих полей потому, что консоль запросов
сама занимается выводом данных, а также для упрощения текста запросов.

Особенностью функции ПРЕДСТАВЛЕНИЕ() является то, что ее результат не может
быть использован в выражении языка запросов, например, следующие два запроса
ошибочны (листинги 1.23, 1.24).

Функцию ПРЕДСТАВЛЕНИЕ() нельзя использовать в условиях сравнения в предложении
ГДЕ (листинг 1.23).

Листинг 1.23. Ошибочный запрос

Функцию ПРЕДСТАВЛЕНИЕ() нельзя использовать в различных выражениях в списке
полей выборки, например, нельзя складывать в одну строку текстовые представления
ссылочных полей (листинг 1.24).

Листинг 1.24. Ошибочный запрос

Аналогично с полем Представление также нельзя выполнять никакие операции.

Как получить только первые несколько записей с наибольшими значениями некоторого поля
Часто требуется получить из большой таблицы только определенное количество записей
с наибольшим или наименьшим значением какого-то поля. Например, нам нужно получить
три заказа клиентов с наибольшей суммой заказа.


background image

В нашей демонстрационной конфигурации существует список документов ЗаказТовара,
который показывает сумму заказа по клиентам (см. ниже рис. 1.22).

Чтобы выбрать из таблицы три заказа с наибольшей суммой, зададим упорядочивание по
убыванию поля СуммаЗаказа и затем воспользуемся конструкцией ВЫБРАТЬ ПЕРВЫЕ 3
(листинг 1.25).

Листинг 1.25. Вывод трех документов «ЗаказТовара» с наибольшей суммой заказа

Конструкция ВЫБРАТЬ ПЕРВЫЕ <Количество> позволяет задать предельное
количество строк в результате запроса.

В результате выполнения запроса на рис. 1.22 в нижней таблице мы видим три
наибольших заказа в порядке убывания их суммы, а в верхней таблице для сравнения
приведен список всех заказов клиентов.

Рис. 1.22. Вывод трех документов «ЗаказТовара» с наибольшей суммой заказа

Чтобы выбрать три заказа с наименьшей суммой заказа, нужно в этом же примере
поменять порядок сортировки по полю СуммаЗаказа.

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