1с пример внешней печатной формы. Добавление внешней печатной формы в базу. Что такое «макет»

Жизнь идет, меняется законодательство, разработчик выпускает обновления конфигураций и перед нами снова выбор: установить обновление самому или опять звонить программисту, чтобы «поставил новый релиз»…

Давайте познакомимся с механизмом изменения печатных форм в без изменения конфигурации.


В практике каждого бухгалтера, использующего 1С, когда-либо возникала необходимость доработки конфигурации под себя: кто корректировал точность цены или суммы в приходной накладной, кто вставлял логотип и корректировал внешний вид расходной накладной. Все бы хорошо, но изменений таких со временем набирается великое множество и когда наступает момент обновления релиза, возникает дилемма: либо терять все внесенные изменения, либо звать программиста, чтобы тот перенес все изменения в новый релиз (естественно за дополнительную плату). Как же быть? Чтобы как-то упростить обновление конфигураций, разработчики создали новый механизм: «Внешние обработки, печатные формы, обработки по заполнению табличных частей». Сегодня мы рассмотрим только часть этого механизма – печатные формы.


Любой предмет лучше изучается на примере. Поставим себе следующую задачу: добавить в конфигурацию возможность печатать расходную накладную (документ «Реализация товаров и услуг» ) с логотипом нашей компании. Кроме этого нужно, чтобы в шапке документа надписи «поставщик» и «покупатель» были выделены жирным и напоследок нужно, чтобы внизу документа было место для подписи службы безопасности, разрешившей отгрузку.


Введем два дополнительных условия:

  • Новая печатная форма должна заменить собой прежнюю форму «Накладная»
  • Нельзя изменять конфигурацию, так как мы хотим в дальнейшем пользоваться автообновлением конфигурации

Ну что, какова задача? Кажется слишком сложной? Ну что ж, чем она сложнее, тем интереснее, и тем больше ее хочется решить. Тогда за работу.


Запускаем нашу базу в режиме Конфигуратора. Открываем конфигурацию, выбрав в главном меню команду «Конфигурация > Открыть конфигурацию» . Саму конфигурацию мы изменять ни в коем случае не будем. Мы будем ее использовать как прототип. Основную работу мы будем проводить тут, но редактировать будем внешние обработки. Создаем внешнюю обработку командой в главном меню «Файл > Новый» . Выбираем вид документа «Внешняя обработка» . Для первой обработки зададим имя «ФирменнаяНакладная»


Важно! Имя обработки не должно содержать пробелов, так как же, как и имена переменных.


Теперь немножко займемся «плагиатом» . Скопируем макет «Накладная» из документа «РеализацияТоваровУслуг» . Для этого найдем его в ветке «Документы» дерева конфигурации. Раскроем эту ветку щелчком мыши на значке «+» и найдем нужный нам макет «Накладная» (он находится в ветке «Макеты» ). Для того чтобы, скопировать этот объект, нужно, выбрав этот макет в дереве, выполнить команду «Правка > Копировать» (то же самое действие происходит по комбинации CTRL+C ). Теперь перейдем в созданную нами обработку, выберем в дереве метку «Макеты» и в главном меню выберем пункт – «Правка > Вставить» (CTRL+V) . Результат должен выглядеть как на рисунке 1.


Теперь двойным щелчком мыши откроем макет.

Что такое «макет»

Скажем несколько слов о назначении макета.

Макет – место хранения «строительных блоков» , областей, из которых, как из кирпичиков, строится табличный документ, который мы привыкли называть печатной формой. Области задаются с помощью горизонтальных и вертикальных секций или их пересечений. В нашем макете имеются только горизонтальные секции: «Заголовок», «Поставщик», «Покупатель», «ШапкаТаблицы», «Строка» (см. рис. 2) . Область – набор ячеек. Как и в MS Excel, ячейки можно объединить, изменить цвет текста и фона, шрифт и так далее. Все настройки ячейки можно просмотреть и изменить в окне свойств ячейки. Вызвать окно настройки можно, щелкнув правой кнопкой мыши на ячейке и выбрав пункт контектстного меню «Свойства» (тот же результат достигается сочетанием клавиш Alt+Enter ).


