Одна из самых важных областей бизнес-софта – это отчетность. От того, насколько легко настроить под меняющиеся потребности бизнеса (и законодательства) существующий отчет или сделать новый, может зависеть (причем не в переносном смысле!) судьба бизнеса, будь то отчет для налоговой инспекции или диаграмма зависимости спроса на товары от сезона и других факторов. Мощная и гибкая система отчетности, позволяющая легко извлечь из системы нужные данные, представить их в доступном для понимания виде, позволяющая конечному пользователю перенастроить стандартный отчет так, чтобы увидеть данные в новом свете – это идеал, к которому должна стремиться каждая бизнес-система.

В платформе «1С:Предприятие» за построение отчётов отвечает механизм под названием «Система компоновки данных» (сокращенно СКД). В этой статье мы постараемся дать краткое описание идеи и архитектуры механизма СКД и его возможностей.


СКД – это механизм, основанный на декларативном описании отчетов. СКД предназначен для построения отчетов и для вывода информации, имеющей сложную структуру. Кстати, помимо разработки отчетов механизм СКД также используется в «1С:Предприятии» в динамическом списке , средстве показа списочной информации с богатой функциональностью (показ плоских и иерархических списков, условное оформление строк, группировки и т.п.).

Немного истории

В самой первой версии платформы «1С:Предприятие 8», версии 8.0, отчеты делались так:
  1. Писался один или несколько запросов на языке запросов 1С (SQL-подобный язык, подробнее о нем ниже).
  2. Писался код, который переносил результаты выполненных запросов в табличный документ или в диаграмму. Код также мог делать работу, которую в запросе сделать невозможно – например, вычислял значения, используя встроенный язык 1С.
Подход прямолинейный, но не самый удобный – визуальных настроек минимум, все приходится программировать «врукопашную». А один из козырей на тот момент совсем новой платформы «1С:Предприятие 8» - это минимизация в прикладном решении объема кода, который нужно писать вручную, в частности, за счет визуального проектирования. Логично было бы пойти этим же путем и в механизме построения отчетов. Что и было сделано путем разработки нового механизма - Системы Компоновки Данных.

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

Постановка задачи

Задача перед командой разработки стояла такая – сделать систему создания отчетов, основанную не на алгоритмическом (т.е. через написание кода), а на декларативном подходе к созданию отчетов. И мы считаем, что задачу успешно решили. По нашему опыту, около 80% требуемой отчетности может быть реализована с помощью СКД без единой строчки кода (за исключением написания формул вычисляемых полей), по большей части - через визуальные настройки.
Разработка первой версии СКД заняла около 5 человеко-лет.

Два языка

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

Язык запросов

Язык запросов основан на SQL и легко осваивается знающими SQL. Пример запроса:

Легко видеть аналоги стандартных для SQL-запроса секций - SELECT, FROM, GROUP BY, ORDER BY.

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

  • Обращение к полям через точку. Если поля какой-либо таблицы имеют ссылочный тип (хранят ссылки на объекты другой таблицы), разработчик может в тексте запроса ссылаться на них через ".", при этом количество уровней вложенности таких ссылок система не ограничивает (например, ЗаказКлиента.Соглашение.Организация.Телефон).
  • Многомерное и многоуровневое формирование итогов. Итоги и подитоги формируются с учетом группировки и иерархии, обход уровней может выполняться в произвольном порядке с подведением подитогов, обеспечивается корректное построение итогов по временным измерениям.
  • Поддержка виртуальных таблиц. Виртуальные таблицы, предоставляемые системой, позволяют получить практически готовые данные для большинства прикладных задач без необходимости составления сложных запросов. Так, виртуальная таблица может предоставить данные по остаткам товаров в разрезе периодов на какой-то момент времени. При этом виртуальные таблицы максимально используют хранимую информацию, например, ранее рассчитанные итоги и т.д.
  • Временные таблицы. Язык запросов позволяет использовать в запросах временные таблицы. С их помощью можно повысить производительность запросов, в некоторых случаях снизить количество блокировок и сделать текст запроса более легким для восприятия.
  • Пакетные запросы. Для более удобной работы с временными таблицами в языке запросов поддерживается работа с пакетными запросами - таким образом, создание временной таблицы и ее использование помещаются в один запрос. Пакетный запрос представляет собой последовательность запросов, разделенных точкой с запятой (";"). Запросы в пакете исполняются один за другим. Результатом выполнения пакетного запроса, в зависимости от используемого метода, будет являться либо результат, возвращаемый последним запросом пакета, либо массив результатов всех запросов пакета в той последовательности, в которой следуют запросы в пакете.
  • Получение представлений ссылочных полей. Каждая объектная таблица (в которой хранится справочник или документ) имеет виртуальное поле - «Представление». Это поле содержит текстовое представление объекта и облегчает работу создателя отчетов. Так, для документа это поле содержит всю ключевую информацию - название типа документа, его номер и дату (например, «Продажа 000000003 от 06.07.2017 17:49:14»), избавляя разработчика от написания вычисляемого поля.
  • и др.
