Учебный пример программного формирования схемы компоновки данных: Универсальный отчет по регистрам накопления

14.06.21

Разработка - СКД

Разберём учебную задачу создания Универсального отчета по оборотным регистрам накопления конфигурации.

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

Дано: конфигурация с несколькими оборотными регистрами накопления:

  • ОбщаяСтатистика
  • СтатистикаОтветов

Мы создадим универсальный отчет, который будет выглядеть так:
 

 

У нашего отчета будут особенности:
 

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

Посмотрим на объект ОтчетОбъект в Синтакс-помощнике:

 

Видим следующее:
  1. свойства объекта КомпоновщикНастроек и СхемаКомпоновкиДанных

    содержат используемую отчетом схему и применяемые к ней настройки

  2. метод СкомпоноватьРезультат()

    вызывает выполнение отчета

  3. событие ПриКомпоновкеРезультата

    вызывается до выполнения отчета

    соответственно здесь можно его донастроить перед выводом


Также есть особенности и у формы отчета:
 

Видим следующее:
  1. у формы есть ряд специфичных свойств

  2. присутствует метод СкомпоноватьРезультат

    то есть можем вызвать формирование отчета из модуля формы, не получая объект отчета

    результат отчета будет выведен в элемент формы, указанный в её свойстве "Результат отчета"

     
    Показать картинку (к сожалению мелко)
  3. есть метод СоздатьЭлементыФормыПользовательскихНастроек()

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

    при этом есть и интерактивное свойство формы: Группа пользовательских настроек

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

  5. есть параметры формы, специфичные для отчета

    Отбор

    1. если установлен, отчет будет открыт с предустановленным отбором
    2. это Структура
    3. ключ соответствует имени поля компоновки схемы

    СформироватьПриОткрытии

    1. Булево
    2. если Истина, отчет будет сформирован
    3. и мы попадём в событие модуля объекта ПриКомпоновкеРезультата

Сделаем следующее

 

  1. Создадим новый отчет "УниверсальныйОтчет"

  2. Создадим основную форму отчета

  3. Основную схему компоновки данных создавать не будем

  4. Приведём отчет и его форму в следующий вид:
     


     
  5. В ПриСозданииНаСервере заполним список выбора элемента формы данными оборотных регистров накопления конфигурации

    Значение - имя регистра, Представление - по желанию, например "Полное имя"

    Список регистров накопления получаем динамически
     

     
    Показать логику кода

     

  6. Результат:
     


Теперь при изменении поля ИмяРегистра нам нужно
  1. Программно сформировать СКД

  2. Инициализировать компоновщик настроек формы

  3. Сформировать настройки компоновщика
     


 

Шаг 2 - это стандартный код, необходимый для инициализации КомпоновщикаНастроек.

Посмотрим на объект КомпоновщикНастроекКомпоновкиДанных
 

Видим следующее:
  1. конструктор без параметров

  2. присутствует свойство Настройки с типом НастройкиКомпоновкиДанных

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

     
    подробнее

    есть соответствующие методы загрузки настроек: Загрузить...Настройки()

    Существует три вида настроек СКД: Основные, Пользовательские и Фиксированные
  3. есть метод инициализации Инициализировать с параметром ИсточникДоступныхНастроекКомпоновкиДанных

     
    Показать картинку
  4. есть метод ПолучитьНастройки, который "склеивает" все три возможные настройки

    1. за основу берутся настройки компоновки (свойство Настройки)
    2. к ним применяются пользовательские (свойство ПользовательскиеНастройки)
    3. накладываются отбор, условное оформление и параметры из свойства ФиксированныеНастройки
     
    Показать картинку


Таким образом логика кода инициализации следующая:
 


 

 
Как думаете, зачем нужна инициализация компоновщика?


Предметом настройки, осуществляемой объектом КомпоновщикНастроек является СхемаКомпоновкиДанных.

Схема содержит структуру (каркас) данных, настройки - то как эти данные будут скомпонованы при выводе.

Соответственно настройка оперирует "кирпичиками", определёнными в схеме - объектами ПолеКомпоновкиДанных.

При инициализации эти кирпичи становятся доступными для настройки.

Объект ПолеКомпоновкиДанных по сути является обёрткой строки.


Доступные для настройки поля ссылаются на поля компоновки.
 

  1. Настройки компоновки содержат ряд свойств ДоступныеПоля<...>

  2. Это коллекция элементов ДоступноеПолеКомпоновкиДанных, которое является обёрткой поля:

  3. По факту всё сводится к оперированию атомарными объектами схемы - ПолеКомпоновкиДанных


Посмотрим на объект СхемаКомпоновкиДанных.
 

Видим следующее:
  1. конструктор опять без параметров

  2. есть источники данных, настройки, макеты и НаборыДанных

    Обратите внимание на свойство Набора с говорящим названием - Запрос


