Как сделать отборы без скд. СКД не только для отчетов – реализация универсальных отборов

Расширение языка запросов для системы компоновки данных

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

Синтаксические элементы расширения языка запросов системы компоновки данных

ВЫБРАТЬ

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

Например:

{ВЫБРАТЬ Номенклатура, Склад}

После псевдонима поля может находиться комбинация символов «.*», что обозначает возможность использования дочерних полей от данного поля.

Например, запись Номенклатура.* обозначает возможность использования дочерних полей поля «Номенклатура» (например, поля «Номенклатура.Код»). Элемент ВЫБРАТЬ может присутствовать только в первом запросе объединения.

ГДЕ

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

{ГДЕ Номенклатура.*, Склад }

Нехитрый пример

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

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

ВЫБРАТЬ СпрНоменклатура.Ссылка КАК Номенклатура, ПродажиОбороты.Контрагент, ПродажиОбороты.ДоговорКонтрагента, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Стоимость ИЗ Справочник.Номенклатура КАК СпрНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты ПО СпрНоменклатура.Ссылка = ПродажиОбороты.Номенклатура

Вот результат:

Контрагент Договор Номенклатура Количество Сумма
null null _Тест1 null null
ООО "Рога и копыта" Договор1 Тапочки 10 1200
ОАО "Газпром" Клевый договор Сапоги 5 13000
null null Галоши null null
null null Сланцы null null

В данном примере не было продаж номенклатуры: "Галоши" и "Сланцы"

И все бы ничего, если мы сгруппируем выборку по контрагенту то вся не продаваемая номенклатура попадет в отдельную группировку, где Контрагент = Null, но клиент хочет иметь в отчете произвольный отбор по полю контрагент(естественно имеется ввиду контрагент из регистра Продажи). Как быть? Ведь по сути нам нужно фильтровать только таблицу Продажи . Если мы используем автозаполнение в конструкторе СКД, то в доступные поля отбора попадет поле Контрагент , все вроде бы хорошо, но при исполнении отчета с отбором по контрагенту мы потеряем все записи из соединения с номенклатурой. Например, установим отбор: Контрагент = ООО "Рога и копыта" . Результат будет выглядеть так:

Совсем не то что нам нужно, правда?

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

Решение есть: для этого в конструкторе запросов на вкладке Компоновка данных => Таблицы добавим поле-условие в условия виртуальной таблицы ПродажиОбороты и сменим ему псевдоним на КонтрагентОтбор

Для того чтобы не путать пользователя с полями отбора, отключим поле-условие Контрагент и сменим заголовок для поля КонтрагентОтбор


В результате выполнения данной схемы с включенным отбором по полю контрагент результирующий запрос примет вид:

ВЫБРАТЬ СпрНоменклатура.Ссылка КАК Номенклатура, ПродажиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента, ПродажиОбороты.КоличествоОборот КАК >Количество, ПродажиОбороты.СтоимостьОборот КАК Стоимость, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.ДоговорКонтрагента) КАК ДоговорКонтрагентаПредставление, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление, СпрНоменклатура.Представление КАК НоменклатураПредставление ИЗ Справочник.Номенклатура КАК СпрНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&П , , , Контрагент = &П3 ) КАК ПродажиОбороты ПО СпрНоменклатура.Ссылка = ПродажиОбороты.Номенклатура

И соответственно результат:

Контрагент Договор Номенклатура Количество Сумма
null null _Тест1 null null
ООО "Рога и копыта" Договор1 Тапочки 10 1200
null null Сапоги null null
null null Галоши null null
null null Сланцы null null

Тест1 - это группа в справочнике Номенклатура, в которой все лежит

К публикации прикреплена схема XML-схема отчета, использовавшегося в публикации. Схему создавал в Комплексной автоматизации, но думаю, все будет прекрасно работать и в УПП и в УТ 10

Подведение итогов

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

Если же вы имеете достаточно опыта, чтобы создавать схемы без использования Автозаполнения - то данный совет не имеет смысла.

Использовавшийся софт

  • Программа создания скриншотов SnimOK!
  • Редактор XML-файлов

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

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

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