Механизм запросов автоматически модифицирует запрос с учетом ролей , к которым принадлежит пользователь, от имени которого выполняется запрос (т.е. пользователь увидит только те данные, которые имеет право видеть) и функциональных опций (т.е. в соответствии с настроенной в прикладном решении функциональностью).

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

Например:

  • ВЫБРАТЬ. В этом предложении описываются поля, которые пользователь сможет выбирать для вывода. После данного ключевого слова через запятую перечисляются псевдонимы полей из основного списка выборки запроса, которые будут доступными для настройки. Пример: {ВЫБРАТЬ Номенклатура, Склад}
  • ГДЕ. Описываются поля, на которые пользователь сможет накладывать отбор. В данном предложении используются поля таблиц. Использование псевдонимов полей списка выборки недопустимо. Каждая часть объединения может содержать собственный элемент ГДЕ. Примеры: {ГДЕ Номенклатура.*, Склад }, {ГДЕ Документ.Дата >= &ДатаНачала, Документ.Дата <= &ДатаКонца}
  • и др.
Пример использования расширений:

Язык выражений компоновки данных

Язык выражений компоновки данных предназначен для записи выражений, используемых, в частности, для описания выражений пользовательских полей. СКД позволяет определять в отчете пользовательские поля, используя либо собственные выражения, либо наборы вариантов с условиями их выбора (аналог CASE в SQL). Пользовательские поля являются аналогом вычисляемых полей. Они могут задаваться как в конфигураторе, так и в режиме «1С:Предприятие», но в выражениях пользовательских полей нельзя использовать функции общих модулей. Поэтому пользовательские поля предназначены скорее для пользователя, чем для разработчика.

Пример:

Процесс создания отчета на СКД

При создании отчета нам нужно создать макет, определяющий, как данные будут отображаться в отчете. Можно создать макет, базирующийся на схеме компоновки данных. Схема компоновки данных описывает суть данных, которые предоставляются отчету (откуда получать данные и как можно управлять их компоновкой). Схема компоновки данных представляет собой базу, на основе которой могут быть сформированы всевозможные отчеты. Схема компоновки данных может содержать:
  • текст запроса с инструкциями системы компоновки данных;
  • описание нескольких наборов данных;
  • подробное описание доступных полей;
  • описание связей между несколькими наборами данных;
  • описание параметров получения данных;
  • описание макетов полей и группировок;
  • и др.

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

Итогом запуска конструктора запросов будет текст запроса (на языке запросов «1С:Предприятия»). Этот текст можно при необходимости скорректировать вручную:

