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

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

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

Главная причина: почему поля остаются пустыми?

Разберем ситуацию, с которой столкнулся автор темы. В коде был сформирован запрос, получен результат и создана выборка. Однако данные в параметры макета не попадали. Проблема кроется в том, как 1С работает с объектом ВыборкаИзРезультатаЗапроса.

Когда мы получаем выборку методом Выбрать(), «курсор» системы устанавливается перед первой записью результата. Если мы сразу попытаемся обратиться к полям выборки (например, Выборка.Организация), мы не получим данных, так как система еще не «встала» на конкретную строку.

Для того чтобы получить доступ к данным, необходимо вызвать метод Следующий(). Этот метод перемещает курсор на следующую (в данном случае — на первую) запись. Если запись существует, метод возвращает Истина, если результат запроса пуст — Ложь.

Рассмотрим правильную конструкцию заполнения шапки документа, предложенную в решении проблемы:


// Получаем выборку из результата запроса
ДанныеДляПечатиПоШапке = РезультатЗапроса.Выбрать();

// Обязательно позиционируемся на первой (и, как правило, единственной для шапки) строке
Если ДанныеДляПечатиПоШапке.Следующий() Тогда 
    
    // Теперь данные доступны для заполнения параметров макета
    ОбластьМакета.Параметры.Организация = ДанныеДляПечатиПоШапке.Организация;
    ОбластьМакета.Параметры.Контрагент  = ДанныеДляПечатиПоШапке.Контрагент;
    ОбластьМакета.Параметры.Менеджер    = ДанныеДляПечатиПоШапке.Менеджер;
    
    // Выводим область в табличный документ
    ТабДок.Вывести(ОбластьМакета);
    
КонецЕсли;

Важный нюанс: использование конструкции Если ... Тогда вместо Пока ... Цикл оправдано для шапки документа, так как мы ожидаем там только одну уникальную запись по ссылке на документ. Если же мы выводим табличную часть (товары), необходимо использовать цикл Пока Выборка.Следующий() Цикл.

Как отлаживать внешние печатные формы?

Проанализируем ситуацию с отладкой. Автор темы жаловалась, что точка останова «не срабатывает». Это типичное поведение для внешних печатных форм в современных конфигурациях, таких как «Управление торговлей 11» или «Бухгалтерия предприятия 3.0».

Дело в том, что при запуске печати из интерфейса программа копирует файл внешней обработки во временное хранилище на сервере и запускает его оттуда. Конфигуратор «не знает», что этот временный файл связан с вашим исходным .epf файлом на диске.

Выясним, как все-таки заставить отладку работать:

  1. Отладка на сервере: Убедитесь, что на сервере 1С включен режим отладки (параметр -debug). Без этого точки останова в серверном коде (а печать обычно происходит на сервере) работать не будут.
  2. Использование обработки как встроенной: Самый надежный способ для новичка — временно добавить вашу печатную форму в дерево конфигурации как обычную обработку. В этом случае точки останова будут срабатывать гарантированно.
  3. Метод «Файл - Открыть»: Если ваша форма написана по стандартам БСП (Библиотеки стандартных подсистем), вы можете открыть ее через меню «Файл», но вам придется вручную вызвать процедуру печати, передав в нее ссылку на документ.
  4. Специальные инструменты: Существуют консоли для отладки внешних печатных форм (их можно найти на профильных ресурсах), которые позволяют запускать ВПФ без регистрации в справочнике «Дополнительные отчеты и обработки».

Требования БСП к внешним печатным формам

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

Во-первых, функция СведенияОВнешнейОбработке(). Она описывает свойства обработки: к какому документу она привязана, как называется команда печати и какой метод вызывается.

Во-вторых, процедура Печать(). Ее сигнатура (набор параметров) должна быть строго определенной:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    // Код подготовки табличного документа
КонецПроцедуры

Если вы пропустите один из параметров или назовете процедуру иначе, система БСП не сможет корректно передать управление вашему коду, и данные (тот самый МассивОбъектов со ссылками на документы) не попадут в запрос.

Оптимизация заполнения макета: метод ЗаполнитьЗначенияСвойств

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

Проанализируем пример:


// Вместо:
// Область.Параметры.Организация = Выборка.Организация;
// Область.Параметры.Дата = Выборка.Дата;

// Используем:
Область.Параметры.Заполнить(Выборка);

Условие успеха: Имена параметров в макете (в свойствах ячеек) должны полностью совпадать с именами полей в выборке вашего запроса. Обратите внимание на регистр: хотя 1С во многих местах нечувствительна к регистру, хорошим тоном считается полное соответствие (например, Контрагент и в запросе, и в макете).

Проблемы с макетом: Параметр, Текст или Шаблон?

Если даже с методом Следующий() данные не выводятся, проверим настройки самого табличного документа (макета):

Борьба с кэшированием

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

Правильный алгоритм тестирования:

  1. Внесли изменения в .epf.
  2. Зашли в «НСИ и администрирование» -> «Печатные формы, отчеты и обработки» -> «Дополнительные отчеты и обработки».
  3. Нашли свою форму, нажали «Обновить из файла» и выбрали обновленный файл.
  4. Нажали «Записать и закрыть».
  5. Только теперь проверяем результат печати.

Соблюдение этих простых правил — использование Следующий(), понимание механизмов отладки и стандартов БСП — позволит вам быстро и без ошибок создавать качественные печатные формы для любых конфигураций на платформе 1С:Предприятие 8.3.

← На главную