Ячейка может содержать значение одного из трех видов:

  1. текст – значение такого вида будет выведено на печать в том же виде;
  2. параметр – ячейка такого вида содержит имя переменной, значение которой будет выведено на печать.
  3. шаблон – ячейки такого вида являются комбинацией первого и второго варианта. Ячейка может содержать текст и переменные. Чтобы программа могла отличить текст от переменной, переменные нужно заключать в квадратные скобки: «Сегодня [Дата]» .

Важно! Значение ячеек второго и третьего вида табличный редактор отображает в треугольных скобках. На рисунке 2 ячейка с текстом «Покупатель» - имеет вид текст, а правее ячейки «ПредставлениеПокупателя» - параметр.

Зачем я все это рассказываю? Теперь вы знаете, в каких ячейках можно легко поменять содержимое, и в каких нежелательно что-то менять, так как нужно будет вносить изменения в алгоритм вывода на печать.

Вернемся теперь к нашей задаче. Мы создали обработку, скопировали макет и готовы его доработать под себя. Для начала внимательно его рассмотрим.

Что есть в макете для печати

Структура макета у всех документов очень похожа. Внимательно исследовав один документ, мы сможем разобраться и с другими. Первая секция «Заголовок» . При выводе этой секции будет сформирован заголовок документа, состоящий из вида, даты и номера документа. За ней следуют секции «Поставщик» и «Покупатель» , в которые программа выведет информацию о поставщике и покупателе соответственно. Далее более интересная секция «ДопИнформация» , которую разработчики используют для вывода прочей информации по документу, например, информацию о договоре с его номером и датой. Особенностью этой секции является то, что она может быть выведена много раз, и каждый раз может содержать разную информацию. Что именно и когда выводить, описано в алгоритме вывода на печать.

На этом шапка документа завершена. За шапкой следует обычно табличная часть. Интересно, что в макете описаны два варианта отображения табличной части: «ШапкаТаблицы» , «Строка» и «ШапкаТаблицыМест» и «СтрокаМест» . В зависимости от того, заполнена или нет у вас колонка «Мест» в документе, будет использоваться первый или второй вариант вывода табличной части документа. Любопытный читатель наверняка уже задался вопросом: почему в секции вывода шапки «Цена» и «Сумма» взяты в треугольные скобки, как будто это переменные? Так и есть, – это переменные, в которых в зависимости от настроек документа будет выведена надпись «Цена» , «Цена с НДС» или «Цена без НДС» и аналогично для суммы.

Ну а ниже в макете находятся секции, с помощью которых выводятся итоги документа и подписи.

Редактируем макет

Логотип было бы неплохо разместить над информацией о поставщике и покупателе. Предлагаю отредактировать область макета «Заголовок» . Нужно уменьшить размеры ячейки с содержимым «ТекстЗаголовка» . Это ячейка состоит из нескольких объединенных ячеек. Размер изменяем следующим образом:

  1. Предусмотрительно скопируем содержимое объединенной ячейки «ТекстЗаголовка» (для этого ячейку нужно выделить и воспользоваться командой «Правка > Копировать» или сочетанием клавиш CTRL+C )
  2. Выделив эту ячейку, выбираем в главном меню пункт «Таблица - Объединить» , что приведет к обратному действию – объединенная ячейка будет разбита на множество исходных ячеек
  3. Теперь выберем меньшее количество ячеек, – вместо ячейки 2 столбца начнем объединение с 6 столбца, завершив его на столбце 32, – и снова нажмем на кнопку «Объединить»
  4. Командой «Правка > Вставить» (CTRL+V) вставим в новую объединенную ячейку содержимое прежней объединенной ячейки
  5. Освободившиеся ячейки в колонках 2 – 5 попросту очистим (выделим и нажмем клавишу Delete)

Теперь на освободившееся место можно вставить картинку с логотипом. Для этого в меню выберем пункт «Таблица > Рисунки > Картинка…» . Найдем на диске файл с нашим логотипом и нажмем «ОК ». Теперь переместим картинку на освободившееся место. В результате должно получиться как на рисунке 3.


Теперь выделим полужирным шрифтом значение в ячейках «Поставщик» и «Покупатель» (рис. 4). Для этого в свойствах ячейки найдем параметр «Шрифт» и зададим полужирное начертание.