Наборов данных в схеме компоновки данных может быть несколько, наборы данных могут быть связаны в макете произвольным образом, могут быть добавлены вычисляемые поля, заданы параметры отчета и т.п. Стоит упомянуть интересную особенность работы механизма запросов в 1С:Предприятии. Запросы в конечном итоге транслируются в диалект SQL, специфичный для СУБД, с которой непосредственно работает приложение. Мы вообще стараемся задействовать возможности серверов СУБД по максимуму (нас ограничивает то, что мы используем только те возможности, которые есть одновременно во всех поддерживаемых платформой «1С:Предприятие» СУБД – MS SQL, Oracle, IBM DB2, PostgreSQL). Таким образом, на уровне запроса в вычисляемых полях мы можем использовать только те функции, которые транслируются в SQL.

А вот на уровне схемы компоновки данных мы уже можем добавлять пользовательские поля и использовать в них функции на встроенном языке разработки 1С (в том числе и написанные нами), что сильно расширяет возможности отчетов. Технически это выглядит так – всё, что можно транслировать в SQL, транслируется в SQL, запрос выполняется на уровне СУБД, результаты запроса помещаются в память сервера приложений 1С и СКД вычисляет для каждой записи значения вычисляемых полей, чьи формулы написаны на языке 1С.


Добавление пользовательских полей

В отчет можно добавить произвольное количество таблиц и диаграмм:


Дизайнер отчетов


Отчет во время выполнения

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

Коротко описать процесс построения и формирования отчета можно так:

  • Разработчик в design time с помощью дизайнера (или в runtime с помощью кода) определяет схему компоновки данных:
    • Текст запроса/запросов
    • Описание вычисляемых полей
    • Связи между запросами (если их несколько)
    • Параметры отчета
    • Настройки по умолчанию
    • И т.д.
  • Вышеописанные настройки сохраняются в макете
  • Пользователь открывает отчет
    • Возможно, делает дополнительные настройки (например, меняет значения параметров)
    • Нажимает кнопку «Сформировать»
  • Настройки пользователя применяются к схеме компоновки данных, определенной разработчиком.
  • Формируется промежуточный макет компоновки данных, содержащий в себе инструкции, откуда получать данные. В частности, корректируются запросы, заданные в макете. Так, из запроса удаляются поля, которые не используются в отчете (это делается с целью минимизировать объем получаемых данных). В запрос добавляются все поля, участвующие в формулах вычисляемых полей.
  • В дело включается процессор компоновки данных. Процессор компоновки выполняет запросы, осуществляет связь наборов данных, рассчитывает значения вычисляемых полей и ресурсов, выполняет группировку. Словом, делает все расчеты, которые не были выполнены на уровне СУБД.
  • Процессор вывода данных запускает запрос на исполнение и выводит полученные данные в табличный документ, диаграмму и т.п.


Процесс формирования отчета механизмом СКД

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

Пользовательские настройки

Весь инструментарий СКД доступен как разработчику, так и конечному пользователю. Но практика показала, что конечного пользователя часто пугает обилие возможностей инструмента. Тем более что в большинстве случаев вся мощь настроек конечному пользователю и не нужна – ему достаточно иметь быстрый доступ к настройке одного-двух параметров отчета (например, периода и контрагента). Начиная с определенной версии платформы у разработчика отчета появилась возможность отметить, какие настройки отчета доступны пользователю. Делается это с помощью флажка «Включать в пользовательские настройки». Также у настроек отчета появился флаг «Режим отображения», принимающий одно из трех значений:
  • Быстрый доступ. Настройка будет выведена непосредственно в верхнюю часть окна отчета.
  • Обычный. Настройка будет доступна через кнопку «Настройки».
  • Недоступный. Настройка будет недоступна конечному пользователю.


Режим отображения настройки в design time


Отображение настройки в режиме «Быстрый доступ» во время выполнения (под кнопкой «Сформировать»)

Планы развития

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

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

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

Решение

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

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

Чтобы показатель количественного остатка отображался на диаграмме, добавим поле "КоличествоОстаток" в ресурс.

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


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

Выбрав в конструкторе тип отчета «Диаграмма» нам нужно выбрать настройки:

