В платформе «1С:Предприятие» за построение отчётов отвечает механизм под названием «Система компоновки данных» (сокращенно СКД). В этой статье мы постараемся дать краткое описание идеи и архитектуры механизма СКД и его возможностей.
СКД – это механизм, основанный на декларативном описании отчетов. СКД предназначен для построения отчетов и для вывода информации, имеющей сложную структуру. Кстати, помимо разработки отчетов механизм СКД также используется в «1С:Предприятии» в динамическом списке, средстве показа списочной информации с богатой функциональностью (показ плоских и иерархических списков, условное оформление строк, группировки и т.п.).
Немного истории
В самой первой версии платформы «1С:Предприятие 8», версии 8.0, отчеты делались так:
- Писался один или несколько запросов на языке запросов 1С (SQL-подобный язык, подробнее о нем ниже).
- Писался код, который переносил результаты выполненных запросов в табличный документ или в диаграмму. Код также мог делать работу, которую в запросе сделать невозможно – например, вычислял значения, используя встроенный язык 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
Отображение настройки в режиме «Быстрый доступ» во время выполнения (под кнопкой «Сформировать»)
Планы развития
Одно из приоритетных направлений в развитии СКД для нас – упрощение настроек пользователя. Наш опыт показывает, что для части конечных пользователей работа с пользовательскими настройками – все еще серьезный труд. Мы это учитываем и работаем в этом направлении. Соответственно, и разработчикам также станет проще работать с СКД, т.к. мы, как и раньше, хотим предоставлять единый инструментарий настройки отчетов и для разработчика, и для конечного пользователя.
Комментарии (62)
iliabvf
24.08.2017 10:54-3Эти топорные графики не стыдно выставлять на Хабр? Тут ведь не инфостарт, народ знаком с JS и canvas :)
Хотя и на инфостарте есть пару графиков на JS, но они не имеют к СКД никакого отношения…dmpas
24.08.2017 10:59+1Поддержу. Система компоновки данных — очень мощный механизм и пара круговых диаграмм вообще не раскрывает
тему сисекни одной из прелестей.iliabvf
24.08.2017 11:02я хорошо знаком с СКД, вопрос был на тему дизайна, есть ли они, дизайнеры, вообще в 1С?
PeterG Автор
24.08.2017 11:04Как считаете — как именно эффектней было бы раскрыть прелести СКД?
fishca
24.08.2017 11:30Описать как создать достаточно сложный отчет без написания кода вручную.
SuhoffGV
24.08.2017 12:31+1А потом написать как «обрезать пользователю» все лишнее, чтобы он не испортил этот отчет настройками. Очень часть пользователю нужен надежный молоток, а с СКД получается некий мультитул. Одно неловкое движение и у пользователя вместо молотка открывается космическая горелка с голосовым управлением.
fishca
24.08.2017 13:20Точно, сначала дадут инструмент, а потом обижаются на то что пользователь его не умеет готовить и неправильно настраивает.
bolonov
24.08.2017 13:04Петр, в добавок к показанному на мой взгляд стоило бы:
1. Проиллюстрировать примером использования СКД в кач-ве «движка» динамических списков
2. Рассказать про возможность программной работы с СКД и в частности с получением рез-тов ее исполнения в виде тех же таблиц значений. Это позволяет один раз реализовав какую-нибудь аццки сложную логику (пример — расчет среднесписочной численности сотрудников) иметь ее И в виде отчета И в виде данных на входе чего-нибудь еще.
erwins22
24.08.2017 11:301. Добавьте наконец в вычисляемые поля редактор!
2. 2 таблицы идущие подряд это кошмар, нельзя задать сквозную ширину колонок
3. если 3 строки в ячейке, то и в итоге 3 строчки
4. разбитие по страницам в СКД НЕТ
и еще 1000 «тут должен быть мат» мелочей
такое впечатление что после определенного шага развития решили оставить как есть.
Вычислитьвыражение это вообще попытка решить вопрос с помощью большого костыля врожденные проблемы.
Кстати, не разу не потребовалось за много лет сделать диаграмму.
shumkiiv
24.08.2017 12:07+2Да редактировать к примеру такое в вычисляемых полях
это просто жесть, реально нужен редакторPeterG Автор
24.08.2017 12:20В Enterprise Development Tools будет редактор для вычисляемых полей. Точнее, уже есть, просто Enterprise Development Tools пока в статусе Beta.
fishca
24.08.2017 13:23От этого, к сожалению, не легче. Когда выйдет EDT неизвестно, а мучиться продолжать мы будем еще долго. Плохо то что конфигуратор не хотите поддерживать.
vis_inet
24.08.2017 13:56Действительно не хотите поддерживать старый конфигуратор?
PeterG Автор
24.08.2017 13:58Функциональность конфигуратора будет поддерживаться. Другое дело, что какие-то нововведения (не принципиальные — вроде поля редактора в вычисляемых полях) могут быть реализованы в EDT и не быть реализованы в Конфигураторе.
Neikist
24.08.2017 14:25И это правильно. Конечно не от jetBrains, но хоть нормальная IDE будет. И надо всех силой на нее пересаживать. Иначе некоторые работодатели не будут переход поддерживать.
bolonov
24.08.2017 17:04>нормальная IDE будет
Конфигуратор вполне годная IDE
>надо всех силой на нее пересаживать.
Люди при наличии выбора сами выберут более подходящее им. И не надо силой никого и никудаNeikist
24.08.2017 17:26Конфигуратор вполне годная IDE
Да ладно, будь еще возможность без проблем плагины писать под него, более умную контекстную подсказку, и прочие плюшки нормальных IDE — можно было бы поспорить. А так… Есть подозрения что умельцы даже в vim или emacs больше возможностей добавить смогут…
cleaner_it
24.08.2017 14:45Я попробовал EDT, старый добрый конфигуратор удобнее. Может, и привыкну потом. А по теме — основы рассказали. Описывать всё не нужно, концепции вполне достаточно.
vis_inet
24.08.2017 15:26Я попробовал EDT, старый добрый конфигуратор удобнее
А в чём тогда преимущества EDT?Neikist
24.08.2017 15:29Она более удобна если не брать во внимание привычку, более умная, имеет возможность написания плагинов, и в целом имеет больше возможностей по умолчанию, которых в конфигураторе не будет принципиально насколько я понимаю (та же работа с гитом например и т.п.)
PeterG Автор
24.08.2017 15:28Мне, наоборот, с EDT обратно на Конфигуратор пересаживаться не хотелось. А что не понравилось в EDT? Не считая того, что еще не реализовано в бета-версии.
bolonov
24.08.2017 17:08EDT на уровне интерфейса подтормаживает в сравнении с Конфигуратором. Доли секунды, но заметны. Не знаю, то ли дело в нативности Конфигуратора, по сравнению с джавовским EDT, то ли в меньшей его навороченности.
И чисто эстетически Конфигуратор кажется более… элегантным, что ли
ЗЫЖ я понимаю что за EDT будушее и ряд его фишек стоят того, чтобы на него переходить
ssdvig
24.08.2017 15:26А что, EDT уже полноценно заменяет конфигуратор?
PeterG Автор
24.08.2017 15:28Релиз — заменит. В принципе на бете у меня получалось полноценно работать. Но: на EDT можно разрабатывать только управляемые приложения.
ssdvig
24.08.2017 15:30Про управляемые понятно. Когда я крайний раз смотрел EDT там не было плана счетов, бухгалтерских и расчетных регистров, уже есть?
PeterG Автор
24.08.2017 15:57В бета-версии — насколько помню, еще не было. Ну у меня область работы специфическая.
В релизе, кончено, все перечисленное будет.
fishca
24.08.2017 16:07можно разрабатывать только управляемые приложения
Так как же он заменит, если толстые формы не поддерживаются?Neikist
24.08.2017 16:12+1Серьезно? Кто то использует их в новых проектах?
fishca
24.08.2017 16:19Про поддержку существующего не забываем.
Про ограниченность тонких форм не забываемPeterG Автор
24.08.2017 16:25ВСЁ существующее продолжает поддерживаться в Конфигураторе.
Большинство типовых решений от 1С (ERP, УТ, КА, БП, ...) — написаны как управляемые приложения. Для новых разработок и рекомендуется DT.
tormozit
28.08.2017 14:29Частично проблема решается runtime средствами разработки, где есть достаточно удобные редакторы выражений. Тем более обычно сначала схема отлаживается в режиме предприятия и только потом помещается в конфигурацию.
erwins22
28.08.2017 14:32-1обычно сначала схема отлаживается в режиме предприятия и только потом помещается в конфигурацию
только если нет требываний по оформлению отчета. Просто требования могут сделать формирование отчета в режиме предприятия бессмысленной тратой времени.
geminirff
24.08.2017 16:56СКД очень мощный инструмент. С его помощью можно сделать много вещей, без кодирования. Но … бывает очень сложно сделать то, что нужно.
Это ИМХО за многие годы работы с ней.PeterG Автор
24.08.2017 16:57бывает очень сложно сделать то, что нужно.
Можете привести пример?geminirff
24.08.2017 17:31Да вот же erwins22 написал.
А у самого, из недавнего …
Нужен отчет с диаграммами «в строку»: первая справа, вторая слева. Строк много. Для некоторых необходимо рядом размещать таблицу данных, но с расширенным и переменным описанием объектом анализа.
Всё это необходимо сохранить в ECXEL с сохранением редактирования.
В итоге 800 строк интерфейсной логики, и 4200 — расчетной/оформительской. Предупреждаю — код не Ctrl+C, Ctrl+V, а хорошо декомпозирован.
Бывает и так …
Необходимо разработать сложный отчет с двумя десятками показателей и пятком объектов анализа. Рассчитать все это в СДК можно, но управлять потом невозможно. Это выльется в десяток наборов данных, с простынями «ВЫБРАТЬ», и бойницами параметров (о них писал shumkiiv). И попробуй ошибись с объединением наборов!
Или вот ещё …
Расшифровка и макеты. Специально ездил за книгой Хрусталёвой чтобы разобраться вот с этим …
Ну, не заходит оно.
Далее …
Программное управление параметрами отчета, его структурой: скрыть добавить группировку, убрать параметры при отсутствии какой-то группировки … и подобное. Всё это требует наличия какой-то библиотеки, и её использование ПриКомпоновкеРезультата.
Управление структурой отчета – всегда боль. И всячески нужно скрывать возможность порчи настроек пользователем. Об этом тоже писали.
Говорю об этом в противовес мнению «СДК – это супер отчеты без программирования».
Опять, же ИМХО, но СДК плохой механизм.
krovlads
29.08.2017 11:15+1PeterG Статья про 1с на Хабре и ни одного комментария про код кириллицей.
Можно считать это победой.
Верным путём идёте.
Neikist
29.08.2017 13:33По моему все претензии к языку обычно идут не от русскости, а от бедности синтаксиса, разве не? Не, конечно бывают отдельные индивидуумы, но по моему их даже на хабре минусили обычно.
fishca
Где 8.3.11?
Почему нет скринов конфигуратора, а только EDT?
PeterG Автор
А почему интересует именно 8.3.11? Извините, что вопросом на вопрос.
EDT мне больше нравится.
fishca
Потому что ждали релиз, а вышла тестовая и не в срок :(
И EDT — всего лишь бэта
Elanor
Так тестовая 8.3.11 тестовая еще ж не выходила. Как же релиз без тестовой? ;)
PeterG Автор
Тестовая 8.3.11 вышла, если не ошибаюсь, сегодня.
Elanor
Вышла-то сегодня, но fishca ждал «релиз».
iwans90
> А почему интересует именно 8.3.11?
Меня тоже это интересует. В ней обещали починить баги клиента под Mac, приводящие к падению клиента. Пользователи Mac ждут 8.3.11 как второго пришествия.
SONANT
Им некогда заниматься тем, что ждут пользователи, они чатики делают…
dadyjo
Согласен. 1С уже не тот, выкладывают в продакшен неработающую платформу и даже не отзывают! (8.3.10.2505)
iwans90
У нас 2505 в продакшене стоит, люди работают, под виндой проблем с платформой нет. У 1с есть баг-трекер, если есть какая-то существенная проблема, я бы предложил провести диагностику и зарегистрировать ее там, вдруг, с этим столкнется кто-то еще.
dadyjo
Ошибка 1с известна. Пофиксили в новой версии. Но по правильному должны были платформу отзывать, так как релиз неработоспособный!
www.forum.mista.ru/topic.php?id=802612
smakki
Только что появилась тестовая:)