И напоследок осталось добавить подпись службы безопасности. Эту информацию будем размещать в секции «Подписи» . Чтобы получить место для подписей нужно раздвинуть секцию. Выделим строку 37, нажмем на ней правой кнопкой мыши и выберем «Раздвинуть» , и так два раза. В одной из добавленных строк разместим место для подписи службы безопасности. В результате все должно получиться как на рисунке 5.



Важно! В типовой конфигурации используются два языка: русский и украинский. Макет хранит представление текста на обоих языках (оформление ячейки - общее). Для того чтобы внести украинский вариант добавленной нами надписи, необходимо зайти в свойства ячейки и в поле «Текст» нажать на кнопочку «поиск» . Откроется окно для внесения представления текста на разных языках (рис. 6).

Как обеспечить вывод на печать

Итак, макет готов. Теперь в самый раз заняться алгоритмом его вывода на печать.

Для того чтобы мы смогли этот макет безболезненно встроить в конфигурацию и использовать, обработка, которую мы создали, должна удовлетворять следующим условиям:

  1. Нужно создать реквизит в обработке «СсылкаНаОбъект» с типом «ЛюбаяСсылка»
  2. Нужно создать в модуле обработки процедуру «Печать() Экспорт» без параметров и обязательно указать ключевое слово "Экспорт "

Первый пункт нужен для того чтобы алгоритм печати знал откуда брать данные для печати, а второй – собственно сам алгоритм печати. Давайте выполним эти условия.

На панели окон выбираем окно редактирования нашей обработки (на рисунке 7). Откроется окно с деревом объектов нашей обработки. Выбираем ветку «Реквизиты» и нажимаем кнопку «Добавить» ,. Откроется окно свойств реквизита. Внесем имя – «СсылкаНаОбъект» и укажем тип «ЛюбаяСсылка» . Теперь мы можем переходить к тексту модуля печати. Писать мы ее с нуля не будем, вместо этого скопируем ее из документа «РеализацияТоваровУслуг» .



Для этого находим в дереве конфигурации среди документов «РеализацияТоваровУслуг» , щелкаем на нем правой кнопкой мыши и выбираем «Открыть модуль объекта» (см. рисунок 8).



После этого откроется модуль документа. Нам нужна первая функция «ПечатьДокумента» . Ее текст необходимо выделить и скопировать. Очень удобно выделять текст функции, когда он свернут, но нужно обязательно выделять и строчку под ней, иначе рискуем скопировать только заголовок.

См. на рисунке 9, мы выделили заголовок и строку под ней. После этого копируем в буфер. Главное меню «Правка > копировать» (или CTRL+C) .



Запомнили текст в буфере обмена, теперь снова переходим к нашей обработке «ФирменнаяНакладная» . Нажимаем на кнопку «Действия > Открыть модуль объекта» (рис. 10).



Вставляем скопированный текст: «Правка > Вставить» (или CTRL+V) .

Теперь необходимо слегка подрихтовать скопированный текст, так как он писался для печати документа из самого документа, а мы собираемся из внешней обработки. Для этого нужно:

  1. Переименовать функцию в «Печать»
  2. Заменить «ЭтотОбъект» на «СсылкаНаОбъект»
  3. Заменить «ЭтотОбъект» на «СсылкаНаОбъект»
  4. Заменить «БанковскийСчетОрганизации» на «СсылкаНаОбъект.БанковскийСчетОрганизации»
  5. Заменить «Товары.Итог» на «СсылкаНаОбъект.Товары.Итог»

Для этих действий можно воспользоваться пунктом главного меню «Правка > Замена» .

После этого нужно обязательно проверить на синтаксис. Для этого есть магическая комбинация CTRL+F7. В результате должно появиться сообщение: «Синтаксических ошибок не обнаружено!»

Ну что ж, на этом мы завершили все черную работу. Теперь можем сохранять результаты своих трудов в файле, например «ФирменнаяНакладная.epf» . Для этого нужно сделать активным окно этой обработки и сохранить ее, воспользовавшись главным меню программы «Файл > Сохранить как…» . Имя файла с обработкой – «ФирменнаяНакладная.epf» (оно будет предложено по умолчанию). Сохранить его можно временно на рабочий стол, чтобы потом быстрее найти.

