Нюансы программной работы со схемой компоновки данных

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

Но на практике часто встречаются задачи, когда схему компоновки нужно программно создать с нуля или доработать существующую схему при помощи кода на встроенном языке, настроить вариант отчета – добавить отбор, установить условное оформление, добавить группировку и т.д. Такие задачи решаются на внедрениях при адаптации типовых конфигураций фирмы “1С” под требования конкретного заказчика.

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

Задача действительно очень актуальная, участники Мастер-группы по СКД задают много вопросов на эту тему :)

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

  • Почему отличаются значения параметра в настройках компоновщика и в пользовательских настройках? Которое из этих значений используется для формирования отчета?
  • Как связываются между собой настройки компоновщика и пользовательские настройки?
  • Как установить значение отбора или параметра, если они вынесены в пользовательские настройки?
  • И многие другие…

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

Общая длительность всех видеоуроков – 1 час 5 минут.

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

Полезного просмотра :)

Видео 1 – Программное создание варианта отчета

00:37 – В каком обработчике можно расположить код для создания настроек компоновки
01:00 – Где в Синтакс-помощнике можно “подсмотреть” свойства, которые потребуются при написании кода
01:58 – Как настроить группировки отчета
02:28 – Какое свойство позволяет создавать вложенные группировки
03:11 – Как включить/выключить отдельные элементы настроек.

Видео 2 – Программное создание группировки

00:22 – Как создать структуру отчета
02:00 – Как указать поля, по которым выполняется группировка
04:10 – Как настроить выбранные поля
06:30 – Как создать автополе.

Видео 3 – Программное создание вложенной группировки

00:22 – Как создать подчиненную группировку
02:05 – Почему в отчете группировки могут выводиться несколько раз
02:40 – Как проверить наличие группировок в структуре отчета.

Видео 4 – Программное добавление отбора

00:18 – Где в Синтакс-помощнике найти типы данных, необходимые для создания отборов
00:55 – Какие свойства объекта типа ЭлементОтбораКомпоновкиДанных нужно использовать для создания отбора
01:20 – Как создать отбор при помощи программного кода.

Видео 5 – Программная установка сортировки

00:25– Где в Синтакс-помощнике найти типы данных, необходимые для включения сортировки
00:50 – Какие свойства объекта типа ЭлементПорядкаКомпоновкиДанных нужно использовать для включения сортировки
01:00 – Как установить сортировку при помощи программного кода.

Видео 6 – Программное добавление условного оформления

00:25 – Где в Синтакс-помощнике найти типы данных, необходимые для работы с условным оформлением
00:33 – Какие свойства объекта типа ЭлементУсловногоОформленияКомпоновкиДанных нужно использовать
02:08 – Как добавить условное оформление при помощи программного кода
02:31 – Как задать перечень полей, к которым будет применяться условное оформление
03:34 – Как отобрать оформляемые данные
04:15 – Как при помощи программного кода описать применяемое оформление.

Видео 7 – Программная работа с пользовательскими настройками

01:01 – Как программно установить значение параметра
02:00 – Почему значения параметров, выводимые на форму отчета, не совпадают со значениями в самом отчете
04:25 – Что делает метод ПолучитьНастройки
05:10 – Как нужно работать с пользовательскими настройками
06:17 – Для чего нужно свойство ИдентификаторПользовательскойНастройки
07:10 – Где в типовой конфигурации УТ 11 можно найти пример работы с пользовательскими настройками.

Видео 8 – Особенности использования метода ПолучитьНастройки

00:58 – Почему отличаются значения параметра в настройках компоновщика и в пользовательских настройках
01:23 – Как связываются между собой настройки компоновщика и пользовательские настройки
03:06 – Как работает метод ПолучитьНастройки и значение какого типа он возвращает

Видео 9 – Программное создание отборов в пользовательских настройках

00:34 – Чем отличается отбор в настройках компоновщика и отбор в пользовательских настройках
02:34 – Как используется свойство ИдентификаторПользовательскойНастройки
03:08 – Какой алгоритм должен использоваться для установки значения отбора в пользовательских настройках
03:42 – Как реализовать процедуру для установки значения отбора в пользовательских настройках.

Видео 10 – Программное создание схемы компоновки

00:40 – Как при компоновке отчета программно создать схему, по которой будет формироваться отчет
02:15 – Какой алгоритм должен использоваться для программного создания с нуля схемы компоновки
02:50 – Как программно создать источник данных схемы компоновки
04:00 – Как программно добавить в схему набор данных – объект
06:25 – Как программно добавить поля набора данных.

