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