СКД не для отчетов

31 мая 2013

Отчеты это слишком просто!

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

Отчет на системе компоновки данных

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

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

Пример задачи

В справочнике "Товары" для группы "Группа - 1" и всех входящих в нее элементов необходимо вести историю изменения. Касаться вопроса почему для этого не подошел журнал регистрации не будем. Для решения задачи нужно создать отдельный регистр сведений с измерением "Товар", с типом ссылки на соответствующий справочник, и ресурсом "ДатаИзменения" с типом "Дата".

Регистр сведений "ИзмененныеТовары" для хранения истории редактирования товаров

Самый простой путь решения подобной задачи - это создать подписку на событие "ПриЗаписи" справочника и выполнять запись для текущего элемента в описанный ранее регистр сведений. Так, например, выглядела бы структура метаданных конфигурации и программный код в обработчике подписки.

Простой способ решения задачи

Однако у подобной реализации есть большие минусы:

  1. Мы жестко привязаны к имени группы "Группа - 1". Если пользователь изменит наименование группы, то алгоритм перестанет работать.
  2. Если завтра пользователь захочет включить наблюдение не только для этой группы или наложить дополнительные условия на реквизиты товаров, то нужно будет снова подключать к работе программиста.

Вот тут то и вступает в бой СКД, предлагая более универсальное решение!

С нуля

В регистр сведений "ИзмененныеТовары" добавим макет с типом "СхемаКомпоновкиДанных". В нем нужно лишь написать запрос к справочнику "Товары" и настроить структуру схемы:

Настраиваем наборы данных СКД

Создаем структуру отчета

Схема готова! С ее помощью при каждой записи товара мы будем проверять удовлетворяет ли записываемый элемент условиям отбора, заданных пользователем. Настройки отбора задает сам пользователь в режиме 1С:Предприятия, которые сохраняются в константе "НастройкиОтборов" с типом "ХранилищеЗначения". 

Для начала рассмотрим как изменится программный код обработчика подписки на событие "ПриЗаписи" справочника "Товары":

Обработчик подписки на событие "ПриЗаписи" с использованием СКД

Теперь проверку мы осуществляем не запросом, а получением данных через СКД. Условия выборки остались практически такими же, как и в первом предложенном варианте решения. Отбор устанавливается по ссылке на текущий элемент справочника "Товары", а также дополняется отборами, которые установил пользователь. Результат СКД выводится в таблицу значений. Если количество записей в ней больше 0, тогда текущий записываемый элемент справочника "Товары" удовлетворяет всем установленным отборам.

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

Пользовательские отборы хранятся в константе "НастройкиОтборов" в виде хранилища значения. Рассмотрим далее как эти настройки были установлены.

Особенности работы с компоновщиком настроек

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

Добавляем компоновщик настроек СКД на форму для дальнейшей работы

Чтобы компоновщик работал правильно необходимо:

  1. Инициализировать его для соответствующей схемы компоновки данных.
  2. Загрузить предыдущие настройки, если они были сохранены ранее.

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

Проблема была в том, что ни при каких настройках платформа не создавала источник доступных настроек по схеме компоновки данных. Конструктор:

Новый ИсточникДоступныхНастроекКомпоновкиДанных(<СхемаКомпоновки>);

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

Инициализируем компоновщик при создании формы

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

Настройки компоновщика берем либо из константы, либо получаем стандартные из схемы компоновки, если ранее они не были сохранены. 

При записи констант в событии формы "ПриЗаписиНаСервере" выполняем сохранение настроек компоновщика в константу:

Сохранение параметров компоновщика

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

Настройка отборов номенклатуры в пользовательском режиме

Вместо заключения

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

Подобный прием используется, например, в настройках обмена данными с сайтом на 1С:Битрикс в типовой конфигурации "Управление торговлей 11".

Использование СКД в механизме обмена с веб-сайтом. Управление торговлей 11

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

Время получения данных с помощью СКД

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

  СКД

comments powered by Disqus