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

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

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

Почему конструктор запросов не видит реквизиты из расширения?

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

Из-за этого любые объекты, реквизиты табличных частей или реквизиты шапки, которые были добавлены через расширение, остаются недоступными в визуальном конструкторе запросов и при использовании автодополнения кода (Ctrl+Space). Многие разработчики на этом этапе ошибочно полагают, что придется добавлять реквизит в основную конфигурацию, снимая ее с поддержки. Но это не так, посмотрим на правильные решения.

Решение 1: Ручное написание запроса и префиксы

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

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

Посмотрим на пример того, как это должно выглядеть в коде модуля внешней печатной формы:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
    |    РеализацияТоваровУслугТовары.Количество КАК Количество,
    |    РеализацияТоваровУслугТовары.Расш1_НовыйРеквизит КАК НовыйРеквизит
    |ИЗ
    |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    |ГДЕ
    |    РеализацияТоваровУслугТовары.Ссылка В(&МассивОбъектов)";

Запрос.УстановитьПараметр("МассивОбъектов", МассивСсылок);
РезультатЗапроса = Запрос.Выполнить();

Если вы напишете имя реквизита без префикса, при выполнении кода платформа выдаст ошибку «Поле не найдено».

Где найти исходный запрос для печатной формы?

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

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

Обходные пути: как всё же использовать конструктор запросов

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

  1. Временное добавление ВПФ в расширение. Добавим нашу внешнюю обработку прямо в дерево объектов расширения (как встроенную обработку). В этом контексте конструктор запросов Конфигуратора «увидит» все новые реквизиты. Создадим запрос визуально, отладим его, затем скопируем готовый текст. После этого обработку можно удалить из расширения и продолжить работу с ней как с внешним файлом.
  2. Использование консоли запросов в режиме Предприятия. Откроем любую внешнюю консоль запросов (например, из подсистемы ИТС) прямо в работающей базе 1С. Поскольку в режиме Предприятия все метаданные расширений уже слиты с основными, консоль прекрасно увидит все наши добавленные реквизиты. Соберем запрос там с помощью конструктора, проверим результат и перенесем готовый текст в Конфигуратор.

Важные настройки расширения и нововведения платформы

Проанализируем еще одну деталь, из-за которой реквизиты могут быть недоступны. У каждого расширения есть свойство Назначение. Чтобы добавленные объекты и реквизиты были гарантированно доступны для запросов и корректно работали при адаптации логики, это свойство должно быть установлено в значение Адаптация. Если установлено значение Дополнение или другое, поведение системы при работе с ВПФ может быть непредсказуемым.

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

← На главную