Важно! Как вы видели, никаких изменений внутри нашей конфигурации мы не производили. Для всех вышеописанных действий даже не нужно снимать ее с поддержки (то есть включать возможность изменения).

Подключаем внешнюю обработку к конфигурации

Теперь можно подключить обработку к нашей расходной накладной. Для этого запускаем в режиме . Заходим в меню «Сервис» , где находятся три пункта, относящиеся к механизму «Внешние обработки, печатные формы, обработки по заполнению табличных частей» . В нашем случае нам только нужен пункт «Внешние печатные формы» (см. рис.11).



При этом откроется справочник «Внешние обработки» , с отбором по виду «печатные формы» . Он будет хранить перечень всех внешних печатных форм с оказанием для каких они документов и в каких случаях их нужно показывать.



Важно! Сами обработки будут храниться именно в базе данных наравне с другими данными, то есть после сохранения обработки внутри базы, внешний файл нам будет не нужен.

Нам нужно создать новый элемент в справочнике. Нажимаем Insert . Теперь рассмотрим содержимое элемента. В наименовании вносим осмысленное краткое описание сути этой формы, например, «Фирменная накладная» . Как у любого другого справочника, тоже есть код. Оставим по умолчанию. Реквизит вид заполнен по умолчанию и редактированию не подлежит – «Печатная форма» . И последний реквизит шапки элемент – комментарий. Тут как обычно более детально о назначении печатной формы. Кроме шапки у элементов этого справочника есть две закладки. На второй расположена информация об ограничение прав доступа к этой обработке. Эта тема выходит за рамки этой статьи (об этой и других настройках прав доступа в без доработки конфигурации мы расскажем в одном из ближайших номеров).

А на первой закладке остановимся подробнее.

Закладка содержит четыре колонки. Представление объекта – тип документа, для которого мы хотели бы использовать нашу печатную форму,

Отбор – условие, при выполнении которого должна быть доступна эта печатная форма. Например, мы переработали печатную форму расходной накладной и перевели ее на английский язык. И хотим, чтобы для клиентов из папки «Европейские» вместо стандартной печатной формы «Расходная накладная» печаталась новая форма, на английском языке. Для этого можно воспользоваться колонкой «Отбор» . Пример такого отбора на рисунке 13.



Но в нашем задании никаких отборов не нужно.

Файл печатной формы – указывается файл, из которого брать макет и процедуру печати. В эту ячейку нужно выбрать сохраненный нами на рабочем столе файл.

Заменяемая печатная форма – в случае если мы хотим, чтобы созданная нами печатная форма заменила одну из стандартных для этого документа, то нужно указать, какую нужно заменять. В случае есть ничего не выбрать – появится дополнительная печатная форма.

В нашем случае нам нужно чтобы «ФирменнаяНакладная» печаталась вместо обычной расходной накладной. Для этого нужно выбрать в этом поле «Расходная накладная» .

Все теперь сохраняем этот элемент. И открываем любую расходную накладную.

Должно получиться так, как показано на рисунке 14.



Ну что ж, на этом задача, которую мы перед собой ставили в начале статьи, выполнена. Полагаем, нам удалось проиллюстрировать возможности, которые открывает перед пользователем использование механизма внешних обработок.

Для закрепления навыков можете попробовать самостоятельно добавить в конфигурацию дополнительную печатную форму «На склад» для документа «Поступление товаров и услуг», которая повторяла бы обычную накладную, но без цен и сумм, а также содержала бы поля для внесения принятого количества.

Рассмотрим написание простейшей печатной формы в 1с 8.1 — 8.2 на примере конфигурации Бухгалтерия предприятия 2.0 . Допустим требуется написать внешнюю печатную форму к документу : вывести основные данные документа, а так же из табличной части Товары : номенклатуру, цену, количество и сумму.

Скачать получившийся пример можно по .

В конфигураторе 1C Предприятия 8 создаем внешнюю обработку (Файл->Новый->Внешняя обработка ), задаем имя, создаем обязательный для внешней печатной формы реквизит СсылкаНаОбъект с типом ДокументСсылка.РеализацияТоваровУслуг .