Рассмотрим, как это можно сделать при помощи СКД. Создадим в нашей обработке Макет с типом Схема компоновки данных и заполним его нашим запросом:

На вкладке Настройки добавим новую группировку без детализации и, в нашем примере, поле Контрагент, так как в итоге мы получим все в таблицу значений:

И на вкладке Отбор добавим в отбор Контрагента:

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

Теперь создадим обработчики событий формы ПриОткрытии и обработчик нажатия кнопки Выполнить, код представлен ниже:

Перем Макет; Процедура КнопкаВыполнитьНажатие(Кнопка) Результат.Очистить(); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(Макет, Компоновщик.ПолучитьНастройки(), Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбъект(Результат); ПроцессорВывода.Вывести(ПроцессорКомпоновки); Если ЭлементыФормы.Результат.Колонки.Количество() = 0 Тогда ЭлементыФормы.Результат.СоздатьКолонки(); КонецЕсли; КонецПроцедуры Процедура ПриОткрытии() Макет = ПолучитьМакет("Макет"); ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(Макет); Компоновщик.Инициализировать(ИсточникДоступныхНастроек); Компоновщик.ЗагрузитьНастройки(Макет.НастройкиПоУмолчанию); КонецПроцедуры

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

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

Кононов Сергей

Для чего может применяться СКД?

Устоявшееся мнение – для отчетов.

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

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

Для каких задач это будет полезно?

Приведем примеры из типовых конфигураций :

  • Обработка «Выгрузка данных на сайт»
  • Формирование прайс-листа
  • Выгрузка данных в ТСД (терминал сбора данных)
  • Сегментирование товаров, партнеров
  • Формирование заказов (клиентов, поставщикам) по потребностям
  • Планирование ремонтов в 1C:ERP.

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

Создание произвольного отбора в управляемой форме с использованием СКД

В уроке рассмотрена работа с компоновщиком настроек схемы компоновки данных:

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

Получение данных из базы с фильтрацией по отбору СКД

В видео показано, как можно выбрать данные с помощью ранее установленного отбора в компоновщике настроек.

Используется “страшный” объект – ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений .

На самом деле, не все так сложно – за 8 минут мы решаем поставленную задачу.

Хранение отборов СКД в информационной базе

В уроке рассмотрим сохранение настроек компоновщика СКД с помощью Хранилища значений.

Разбираемся, как решить эту задачу в конфигурации “1С:Управление производственным предприятием 1.3”.

Приятного просмотра! :)

Вообще, СКД предоставляет массу возможностей.

Вот несколько “фишечек”, которые мы даже не успели описать на странице курса.

Если нужно собрать данные из разных источников , есть три варианта.

Можно пытаться составлять один “универсальный” запрос для всех данных (долго), можно в цикле выводить данные нескольких запросов (жесткая, негибкая структура) – а можно просто задействовать СКД и соединение наборов данных вместо одного запроса.

При этом важно получить корректные итоги – в этом есть особенности, если источников несколько

При помощи СКД можно просто получить срез последних на каждую дату в отчете .

Или, для наглядности, – получить цену товара на каждую дату продажи .

С помощью СКД можно организовать вывод в отчет всех дат за период , а не только тех, на которые были данные в отчете (дополнение дат без программирования, только возможностями СКД)

С помощью СКД можно организовать вложенные группировки с дополнением периодов (год/квартал/месяц и т.д.)

Произвольно оформить отчет, например, вывести заголовок колонки вертикально, а данные в этой колонке – горизонтально.

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

Как в отчете соединить несколько условий по ИЛИ? Такой возможности, например, в построителе отчета нет – но есть в СКД

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

Безусловно, здесь есть и нюансы, на которые нужно обращать внимание

При создании отчета разработчик отладил текст запроса, но при использовании этого запроса в отчете на СКД система выдает неверный результат.

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

При добавлении в отчет детализации до документа-регистратора система иногда выдает “некорректные” начальные и конечные остатки.

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

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

Если Вы хотите профессионально освоить СКД и ежедневно применять в своей работе , записывайтесь на курс:

Поддержка – 2 месяца . Объем курса – 34 учебных часа .

Не откладывайте свое обучение!