Источник : https://infostart.ru/1c/articles/1382297/
В данной статье рассмотрим базовое применение методов вывода на печать макетов печатных форм с помощью БСП любых типовых или собственных документов.
Введение
Привет всем! В данной статье предлагаю рассмотреть методы вывода макета на печать любых документов (собственных или типовых) с помощью актуальной библиотеки стандартных подсистем (БСП). Данный небольшой обзор поможет снять вам вопросы типа "как прицепить макет печати к собственному документу или справочника?" или "как разместить кнопку печать на форме списка и форме документа или справочника". На момент написания статьи - середина февраля 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с (БУХ, ЗУП, Розница, УНФ и т.п....), основой которых является библиотека стандартных подсистем. И самое главное - это правильно и по стандарту профессиональных разработчиков.