Как получить номенклатуру и данные регистратора из регистра «Выручка и себестоимость продаж» в расширении 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке отчетов или обработок в расширениях для современных конфигураций на базе 1С:ERP или 1С:Управление торговлей 11 (УТ 11) программисты часто сталкиваются с проблемой: после добавления регистра ВыручкаИСебестоимостьПродаж в расширение многие поля оказываются «пустыми» или недоступными для выбора в конструкторе запроса. Особенно остро стоит вопрос с получением конкретной Номенклатуры (которая скрыта за ключом аналитики) и данных из Регистратора (например, контрагента или подразделения).

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

Причина возникновения проблемы: Особенности архитектуры и ограничения расширений

Проанализируем ситуацию. В конфигурациях «нового поколения» (УТ 11, КА 2, ERP) регистры накопления часто используют механизм ключей аналитики. Вместо того чтобы хранить ссылку на справочник Номенклатура напрямую в измерении регистра, система хранит ссылку на справочник КлючиАналитикиУчетаНоменклатуры. Это сделано для оптимизации размеров таблиц и ускорения проведения документов.

Когда мы добавляем регистр в расширение, конфигуратор «видит» только те типы данных, которые также заимствованы в это расширение. Если справочник ключей или конкретные типы документов-регистраторов не добавлены, конструктор запроса просто не сможет «пробросить» связь через точку к нужным полям. Выясним, как это обойти.

Способ 1: Заимствование типов и использование оператора ВЫРАЗИТЬ

Рассмотрим стандартный путь, который требуется в версиях платформы ниже 8.3.23. Чтобы получить доступ к реквизитам через точку в запросе, нам необходимо явно указать расширению, с какими типами данных мы работаем.

Выполним следующие шаги:

  1. Найдем в основной конфигурации справочник КлючиАналитикиУчетаНоменклатуры и добавим его в расширение.
  2. Внутри этого справочника в расширении обязательно заимствуем реквизит Номенклатура. Только после этого в конструкторе запроса при развертывании поля АналитикаУчетаНоменклатуры появится вложенное поле Номенклатура.
  3. Для получения данных из Регистратора (например, контрагента), нам нужно понимать, что Регистратор — это составной тип данных. Чтобы обратиться к его полям, в расширение придется добавить все типы документов, которые могут делать движения по этому регистру (Реализация товаров и услуг, Отчет комиссионера и т.д.).

Важный совет: Если документов-регистраторов слишком много (десятки типов), заимствовать их все — плохая практика, так как это перегружает расширение и затрудняет дальнейшие обновления. В этом случае лучше использовать конструкцию ВЫРАЗИТЬ в тексте запроса.

Посмотрим на пример кода запроса:


ВЫБРАТЬ
    ВыручкаПродажи.АналитикаУчетаНоменклатуры.Номенклатура КАК Товар,
    ВЫРАЗИТЬ(ВыручкаПродажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Контрагент КАК Клиент,
    ВыручкаПродажи.СуммаВыручкиОборот КАК Сумма
ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ВыручкаПродажи

В этом случае вам достаточно заимствовать только те 2-3 типа документов, которые вы реально используете в отчете, а не весь огромный список регистраторов.

Способ 2: Написание запроса в режиме «Предприятие»

Разберем интересный лайфхак, который часто используют опытные разработчики. Ограничения на «невидимость» полей существуют только в конфигураторе, так как он проверяет метаданные расширения. Однако на уровне базы данных (в режиме «Предприятие») структура остается полной.

Проанализируем алгоритм действий:

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

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

Способ 3: Использование возможностей платформы 8.3.23 и выше

Если у вас есть возможность обновить платформу до версии 8.3.23 (например, 8.3.23.1865 и выше), то проблема решается сама собой. В этих версиях фирма «1С» радикально изменила механизм работы расширений с метаданными основной конфигурации.

Рассмотрим, как это работает теперь:

  1. При создании запроса в расширении конструктор теперь позволяет выбирать любые таблицы и поля из основной конфигурации, даже если они не добавлены (не заимствованы) в расширение.
  2. При сохранении запроса система может спросить: «Добавить используемые поля в расширение?». Теперь это не всегда обязательно для работы запроса в СКД.
  3. Это избавляет нас от необходимости «раздувать» расширение сотнями заимствованных объектов ради одного простого отчета.

Проверить наличие этой возможности можно в свойствах расширения. Убедитесь, что РежимСовместимости установлен в значение «Не использовать» или соответствует актуальной версии платформы (не ниже 8.3.23).

Дополнительные рекомендации по оптимизации

Выясним еще один важный момент. При работе с регистром ВыручкаИСебестоимостьПродаж получение контрагента напрямую из регистратора может замедлять отчет, если данных очень много. Рассмотрим альтернативный подход: в этом регистре часто присутствует измерение АналитикаУчетаПоПартнерам.

Если вам нужен контрагент, попробуйте пойти по пути:

АналитикаУчетаПоПартнерам.Контрагент

Для этого вам достаточно заимствовать справочник КлючиАналитикиУчетаПоПартнерам и его реквизит Контрагент. Это гораздо эффективнее с точки зрения производительности базы данных, чем «проваливаться» в каждый документ-регистратор для получения одной и той же ссылки на клиента.

Подведем итог: Для быстрого решения в старых версиях платформы — пишите текст запроса вручную (или копируйте из консоли) и не заходите в конструктор. Для «чистой» разработки — заимствуйте только необходимые ключи аналитики и используйте ВЫРАЗИТЬ для типов регистратора. А самым современным и правильным решением будет переход на платформу 8.3.23, где эти ограничения сняты.

← На главную