1. Поля диаграммы.


2. Серии и точки диаграммы.


3. Тип диаграммы.


На этом задачу по созданию отчета можно считать выполненной!

Результат

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

Соберем оставшиеся вопросы 11 раздела тестирования, с пояснениями по тексту.

Вопрос 11.06 экзамена 1С:Профессионал по Платформе. При использовании в системе компоновки данных диаграммы (получение в выходной форме) для нее характерно:

  1. можно включить в выходную форму только одну диаграмму
  2. можно включить в выходную форму любое количество диаграмм, но они должны иметь один тип
  3. можно включить в выходную форму любое количество диаграмм, но они должны выводить данные по одному ресурсу
  4. можно включить в выходную форму любое количество диаграмм без ограничения

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

и вторая:

Вопрос 11.14 экзамена 1С:Профессионал по Платформе. В каком случае условия из отбора, указанного в настройках системы компоновки данных, не помещаются в текст запроса?

  1. Отбор установлен для группировки
  2. В условии используется вычисляемое или пользовательское поле, содержащее выражения, которые не могут быть представлены на языке запросов
  3. В условии используются поля из нескольких наборов данных
  4. Верно все выше перечисленное

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

Вопрос 11.15 экзамена 1С:Профессионал по Платформе. Можно ли в языке выражений системы компоновки данных использовать собственные функции?

  1. Нельзя
  2. Можно, но только при программной работе с системой компоновки данных. Функции должны быть описаны с ключевым словом "Экспорт" и обязательно расположены в глобальном общем модуле
  3. Можно, но только при программной работе с системой компоновки данных. Функции должны быть описаны с ключевым словом "Экспорт" и расположены в любом общем модуле
  4. Можно, но только при интерактивной работе с системой компоновки данных. Функции должны быть описаны с ключевым словом "Экспорт" и обязательно расположены в глобальном общем модуле
  5. Можно, но только при интерактивной работе с системой компоновки данных. Функции должны быть описаны с ключевым словом "Экспорт" и расположены в любом общем модуле
  6. Можно, и при интерактивной, и при программной работе с системой компоновки данных. Функции должны быть описаны с ключевым словом "Экспорт" и расположены в любом общем модуле

Правильный ответ шестой. К чему картинка, непонятно.

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

  1. В разделе "Вычисляемые поля"
  2. В разделе "Параметры"
  3. В разделе "Макеты"
  4. В разделе "Настройки" на закладке "Пользовательские поля"
  5. Верно все перечисленное
  6. Верны ответы 1 и 4

Правильный ответ пятый. Выражение в вычисляемых полях:

В Параметрах:

В Макетах:

И в Пользовательских полях:


Вопрос 11.19 экзамена 1С:Профессионал по Платформе. Параметр схемы компоновки данных может быть создан

  1. Автоматически, на основании текста запроса
  2. Интерактивно, в окне конструктора схемы компоновки данных в разделе "Параметры"
  3. Интерактивно, в окне конструктора схемы компоновки данных в разделе "Настройки" на закладке "Параметры"
  4. Программным образом
  5. Верно все перечисленное
  6. Верны ответы 1, 2 и 4

Правильный ответ шестой - в третьей опции параметр допустимо лишь менять, не создавать:


Вопрос 11.20 экзамена 1С:Профессионал по Платформе. В каком элементе управления результат вывода отчета представляется в виде, похожем на электронную таблицу?

  1. Поле табличного документа
  2. Поле итоговой таблицы
  3. Диаграмма
  4. Сводная диаграмма

Правильный ответ первый. Точно не диаграмма:)

Вопрос 11.38 экзамена 1С:Профессионал по Платформе. В каком месте можно настроить связь между полями внешней и вложенной схем?

  1. Поле табличного документа
  2. В настройках самой вложенной схемы
  3. В настройках внешней схемы
  4. В специальном окне "Настройки вложенной схемы"
  5. Верны все варианты
  6. Верны варианты 1 и 3