Создание внешних печатных форм (ВПФ) — одна из самых частых задач для начинающего разработчика 1С. Однако на этом пути часто возникают трудности: вроде бы запрос написан верно, макет отрисован красиво, а при выводе на печать вместо данных организации, контрагента или менеджера мы видим пустые ячейки. В этой статье мы разберем классическую причину этой проблемы, научимся правильно работать с выборкой запроса и узнаем секреты эффективной отладки внешних обработок.
Разберем ситуацию, с которой столкнулся автор темы. В коде был сформирован запрос, получен результат и создана выборка. Однако данные в параметры макета не попадали. Проблема кроется в том, как 1С работает с объектом ВыборкаИзРезультатаЗапроса.
Когда мы получаем выборку методом Выбрать(), «курсор» системы устанавливается перед первой записью результата. Если мы сразу попытаемся обратиться к полям выборки (например, Выборка.Организация), мы не получим данных, так как система еще не «встала» на конкретную строку.
Для того чтобы получить доступ к данным, необходимо вызвать метод Следующий(). Этот метод перемещает курсор на следующую (в данном случае — на первую) запись. Если запись существует, метод возвращает Истина, если результат запроса пуст — Ложь.
Рассмотрим правильную конструкцию заполнения шапки документа, предложенную в решении проблемы:
// Получаем выборку из результата запроса
ДанныеДляПечатиПоШапке = РезультатЗапроса.Выбрать();
// Обязательно позиционируемся на первой (и, как правило, единственной для шапки) строке
Если ДанныеДляПечатиПоШапке.Следующий() Тогда
// Теперь данные доступны для заполнения параметров макета
ОбластьМакета.Параметры.Организация = ДанныеДляПечатиПоШапке.Организация;
ОбластьМакета.Параметры.Контрагент = ДанныеДляПечатиПоШапке.Контрагент;
ОбластьМакета.Параметры.Менеджер = ДанныеДляПечатиПоШапке.Менеджер;
// Выводим область в табличный документ
ТабДок.Вывести(ОбластьМакета);
КонецЕсли;
Важный нюанс: использование конструкции Если ... Тогда вместо Пока ... Цикл оправдано для шапки документа, так как мы ожидаем там только одну уникальную запись по ссылке на документ. Если же мы выводим табличную часть (товары), необходимо использовать цикл Пока Выборка.Следующий() Цикл.
Проанализируем ситуацию с отладкой. Автор темы жаловалась, что точка останова «не срабатывает». Это типичное поведение для внешних печатных форм в современных конфигурациях, таких как «Управление торговлей 11» или «Бухгалтерия предприятия 3.0».
Дело в том, что при запуске печати из интерфейса программа копирует файл внешней обработки во временное хранилище на сервере и запускает его оттуда. Конфигуратор «не знает», что этот временный файл связан с вашим исходным .epf файлом на диске.
Выясним, как все-таки заставить отладку работать:
-debug). Без этого точки останова в серверном коде (а печать обычно происходит на сервере) работать не будут.Современные конфигурации требуют строгого соблюдения программного интерфейса. Посмотрим, что обязательно должно быть в модуле объекта вашей формы, чтобы она вообще работала:
Во-первых, функция СведенияОВнешнейОбработке(). Она описывает свойства обработки: к какому документу она привязана, как называется команда печати и какой метод вызывается.
Во-вторых, процедура Печать(). Ее сигнатура (набор параметров) должна быть строго определенной:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Код подготовки табличного документа
КонецПроцедуры
Если вы пропустите один из параметров или назовете процедуру иначе, система БСП не сможет корректно передать управление вашему коду, и данные (тот самый МассивОбъектов со ссылками на документы) не попадут в запрос.
Рассмотрим способ, который значительно ускоряет написание кода и уменьшает количество опечаток. Вместо того чтобы вручную прописывать каждую строку для каждого параметра макета, мы можем использовать метод Заполнить() для параметров области.
Проанализируем пример:
// Вместо:
// Область.Параметры.Организация = Выборка.Организация;
// Область.Параметры.Дата = Выборка.Дата;
// Используем:
Область.Параметры.Заполнить(Выборка);
Условие успеха: Имена параметров в макете (в свойствах ячеек) должны полностью совпадать с именами полей в выборке вашего запроса. Обратите внимание на регистр: хотя 1С во многих местах нечувствительна к регистру, хорошим тоном считается полное соответствие (например, Контрагент и в запросе, и в макете).
Если даже с методом Следующий() данные не выводятся, проверим настройки самого табличного документа (макета):
Менеджер в самом документе просто не заполнено пользователем. Перед выводом полезно проверять данные функцией ЗначениеЗаполнено().Выясним еще одну причину, по которой изменения в коде не «подхватываются». 1С активно кэширует внешние обработки. Если вы исправили код (добавили метод Следующий()), сохранили файл, но не обновили его в справочнике «Дополнительные отчеты и обработки», система продолжит запускать старую версию из своего внутреннего хранилища.
Правильный алгоритм тестирования:
.epf.Соблюдение этих простых правил — использование Следующий(), понимание механизмов отладки и стандартов БСП — позволит вам быстро и без ошибок создавать качественные печатные формы для любых конфигураций на платформе 1С:Предприятие 8.3.