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