СКД — использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ












Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

Предыдущие статьи можно посмотреть по ссылкам ниже:

Продолжаем рассмотрение различных возможностей системы компоновки данных. В текущей статье поговорим о расширениях языка запросов для СКД. Это конструкции, которые в тексте запроса обернуты в фигурные скобки:

{……}

И так, для чего же необходимы расширения языка запросов?

СКД использует расширения для настройки полей компоновки и формирования запроса итогового макета компоновки. А я напомню, запрос итогового макета компоновки может существенно отличаться от запроса источника данных заданного в схеме компоновки.

Понимание, и грамотное использование расширений языка запросов позволяет более гибко управлять формированием итогового запроса макета компоновки:

Общая схема расширений языка запросов

Оглавление

  1. Автоматическое заполнение полей компоновки данных
  2. Расширение языка запроса для СКД
  1. Использование дополнительных данных, секция ХАРАКТЕРИСТИКИ

 

Автоматическое заполнение полей компоновки данных

Перед тем, как начинать говорить о расширениях языка запросов, нужно понимать, что означает флаг «Автозаполнение», который расположен на закладке полей компоновки:

Автоматическое заполнение полей копоновки

Если флаг установлен, поля компоновки данных заполняются автоматически для всех полей, указанных на верхнем уровне запроса источника данных (не зависимо от наличия секций с расширениями в тексте запроса).

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

Ограничение использования полей

Дополнительно, для виртуальных таблиц, флаг «Автозаполнение» неявно формирует отбор по периоду, создавая стандартные параметры: «Период» для таблиц остатков, «НачалоПериода» и «КонецПериода» для таблиц оборотов. Причем, указание значений этих параметров в настройках компоновки не является обязательным. В итоговый запрос макета компоновки параметры попадут только в том случае, если они заданы в настройках.

На заметку. Если для виртуальной таблицы заданы параметры отбора по периоду непосредственно в запросе схемы компоновки, и их имена отличаются от стандартных, этот отбор будет работать только в том случае, если не используются стандартные параметры отбора по периоду. Заполнение этих параметров является обязательным.

Если флаг «Автозаполнение» — отключен, автоматического формирования полей компоновки и стандартных параметров виртуальных таблиц по данным запроса источника данных не происходит. Заполнение будет происходить таким образом, как это описано в секциях расширений.

Еще несколько моментов при использовании флага «Автозаполнение»:

  1. Если в запросе источника данных используется виртуальная таблица, и в настройках компоновки добавлен отбор по какому-либо измерению, в итоговом запросе макета, СКД будет накладывать отбор на параметры виртуальных таблиц, если это возможно. Если кроме виртуальных таблиц, в запросе присутствуют и другие таблицы (не виртуальные), в итоговом запросе будет добавлен дополнительный отбор в секции ГДЕ всего запроса. То-есть будет присутствовать два отбора.
  2. Если в наборе данных используется пакет запросов, СКД будет пытаться наложить отбор на все запросы пакета, если это возможно.

Есть еще один флаг, который может влиять на итоговый запрос макета компоновки «Использовать группировки запроса если возможно». Если флаг установлен, СКД будет пытаться использовать агрегатные функции на уровне запроса к базе данных.

Происходит это следующим образом. Если в настройках компоновки добавлены только группировки и ресурсы (без детальных записей), в итоговом запросе макета компоновки данные будут сгруппированы по выбранным в настройках группировкам.

 

Расширение языка запроса для СКД

Начнем с того, где именно можно использовать секции с расширениями?

Расширения языка запросов можно использовать в секциях: ВЫБРАТЬ, ГДЕ, ХАРАКТЕРИСТИКИ, и в параметрах виртуальных таблиц.

Также выделить как расширение можно целиком таблицу запроса.

Конструкции, добавленные в расширение в итоговом тексте запроса находятся в фигурных скобках «{…}». Для работы с расширениями в конструкторе запроса существует специальная закладка – «Компоновка данных»:

Закладка "Компановка данных"

Рассмотрим более подробно использование каждой секции.

 

Секция ВЫБРАТЬ­

Настройка выполняется на закладке «Поля» в окне редактирования расширений:

Секция ВЫБРАТЬ расширений языка запросов

Выбранные на этой закладке поля попадут в список полей компоновки, если отключена галка «Автозаполнение». Можно указать, нужно ли включать вложенные реквизиты полей – флаг «Использовать реквизиты». Можно изменить псевдонимы полей, если это необходимо.

Обратите внимание, если в основном запросе уже используются псевдонимы для полей, в расширении отображаются именно они, а не имена самих полей:

Использование псевдонимов для полей в расширении

Если в запросе используется объединение нескольких таблиц, расширение секции ВЫБРАТЬ необходимо задавать только для первой таблицы.

 

