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