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