Основой СКД являются "Наборы данных", по полям набора данных формируются возможные поля:

объекты ПолеКомпоновкиДанных и их обёртки: ДоступныеПоляВыбора, ДоступныеПоляОтбора и т.д.


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

    По параметру ИмяРегистра будем понимать для какого регистра формируем текст запроса
     


     
  2. Конструкция {&ДатаНачала},{&ДатаОкончания} означает, что вместо стандартных параметров
    виртуальной таблицы ПериодНачала и ПериодОкончания мы будем использовать свои: ДатаНачала и ДатаОкончания

    это такой способ "переименования" стандартных параметров

  3. функция будет возвращать созданную схему: Возврат СхемаКомпоновки

Соедините этот код и код инициализации.
 
 
Получится следующее:
 
То есть имеем ошибку: Не установлена схема компоновки данных
Вспомним, что отчет формируется по схеме, установленной в его свойстве СхемаКомпоновкиДанных
А ещё, что где-то есть место, где мы можем "донастроить" вывод отчета...
 
 
Показать подсказку
 
Почему возникает и как её исправить?

Решили проблему, но теперь у нас вот так:
 


 

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

Видим следующее:
  1. есть аналогия с объектами языка, модифицирующими текст запроса

    с объектом ПостроительЗапроса, например

    1. ДоступныеПоля разбиты на несколько
      коллекций ДоступныеПоля<>

    2. ВыбранныеПоля -> Выбор

    3. Отбор -> Отбор

    4. Параметры -> ПараметрыДанных

    5. Измерения -> Структура

     

  2. Чтобы что-нибудь вывелось нам надо:

    1. Получить настройки

    2. Заполнить коллекцию Выбор

    3. Добавить группировку в коллекцию Структура

    4. Определить поля добавленной группировки

    5. Загрузить изменённые настройки в КомпоновщикНастроек


Собственно, реализуем:
 


 

Часто возникает вопрос: как добавить в коллекцию нужный тип?
 

 

Решается использованием конструкций вида:

  1. Тип("ВыбранноеПолеКомпоновкиДанных")

  2. Тип("ГруппировкаКомпоновкиДанных")

  3. Тип("АвтоВыбранноеПолеКомпоновкиДанных")

 
В итоге получим такой вывод:
 


 

 
Чего не хватает по ощущениям?

Реализуем следующее:
  1. Итоги по ресурсам выбранного регистра

    здесь всё довольно просто - надо заполнить коллекцию ПоляИтога соответствующего свойства Схемы:

     
    Показать код
  2. Выведем на форму отбор по периоду

    здесь уже посложнее; помним, что мы переименовали параметры периода:
     


     

    при формировании настроек компоновщика пишем:
     


     

    заполненное свойство ИдентификаторПользовательскойНастройки включает элемент в ПользовательскиеНастройки

     
    Показать картинку


    А если элемент включен в пользовательскую настройку - то он отображается на форме отчета. Всё просто)
     


     
  3. Добавим отбор по полю Тест

    здесь похожая ситуация, сами сможете сделать?

     
    Показать код

А теперь вместо "Дата начала" и "Дата окончания" выведем один параметр Период с типом СтандартныйПериод

Для этого:
  1. Добавим параметр Период в схему компоновки

    Установим Выражение для параметров ДатаНачала и ДатаОкончания

    Ограничим видимость параметров ДатаНачала и ДатаНачала (если этого не сделать, то будет как на картинке ниже в спойлере)

     
    Показать картинку
  2. Включим наш параметр в пользовательские настройки

  3. Результат:

Надеюсь, статья будет вам полезна. Спасибо дочитавшим до конца)
Желающих изучить 1С приглашаю на свой курс-репетитор по программированию в 1С 8.3: infostart.ru/courses/1380252/

КомпоновщикНастроекКомпоновкиДанных СхемаКомпоновкиДанных НастройкиКомпоновкиДанных ПоляИтога ИдентификаторПользовательскойНастройки ФиксированныеНастройки

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 8000 руб.

02.09.2020    122415    673    389    

716

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

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

3 стартмани

05.02.2024    4061    26    obmailok    17    

64

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2007    2    Yashazz    0    

29

СКД на JavaScript в 1С

СКД WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8172    20    John_d    25    

123

Использование менеджера временных таблиц в СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

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

05.12.2023    4663    PROSTO-1C    13    

61

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    5816    15    kalyaka    5    

86

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

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

18.09.2023    6747    accounting_cons    5    

29

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

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

01.09.2023    4538    KVIKS    15    