Секция ГДЕ

Настройка выполняется на закладке «Условия» в окне редактирования расширений:

Секция ГДЕ в расширении языка запросов

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

Если в запросе источника данных используется объединение нескольких таблиц или пакет запросов, расширение секции ГДЕ можно указать для каждой таблицы объединения или пакета отдельно.

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

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

ТоварныеЗапасыОстатки.Товар = &Товар

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

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

 

Параметры виртуальных таблиц

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

Параметры виртуальных таблиц в расширении языка запросов

Можно указать следующие параметры: 

  • Период, НачалоПериода, КонецПериода – задается отбор по периоду для виртуальных таблиц.

Если флаг «Автозаполнение» включен, данные параметры будут заполнены автоматически неявно. То-есть, в тексте запроса их нет, но фактически они будут присутствовать. Можно явно указать в качестве этих параметров произвольные имена:

РегистрНакопления.ТоварныеЗапасы.Обороты({(&ДатаНачала)}, {(&ДатаОкончания)}, , ) КАК ТоварныеЗапасыОбороты

Тогда «неявно» заданные параметры действовать не будут. Это может быть необходимо, если в запросе уже встречаются параметры отбора по периоду, и нужно привести все остальные отборы к существующим.

Если флаг «Автозаполнение» отключен, параметры не будут заполнены неявно. Если требуется отбор по периоду, необходимо их указывать явно.

  • Периодичность – можно указать параметр, с помощью которого можно будет задавать периодичность в настройках компоновки. Для параметра будет создан список выбора периода.
  • Метод дополнения – можно указать параметр, для задания в настройках компоновки метода дополнения: «Движения», «Движения и границы периода».
  • Условие – используется для выбора полей, по которым можно будет указывать отбор в настройках компоновки (аналогично секции ГДЕ). Отличие в том, что указанные пользователем отборы, в итоговом запросе макета компоновки будут наложены в параметрах виртуальных таблиц, а не в секции ГДЕ на уровне всего запроса.

 

 

Выделение в расширение отдельных таблиц запроса

Есть возможность выделить в расширение (заключить в фигурные скобки) целиком таблицу запроса источника данных. Выполняются эти действия также на закладке «Таблицы». Для выделения таблицы необходимо убрать флаг «Обязательная» и указать параметр «Номер группы»:

Выделение таблиц целиком в расширение языка запросов

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

«Не обязательные» таблицы или группы таблиц будут исключены из итогового запроса макета компоновки, если в настройках компоновки не будет выбрано ни одного поля из этих таблиц, в любой группе настроек: поля, отборы, сортировка, оформление.

 

Использование дополнительных данных, секция ХАРАКТЕРИСТИКИ

Что такое дополнительные реквизиты и сведенья, думаю, знают все. Этот механизм активно используется еще с конфигураций прошлого поколения.

Так вот, значения этих дополнительных реквизитов или сведений можно АВТОМАТИЗИРОВАНО включать в схему компоновки данных. Вы конечно можете сделать это в ручную, добавив нужное количество соединений в запрос источника данных:

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСвойства КАК ДопСвойства1
ПО (ДопСвойства.Номенклатура = Номенклатура.Ссылка
И ДопСвойства.ВидСвойства = &Свойство1)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСвойства КАК ДопСвойства2
ПО (ДопСвойства1.Номенклатура = Номенклатура.Ссылка
И ДопСвойства1.ВидСвойства = &Свойство2) 

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

Номенклатура.ДопРеквизит

Механизмы СКД скрывают от пользователей всю структуру хранения дополнительных данных, и позволяют работать с ними, непосредственно, как с реквизитами объектов. В итоговый запрос макета компоновки автоматически будут добавлены все необходимые таблицы и связи.

Так вот, для автоматизации использования дополнительных данных (дополнительных реквизитов, сведений и прочей информации) существует специальная закладка конструктора запросов «Характеристики»:

Использование дополнительных данных в запросе

На этой закладке в таблице указывается вся необходимая информация о структуре хранения дополнительных данных. Рассмотрим поля этой таблицы подробнее:

  • Тип – вид объектов метаданных, для которых необходимо выводить характеристики (то-есть, через точку от которого они будут доступны),
  • Источник видов – способ получения видов дополнительных данных (характеристик): отдельная таблица или произвольный запрос (запрос можно использовать, если требуется наложить на таблицу дополнительные отборы),
  • Источник значений – способ получения значений дополнительных данных (характеристик): отдельная таблица или произвольный запрос.

 

Группа полей с описанием видов дополнительных данных (Виды характеристик)

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

 

