Базовое понимание внедрения механизма печати в любом документе конфигурации на БСП
Введение Привет всем! В данной статье предлагаю рассмотреть методы вывода макета на печать любых документов (собственных или типовых) с помощью актуальной библиотеки стандартных подсистем (БСП). Данный небольшой обзор поможет снять вам вопросы типа «как прицепить макет печати к собственному документу или справочника?» или «как разместить кнопку печать на форме списка и форме документа или справочника«. На момент написания статьи — середина февраля 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с (БУХ, ЗУП, Розница, УНФ и т.п. ), основой которых является библиотека стандартных подсистем. И самое главное — это правильно и по стандарту профессиональных разработчиков. Другие мои материалы по БСП Если вам интересен мой практический подход и информация, которую вы сможете реально использовать, если у вас есть желание, чтобы данный комплекс статей наполнялся практическими материалы для программистов — я не откажусь от поддержки как данной статьи, так и всего комплекса статей в целом. Так же прошу ознакомиться с другими моими статьями по функционалу библиотеки стандартных подсистем и типовым конфигурациям: Полезные встроенные функции для работы с печатными формами и не только на УТ 11.4 и БП 3.0 (сравнение) Работаем с контактной информацией в конфигурациях на БСП Генерация штрихкодов с помощью БСП для программистов Типовые методы конфигурации «Зарплата и управление персоналом», которые пригодятся каждому ЗУП программисту и не только Базовые вещи БСП, которые облегчат жизнь программисту 1С Возможности работы со строками при помощи БСП, которые должен знать каждый программист