Как правильно создать и отладить внешнюю печатную форму в 1С:ЗУП 3.1

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

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

Разберем структуру функции СведенияОВнешнейОбработке

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

Рассмотрим пример корректного заполнения шапки регистрации:


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

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

Выясним причину ошибки Слишком много фактических параметров

Часто программисты копируют вспомогательную процедуру ДобавитьКоманду из старых примеров или других конфигураций. Ошибка «Слишком много фактических параметров» возникает, когда количество аргументов при вызове процедуры не совпадает с количеством параметров в её определении. Посмотрим, как должна выглядеть эта процедура и таблица команд, чтобы соответствовать стандартам БСП:


Функция ПолучитьТаблицуКоманд()
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;
КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры

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

Реализация основной логики печати

В современных конфигурациях внешняя печатная форма обязательно должна содержать экспортную процедуру Печать. Рассмотрим её сигнатуру, которая является стандартом для ЗУП 3.1:


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

Проанализируем ситуацию, когда пользователь выбирает сразу несколько сотрудников в списке. Если мы будем обращаться только к МассивОбъектов[0], то печатная форма сформируется только для первого выделенного человека. Чтобы форма работала корректно для любого количества объектов, необходимо использовать цикл.

Как правильно работать с данными сотрудников и макетом

В ЗУП 3.1 есть важная особенность: справочник Сотрудники хранит кадровую информацию, а персональные данные (ФИО, паспорт) хранятся в справочнике ФизическиеЛица. Если вы хотите вывести данные физического лица, ссылаясь на сотрудника, используйте обращение через точку: Сотрудник.ФизическоеЛицо.

Рассмотрим пример функции формирования документа с обходом массива объектов:


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

Советы по отладке и оптимизации

Проанализируем еще несколько моментов, которые помогут вам в работе:

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

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

← На главную