Разработка внешних печатных форм (ВПФ) в 1С:УНФ 3.0 — задача стандартная, но часто сопряженная с «подводными камнями». Типичная ситуация: вы берете готовую печатную форму из конфигурации, пытаетесь её дополнить, и внезапно сталкиваетесь с ошибками «Поле объекта не обнаружено» или получаете пустой ТабличныйДокумент. В этой статье мы подробно разберем, почему возникают такие проблемы, как правильно работать с виртуальными полями запроса и как передать собственные значения для пересчета сумм в валюте.
Одной из первых проблем, с которой сталкиваются разработчики, является использование функции ПРЕДСТАВЛЕНИЕ в тексте запроса. Проанализируем ситуацию: в консоли запросов всё отрабатывает корректно, но при выполнении кода ВПФ система выдает ошибку. Рассмотрим причину подробнее.
Функция ПРЕДСТАВЛЕНИЕ(РасходнаяНакладная.СтруктурнаяЕдиница) КАК ПредставлениеСклада создает виртуальное поле. Важно понимать, что платформа 1С рассчитывает это поле в самый последний момент, уже после выполнения основной логики запроса на сервере БД. Если вы пытаетесь обратиться к этому полю внутри кода формирования печатной формы, когда данные уже выгружены в ТаблицуЗначений или Структуру, вы можете столкнуться с тем, что поле либо отсутствует, либо имеет тип, отличный от ожидаемого.
Рекомендация: Вместо получения представления непосредственно в запросе, лучше выбирать саму ссылку на объект, а строковое представление получать уже в коде формирования макета. Рассмотрим пример изменения запроса:
// Вместо этого:
// | ПРЕДСТАВЛЕНИЕ(РасходнаяНакладная.СтруктурнаяЕдиница) КАК ПредставлениеСклада
// Используем это:
| РасходнаяНакладная.СтруктурнаяЕдиница КАК СкладСписания
Затем в цикле обработки данных объекта мы сможем получить текст следующим образом: Строка(ДанныеОбъекта.СкладСписания).
Для успешной работы ВПФ должна соответствовать стандартам БСП (Библиотеки стандартных подсистем). Разберем стандартную процедуру Печать, которая является точкой входа. Проанализируем код, представленный ниже:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Получаем сведения о печатной форме
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, ИдентификаторПечатнойФормы());
ОбъектыПечати = Новый СписокЗначений;
// Собираем данные из документов
Ошибки = Неопределено;
ДанныеОбъектовПечати = ДанныеДокументовРегУчет(МассивОбъектов, Истина, Истина, Ошибки);
// Формируем табличный документ и выводим его в коллекцию
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ПФ_MXL_ТОРГ12валютный",
"ТОРГ-12 (валютная)",
СформироватьПФ(ДанныеОбъектовПечати, ОбъектыПечати)
);
КонецПроцедуры
Обратите внимание на функцию ДанныеДокументовРегУчет. Именно в ней подготавливается источник данных. Если вы переименовали поле в запросе, например, написали ВЫРАЗИТЬ(РасходнаяНакладная.Номер КАК СТРОКА(12)) КАК Номер, то в дальнейшем обращении к результату нужно использовать именно ДанныеОбъекта.Номер, а не НомерДокумента. Несоответствие имен алиасов в запросе и имен параметров в макете — самая частая причина падения обработки.
Если в процессе отладки вы видите, что функция СформироватьПФ возвращает Неопределено, это означает, что выполнение кода прервалось или не дошло до инициализации объекта ТабличныйДокумент. Выясним основные причины:
ПечатьДокументовУНФ.ПолучитьОбластьБезопасно. Если имя области в макете (например, "Шапка" или "Строка") не совпадает с тем, что передается в функцию, она вернет Неопределено, и дальнейшая логика может «сломаться».ДанныеДокументовРегУчет по каким-то причинам не вернул строк (например, неверный МассивОбъектов), цикл Для Каждого ДанныеОбъекта Из ДанныеОбъектовПечати не выполнится, и итоговый документ не будет заполнен.Рассмотрим ситуацию, когда нам необходимо вывести в ТОРГ-12 суммы не в валюте регламентированного учета (рублях), а в валюте документа с пересчетом по определенному курсу. Разберем по шагам, как это реализовать.
Шаг 1: Модернизация запроса. Добавим в запрос получение курса валюты документа. В УНФ курс часто хранится непосредственно в шапке документа или получается из регистра.
// В функции ДанныеДокументовРегУчет добавляем поля:
Запрос.Текст = "ВЫБРАТЬ
| РасходнаяНакладная.Курс КАК Курс,
| РасходнаяНакладная.Кратность КАК Кратность,
| РасходнаяНакладная.ВалютаДокумента КАК Валюта,
| ... ";
Шаг 2: Алгоритм пересчета в коде. В функции СформироватьПФ, внутри цикла обхода строк табличной части, мы должны выполнить математическую операцию. Посмотрим на пример:
Для Каждого СтрокаТЧ Из ДанныеОбъекта.ТаблицаЗапасы Цикл
// Предположим, нам нужно пересчитать цену
ЦенаВРублях = СтрокаТЧ.Цена;
Курс = ДанныеОбъекта.Курс;
Кратность = ?(ДанныеОбъекта.Кратность = 0, 1, ДанныеОбъекта.Кратность);
ЦенаВВалюте = (ЦенаВРублях * Курс) / Кратность;
// Заполняем параметры области макета
ОбластьСтрока.Параметры.Цена = ЦенаВВалюте;
ОбластьСтрока.Параметры.Сумма = ЦенаВВалюте * СтрокаТЧ.Количество;
КонецЦикла;
Шаг 3: Работа с валютой и прописью. Чтобы вывести итоговую сумму прописью в нужной валюте, воспользуемся функцией ЧислоПрописью. Проанализируем пример кода:
ПараметрыВалюты = "L=ru_RU; SN=true; FN=true; NW=false";
// Для более точной настройки используйте данные из справочника Валюты
СуммаПрописью = ЧислоПрописью(ИтоговаяСуммаВВалюте, ПараметрыВалюты, ДанныеОбъекта.Валюта.ПараметрыПрописи);
ДанныеПечати.Вставить("СуммаПрописью", СуммаПрописью);
Для того чтобы не тратить недели на поиск ошибок в ВПФ, воспользуйтесь следующими приемами:
ДанныеДокументовРегУчет в консоли, подставляя реальный МассивОбъектов. Это позволит сразу увидеть, возвращаются ли данные и как называются колонки.Сообщить() для вывода значений ключевых переменных (например, количество строк в выборке или тип данных в колонке).Таким образом, мы выяснили, что ключ к исправлению ошибок в печатных формах УНФ 3.0 лежит в строгом соблюдении соответствия имен полей запроса и параметров макета, а также в понимании механизмов работы платформы с виртуальными полями ПРЕДСТАВЛЕНИЕ.