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