Хотите научиться грамотно создавать отчеты на СКД и дорабатывать отчеты в типовых конфигурациях?

Чтобы подробнее изучить возможности системы компоновки данных и уверенно применять механизм на практике, рекомендуем пройти курс Профессиональная разработка отчетов в 1С 8.3 на Системе Компоновки Данных (СКД)

Комментарии / обсуждение (30):

  1. Максим

    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    УстановитьПараметрПользовательскиеНастройки(ПользовательскиеНастройки, “Период”, ‘2016-01-01’);
    НастройкиКомпановки = КомпоновщикНастроек.ПолучитьНастройки();

    КомпановщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпановки = КомпановщикМакета.Выполнить(СхемаКомпоновкиДанных, НастпройкиКомпановки);

    ПроцессорКомпановки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпановки.Инициализировать(МакетКомпановки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпановки);
    КонецПроцедуры

    Процедура УстановитьПараметрПользовательскиеНастройки(ПользовательскиеНастройки, ИмяНастройки, Значение)
    ПриКомпоновкиПараметр = Новый ПараметрКомпоновкиДанных(ИмяНастройки);
    ЭлементОтбора = Неопределено;

    Для Каждого Элемент Из ПользовательскиеНастройки.Элементы Цикл
    Если Элемент.Параметр = ПолеКомпановкиПараметр Тогда
    Элемент.Значение = Значение;
    Элемент.Использование = Истина;
    Прервать;
    КонецЕсли;
    КонецЦикла;

    КонецПроцедуры

    Почему вызываются данные ошибки
    {Отчет.Отчет4.МодульОбъекта(6,46)}: Переменная не определена (ПользовательскиеНастройки)
    УстановитьПараметрПользовательскиеНастройки(<>ПользовательскиеНастройки, “Период”, ‘2016-01-01’); (Проверка: Сервер)
    {Отчет.Отчет4.МодульОбъекта(10,71)}: Переменная не определена (НастпройкиКомпановки)
    МакетКомпановки = КомпановщикМакета.Выполнить(СхемаКомпоновкиДанных, <>НастпройкиКомпановки); (Проверка: Сервер)
    {Отчет.Отчет4.МодульОбъекта(25,27)}: Переменная не определена (ПолеКомпановкиПараметр)
    Если Элемент.Параметр = <>ПолеКомпановкиПараметр Тогда (Проверка: Сервер)
    {Отчет.Отчет4.МодульОбъекта(9,28)}: Тип не определен (КомпоновщикМакетаКомпоновкиДанных)
    КомпановщикМакета = Новый <>КомпоновщикМакетаКомпоновкиДанных; (Проверка: Мобильное приложение-сервер)
    {Отчет.Отчет4.МодульОбъекта(12,30)}: Тип не определен (ПроцессорКомпоновкиДанных)
    ПроцессорКомпановки = Новый <>ПроцессорКомпоновкиДанных; (Проверка: Мобильное приложение-сервер)
    {Отчет.Отчет4.МодульОбъекта(15,26)}: Тип не определен (ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент)
    ПроцессорВывода = Новый <>ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; (Проверка: Мобильное приложение-сервер)

    • Василий Ханевич

      Добрый день!
      Внимательно читайте сообщения об ошибках.

      >>Переменная не определена (ПользовательскиеНастройки)
      Да, такая переменная не определена, ПользовательскиеНастройки есть у объекта КомпоновщикНастроек.

      >>Переменная не определена (НастпройкиКомпановки)
      Опечатка, лишняя буква П, выше используется имя переменной НастройкиКомпановки.

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

  2. Вова

    Здравствуйте! А как обратиться к параметру типа дата и вывести его с помощью сообщить?

    • Василий Ханевич

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

      НастройкиКомпоновки.ПараметрыДанных.Элементы

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

  3. olbir

    Здравствуйте!
    Можно ли программно задать имя группировки? (когда становимся на группировку, правой кнопкой мыши Установить имя. Можно это сделать программно?

    • Василий Ханевич

      Добрый день!
      Да, можно.
      Для этого используется свойство Имя объекта встроенного языка типа ГруппировкаКомпоновкиДанных:

      ГруппировкаТовар = НастройкиКомпоновки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
      ГруппировкаТовар.Использование = Истина;
      ГруппировкаТовар.Имя = "Т";
  4. Геннадий

    У меня есть предложение к разработчикам платформы 1С:Предприятие. А почему бы в конструктор СКД не добавить кнопку. По нажатии на которую генерировался бы текст вот всего того, что рассмотрено в видеороликах. Мне так кажется, что жизнь слишком коротка, для того, чтобы ее тратить на разбор синтаксис-помощника. Уверяю, что потраченное время можно провести с большей пользой для организма.

    • Василий Ханевич

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

  5. Yulunga

    Добрый день, Василий !
    подскажите, пожалуйста, можно ли программно отключить расчёт пользовательских полей
    конкретно отчёт штатная расстановка – считаются поля ФОТ, ФОТ мин, ФОТ макс
    хотя я добавляю только поле
    Поле.Поле = Новый ПолеКомпоновкиДанных(“ДанныеПозиции.КоличествоСтавок”);
    пусть и быстро отчёт считает, но хотелось бы иметь представление.
    спасибо !

    • Василий Ханевич

      Добрый день!
      Можно программно установить признак Использование в значение Ложь. Но тогда это поле не будет выводиться в отчет.
      Либо можно программно по какому-то условию изменять выражение для пользовательского поля. Когда его не нужно рассчитывать, можно в качестве выражения установить 0.

      • Yulunga

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

  6. Дмитрий

    Здравствуйте.
    Мне нужно, чтобы при открытии отчета на СКД с формой отчета, заполнялся параметр значением ТекущаяДата() минус 15 дней. Написал

    &НаСервере
    Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Настройки, ИспользуютсяСтандартныеНастройки)
    ДатаНачалаПар = Новый ПараметрКомпоновкиДанных(“ДатаНачала”);

    Для Каждого Элемент Из Настройки.Элементы Цикл
    Если Элемент.Параметр = ДатаНачалаПар Тогда
    Элемент.Значение.Дата = ТекущаяДата() – 1296000; //15 дней
    Элемент.Использование = Истина;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры

    Все равно тянет дату из пользовательских настроек (ту, что использовалась в прошлый раз)
    Что я упустил?

    • Василий Ханевич

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

      • Дмитрий

        Спасибо, получилось. Осталось непонятным, что же передается в эту функцию параметром Настройки? Тип там ПользовательскиеНастройки. Но какие-то не те, которые использует отчет.

        • Василий Ханевич

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

  7. Михаил Госьков

    Добрый день, Василий!
    Моя проблема: Имеется типовая конфигурация (ЗКГУ) со встроенной БСП. В этой конфигурации отчёты на СКД открываются и настраиваются посредством общей формы “ФормаОтчета”. Один из вариантов отчёта нужно программно (из расширения) изменить:
    1. Доработать текст запроса, при этом в нём появляется новый параметр (НовыйПараметр).
    2. Вывести параметр на форму с возможностью изменения его пользователем.
    3. При сохранении и восстановлении нового варианта отчёта обеспечить сохранение и восстановление значения нового параметра.
    Поскольку речь идёт о механизме вариантов отчётов, поставляемых БСП, трудность для меня состоит в реализации п.2 и 3.
    Хотелось бы получить консультацию, которую я согласен оплатить.

    • Василий Ханевич

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

      Еще вариант, который можно подсмотреть, – это отчет УниверсальныйОтчет (он есть в типовых конфигурациях УТ 11, БП и других). В модуле объекта есть такой комментарий:
      // Вызывается перед загрузкой новых настроек. Используется для изменения схемы компоновки.
      // Например, если схема отчета зависит от ключа варианта или параметров отчета.
      // Чтобы изменения схемы вступили в силу следует вызывать метод ОтчетыСервер.ПодключитьСхему().

      В этом же модуле есть несколько примеров использования метода.
      Попробуйте этим методом еще воспользоваться применительно к своей задаче. Например, копируете исходную схему компоновки как новый макет и дорабатываете её под нужды заказчика. Если в отчете используется требуемый ключ варианта, то подменяете типовую схему на свою (скопированную) и вызываете указанный метод.

  8. Сергей

    Добрый день.
    Вопрос такой, отчет СКД формируется на основании набора данных
    https://ibb.co/tM9LgXb
    Как сделать чтобы в сформированном отчете СКД при нажатии на регистратор открывался документ по ссылке как в обычном запросе СКД?

    • Василий Ханевич

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

      • Сергей

        Нашел ошибку
        Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

        СтандартнаяОбработка = Ложь;

        //НастройкиКомпоновки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
        НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();

        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки,);

        ВидДеятельности = НастройкиКомпоновки.ПараметрыДанных.Элементы.Найти(“ВидДеятельности”);
        ВыбранныеСтратегии = НастройкиКомпоновки.ПараметрыДанных.Элементы.Найти(“СтратегияДУ”);
        ПериодОтчета = НастройкиКомпоновки.ПараметрыДанных.Элементы.Найти(“ПериодОтчета”);

        ПараметрыЗаполнения = Новый Структура(“ДатаНачала,ДатаОкончания,ВидДеятельности,ВыбранныеСтратегии”,
        ПериодОтчета.Значение.ДатаНачала,
        ПериодОтчета.Значение.ДатаОкончания,
        ВидДеятельности.Значение,
        ВыбранныеСтратегии.Значение);

        ДанныеРасчетДоходности = уа_РасчетСЧА.РассчитатьДоходность(ПараметрыЗаполнения,Истина);

        ВнешнийНаборДанных = Новый Структура(“ДанныеДоходность”, ДанныеРасчетДоходности.ТЗ_РасчетДоходности);

        ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных);

        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
        ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
        ПроцессорВывода.Вывести(ПроцессорКомпоновки);

        КонецПроцедуры

        Потерял в процедуре выполнить и инициализировать ДанныеРасшифровки

        Код ниже расшифровка работает

        Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

        СтандартнаяОбработка = Ложь;

        //НастройкиКомпоновки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
        НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();

        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки, ДанныеРасшифровки);

        ВидДеятельности = НастройкиКомпоновки.ПараметрыДанных.Элементы.Найти(“ВидДеятельности”);
        ВыбранныеСтратегии = НастройкиКомпоновки.ПараметрыДанных.Элементы.Найти(“СтратегияДУ”);
        ПериодОтчета = НастройкиКомпоновки.ПараметрыДанных.Элементы.Найти(“ПериодОтчета”);

        ПараметрыЗаполнения = Новый Структура(“ДатаНачала,ДатаОкончания,ВидДеятельности,ВыбранныеСтратегии”,
        ПериодОтчета.Значение.ДатаНачала,
        ПериодОтчета.Значение.ДатаОкончания,
        ВидДеятельности.Значение,
        ВыбранныеСтратегии.Значение);

        ДанныеРасчетДоходности = уа_РасчетСЧА.РассчитатьДоходность(ПараметрыЗаполнения,Истина);

        ВнешнийНаборДанных = Новый Структура(“ДанныеДоходность”, ДанныеРасчетДоходности.ТЗ_РасчетДоходности);

        ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки);

        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
        ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
        ПроцессорВывода.Вывести(ПроцессорКомпоновки);

        КонецПроцедуры

  9. Logic

    Добрый день.
    Создал внешний отчет НоменклатураКалькуляций. Группировка по номенклатуре Документа и по номенклатуре талицы МатериалыИУслуги, использовал только документы ПлановыеКалькуляции и их табличные части МатериалыИРесурсы. Таблица, строки – материалы, столбцы – изделия, в пересечении количество….
    Идея заключается в том, что-бы видеть сколько каого материала (номенклатура табличной части) уходит/есть/нету/требуется при производстве изделий (номенклатура документа).
    Если позволите вопрос????
    Стратегически как правильнее вносить пользовательские изменения в настройки отчета, а именно в количество Изделий, которые будут фигурировать в отчете???
    Алгоритм действий пользователя – Выбирает из списка интересующие калькуляции (сделали, работает), получает таблицу на форме, в таблице хочет проставить нужным количество и уже по этому списку будет формироваться Отчет.
    К какой ахитектуре отчета нужно стремиться с таким заданием?

    • Василий Ханевич

      Добрый день!
      Предлагаю реализовать эту задачу не как внешний отчет, а как внешнюю обработку. Будет такой навороченный АРМ.
      На форме располагаем все необходимые элементы для ввода данных пользователем – поля ввода, таблицы. Из этих данных программно формируем итоговую таблицу значений, которую передаем системе компоновки, которой остается только сформировать отчет, вывести его, оформить.
      Настройки обработки можно сохранять, для этого есть штатные возможности платформы.

  10. Анастасия

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

    • Василий Ханевич

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

  11. Владимир

    Для отчета СКД создал форму. Как в нее включить весь функционал формы по умолчанию,
    например отправка по почте

    • Василий Ханевич

      Добрый день!
      В УТ на уровне корневого элемента конфигурации определены формы отчета:
      Формы
      Это общие формы, их можно использовать в качестве форм отчета. Так сделано, например, для типового отчета ВедомостьПоТоварамНаСкладах:
      Отчет
      Таким образом, не придется реализовывать отдельную форму для каждого отчета. И все отчеты в конфигурации будут выглядеть однотипно.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

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

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.