Почему в отчете 1С, добавленном через расширение, не работает расшифровка по детальным записям?

Программист 1С v8.3 (Управляемые формы) 1С:Розница
← На главную

При разработке собственных отчетов в системе 1С:Предприятие 8.3, особенно когда мы используем механизм расширений и интеграцию с Библиотекой стандартных подсистем (БСП), программисты часто сталкиваются со странным поведением стандартных механизмов. Одной из таких проблем является ошибка «нельзя расшифровать детальные записи» при попытке вызвать расшифровку в сформированном отчете. В этой статье мы подробно разберем, почему это происходит, проанализируем технические нюансы работы СКД (Системы компоновки данных) и найдем способы решения этой задачи.

Анализируем исходную ситуацию

Рассмотрим типичный сценарий: в конфигурацию (например, «1С:Розница 3.0») через расширение добавлен самописный отчет. Он подключен к подсистеме БСП «Варианты отчетов», в свойствах указано использование стандартного хранилища вариантов и общей формы отчета. При формировании отчета данные выводятся корректно, но при попытке расшифровать числовой показатель (например, поле «Количество») система выдает отказ. При этом, если сохранить этот же отчет как внешний (в формате .erf), расшифровка начинает работать идеально. Это сразу наталкивает нас на мысль, что проблема кроется не в самом запросе, а в способе регистрации объекта в метаданных и его взаимодействии с платформой.

Проверка запроса и настроек СКД

Прежде чем грешить на платформу, проанализируем запрос, который лежит в основе отчета. Часто расшифровка не срабатывает из-за сложных группировок или использования временных таблиц без четко определенных связей. Посмотрим на пример типичного запроса, который может вызывать подобные сложности:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ЦеныНоменклатуры.Номенклатура.Ссылка КАК Номенклатура,
    СУММА(ЦеныНоменклатуры.Цена) / КОЛИЧЕСТВО(ЦеныНоменклатуры.Номенклатура.Ссылка) КАК СредняяСебестоимостьЗаШТ
ПОМЕСТИТЬ ВТ_СебестоимостьСР
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
    ЦеныНоменклатуры.ВидЦен = &ВидЦен
СГРУППИРОВАТЬ ПО
    ЦеныНоменклатуры.Номенклатура.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    СписаниеЗапасовЗапасы.Номенклатура.Ссылка КАК Номенклатура,
    СУММА(СписаниеЗапасовЗапасы.Количество) КАК Количество,
    СписаниеЗапасов.СтруктурнаяЕдиница.Ссылка КАК Склад,
    ВТ_СебестоимостьСР.СредняяСебестоимостьЗаШТ КАК СредняяСебестоимостьЗаШТ,
    ВТ_СебестоимостьСР.СредняяСебестоимостьЗаШТ * СУММА(СписаниеЗапасовЗапасы.Количество) КАК СебестоимостьСписания
ИЗ
    Документ.СписаниеЗапасов.Запасы КАК СписаниеЗапасовЗапасы
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.СписаниеЗапасов КАК СписаниеЗапасов
        ПО СписаниеЗапасовЗапасы.Ссылка = СписаниеЗапасов.Ссылка
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СебестоимостьСР КАК ВТ_СебестоимостьСР
        ПО СписаниеЗапасовЗапасы.Номенклатура.Ссылка = ВТ_СебестоимостьСР.Номенклатура.Ссылка
СГРУППИРОВАТЬ ПО
    СписаниеЗапасовЗапасы.Номенклатура.Ссылка,
    СписаниеЗапасов.СтруктурнаяЕдиница.Ссылка,
    ВТ_СебестоимостьСР.СредняяСебестоимостьЗаШТ

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

Причина 1: Состав объектов расширения

Разберем важный нюанс работы расширений. Когда мы создаем запрос в СКД внутри расширения, мы используем объекты основной конфигурации. Для того чтобы механизм расшифровки (который фактически выполняет новый запрос к базе данных с наложенными фильтрами) отработал успешно, все объекты, участвующие в запросе, должны быть добавлены в расширение. Рассмотрим ситуацию: если в запросе используется Документ.СписаниеЗапасов, но он не заимствован в расширение, платформа при попытке расшифровки может не найти метаданные объекта для построения динамического фильтра. Проанализируем состав своего расширения и убедимся, что все справочники, документы и регистры, упомянутые в тексте запроса, в нем присутствуют.

Причина 2: Регистрация в БСП и справочнике «Варианты отчетов»

Выясним, как подсистема «Варианты отчетов» влияет на процесс. БСП использует собственные таблицы для хранения настроек и идентификаторов отчетов. При добавлении отчета через расширение системе требуется время или принудительная команда для обновления кэша идентификаторов объектов метаданных. Если отчет «свежий», БСП может некорректно связывать форму отчета и его схему. Выполним следующие действия для устранения этой причины:

  1. Запустим конфигурацию в режиме 1С:Предприятие.
  2. Перейдем в раздел администрирования или воспользуемся обработкой «Консоль запросов/кода» для программного вызова метода обновления: ВариантыОтчетов.Обновить().
  3. Убедимся, что в самом объекте расширения в поле «Хранилище вариантов» выбрано ХранилищеВариантовОтчетов.

Причина 3: Кэширование данных платформой

Рассмотрим ситуацию, когда отчет в расширении «зависает» в старом состоянии. Это часто случается при динамическом обновлении конфигурации. Как показывает практика, иногда даже простое копирование отчета (создание дубля в том же расширении) решает проблему. Это происходит потому, что при создании нового объекта платформа генерирует для него новый уникальный идентификатор (GUID) и принудительно регистрирует его во всех внутренних реестрах. Проанализируем этот момент: если ваш отчет не расшифровывается, попробуйте создать новый отчет с аналогичной схемой. Если в нем расшифровка заработает — значит, проблема была в кэше метаданных.

Пошаговая инструкция по исправлению ошибки

Для решения проблемы рекомендуем придерживаться следующего алгоритма:

  1. Проверка ролей полей в СКД: Перейдем в конструктор схемы компоновки данных. На вкладке «Наборы данных» проверим колонку «Роль». Убедимся, что ключевые поля (ссылки на объекты) помечены как измерения, а для ресурсов не стоит ограничений на расшифровку.
  2. Заимствование метаданных: Проверим список объектов расширения. Добавим в него все документы и справочники, которые фигурируют в ЛЕВОЕ СОЕДИНЕНИЕ или ГДЕ вашего запроса.
  3. Очистка кэша: Самый простой и эффективный способ — очистка локального кэша пользователя. Удалим базу из списка и добавим её заново, либо вручную очистим папку %AppData%\1C\1Cv8.
  4. Перерегистрация в расширении: Если ничего не помогло, попробуем удалить отчет из расширения (предварительно сохранив схему) и создать его заново. Как мы выяснили выше, это часто помогает «подтолкнуть» механизмы платформы к правильной работе.

Важный момент: если вы используете в отчете ВЫБРАТЬ РАЗЛИЧНЫЕ, это также может блокировать автоматическую расшифровку по детальным записям, так как СКД не может гарантировать уникальность строк для детализации. Попробуем убрать это выражение и использовать СГРУППИРОВАТЬ ПО для исключения дублей, это более «дружелюбный» способ для механизмов расшифровки 1С.

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

← На главную