При разработке отчетов в Системе компоновки данных (СКД) на базе регистров бухгалтерии разработчики часто сталкиваются со следующей ситуацией: запрос выбирает обороты или остатки с группировкой по полям субконто (например, Субконто1, Субконто2), отчет успешно формируется и выводит данные, однако стандартная расшифровка для ячеек группировки не работает. Нажатие на ячейку не вызывает контекстное меню или не позволяет открыть объект справочника.
Рассмотрим подробно причины возникновения этой проблемы, базовый способ ее устранения, а также альтернативные варианты решения задачи.
Проанализируем ситуация с технической стороны. Поля Субконто1, Субконто2 и далее в виртуальных таблицах регистров бухгалтерии имеют составной тип данных, базирующийся на плане видов характеристик (ПВХ ВидыСубконтоХозрасчетные). Из-за этого платформа 1С при автоматическом формировании схемы компоновки данных сталкивается с ограничениями:
ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.Подразделения), включенный механизм автозаполнения схемы СКД может сбросить уточнение типа и вернуть полю исходный составной тип виртуальной таблицы.Рассмотрим пример запроса, при котором возникает подобное поведение:
ВЫБРАТЬ
ХозрасчетныйОбороты.Счет.СтатьиЗатрат КАК СтатьяЗатрат,
ХозрасчетныйОбороты.Субконто1 КАК Подразделение,
ХозрасчетныйОбороты.СуммаОборот КАК СуммаОборот,
ХозрасчетныйОбороты.Регистратор КАК Регистратор,
ХозрасчетныйОбороты.ПериодМесяц КАК ПериодМесяц
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Авто, Счет.Ссылка В ИЕРАРХИИ (&Сч), , , , ) КАК ХозрасчетныйОбороты
Самый простой и эффективный способ вернуть расшифровку для поля субконто — указать тип значения непосредственно в конструкторе схемы компоновки данных, не меняя сам запрос.
Разберем процесс настройки по шагам:
Субконто1 или его псевдоним Подразделение).СправочникСсылка.ПодразделенияОрганизаций).После указания точного типа платформа сможет однозначно идентифицировать ссылки, и стандартная расшифровка СКД начнет функционировать штатно.
Посмотрим на другие варианты решения данной проблемы, которые применяются в зависимости от архитектуры отчета и требований к гибкости.
Вместо использования поля Субконто1 напрямую из виртуальной таблицы, соединим ее с нужным справочником по условию равенства ссылок:
ВЫБРАТЬ
Подразделения.Ссылка КАК Подразделение,
ХозрасчетныйОбороты.СуммаОборот КАК СуммаОборот
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Авто, Счет.Ссылка В ИЕРАРХИИ (&Сч), , , , ) КАК ХозрасчетныйОбороты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПодразделенияОрганизаций КАК Подразделения
ПО ХозрасчетныйОбороты.Субконто1 = Подразделения.Ссылка
Поскольку поле выбырается из конкретной таблицы справочника, СКД автоматически назначит ему строго определенный тип, и расшифровка будет работать без дополнительных настроек на вкладке полей.
Если требуется сохранить гибкость запроса, можно отключить флажок «Автозаполнение» на вкладке «Наборы данных». В этом случае все поля отчета, их типы и роли описываются разработчиком вручную. Это исключает переопределение типов алгоритмами платформы.
В случаях, когда отчет формируется на управляемой форме и требуется нестандартное поведение при клике (например, открытие подчиненного отчета с передачей параметров), используем событие ОбработкаРасшифровки элемента ТабличныйДокумент.
Выясним, как перехватить клик программно:
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ОбработкаРасшифровкиНаСервере(Расшифровка);
КонецПроцедуры
Критически важно учитывать: если поле субконто на разных счетах может принимать значения разных типов (например, на одном счету это «Подразделения», а на другом — «Контрагенты»), жесткое ограничение типа поля в СКД до одного конкретного справочника приведет к тому, что значения других типов будут выводиться как пустые значения (NULL).
Если отчет строится по нескольким счетам с разными типами субконто, рекомендуется не ограничивать тип жестко в одном поле, а настраивать отдельные группировки с отборами по счетам или использовать программную обработку расшифровки.