Как создать внешнюю печатную форму для 1С:Управление торговлей 11 и избежать ошибок при разработке?

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

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

Шаг 1. Регистрация внешней печатной формы в системе

Для того чтобы программа «увидела» вашу обработку как печатную форму, в модуле объекта должна присутствовать экспортная функция СведенияОВнешнейОбработке. Рассмотрим структуру этой функции. Именно здесь мы указываем, к какому документу привязывается форма и какие команды будут доступны пользователю.

Проанализируем пример кода для регистрации:


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

Обратите внимание на параметр Модификатор в методе ДобавитьКоманду. Значение ПечатьMXL критически важно: оно сообщает системе, что результатом работы будет табличный документ mxl. Если этот параметр не указать, форма может не открыться в стандартном окне предпросмотра.

Шаг 2. Основная процедура печати и типичная ошибка возврата

После регистрации БСП ищет в модуле объекта процедуру Печать. Одной из самых частых ошибок является неправильная передача сформированного табличного документа обратно в систему. Если процедура завершится без наполнения коллекции печатных форм, вы получите ошибку: «В обработчике печати не был сформирован табличный документ».

Разберем, как правильно организовать процедуру Печать:


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

Важный момент: в функцию формирования печатной формы мы передаем МассивОбъектов. Это позволяет реализовать массовую печать (когда пользователь выделяет несколько документов в списке и нажимает кнопку «Печать»).

Шаг 3. Формирование табличного документа и работа с запросом

Теперь выясним причину, по которой данные могут не выводиться в макет. Рассмотрим функцию СформироватьПечатнуюФорму. Здесь мы должны создать объект ТабличныйДокумент, получить макет, выполнить запрос к базе данных и заполнить области макета.

Разберем правильный подход к написанию запроса. Попытка просто выбрать данные из Документ.РеализацияТоваровУслуг без условий приведет к тому, что запрос выберет данные всех реализаций в базе. Нам же нужно ограничить выборку переданным массивом ссылок.


Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Тест";
    
    Макет = ПолучитьМакет("Макет"); // Убедитесь, что имя макета совпадает
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
        |	РеализацияТоваровУслугТовары.Количество КАК Количество,
        |	РеализацияТоваровУслугТовары.Цена КАК Цена,
        |	РеализацияТоваровУслугТовары.Сумма КАК Сумма,
        |	РеализацияТоваровУслугТовары.Номенклатура.Производитель.Наименование КАК ПроизводительНаименование,
        |	РеализацияТоваровУслугТовары.Ссылка КАК Ссылка
        |ИЗ
        |	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        |ГДЕ
        |	РеализацияТоваровУслугТовары.Ссылка В(&МассивОбъектов)
        |УПОРЯДОЧИТЬ ПО
        |	Ссылка,
        |	РеализацияТоваровУслугТовары.НомерСтроки";
    
    Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
    РезультатЗапроса = Запрос.Выполнить();
    
    // Используем выборку для обхода результатов
    Выборка = РезультатЗапроса.Выбрать();
    
    ПервыйДокумент = Истина;
    Пока Выборка.Следующий() Цикл
        // Если печатаем несколько документов, разделяем их страницами
        // В данном примере упростим для понимания логики заполнения строк
        
        ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, Выборка);
        // Если параметр в макете называется иначе, чем в запросе, заполняем вручную:
        ОбластьСтрока.Параметры.Производитель = Выборка.ПроизводительНаименование;
        
        ТабДок.Вывести(ОбластьСтрока);
    КонецЦикла;
    
    Возврат ТабДок;
КонецФункции

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

Рассмотрим несколько распространенных ситуаций, с которыми сталкиваются разработчики при работе с запросами в ВПФ:

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

Рекомендации по заполнению макета

Проанализируем процесс вывода данных. Чтобы сократить объем кода, используйте метод ЗаполнитьЗначенияСвойств. Он автоматически ищет параметры в области макета, имена которых совпадают с полями выборки запроса. Это избавляет от необходимости писать десятки строк вида Область.Параметры.Цена = Выборка.Цена.

Также не забывайте про Безопасный режим. Если в СведенияОВнешнейОбработке вы указали БезопасныйРежим = Истина, ваша обработка не сможет обращаться к файловой системе сервера или использовать некоторые привилегированные функции. Для простых печатных форм рекомендуется оставлять безопасный режим включенным.

Итоги работы

Мы рассмотрели полный цикл создания внешней печатной формы. Теперь мы знаем, что:

Используя эти правила, вы сможете создавать стабильные и быстрые печатные формы для любых конфигураций на базе 1С 8.3.

← На главную