При разработке отчетов на базе системы компоновки данных (СКД) в конфигураторе часто возникает необходимость присвоить группировке уникальное имя (через контекстное меню Установить имя...). Это имя в дальнейшем используется в пользовательских полях и вычисляемых ресурсах в функциях вида Вычислить(Выражение, Группировка, ТипРасчета) или ВычислитьВыражение(...).
Однако при попытке настроить аналогичную структуру отчета непосредственно в пользовательском режиме «1С:Предприятие» разработчики и пользователи сталкиваются с тем, что в контекстном меню доступна только команда Установить заголовок.... Разберем, почему возникает данная проблема, как устроена обработка структуры отчета на уровне платформы и типовых конфигураций, а также какими способами можно решить поставленную задачу.
Проанализируем устройство типового механизма настройки отчетов (в частности, в отчетах на обычных формах в конфигурациях УПП 1.3, ЗУП 2.5, КА 1.1). В пользовательском режиме для редактирования состава полей и группировок открывается общая форма ФормаНастройкиСтруктурыОтчета.
Посмотрим на обработчик отображения строк дерева группировок в кодовой базе типовой формы настройки:
Процедура СтруктураПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого Оформление Из ОформленияСтрок Цикл
Если ТипЗнч(Оформление.ДанныеСтроки.Строка) = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных") ИЛИ
ТипЗнч(Оформление.ДанныеСтроки.Строка) = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") ИЛИ
ТипЗнч(Оформление.ДанныеСтроки.Строка) = Тип("НастройкиКомпоновкиДанных") Тогда
Если ТипЗнч(Оформление.ДанныеСтроки.Строка) = Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных") ИЛИ
ТипЗнч(Оформление.ДанныеСтроки.Строка) = Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") Тогда
Оформление.ЦветТекста = Новый Цвет(96, 96, 96);
КонецЕсли;
Иначе
Если НЕ СтрокаИспользуется(Оформление.ДанныеСтроки.Строка) Тогда
// Элемент не используется - выделим его серым цветом
Оформление.ЦветТекста = НеИспользуемыйЦвет;
КонецЕсли;
КонецЕсли;
Если ТипЗнч(Оформление.ДанныеСтроки.Строка) <> Тип("НастройкиКомпоновкиДанных") И
ТипЗнч(Оформление.ДанныеСтроки.Строка) <> Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") И
ТипЗнч(Оформление.ДанныеСтроки.Строка) <> Тип("КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных") тогда
Если Оформление.ДанныеСтроки.Строка.Имя = "Группировка" или Оформление.ДанныеСтроки.Строка.Имя = "Таблица" или Оформление.ДанныеСтроки.Строка.Имя = "Диаграмма" тогда
Оформление.Ячейки.НазваниеГруппировки.ЗначениеФлажка = истина;
Оформление.Ячейки.НазваниеГруппировки.ОтображатьФлажок = истина;
ИначеЕсли Оформление.ДанныеСтроки.Строка.Имя <> "Группировка" И Оформление.ДанныеСтроки.Строка.Имя <> "Таблица" И Оформление.ДанныеСтроки.Строка.Имя <> "Диаграмма" И Оформление.ДанныеСтроки.Строка.Имя <> "" тогда
Оформление.Ячейки.НазваниеГруппировки.Текст = Оформление.ДанныеСтроки.Строка.Имя;
Оформление.Ячейки.НазваниеГруппировки.ОтображатьТекст = истина;
Иначе
Оформление.Ячейки.НазваниеГруппировки.ЗначениеФлажка = ложь;
Оформление.Ячейки.НазваниеГруппировки.ОтображатьФлажок = истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Как видно из представленного фрагмента, свойство Имя у объекта ГруппировкаКомпоновкиДанных в типовой форме используется исключительно для служебного разграничения доступности элемента и вывода текста, но элементов управления для его интерактивного редактирования нет. Поле Заголовок, которое можно задать пользователю, изменяет исключительно представление группировки в отчете и не заменяет собой системный идентификатор Имя.
Таким образом, штатными средствами интерактивного диалога настройки отчета задать системное имя группировки невозможно как на обычных, так и на управляемых формах.
Выясним, действительно ли необходимо задавать имя группировки вручную для выполнения расчетов. В подавляющем большинстве задач выражения СКД позволяют обращаться к группировке без явного присвоения ей уникального имени в конфигураторе.
Вычислить и ВычислитьВыражение вторым параметром можно передать имя поля, по которому выполняется группировка. Например:
Вычислить("Сумма(СуммаОборот)", "Номенклатура")
Вычислить("Сумма(СуммаОборот)", "Организация")
"ОбщийИтог" — расчет агрегата на самом верхнем уровне (итог по всему отчету)."Записи" или "ДетальныеЗаписи" — расчет выражения на уровне детальных записей."" — расчет выражения на текущем уровне группировки.ВычислитьВыражение: Если требуется сложная навигация по иерархии группировок, предпочтительно использовать функцию ВычислитьВыражение. Она поддерживает относительные области расчета, такие как "ПерваяОкружающаяГруппировка" или "ПоследняяОкружающаяГруппировка", что исключает зависимость от фиксированных строковых имен.Если специфика отчета строго требует наличия именованной группировки, а редактирование выполняется в режиме «1С:Предприятие», можно применить метод экспорта и импорта настроек:
<item xsi:type="StructureItemGroup"> или узел описания структуры) и вручную пропишем атрибут с именем: name="МояГруппировка".Рассмотрим вариант, когда имя группировке необходимо назначать динамически из внешнего кода, обработки или модуля отчета. Для этого обратимся к компоновщику настроек отчета:
// Получаем рабочие настройки компоновщика
Настройки = ОтчетОбъект.КомпоновщикНастроек.Настройки;
// Обходим элементы структуры отчета
Для Каждого ЭлементСтруктуры Из Настройки.Структура Цикл
Если ТипЗнч(ЭлементСтруктуры) = Тип("ГруппировкаКомпоновкиДанных") Тогда
// Задаем системное имя первой найденной группировке
ЭлементСтруктуры.Имя = "ГруппировкаПоНоменклатуре";
КонецЕсли;
КонецЦикла;
Установленное таким образом свойство Имя будет корректно распознаваться всеми вычисляемыми полями и функциями СКД при формировании отчета.