Введение
Привет всем! В данной статье предлагаю рассмотреть методы вывода макета на печать любых документов (собственных или типовых) с помощью актуальной библиотеки стандартных подсистем (БСП). Данный небольшой обзор поможет снять вам вопросы типа "как прицепить макет печати к собственному документу или справочника?" или "как разместить кнопку печать на форме списка и форме документа или справочника". На момент написания статьи - середина февраля 2021 года - точка актуальности - это БСП версии 3.1.4.148.
Для кого-то этот материал не новшество, но отмечу, что данная статья будет полезна специалистам, желающим использовать последние возможности библиотеки стандартных подсистем в методах вывода на печать. Хорошо известно, что подсистема БСП постоянно меняется и усовершенствуется, и я могу сказать определенно, что старые методы и алгоритмы вывода на печать макетов печатных форм документов и справочников уже будут вряд ли применимы в современных конфигурациях на последних БСП.
Подготовка и настройка собственного документа конфигурации для использования в подсистеме печати в системе БСП.
Начнем с простого создания документа ТестоваяПечатьДокументов в конфигурации на БСП. В качестве конфигурации я беру чистую библиотеку стандартных подсистем версии 3.1.4.148. Разработка ведется на Платформе 1с 8.3.18.1208.
Основным и главным моментом после создания собственного документа будет необходимость прописать данный документ в общем модуле - процедуре УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
выглядит это вот так:
Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
// _Демо начало примера
СписокОбъектов.Добавить(Справочники._ДемоКонтактныеЛицаПартнеров);
СписокОбъектов.Добавить(Справочники._ДемоКонтрагенты);
СписокОбъектов.Добавить(Справочники._ДемоОрганизации);
СписокОбъектов.Добавить(Справочники._ДемоПартнеры);
СписокОбъектов.Добавить(Справочники._ДемоФизическиеЛица);
СписокОбъектов.Добавить(Документы._ДемоОприходованиеТоваров);
СписокОбъектов.Добавить(Документы._ДемоПеремещениеТоваров);
СписокОбъектов.Добавить(Документы._ДемоРеализацияТоваров);
СписокОбъектов.Добавить(Документы._ДемоСписаниеТоваров);
СписокОбъектов.Добавить(Документы._ДемоСчетНаОплатуПокупателю);
СписокОбъектов.Добавить(Документы._ДемоРасходныйКассовыйОрдер);
//****
СписокОбъектов.Добавить(Документы.ТестоваяПечатьДокументов);
//****
// _Демо конец примера
КонецПроцедуры
Далее, что нам потребуется. Создаем 2 формы в документе ТестоваяПечатьДокументов - это "ФормаСписка" и "ФормаДокумента". В каждой из этих форм создаем и привязываем процедуру ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
выглядит она вот так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Вставить содержимое обработчика.
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
КонецПроцедуры
Далее, для "формы списка" добавляем внутренние БСП подключаемые процедуры:
// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Элементы.Список);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Элементы.Список);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.Список);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
А для "формы документа" добавляем вот такие внутренние БСП подключаемые процедуры:
// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
Хочу отметить, что данные процедуры я копирую из типовых документов БСП - их будет достаточно, чтобы активировать кнопку системы печати на формах документа. Ничего лишнего добавлять не нужно.
Далее, заполним модуль менеджера нашего документа. Напишем в нем такой код:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
// Перемещение товаров
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ТестовыйМакетПечати";
КомандаПечати.Представление = НСтр("ru = 'Тестовый макет печати'");
КонецПроцедуры
// Формирует печатные формы.
//
// Параметры:
// МассивОбъектов - см. УправлениеПечатьюПереопределяемый.ПриПечати.МассивОбъектов
// ПараметрыПечати - см. УправлениеПечатьюПереопределяемый.ПриПечати.ПараметрыПечати
// КоллекцияПечатныхФорм - см. УправлениеПечатьюПереопределяемый.ПриПечати.КоллекцияПечатныхФорм
// ОбъектыПечати - см. УправлениеПечатьюПереопределяемый.ПриПечати.ОбъектыПечати
// ПараметрыВывода - см. УправлениеПечатьюПереопределяемый.ПриПечати.ПараметрыВывода
//
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
НужноПечататьМакет = УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ТестовыйМакетПечати");
Если НужноПечататьМакет Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ТестовыйМакетПечати",
НСтр("ru = 'Тестовый макет печати'"),
ПечатнаяФормаТестовогоДокумента(МассивОбъектов, ОбъектыПечати),
,
"Документ.ТестоваяПечатьДокументов.ТестовыйМакетПечати");
КонецЕсли;
КонецПроцедуры
Функция ПечатнаяФормаТестовогоДокумента(МассивОбъектов, ОбъектыПечати)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.КлючПараметровПечати = "ТестовыйМакетПечати";
Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.ТестоваяПечатьДокументов.ТестовыйМакетПечати");
МассивОбластейМакета = Новый Массив;
МассивОбластейМакета.Добавить("Заголовок");
МассивОбластейМакета.Добавить("ШапкаТаблицы");
МассивОбластейМакета.Добавить("Строка");
МассивОбластейМакета.Добавить("Подвал");
МассивОбластейМакета.Добавить("Подписи");
Для Каждого ИмяОбласти Из МассивОбластейМакета Цикл
ОбластьМакета = Макет.ПолучитьОбласть(ИмяОбласти);
Если ИмяОбласти <> "Строка" Тогда
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции
Здесь функция - ПечатнаяФормаТестовогоДокумента(МассивОбъектов, ОбъектыПечати) - формирует заполненный макет печатной формы и возвращает пользователю.
Процедура - Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт - типовая процедура печати БСП.
Тут нет ничего сложного, но особое внимание хочу обратить на вот эту процедуру добавления команд
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
// Перемещение товаров
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ТестовыйМакетПечати";
КомандаПечати.Представление = НСтр("ru = 'Тестовый макет печати'");
КонецПроцедуры
Открываем код БСП и смотрим какие возможности предоставляет нам функция УправлениеПечатью.СоздатьКоллекциюКомандПечати() - она используется для "наполнения" объекта КомандыПечати(). Возможности широчайшие:
Функция СоздатьКоллекциюКомандПечати() Экспорт
Результат = Новый ТаблицаЗначений;
// описание
Результат.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Результат.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
//////////
// Опции (необязательные параметры).
// менеджер печати
Результат.Колонки.Добавить("МенеджерПечати", Неопределено);
Результат.Колонки.Добавить("ТипыОбъектовПечати", Новый ОписаниеТипов("Массив"));
// Альтернативный обработчик команды.
Результат.Колонки.Добавить("Обработчик", Новый ОписаниеТипов("Строка"));
// представление
Результат.Колонки.Добавить("Порядок", Новый ОписаниеТипов("Число"));
Результат.Колонки.Добавить("Картинка", Новый ОписаниеТипов("Картинка"));
// Имена форм для размещения команд, разделитель - запятая.
Результат.Колонки.Добавить("СписокФорм", Новый ОписаниеТипов("Строка"));
Результат.Колонки.Добавить("МестоРазмещения", Новый ОписаниеТипов("Строка"));
Результат.Колонки.Добавить("ЗаголовокФормы", Новый ОписаниеТипов("Строка"));
// Имена функциональных опций, влияющих на видимость команды, разделитель - запятая.
Результат.Колонки.Добавить("ФункциональныеОпции", Новый ОписаниеТипов("Строка"));
// Динамические условия видимости.
Результат.Колонки.Добавить("УсловияВидимости", Новый ОписаниеТипов("Массив"));
// проверка проведения
Результат.Колонки.Добавить("ПроверкаПроведенияПередПечатью", Новый ОписаниеТипов("Булево"));
// вывод
Результат.Колонки.Добавить("СразуНаПринтер", Новый ОписаниеТипов("Булево"));
Результат.Колонки.Добавить("ФорматСохранения"); // ТипФайлаТабличногоДокумента
// настройки комплектов
Результат.Колонки.Добавить("ПереопределитьПользовательскиеНастройкиКоличества", Новый ОписаниеТипов("Булево"));
Результат.Колонки.Добавить("ДополнитьКомплектВнешнимиПечатнымиФормами", Новый ОписаниеТипов("Булево"));
Результат.Колонки.Добавить("ФиксированныйКомплект", Новый ОписаниеТипов("Булево")); // запрет изменения комплекта
// дополнительные параметры
Результат.Колонки.Добавить("ДополнительныеПараметры", Новый ОписаниеТипов("Структура"));
// Специальный режим выполнения команды
// по умолчанию выполняется запись модифицированного объекта перед выполнением команды.
Результат.Колонки.Добавить("НеВыполнятьЗаписьВФорме", Новый ОписаниеТипов("Булево"));
// Для использования макетов офисных документов в веб-клиенте.
Результат.Колонки.Добавить("ТребуетсяРасширениеРаботыСФайлами", Новый ОписаниеТипов("Булево"));
// Для служебного использования.
Результат.Колонки.Добавить("СкрытаФункциональнымиОпциями", Новый ОписаниеТипов("Булево"));
Результат.Колонки.Добавить("УникальныйИдентификатор", Новый ОписаниеТипов("Строка"));
Результат.Колонки.Добавить("Отключена", Новый ОписаниеТипов("Булево"));
Результат.Колонки.Добавить("ИмяКомандыНаФорме", Новый ОписаниеТипов("Строка"));
Возврат Результат;
КонецФункции
Как мы видим, основные параметры - Идентификатор, Представление. Остальные являются необязательными.
Правильно разместив вышеуказанный код в конфигурации вы получите необходимый результат - вывод кнопки "Печать" для формы документа и формы списка для документа ТестоваяПечатьДокументов.
Перейдем к разделу заключений и выводов по данной статье.
Заключение и выводы
В данной статье мы рассмотрели основной алгоритм БСП для размещения команд печати на любых документах конфигурации, в основе которой лежит современная библиотека стандартных подсистем. Напомню, что разработка примера велась на "чистой" библиотеке стандартных подсистем версии 3.1.4.148 и Платформе 1с 8.3.18.1208.
Ну и конечно, знание данных методов позволит вам ускорить разработку и доработку любых типовых конфигураций 1с (БУХ, ЗУП, Розница, УНФ и т.п....), основой которых является библиотека стандартных подсистем. И самое главное - это правильно и по стандарту профессиональных разработчиков.
Другие мои материалы по БСП
Если вам интересен мой практический подход и информация, которую вы сможете реально использовать, если у вас есть желание, чтобы данный комплекс статей наполнялся практическими материалы для программистов - я не откажусь от поддержки как данной статьи, так и всего комплекса статей в целом.
Так же прошу ознакомиться с другими моими статьями по функционалу библиотеки стандартных подсистем и типовым конфигурациям:
Работаем с контактной информацией в конфигурациях на БСП
Генерация штрихкодов с помощью БСП для программистов
Базовые вещи БСП, которые облегчат жизнь программисту 1С
Возможности работы со строками при помощи БСП, которые должен знать каждый программист