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