Группа полей с описанием значений дополнительных данных (Значения характеристик)

  • Поле объекта – ссылка на основной объект, для которого получаются дополнительные данные,
  • Поле вида – ссылка на элемент вида дополнительных данных (в случае с дополнительными реквизитами, это ссылка на элемента плана видов характеристик),
  • Поле значения – значения дополнительных данных.

В случае, если значение поля «Значение характеристик (поле значения)» не указано, тип значения дополнительного реквизита считается «булево». Реквизит будет принимать значение «Истина» в том случае, если в источнике данных будет хотя бы одна строка для указанного объекта и вида. Таким образом настроен вывод в отчеты категорий объектов в конфигурациях: УТ 10.3, УПП.

После заполнения структуры хранения дополнительных данных, система добавит в нижнюю часть запроса секцию ХАРАКТЕРИСТИКИ, следующего вида:

{ХАРАКТЕРИСТИКИ
ТИП(ПланВидовХарактеристик.ВидыХарактеристик)
ВИДЫХАРАКТЕРИСТИК ПланВидовХарактеристик.ВидыХарактеристик
ПОЛЕКЛЮЧА Ссылка
ПОЛЕИМЕНИ Наименование
ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
ЗНАЧЕНИЯХАРАКТЕРИСТИК РегистрСведений.Характеристики
ПОЛЕОБЪЕКТА Объект
ПОЛЕВИДА ВидХарактеристики
ПОЛЕЗНАЧЕНИЯ Значение }

По сути, перечисляются все, указанные выше настройки. Данную секцию можно описать вручную, без использования конструктора.

Следует иметь в виду, что дополнительные данные в настройках компоновки можно увидеть только в пользовательском режиме. Это связано с тем, что для определения значений дополнительных реквизитов или сведений требуется обращение к таблицам данных системы.

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

Настройка использования дополнительных данных для объекта

В этом случае, в запрос не нужно будет включать секцию «Характеристики», дополнительные данные будут доступны по умолчанию (также только в режиме 1С Предприятие).

В механизме настроек характеристик для объектов источники видов и значений – это всегда таблицы. Так что нельзя указать запрос с произвольным отборам необходимых видов. Однако, отбор значений все-таки можно указать, заполнив поля: «Поле отборов видов» и «Значение отборов видов»:

Отбор видов характеристик для объектов

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

В следующих статьях рассмотрены следующие темы:

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

Спасибо а внимание.

  