80
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Jimbo 9 16.06.21 14:50 Сейчас в теме
Как-то корявенько. Много скринов из хелпа. Много кода, хотя даже не показана структура самих 2 регистров.
О чём статья ? О программной работе с СКД ? Так есть потолковее аналоги, где суть кратко и ёмко изложены без воды, кучи кода и скринов хелпа.
2. maraton1185 147 17.06.21 08:15 Сейчас в теме
Суть в том, что структура регистров не важна, как и их количество в конфигурации)
Мы же наполняем список выбора из метаданных, а запрос по регистру формируем через ВЫБРАТЬ *

По поводу скринов хелпа - вообще в Синтакс-помощнике есть вся необходимая информация, нужно просто научиться его внимательно читать и понимать.
Например мне кажется интересной аналогия структуры объектов ПостроительЗапросов и НастройкиКомпоновкиДанных.
Также часто возникают неясности с тек как работать с объектом ПолеКомпоновкиДанных и зачем он нужен в принципе.
А исходя из той же справки - это просто обёртка строки-имени поля в запросе.
Можно провести следующую связку:
Текст запроса - > ПолеКомпоновкиДанных - > ДоступноеПолеКомпоновкиДанных - > ДоступныеПоляВыбора -> Выбор.Элементы
На мой взгляд это не вода, а информация для кругозора.

При написании кода быстрее всего посмотреть как раз в Синтакс-помощник)
Что касается кучи кода - ну как же без него? Мы же про программную работу говорим.
neyasytyf; fomaOp; ixijixi; +3 Ответить
3. silverr 15 29.07.21 19:55 Сейчас в теме
Всем доброго времени суток!
А можно мне задать вопрос по отборам в отчетах на СКД.
Пытаюсь из расширения запустить отчет конфигурации БП 3.0 "Движения товаров". Передаю туда отбор по номенклатуре:
Номенклатура = ТекущиеДанные.Ссылка;
        Отбор = Новый Структура("Номенклатура", Номенклатура);
        Отбор.Вставить("НачалоПериода", НачалоМесяца(ТекущаяДата()));
        Отбор.Вставить("КонецПериода", ТекущаяДата());
        ПараметрыФормы = Новый Структура("СформироватьПриОткрытии, Отбор", Истина, Отбор);
        ФормаОтчета = ПолучитьФорму("Отчет.ДвижениеТоваров.ФормаОбъекта", ПараметрыФормы);
        НовыеПользовательскиеНастройки = Новый ПользовательскиеНастройкиКомпоновкиДанных;
        ФормаОтчета.Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(НовыеПользовательскиеНастройки);
        ОткрытьФорму(ФормаОтчета);
Показать

Выдает ошибку:
Невозможно применить фиксированные настройки. Совпадают значения параметра.
{Отчет.ДвижениеТоваров.Форма.ФормаОтчета.Форма(667)}:    ПараметрыОтчета.НастройкиКомпоновкиДанных         = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
{Отчет.ДвижениеТоваров.Форма.ФормаОтчета.Форма(925)}:    ПараметрыОтчета = ПодготовитьПараметрыОтчетаНаСервере();
{Отчет.ДвижениеТоваров.Форма.ФормаОтчета.Форма(733)}:    БухгалтерскиеОтчеты.ЗаписатьОперациюБизнесСтатистики(ЭтотОбъект, "СформироватьОтчет", НастройкиОтчетаДляСтатистики());
{Отчет.ДвижениеТоваров.Форма.ФормаОтчета.Форма(875)}:    РезультатВыполнения = СформироватьОтчетНаСервере();
{Отчет.ДвижениеТоваров.Форма.ФормаОтчета.Форма(511)}:    ЗапуститьФормированиеОтчета();
по причине:
Невозможно применить фиксированные настройки. Совпадают значения параметра
Показать


Если передавать параметры в виде фиксированных настроек, типа:
ПараметрыФормы = Новый Структура();
        ПараметрыФормы.Вставить("Отбор", Новый Структура("Номенклатура",ТекущиеДанные.Ссылка));
        ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
        ОткрытьФорму("Отчет.ДвижениеТоваров.Форма", ПараметрыФормы, ЭтаФорма, УникальныйИдентификатор);

Отчет открывается не заполненным, по кнопке "Сформировать" получаем все туже ошибку. Но если нажать "Показать настройки" и на вкладке "Отбор" снять отбор по выбранной позиции, то отчет формируется.
Данные правильные, но с прицепом в виде предупреждения "Отчет не сформирован! Недействительный адрес или не найден родительский сеанс задания".
Вобщем никакой автоматизации. Прошу помощи!!!
4. sml 41 09.08.21 17:35 Сейчас в теме
не указано, что установка Идентификатора пользовательской настройки надо выполнять в конце Процедура ИмяРегистраПриИзмененииНаСервере(),
после чего надо загрузить измененные настройки в компоновщик настроек
	ПарКД = НастройкиКомпоновки.ПараметрыДанных.Элементы.Найти("ПериодОтчета");
	ПарКД.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;
	
	КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКомпоновки);
	
Оставьте свое сообщение