Как исправить ошибку при нажатии на кнопку печати в расширении для ЗУП 3.1?

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

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

Анализируем причину ошибки в обработчике

Разберем ситуацию, представленную в коде автора. Основная проблема заключалась в строке: КомандаПечати.Обработчик = "УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати";. Выясним причину, почему это вызывает ошибку. Модуль УправлениеПечатьюБПКлиент является специфичным для конфигурации 1С:Бухгалтерия предприятия (БП). В ЗУП 3.1, которая построена на базе подсистемы БЗК (Базовая зарплата и кадры), этого модуля либо не существует, либо его использование не предусмотрено для стандартных команд печати.

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

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

Правильная настройка процедуры ДобавитьКомандыПечати

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


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

Рассмотрим параметры подробнее. Параметр СписокФорм позволяет ограничить видимость команды. Если вы хотите, чтобы кнопка печати была доступна только в форме документа, укажите только её. Это помогает не загромождать интерфейс в списках, где печать данного акта может быть неактуальна.

Устранение ошибки «Обращение к процедуре как к функции»

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

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

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

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


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

Проанализируем функцию формирования документа. Для корректной работы с множественным выбором (печать нескольких документов сразу из списка) необходимо предусмотреть разделители страниц.


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

Подключение команд в формах документа и списка

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

В процедуре ПриСозданииНаСервере необходимо вызвать инициализацию:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Инициализация подключаемых команд
    ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
КонецПроцедуры

А на клиенте — обновление при открытии:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
КонецПроцедуры

И самое главное — обработка нажатия. Рассмотрим шаблон, который перенаправляет вызов в БСП:


&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
    // Для формы документа передаем "Объект", для списка - "Элементы.Список"
    ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

Почему изменения могут не применяться сразу?

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

  1. Перезапустить сеанс пользователя: Это обновит параметры сеанса.
  2. Проверить справочник «Идентификаторы объектов метаданных»: В некоторых случаях (если документ новый) требуется запустить обработку «Обновление информационной базы» или вручную обновить справочник через функции для разработчиков.
  3. Очистить кэш: Если странное поведение сохраняется, попробуйте очистить локальный кэш конфигурации на компьютере разработчика.

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

← На главную