Создание макета печатной формы

Добавляем новый макет , тип макета оставляем Табличный документ . На макете создаем три области: Шапка, Данные и Подвал . Сделать это можно выделив нужное количество строк и нажав меню Таблица->Имена->Назначить имя (Ctrl+Shift+N) .

После этого начинаем располагать в областях текст и параметры. В шапку выведем название печатной формы, номер документа и организацию , а также нарисуем границы шапки таблицы и напишем имена колонок. При создании параметра в свойствах ячейки, на закладке макет следует установить свойство Заполнение в значение Параметр .

В области Данные создадим параметры для вывода строк табличной части(Номенклатура, цена и т.д.), а в области Подвал для итогов по количеству и сумме.

Программирование

Зайдем в модуль объекта печатной формы Действия->Открыть модуль объекта .

Создадим там обязательную для печатных форм экспортную функцию Печать() .

Функция Печать() Экспорт КонецФункции

В функции создадим переменную для табличного документа , в который будет выводится печатная форма, получим макет и области макета .

ТабДок = новый ТабличныйДокумент; Макет = ПолучитьМакет("Макет" ); ОбластьШапки = Макет.ПолучитьОбласть("Шапка" ); ОбластьДанные = Макет.ПолучитьОбласть("Данные" ); ОбластьПодвал = Макет.ПолучитьОбласть("Подвал" );

Заполним параметры шапки и выведем ее в табличный документ .

ОбластьШапки.Параметры.ТекстЗаголовка = +СсылкаНаОбъект.Номер; ОбластьШапки.Параметры.Организация = СсылкаНаОбъект.Организация; ТабДок.Вывести(ОбластьШапки);

Для того чтобы получить строки табличной части Товары используем запрос.

Запрос = новый запрос; Запрос.УстановитьПараметр("Ссылка" ,СсылкаНаОбъект); Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровУслугТовары.Номенклатура, | РеализацияТоваровУслугТовары.Сумма, | РеализацияТоваровУслугТовары.Цена, | РеализацияТоваровУслугТовары.Количество |ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары |ГДЕ | РеализацияТоваровУслугТовары.Ссылка = &Ссылка" ;

В параметр запроса передаем реквизит СсылкаНаОбъект , что бы указать в условии ГДЕ , что нам нужны данные только того документа из которого выводим печатную форму. Чтобы получить выборку запроса, сначала выполняем его, а затем выбираем строки.

Выборка = Запрос.Выполнить().Выбрать();

