При разработке расширений для программ на платформе 1С:Предприятие 8.3, особенно в таких сложных конфигурациях, как Зарплата и управление персоналом 3.1, программисты часто сталкиваются с проблемами при внедрении собственных печатных форм через механизмы Библиотеки стандартных подсистем (БСП). Одна из распространенных ошибок — некорректная работа подключаемых команд печати, когда кнопка на форме появляется, но при нажатии на неё возникает программная ошибка или ничего не происходит. Рассмотрим детально, как правильно настроить механизм печати в расширении и избежать типичных ловушек.
Разберем ситуацию, представленную в коде автора. Основная проблема заключалась в строке: КомандаПечати.Обработчик = "УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати";. Выясним причину, почему это вызывает ошибку. Модуль УправлениеПечатьюБПКлиент является специфичным для конфигурации 1С:Бухгалтерия предприятия (БП). В ЗУП 3.1, которая построена на базе подсистемы БЗК (Базовая зарплата и кадры), этого модуля либо не существует, либо его использование не предусмотрено для стандартных команд печати.
Проанализируем систему вызовов в БСП. Когда мы регистрируем команду печати в процедуре ДобавитьКомандыПечати модуля менеджера, мы указываем системе, какой программный код должен быть выполнен на стороне клиента при нажатии на кнопку. Если указать несуществующий или неподходящий модуль, платформа выдаст ошибку обращения к методу. Рассмотрим правильные варианты заполнения этого поля:
Обработчик рекомендуется оставлять пустым или вообще не инициализировать. В этом случае система автоматически использует стандартный клиентский метод УправлениеПечатьюКлиент.ВыполнитьКомандуПечати.УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати, но это требуется редко при создании обычных печатных форм.Посмотрим на пример корректной реализации регистрации команды в модуле менеджера объекта внутри расширения. Обратите внимание на важный нюанс: когда мы работаем в расширении, нам необходимо явно указать, где искать процедуру Печать, иначе БСП может попытаться найти её в основной конфигурации.
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "Акт";
КомандаПечати.Представление = "Дополнительный акт";
// Оставляем обработчик пустым, чтобы БСП использовала стандартную логику
КомандаПечати.Обработчик = "";
КомандаПечати.СписокФорм = "ФормаСписка,ФормаДокумента";
// Для расширений критически важно указать МенеджерПечати,
// чтобы вызов Печать() ушел в модуль менеджера расширения
КомандаПечати.МенеджерПечати = "Документ.СПР_СправкаПособиеРР";
КонецПроцедуры
Рассмотрим параметры подробнее. Параметр СписокФорм позволяет ограничить видимость команды. Если вы хотите, чтобы кнопка печати была доступна только в форме документа, укажите только её. Это помогает не загромождать интерфейс в списках, где печать данного акта может быть неактуальна.
В процессе обсуждения возникла ошибка: «Обращение к процедуре объекта как к функции (ВыполнитьКомандуПечати)». Выясним, почему это происходит. В архитектуре БСП клиентский обработчик команды — это именно процедура. Если в коде расширения или при динамическом вызове через Вычислить() система ожидает возвращаемое значение (как у функции), а метод объявлен как процедура, возникает конфликт типов. Чаще всего это происходит, если разработчик пытается вручную прописать вызов в модуле формы, не соблюдая стандарты подключаемых команд.
Чтобы избежать этой ошибки, следуем правилу: не пытайтесь переопределять стандартный механизм вызова, если вам не нужна уникальная логика перед открытием формы печати. Просто очистите поле Обработчик в настройках команды, и БСП сама выполнит вызов корректно.
Теперь разберем, как должна выглядеть процедура Печать в модуле менеджера вашего документа в расширении. Важно правильно использовать коллекцию печатных форм и проверять идентификатор команды.
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Проверяем, нужно ли печатать наш макет "Акт"
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Акт") Тогда
// Формируем табличный документ
ТабДокумент = СформироватьНесколькоАктов(МассивОбъектов);
// Выводим результат в коллекцию.
// Четвертый параметр - путь к макету (Документ.Имя.Макет)
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"Акт",
"Дополнительный акт",
ТабДокумент,
,
"Документ.СПР_СправкаПособиеРР.ПФ_MXL_Акт");
КонецЕсли;
КонецПроцедуры
Проанализируем функцию формирования документа. Для корректной работы с множественным выбором (печать нескольких документов сразу из списка) необходимо предусмотреть разделители страниц.
Функция СформироватьНесколькоАктов(МассивОбъектов)
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.АвтоМасштаб = Истина;
ТабДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Акт";
Для Каждого Ссылка Из МассивОбъектов Цикл
// Если это не первый документ, добавляем разрыв страницы
Если ТабДокумент.ВысотаТаблицы > 0 Тогда
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
// Получаем макет конкретного объекта
ТабДокументОбъекта = СформироватьАкт(Ссылка);
ТабДокумент.Вывести(ТабДокументОбъекта);
КонецЦикла;
Возврат ТабДокумент;
КонецФункции
Чтобы команды печати «взлетели», их нужно инициализировать в коде форм. Рассмотрим, какие обязательные процедуры должны быть в модуле формы документа (или списка). Проанализируем стандартный шаблон БСП для подключаемых команд.
В процедуре ПриСозданииНаСервере необходимо вызвать инициализацию:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Инициализация подключаемых команд
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
КонецПроцедуры
А на клиенте — обновление при открытии:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
КонецПроцедуры
И самое главное — обработка нажатия. Рассмотрим шаблон, который перенаправляет вызов в БСП:
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
// Для формы документа передаем "Объект", для списка - "Элементы.Список"
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
Часто программисты сталкиваются с тем, что код исправлен, но ошибка сохраняется. Проанализируем причины кэширования. Список команд печати в БСП кэшируется в параметрах сеанса для повышения производительности. Чтобы изменения в ДобавитьКомандыПечати вступили в силу, недостаточно просто сохранить расширение. Рекомендуется выполнить следующие действия:
Таким образом, для исправления ошибки в ЗУП 3.1 при работе с печатью в расширении, основным шагом является удаление привязки к модулям других конфигураций (таких как БП) и использование стандартных механизмов БСП с корректным указанием МенеджерПечати.