Как исправить ошибки в запросе и передать свои данные во внешнюю печатную форму ТОРГ-12 для 1С:УНФ 3.0

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

Разработка внешних печатных форм (ВПФ) в 1С:УНФ 3.0 — задача стандартная, но часто сопряженная с «подводными камнями». Типичная ситуация: вы берете готовую печатную форму из конфигурации, пытаетесь её дополнить, и внезапно сталкиваетесь с ошибками «Поле объекта не обнаружено» или получаете пустой ТабличныйДокумент. В этой статье мы подробно разберем, почему возникают такие проблемы, как правильно работать с виртуальными полями запроса и как передать собственные значения для пересчета сумм в валюте.

Разбор ошибки «Поле объекта не обнаружено» и работы с ПРЕДСТАВЛЕНИЕ

Одной из первых проблем, с которой сталкиваются разработчики, является использование функции ПРЕДСТАВЛЕНИЕ в тексте запроса. Проанализируем ситуацию: в консоли запросов всё отрабатывает корректно, но при выполнении кода ВПФ система выдает ошибку. Рассмотрим причину подробнее.

Функция ПРЕДСТАВЛЕНИЕ(РасходнаяНакладная.СтруктурнаяЕдиница) КАК ПредставлениеСклада создает виртуальное поле. Важно понимать, что платформа 1С рассчитывает это поле в самый последний момент, уже после выполнения основной логики запроса на сервере БД. Если вы пытаетесь обратиться к этому полю внутри кода формирования печатной формы, когда данные уже выгружены в ТаблицуЗначений или Структуру, вы можете столкнуться с тем, что поле либо отсутствует, либо имеет тип, отличный от ожидаемого.

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


// Вместо этого:
// | ПРЕДСТАВЛЕНИЕ(РасходнаяНакладная.СтруктурнаяЕдиница) КАК ПредставлениеСклада

// Используем это:
| РасходнаяНакладная.СтруктурнаяЕдиница КАК СкладСписания

Затем в цикле обработки данных объекта мы сможем получить текст следующим образом: Строка(ДанныеОбъекта.СкладСписания).

Анализ структуры внешней печатной формы в УНФ 3.0

Для успешной работы ВПФ должна соответствовать стандартам БСП (Библиотеки стандартных подсистем). Разберем стандартную процедуру Печать, которая является точкой входа. Проанализируем код, представленный ниже:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Получаем сведения о печатной форме
    ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, ИдентификаторПечатнойФормы());
    ОбъектыПечати = Новый СписокЗначений;
    
    // Собираем данные из документов
    Ошибки = Неопределено;
    ДанныеОбъектовПечати = ДанныеДокументовРегУчет(МассивОбъектов, Истина, Истина, Ошибки);
    
    // Формируем табличный документ и выводим его в коллекцию
    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
        КоллекцияПечатныхФорм, 
        "ПФ_MXL_ТОРГ12валютный", 
        "ТОРГ-12 (валютная)", 
        СформироватьПФ(ДанныеОбъектовПечати, ОбъектыПечати)
    );
    
КонецПроцедуры

Обратите внимание на функцию ДанныеДокументовРегУчет. Именно в ней подготавливается источник данных. Если вы переименовали поле в запросе, например, написали ВЫРАЗИТЬ(РасходнаяНакладная.Номер КАК СТРОКА(12)) КАК Номер, то в дальнейшем обращении к результату нужно использовать именно ДанныеОбъекта.Номер, а не НомерДокумента. Несоответствие имен алиасов в запросе и имен параметров в макете — самая частая причина падения обработки.

Почему ТабличныйДокумент возвращает «Неопределено»?

Если в процессе отладки вы видите, что функция СформироватьПФ возвращает Неопределено, это означает, что выполнение кода прервалось или не дошло до инициализации объекта ТабличныйДокумент. Выясним основные причины:

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

Передача собственных значений и пересчет сумм в валюте

Рассмотрим ситуацию, когда нам необходимо вывести в ТОРГ-12 суммы не в валюте регламентированного учета (рублях), а в валюте документа с пересчетом по определенному курсу. Разберем по шагам, как это реализовать.

Шаг 1: Модернизация запроса. Добавим в запрос получение курса валюты документа. В УНФ курс часто хранится непосредственно в шапке документа или получается из регистра.


// В функции ДанныеДокументовРегУчет добавляем поля:
Запрос.Текст = "ВЫБРАТЬ
               |    РасходнаяНакладная.Курс КАК Курс,
               |    РасходнаяНакладная.Кратность КАК Кратность,
               |    РасходнаяНакладная.ВалютаДокумента КАК Валюта,
               |    ... ";

Шаг 2: Алгоритм пересчета в коде. В функции СформироватьПФ, внутри цикла обхода строк табличной части, мы должны выполнить математическую операцию. Посмотрим на пример:


Для Каждого СтрокаТЧ Из ДанныеОбъекта.ТаблицаЗапасы Цикл
    // Предположим, нам нужно пересчитать цену
    ЦенаВРублях = СтрокаТЧ.Цена;
    Курс = ДанныеОбъекта.Курс;
    Кратность = ?(ДанныеОбъекта.Кратность = 0, 1, ДанныеОбъекта.Кратность);
    
    ЦенаВВалюте = (ЦенаВРублях * Курс) / Кратность;
    
    // Заполняем параметры области макета
    ОбластьСтрока.Параметры.Цена = ЦенаВВалюте;
    ОбластьСтрока.Параметры.Сумма = ЦенаВВалюте * СтрокаТЧ.Количество;
КонецЦикла;

Шаг 3: Работа с валютой и прописью. Чтобы вывести итоговую сумму прописью в нужной валюте, воспользуемся функцией ЧислоПрописью. Проанализируем пример кода:


ПараметрыВалюты = "L=ru_RU; SN=true; FN=true; NW=false"; 
// Для более точной настройки используйте данные из справочника Валюты
СуммаПрописью = ЧислоПрописью(ИтоговаяСуммаВВалюте, ПараметрыВалюты, ДанныеОбъекта.Валюта.ПараметрыПрописи);
ДанныеПечати.Вставить("СуммаПрописью", СуммаПрописью);

Советы по эффективной отладке

Для того чтобы не тратить недели на поиск ошибок в ВПФ, воспользуйтесь следующими приемами:

Таким образом, мы выяснили, что ключ к исправлению ошибок в печатных формах УНФ 3.0 лежит в строгом соблюдении соответствия имен полей запроса и параметров макета, а также в понимании механизмов работы платформы с виртуальными полями ПРЕДСТАВЛЕНИЕ.

← На главную