Далее в цикле заполняем параметры области Данные для каждой строки выборки документа и выводим их в табличный документ . Также в цикле считаем итоговые значения количества и суммы . Заполнять каждый параметр в отдельности мы не будем, а используем процедуру ЗаполнитьЗначенияСвойств((<Приемник>, <Источник>) из глобального контекста , она копирует значения свойств <Источника> в свойства <Приемника> . Сопоставление производится по именам свойств. Подробнее об этом можно прочитать в синтаксис-помощнике 1С Предприятия 8 .

ИтогоСумма = 0 ; ИтогоКоличество = 0 ; Пока Выборка.Следующий() Цикл ЗаполнитьЗначенияСвойств(ОбластьДанные.Параметры,Выборка); ИтогоСумма = ИтогоСумма + Выборка.Сумма; ИтогоКоличество = ИтогоКоличество + Выборка.Количество; ТабДок.Вывести(ОбластьДанные); КонецЦикла ;

Заполним и выведем область Подвал .

ОбластьПодвал.Параметры.ИтогоКоличество = ИтогоКоличество; ОбластьПодвал.Параметры.ИтогоСумма = ИтогоСумма; ТабДок.Вывести(ОбластьПодвал);

Возвращаем заполненный табличный документ из функции Печать() .

возврат ТабДок;

Если вы используете одну из типовых конфигураций, то после возврата табличного документа само выведет на экран печатную форму. Так же для вывода можно использовать метод табличного документа Показать() .

5. Подключение печатной формы к документу

В типовых конфигурациях 1С 8 для регистрации внешних печатных форм существует справочник ВнешниеОбработки . Для подключения следует в режиме предприятия зайти в меню Сервис->Дополнительные отчеты и обработки->Дополнительные внешние печатные формы .

Добавляем новый элемент справочника, загружаем печатную форму с диска и выбираем тип документа.

Теперь в документе Реализация товаров и услуг появится новая печатная форма.

Авторегистрация печатной формы

Для того чтобы при подключении печатной формы не нужно было выбирать тип документа вручную можно настроить авторегистрацию . Для этого добавляем новый макет и называем его Параметры_Авторегистрации (только так) и в первой его ячейке пишем Документы.<Наименование документа> (либо Справочники.<Наименование справочника> ).

Теперь при подключении печатной формы нам будет предложено воспользоваться параметрами авторегистрации .

Итак! Есть конфигурация (например "Управление торговлей", редакция 10.3), и для нее необходимо разработать внешнюю печатную форму. Для примера возьмем типовой документ "Счет на оплату покупателю" (хотя внешние печатные формы можно создавать не только для документов, но и для справочников).

Пример для 1С 8.3 (Управляемые формы)

Пример разработки внешней печатной формы для управляемого приложения можно посмотреть .

Задача

Разработать внешнюю печатную форму, которая будет доступна из документа "Счет на оплату покупателю", и которая будет содержать наименование организации, контрагента и перечень товаров с ценой, суммой и количеством.

Поехали!

Первое что нужно сделать, это создать файл внешней обработки. Обработка должна содержать три основных момента:
  1. Реквизит "СсылкаНаОбъект" с типом "ДокументСсылка.СчетНаОплатуПокупателю"
  2. Макет, который будет выводиться на печать
  3. Экспортную Функцию "Печать()" которая возвращает табличный документ
Эти действия видны на рисунке №1

"Рисуем макет"

Наш макет будет содержать две области:
  1. Заголовок (шапка) документа (в этой области будут размещены наименования организации и контрагента), и шапка таблицы (с наименованием колонок)
  2. Таблица с товарами (колонки, с наименование количество и суммой)
На рисунке №2 показан макет внешней печатной формы. Обратите внимание на то, что ячейки таблицы и шапки содержат параметры, а не просто текст.

Функция "Печать()"

Вот форма почти и готова. Осталось написать программное заполнение полей табличного документа. Эти действия выполняются в модуле объекта обработки, в функции под название "Печать", которая ОБЯЗАТЕЛЬНО должны быть экспортной.
Этап №1. Получение данных для шапки, заполнение параметров шапки, и ее вывод в табличный документ ТабличныйДокумент = Новый ТабличныйДокумент; Макет = ПолучитьМакет("НашМакет"); ЗапросДанных = Новый Запрос("ВЫБРАТЬ | ПРЕДСТАВЛЕНИЕ(СчетНаОплатуПокупателю.Контрагент) КАК Контрагент, | ПРЕДСТАВЛЕНИЕ(СчетНаОплатуПокупателю.Организация) КАК Организация |ИЗ | Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю |ГДЕ | СчетНаОплатуПокупателю.Ссылка = &Ссылка"); ЗапросДанных.УстановитьПараметр("Ссылка", СсылкаНаОбъект); Шапка = ЗапросДанных.Выполнить().Выбрать(); Шапка.Следующий(); Область = Макет.ПолучитьОбласть("Шапка"); Область.Параметры.Заполнить(Шапка); ТабличныйДокумент.Вывести(Область); Этап №2. Получение данных табличной части, и построчный вывод товаров
ЗапросДанных.Текст = "ВЫБРАТЬ | _Товары.НомерСтроки, | ПРЕДСТАВЛЕНИЕ(_Товары.Номенклатура) КАК Номенклатура, | _Товары.Количество, | _Товары.Цена, | _Товары.Сумма |ИЗ | Документ.СчетНаОплатуПокупателю.Товары КАК _Товары |ГДЕ | _Товары.Ссылка = &Ссылка"; Выборка = ЗапросДанных.Выполнить().Выбрать(); Область = Макет.ПолучитьОбласть("Данные"); Пока Выборка.Следующий() Цикл Область.Параметры.Заполнить(Выборка); ТабличныйДокумент.Вывести(Область); КонецЦикла; Этап №3. Возврат табличного документа и функции печать Возврат ТабличныйДокумент;

Добавляем нашу внешнюю печатную форму в 1С

Заходим в меню "Сервис - Внешние печатные формы и обработки - Внешние печатные формы"

В открывшемся окне создания элемента, выполняем следующие действия:

  1. Загружаем файл внешней обработки
  2. Указываем для какого документа (или справочника) конфигурации, предназначена печатная форма
  3. Записываем изменения

Печатаем!

Открываем любой документ "Счет на оплату покупателю" (с заполненной табличной частью "Товары", потому что именно оттуда мы берем данные для заполнения), нажимаем кнопку "Печать", в открывшемся окне, выбираем НАШУ печатную форму, и нажимаем "Печать"


ВНИМАНИЕ! Такой алгоритм разработки подходит ТОЛЬКО для "Обычного приложения". Печатные формы для конфигураций в режиме "Управляемое приложение" отличаются!

Файл печатной форме которая показана в примере можно

Добрый день.

Сегодня хочу рассказать Вам как создавать внешние печатные формы для конфигурации "Зарплата и Управление Персоналом 3.0". Как известно в ЗУП 3.0 использована библиотека стандратных подсистем, а значит струтура обработки выглядит совсем по другому. Когда мне в первый раз пришлось делать печатную форму для БСП в управляемых формах (тогда это была УТ 11), первым делом я полез на диск ИТС с целью найти там подробную документацию, о том какие экспортные процедуры, с какими параметрами должны быть в обрабтке и как оно все работает. Тут ИТС меня немного разочаровал, т.к. там все рассказано, о том, как процедуры должны выглядеть в модуле документа, а во внешней печатной форме параметры процедуры "печать" переставлены местами, поэтому пришлось искать информацию в других источниках и ковырять подсистему изнутри.

Ну что же, начнем. То, что у нас получится в конце, вполне можно будет использовать как шаблон.

Шаг первый - очевидный. Создаем новую обработку. Присвоим её произвольное имя: "ОбразецПечати".

Шаг второй. Создадим макет. Поскольку у нас тестовый пример, то макет я создам самый простой, без единого параметра.

Шаг третий - самый интересный. Открываем модуль объекта и начинаем программировать. Согласно БСП при регистрации внешней обработки, она (обработка) должна сообщить, что она умеет, к каким объектам она привязана, как она называется. На вопрос, что она умеет обработка должна вернуть список команд - это таблица значений. В нашем случае обработка умеет выводить одну печатную форму, поэтому команда будет всего одна. Для формирования таблицы значений определим пару процедур, которые во всех внешних печатных формах всегда будут одинаковыми:

//процедура, которая подготавливает структуру таблицы команд

Функция ПолучитьТаблицуКоманд()

// Создадим пустую таблицу команд и колонки в ней
Команды = Новый ТаблицаЗначений;

// Как будет выглядеть описание печатной формы для пользователя
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));