27 Comments

  1. YPermitin

    (0) спасибо за полезный материал!

    Reply
  2. lmnlmn

    Отличные материалы!

    Reply
  3. AllexSoft
    Параметры..

    Условие – используется для выбора полей, по которым можно будет указывать отбор в настройках компоновки (аналогично секции ГДЕ). Отличие в том, что указанные пользователем отборы, в итоговом запросе макета компоновки будут наложены в параметрах виртуальных таблиц, а не в секции ГДЕ на уровне всего запроса.

    Тут есть один забавный нюанс, а именно если у вас указано больше чем 1 отбора на этой вкладке, то СКД их объединит в одну группу условий, то есть ввод сразу всех параметров станет обязательным.

    Например

    РегистрСведений.CR_СтатусыОбъектовАренды.СрезПоследних(, {(Контрагент = &Контрагент
    И Договор = &Договор)})

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

    Reply
  4. dhurricane

    (4) В Вашем примере, полагаю, это запланированное поведение от разработчика. Либо решение «по незнанию». 🙂 Для того, чтобы параметры не зависели друг от друга, необходимо их разделять запятыми:

    РегистрСведений.CR_СтатусыОбъектовАренды.СрезПоследних(, {(Контрагент = &Контрагент), (Договор = &Договор)})

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

    РегистрСведений.CR_СтатусыОбъектовАренды.СрезПоследних(, {(Контрагент).* КАК Контрагент, (Договор).* КАК Договор})

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

    Все описанное справедливо в первую очередь при снятом флажке Автозаполнения на закладке наборов данных СКД.

    Ну и прошу прощения, если я проявил излишнюю прыть, описав то, что Вы и без меня хорошо знали. 🙂

    Reply
  5. ids79

    (1)Спасибо, Юрий

    Reply
  6. ids79

    (2)Спасибо

    Reply
  7. ids79

    (4)Спасибо за дополнение.

    Я имел в виду не параметры, а отбор:

    {(Контрагент).* КАК Контрагент, (Договор).* КАК Договор},

    о чем пишет Денис.

    Вы правы, параметры тоже можно размещать здесь и в секции «ГДЕ».

    И, если они объединены логическим оператором, то их использовать возможно только совместно.

    В секции «ГДЕ», такие параметры будут находиться в одной строке:

    Reply
  8. ids79

    (5) Спасибо за дополнение

    Reply
  9. triviumfan

    Множество ссылок на «справедливо для отключенного флага ‘Автозаполнение'», — но ведь он почти всегда включен и поведение с ним такое же.

    Да кто этот флаг вообще отключает?! Может вы просто «не умеете его готовить»?(с)

    Reply
  10. triviumfan

    (5)

    справедливо в первую очередь при снятом флаже Автозаполнение

    Вы хотите сказать, что с включенным поведение отличается?

    Reply
  11. DoctorRoza

    Хорошая статья

    Reply
  12. dhurricane

    (11) Немного отличается, да. Например, я указал, что при использовании параметров не получится указать список исключений контрагенту, либо договору так, чтобы это условие попало в параметры виртуальной таблицы. Только строгое равенство одному значению. Это справедливо, если снят флаг автозаполнения и нет дополнительных инструкций для СКД.

    Но при включенном автозаполнении произвольный отбор по данным полям установить можно. И если в отборе на уровне отчета дополнительно установить фильтр по одному из полей на неравенство, то такое условие все равно попадет в параметры виртуальной таблицы. Хоть мы его явное об этом и не просили.

    Reply
  13. dhurricane

    (10)

    Да кто этот флаг вообще отключает?! Может вы просто «не умеете его готовить»?(с)

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

    В самом простом случае я его порой отключаю при выборке данных из регистра бухгалтерии, чтобы не было среди доступных полей таких как «Субконто1» и «Субконто2», а были мои, например «Контрагент» и «Договор».

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

    Reply
  14. AllexSoft

    (5) я кстати не знал что так можно, в то время когда я учился либо такого не было, либо на курсах в УЦ1 по СКД не показывали.. спасибо в общем, век живи век учись. Автору в статье неплохо бы дополнить этим моментом, уверен что многие не знают

    Reply
  15. ids79

    (13)Да правильно.

    Как раз об этом я пишу в статье:

    «Еще несколько моментов при использовании флага «Автозаполнение»:

    ….

    Если в запросе источника данных используется виртуальная таблица, и в настройках компоновки добавлен отбор по какому-либо измерению, в итоговом запросе макета, СКД будет накладывать отбор на параметры виртуальных таблиц»

    Reply
  16. ids79

    (15)Вы правы, стоит указать об этом в статье. Добавлю, когда будет время

    Reply
  17. ids79

    (10)Согласен с Денисом.

    Отключать Автозаполнение нужно только в том случае, если Вы ХОРОШО, знаете как это работает, для более гибкой настройки.

    Иначе можно получить очень неожиданный результат.

    Reply
  18. ids79

    (12)Спасибо

    Reply
  19. triviumfan

    (14)

    В самом простом случае я его порой отключаю при выборке данных из регистра бухгалтерии, чтобы не было среди доступных полей таких как «Субконто1» и «Субконто2», а были мои, например «Контрагент» и «Договор».

    Можно подробней? А то можно подумать…

    (14)

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

    Мне пока фигурных скобок хватает и ограничения поля в параметрах набора данных.

    Reply
  20. triviumfan

    (18) Отключить автозаполнение, программное выполнение…

    Тогда уже можно вернуться к «построителю отчета» 🙂

    Reply
  21. sam441
    Если флаг установлен, поля компоновки данных заполняются автоматически для всех полей, указанных на верхнем уровне запроса

    может все-таки на нижнем т.е. последнем?

    Reply
  22. dhurricane
    Reply
  23. triviumfan

    (23) Может задать разные превдонимы полей?

    Reply
  24. dhurricane

    (24) Да, можно дать другие псевдонимы, это поможет. Также, например, как помогает в параметрах виртуальных таблиц регистров, где не нужен отбор за период, указание инструкции {&ПустаяДата}. Можно также в приведенном примере попробовать уйти от использования виртуальной таблицы, заменив ее на вложенный запрос. В целом всегда можно применить тот или иной прием, дабы «отвлечь» СКД от некоторых оптимизаций при составлении запроса.

    Только я решительно не понимаю: зачем? Зачем применять различные приемы «обмана» СКД, зачем перестраивать исходный текст запроса, переименовывать поля и проводить прочие эксперименты с запросом? Ведь порой проще и красивее самому явно непосредственно в запросе указать СКД, как себя следует вести, что выбирать.

    Из Ваших комментариев я сделал вывод, что если есть хоть какой-либо способ изменить запрос и настроить поля так, чтобы сохранить работоспособность отчета, и при этом не снимать флаг «Автозаполнение», то всегда следует сохранять автозаполнение. Так к чему же такая однозначность? За что Вы так не любите этот флаг, или вернее его отсутствие?

    Reply
  25. Yashazz

    (15) а такого и не было изначально. Для меня тоже стало открытием.

    Reply
  26. Yashazz

    Отличная статья, спасибо. Чётко, полезно, грамотно, дельно.

    Reply
  27. ids79

    (27)Спасибо

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *