В данном рецепте мы рассмотрим разработку внешней печатной формы, использующей подсистему печати библиотеки стандартных подсистем. На основе этого примера можно создать шаблон внешней печатной формы, чтобы в дальнейшем быстрее разрабатывать другие внешние печ. формы.
СведенияОВнешнейОбработке
При разработке внешних отчетов и обработок с использованием механизмов БСП, в данном методе следует описывать саму внешнюю печатную форму и доступные в ней команды.
Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.5.1"); ПараметрыРегистрации.Информация = НСтр("ru = 'Коммерческое предложение'"); ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма(); ПараметрыРегистрации.Версия = "1.0.0.1"; ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказПокупателя"); Команда = ПараметрыРегистрации.Команды.Добавить(); Команда.Представление = НСтр("ru = 'Коммерческое предложение внеш'"); Команда.Идентификатор = "КоммерческоеПредложение"; Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(); Команда.ПоказыватьОповещение = Ложь; Возврат ПараметрыРегистрации; КонецФункции
В интернете можно найти множество вариантов внешних печатных форм, и часто встречается подход, когда и параметры регистрации и команды, и все остальное жестко прописываются в коде, например:
ПараметрыРегистрации = Новый Структура; ПараметрыРегистрации.Вставить("Вид", ""); ПараметрыРегистрации.Вставить("Версия", "0.0"); ПараметрыРегистрации.Вставить("Назначение", Новый Массив); ПараметрыРегистрации.Вставить("Наименование", Неопределено); ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина); ПараметрыРегистрации.Вставить("Информация", Неопределено); ПараметрыРегистрации.Вставить("ВерсияБСП", ВерсияБСП); ПараметрыРегистрации.Вставить("ОпределитьНастройкиФормы", Ложь);
Этот подход тоже будет рабочим, но имеет существенный недостаток. При изменении версии БСП может поменяться внутренняя начинка подсистемы, в частности подсистемы печати. И в какой-то момент код внешней печ. формы может “сломаться”.
Методологически более правильно – не заниматься копированием того, что уже написано, а использовать стандартные методы БСП.
- Для получения структуры с описанием внешней обработки и таблицей команд достаточно вызвать метод ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке.
- Вместо ПараметрыРегистрации.Вид = “ПечатнаяФорма” следует писать ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма()
- Вместо Команда.Использование = “ВызовСерверногоМетода” следует писать Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода()
Идентификатор – это то, как будет распознаваться печатная форма самой конфигурацией. Представление – то, как будет выглядеть команда для пользователя.
Экспортная процедура "Печать"
Следующий шаг при разработке внешней печатной формы – корректно описать процедуру печати. Опять же, часто встречаются реализации метода “в лоб”, не предусматривающие печати нескольких объектов одновременно. С точки зрения стандартов разработки на БСП это не совсем верно. За основу следует брать подход, используемый при печати “типовых” объектов.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "КоммерческоеПредложение"); Если ПечатнаяФорма <> Неопределено Тогда ПечатнаяФорма.ТабличныйДокумент = ПечатьКоммерческогоПредложения(МассивОбъектов, ОбъектыПечати); ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Коммерческое предложение'"); ПечатнаяФорма.ПолныйПутьКМакету = "ПФ_MXL_КоммерческоеПредложение"; КонецЕсли; КонецПроцедуры
Обратите внимание, мы не вызываем метода Показать у табличного документа, мы даже не вызываем метод “ВывестиТабличныйДокументВКоллекцию”, как можно встретить в некоторыхпримерах. Все что нам нужно – получить описание печатной формы по идентификатору, и если данная печатная форма есть в коллекции – создать для нее табличный документ.
Функции формирования табличных документов
Рассмотрим на примере получения табличного документа коммерческого предложения.
Стандартный подход при печати – предусмотреть, что печататься могут несколько объектов одновременно – например, несколько документов в списке выделили с зажатым CTRL и отправили на печать.
При этом есть несколько моментов. Первое – каждый документ выводится с нового листа. И второе – для каждого документа задается область печати. Область печати нужна для того, чтобы при сохранении печатных форм в файл или при отправке по электронной почте они разделились на отдельные нужные файлы.
Функция ПечатьКоммерческогоПредложения(МассивОбъектов, ОбъектыПечати) ТабличныйДокумент = Новый ТабличныйДокумент; ТабличныйДокумент.КлючПараметровПечати = "ПараметрыПечати_КоммерческоеПредложение"; Макет = ПолучитьМакет("ПФ_MXL_КоммерческоеПредложение"); ДанныеДокументов = ПолучитьДанныеДокументов(МассивОбъектов); ПервыйДокумент = Истина; Пока ДанныеДокументов.Следующий() Цикл Если Не ПервыйДокумент Тогда ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц(); КонецЕсли; ПервыйДокумент = Ложь; НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1; ВывестиКоммерческоеПредложение(ДанныеДокументов, ТабличныйДокумент, Макет); УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ДанныеДокументов.Ссылка); КонецЦикла; Возврат ТабличныйДокумент; КонецФункции
Еще один нюанс – как правило данные для печати получаются отдельной функцией, и могут быть представлены чаще всего в виде таблицы, выборки или структуры. Достаточно стандартный подход, когда данные получаются в виде выборки, а исходный запрос выглядит например так:
Функция ПолучитьДанныеДокументов(МассивОбъектов) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗаказПокупателя.Ссылка КАК Ссылка, | ЗаказПокупателя.Номер КАК Номер, | ЗаказПокупателя.Дата КАК Дата, | ЗаказПокупателя.Организация КАК Организация, | ЗаказПокупателя.Контрагент КАК Контрагент, | ЗаказПокупателя.Договор КАК Договор, | ЗаказПокупателя.СуммаДокумента КАК СуммаДокумента, | ЗаказПокупателя.Ответственный КАК Ответственный, | ЗаказПокупателя.Товары.( | Ссылка КАК Ссылка, | НомерСтроки КАК НомерСтроки, | Номенклатура КАК Номенклатура, | Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения, | Количество КАК Количество, | Цена КАК Цена, | Сумма КАК Сумма | ) КАК Товары, | ЗаказПокупателя.Услуги.( | Ссылка КАК Ссылка, | НомерСтроки КАК НомерСтроки, | Номенклатура КАК Номенклатура, | Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения, | Количество КАК Количество, | Цена КАК Цена, | Сумма КАК Сумма | ) КАК Услуги |ИЗ | Документ.ЗаказПокупателя КАК ЗаказПокупателя |ГДЕ | ЗаказПокупателя.Ссылка В(&МассивОбъектов)"; Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов); Возврат Запрос.Выполнить().Выбрать(); КонецФункции
Чаще всего логика вывода областей в табличный документ также выносится в отдельный метод, чтобы при необходимости доработок изменения вносились в небольшие изолированные методы, а не в один большой кусок кода. Так, в нашем примере вывод областей вынесен в процедуру “ВывестиКоммерческоеПредложение”. В целях упрощения рассмотрим самый простой вариант печати с одной областью.
Процедура ВывестиКоммерческоеПредложение(ДанныеДокументов, ТабличныйДокумент, Макет) ОбластьТекстПисьма = Макет.ПолучитьОбласть("КоммерческоеПредложение"); ДанныеПечати = Новый Структура; ДанныеПечати.Вставить("Организация", ДанныеДокументов.Организация); ДанныеПечати.Вставить("Контрагент", ДанныеДокументов.Контрагент); ОбластьТекстПисьма.Параметры.Заполнить(ДанныеПечати); ТабличныйДокумент.Вывести(ОбластьТекстПисьма); КонецПроцедуры
Как подключить внешнюю печатную форму в 1С?
Рассмотренный способ создания внешних печатных форм позволяет подключать их через справочник “Дополнительные отчеты и обработки”. Массив ПараметрыРегистрации.Назначение указывает БСП, к каким документам подключить печатную форму. В нашем примере это документ Заказ покупателя.
На закладке Команды печати будут размещены те команды, что мы описали в методе СведенияОВнешнейОбработке в таблице команд, Размещение будет браться из массива Назначение, а на закладке Дополнительная информация будут представлены данные из свойств Вид, Версия и Информация.