// Имя нашего макета, что бы могли отличить вызванную команду в обработке печати
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));

// Тут задается, как должна вызваться команда обработки
// Возможные варианты:
// - ОткрытиеФормы - в этом случае в колонке идентификатор должно быть указано имя формы, которое должна будет открыть система
// - ВызовКлиентскогоМетода - вызвать клиентскую экспортную процедуру из модуля формы обработки
// - ВызовСерверногоМетода - вызвать серверную экспортную процедуру из модуля объекта обработки
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));

// Следующий параметр указывает, необходимо ли показывать оповещение при начале и завершению работы обработки. Не имеет смысла при открытии формы
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));

// Для печатной формы должен содержать строку ПечатьMXL
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));

Возврат Команды;

КонецФункции

//Создает в таблице команд новую строку

Функция ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда. Представление = Представление;
НоваяКоманда. Идентификатор= Идентификатор;
НоваяКоманда. Использование= Использование;
НоваяКоманда. ПоказыватьОповещение= ПоказыватьОповещение;
НоваяКоманда. Модификатор= Модификатор;
КонецФункции

Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.ПриемНаРаботу");
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //может быть - ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов...
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", " Привет мир "); //имя под которым обработка будет зарегестрирована в справочнике внешних обработок
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", ИСТИНА);
ПараметрыРегистрации.Вставить("Информация", " ОБРАЗЕЦ ");//так будет выглядеть описание печ.формы для пользователя
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, "Привет мир", "Макет", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции

