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