При разработке отчетов на базе Системы компоновки данных (СКД) в 1С:Предприятии программисты часто сталкиваются с тем, что стандартная расшифровка полей работает некорректно или полностью блокируется. Типичные симптомы этой проблемы: кнопка «Расшифровать» в контекстном меню числового поля (ресурса) становится неактивной (серой), а при попытке расшифровать группировочное поле по периоду система выдает ошибку вида «Поле не найдено "Регистратор"».
В этой статье мы подробно разберем причины возникновения таких ошибок на примере реальной задачи — получения сумм по документам реализации и приобретения с группировкой по неделям — и рассмотрим правильные методы настройки СКД и оптимизации исходных запросов.
Выясним, почему возникают описанные выше проблемы в поведении системы компоновки данных:
ДанныеРасшифровки.Регистратор, система не может определить конкретное значение ссылки для всей недели. СКД не понимает, какой именно документ из группы должен открыться при клике на ячейку периода, что и приводит к ошибке.Рассмотрим, как исправить архитектурные ошибки в запросе и правильно перенастроить схему компоновки данных.
Проанализируем исходный запрос, который часто пишут начинающие разработчики. В нем используются избыточные временные таблицы и бессмысленные группировки:
// Неоптимальный запрос с избыточными группировками
ВЫБРАТЬ
КОНЕЦПЕРИОДА(РеализацияТоваровУслуг.ДатаПлатежа, НЕДЕЛЯ) КАК НЕДЕЛЯ,
СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК СуммаПоступлений,
РеализацияТоваровУслуг.Ссылка КАК Регистратор
ПОМЕСТИТЬ ВТ_поступления
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
СГРУППИРОВАТЬ ПО
КОНЕЦПЕРИОДА(РеализацияТоваровУслуг.ДатаПлатежа, НЕДЕЛЯ),
РеализацияТоваровУслуг.Ссылка
;
В данном запросе конструкция СГРУППИРОВАТЬ ПО абсолютно бесполезна. Поскольку группировка происходит в том числе по полю Ссылка (которое является уникальным идентификатором документа), каждая запись в выборке и так будет уникальной. Суммирование по полю СуммаДокумента здесь не выполняет никакой агрегации. Кроме того, использование конструкции ЕСТЬNULL при последующем объединении таблиц также избыточно, если мы изначально можем сопоставить числовые поля с нулями.
Ниже представлен правильный, оптимизированный вариант запроса. Мы убираем лишние группировки на уровне базы данных (так как агрегацию сумм по периодам должна выполнять сама СКД с помощью механизма ресурсов) и объединяем выборки в одну временную таблицу:
ВЫБРАТЬ
РеализацияТоваровУслуг.СуммаДокумента КАК СуммаПоступления,
РеализацияТоваровУслуг.Ссылка КАК Регистратор,
КОНЕЦПЕРИОДА(РеализацияТоваровУслуг.ДатаПлатежа, НЕДЕЛЯ) КАК НЕДЕЛЯ,
0 КАК СуммаСписания
ПОМЕСТИТЬ ВТ_Документы
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.ДатаПлатежа МЕЖДУ &ДатаНачала И &ДатаОкончания
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
0,
ПриобретениеТоваровУслуг.Ссылка,
КОНЕЦПЕРИОДА(ПриобретениеТоваровУслуг.ДатаПлатежа, НЕДЕЛЯ),
ПриобретениеТоваровУслуг.СуммаДокумента
ИЗ
Документ.ПриобретениеТоваровУслуг КАК ПриобретениеТоваровУслуг
ГДЕ
ПриобретениеТоваровУслуг.ДатаПлатежа МЕЖДУ &ДатаНачала И &ДатаОкончания
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Документы.Регистратор КАК Регистратор,
ВТ_Документы.НЕДЕЛЯ КАК НЕДЕЛЯ,
ВТ_Документы.СуммаПоступления КАК СуммаПоступления,
ВТ_Документы.СуммаСписания КАК СуммаСписания
ИЗ
ВТ_Документы КАК ВТ_Документы
Важное примечание по производительности СУБД: Если отчет строится по большой базе данных, обратите внимание на условия в секции ГДЕ. Поля вида ДатаПлатежа в типовых конфигурациях (таких как «Управление торговлей 11») обычно не являются индексированными. Поиск по ним может выполняться медленно. Если есть возможность, для ограничения выборки лучше использовать стандартное индексированное поле Дата.
Самый простой и надежный способ избежать проблем с расшифровкой — отказаться от ручного создания макетов оформления ячеек, если в этом нет жесткой необходимости, и позволить СКД генерировать отчет автоматически. Разберем по шагам, как правильно настроить схему:
СуммаПоступления и СуммаСписания. В колонке «Выражение» для каждого из них укажите стандартную функцию агрегации СУММА(СуммаПоступления) и СУММА(СуммаСписания) соответственно.НЕДЕЛЯ, а внутрь нее поместите детальные записи (или группировку по полю Регистратор).НЕДЕЛЯ выведите ресурсы СуммаПоступления и СуммаСписания.Поскольку поле Регистратор содержит ссылки на документы, при такой структуре СКД автоматически свяжет числовые показатели на уровне детальных записей с соответствующими документами, и расшифровка будет работать «из коробки» без дополнительных доработок.
Рассмотрим ситуацию, когда стандартное оформление отчета не подходит и вам обязательно нужно использовать собственный макет ячеек. В этом случае для восстановления работы расшифровки выполните следующие действия:
ПараметрРегистратор). Обратите внимание: это имя не должно совпадать с именем обычного параметра этой ячейки.ПараметрРегистратор.Регистратор.Часто в отчете требуется выводить не стандартное представление документа (например, «Реализация товаров и услуг 0000-001234 от 15.10.2023 12:00:00»), а более лаконичный вариант (например, только номер и дату), сохранив при этом полноценную возможность расшифровки. Для этого выполните следующие настройки:
Регистратор.Регистратор.Метаданные().Синоним + " № " + Регистратор.Номер.В результате в ячейках отчета пользователи увидят красивый отформатированный текст, но системным значением поля по-прежнему останется ссылка на документ, благодаря чему стандартный механизм расшифровки и открытия форм продолжит функционировать без ошибок.