Собственно в ней и придется Вам ковырять каждый раз, когда Вы создаете новую внешнюю печатную форму. Из куска кода видно, что привязывать её мы будем к документу "Прием на работу", соответсвенны Вы пишете своё. Называться печатная форма у нас будет "Привет мир", опять таки меняем на своё. Вот тут в шаблоне удобно будет написать явную билеберду, чтобы она бросалась в глаза, чтобы не забыть её исправить потом, на мой взгля "Привет мир" подходит как нельзя кстати. Версия - это для себя, пишите что хотите, она будет отображаться в форме элемента справочника внешних обработок. Слово "ОБРАЗЕЦ" - тоже видно только в форме справочника печатных форм. Далее добавляем команду, вот тут вторым параметров передается имя кнопки, это то, что увидит пользователь в документе в пункте меню "печать".

Этого набора из трех процедур достаточно, чтобы обработка добавлялась в справочник внешних обработок, весь этот запутанный код - сервисный и к алгоритму печати не имеет отношения. По сути, авторы БСП вынудили нас так сложно программировать, если раньше вы сразу приступали к написанию функции "Печать", то теперь при написании обработки с нуля, а не по образцу, Вы потратите время на сервис. Раньше параметры регистрации были не обязательными и указывались в макете обработки, теперь все выглядит намного серьезней. Первое впечатление, когда я увидел это - круто, столько возможностей, все унифицированно... а на практике всегда создаю всего одну команду в одной обаботке, и цепляю её к одному документу. Т.е. по факту мне нужно две строки для регистрации: имя объекта, название кнопки. А тут все так... ну да ладно, не мне судить.

Шаг четвертый - не менее интересный.

Функция ПЕЧАТЬ?

А вот и нет, теперь не функция, а процедура.

А как вернуть макет?

Послать его в функцию глобального модуля подсистемы печати.

Окай

Вот текст этой процедуры:

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Макет") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
"Макет", "Макет",
СформироватьТабДокумнтОбразца(МассивОбъектов, ОбъектыПечати));
КонецЕсли;
КонецПроцедуры

Теперь разяснения. В первой строке процедуры идет немного непоняное условие. Дело в том, что при вызове процедуры печати система передает нам таблицу значений, в которой указано, что нам надо напечатать. Посути функция УправлениеПечатью.НужноПечататьМакет(...) проверяет наличие в таблице значений строки в которой в колонке "ИмяВРЕГ" строки с названием макета. На практике в большинстве случаев вещь бесполезная, т.к. наша обработка будет уметь формировать только одну печатную форму. Т.е. это условие можно опустить и на работоспособность это не повлияет.

Далее УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(...) - она то как раз и добавляет табличный макет куда нужно, чтобы потом вывести его на экран. Если Вам нужно показать свой табличный документ в своем окне (не в типовом), то не вызывайте эту процедуру, а просто напишите тут свой код.

Еще хочу добавить, что процедура Печать выполняется на клиенте и при необходимости Вы можете тут открыть произвольную форму, с целью спросить дополнительную информацию у пользователя необходимую для печати.

Далее СформироватьТабДокумнтОбразца(...) - это функция, которую нам предстоит написать в модуле обработки и которая возвращает табличный документ. В 100 из 100 случаев она будет серверная, т.к. нам надо получить значение реквизитов из объектов перечисленных в параметре "МассивОбъектов".

Шаг пятый - формируем макет.

УРА, мы наконец приступим к алгоритму формирования макета, получению данных и т.д.

Но в нашем образце мы поступим прозаично и тут даже комментировать не буду)))

Функция СформироватьТабДокумнтОбразца(МассивОбъектов, ОбъектыПечати)
табДок = Новый ТабличныйДокумент;
макет = ПолучитьМакет("Макет");

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
табДок.Вывести(областьШапка);

Возврат табДок;
КонецФункции

Вот собственно и все, спасибо за внимание




Top