1с принадлежность печатной формы нет справочника
Когда мне пришлось создавать внешние печатные формы под приложения на БСП ("1С: Бухгалтерия предприятия 3.0", "1С: Управление торговлей 11"), я обнаружил, что нет грамотных инструкций. Те, что имелись, использовали так называемые шаблоны: готовые обработки, в которых необходимо выполнять определенные корректировки. Но как создать сам шаблон, конкретных мануалов не было, справочную информацию я нашел на сайте ИТС и, обработав ее, написал статью, где подробно и понятно объясняются все этапы создания внешней печатной формы для управляемого приложения на примере конфигурации "1С: Бухгалтерия предприятия 3.0"
UPD Статья и обработки к ней обновлены на февраль 2019 года
UPD 25.03.2019 Добавлены примеры внешних печатных форм для УТ 11.4
В этой статье мы научимся создавать внешнюю печатную форму для "1С: Бухгалтерия предприятия 3.0". Причем создавать с нуля, не используя так называемые шаблоны. Вы сами научитесь создавать шаблоны внешних печатных форм.
Все это делается довольно просто))
И так, создадим новую обработку.
Мы будем создавать внешний счет на оплату покупателю, поэтому обработку так и назовем: «СчетНаОплатуВнешний».
Сохраним ее на жесткий диск.
Зайдем в модуль обработки, и создадим экспортную функцию СведенияОВнешнейОбработке.
Внутри этой функции создадим структуру ПараметрыРегистрации, которая будет содержать определенный список полей. Каждое поле мы разберем в отдельности.
Создадим первый элемент структуры, он будет иметь ключ с название «Вид».
Значением данной связки КлючИЗначение идет одна из строк:
В нашем случае должна быть строка "ПечатнаяФорма".
Следующий элемент структуры должен иметь ключ с названием Назначение.
В качестве значения данного элемента должен выступать массив, где перечислены будут все документы или справочники, в которых будет выходить данная печатная форма.
Они должны иметь тип строка, и быть в следующем формате:
Документ."НазваниеДокумента"
Справочник."НазваниеСправочника"
У нас этот массив будет возвращать отдельная функция ПолучитьНазначениеОбработки.
Допишем созданный последним элемент структуры.
Создадим новый элемент структуры, ключ которого будет называться «Наименование», а в значении будет содержаться наименование обработки, которое будет отображаться в справочнике "Дополнительные внешние печатные формы".
Следующий элемент структуры будет иметь название «Версия», значением данного элемента будет версия обработки. Задается программистом на его усмотрение.
Следующий элемент имеет название «Информация», который содержит краткую информацию по обработке.
Следующий элемент имеет название «БезопасныйРежим», его необходим устанавливать в значение истина или ложь, в зависимости от того необходимо устанавливать или отключать безопасный режим во время выполнения обработки. Мы установим значение Истина.
И в последнем параметре необходимо добавить команды, которые будут поставляться обработкой. Для этого нам необходимо создать и заполнить таблицу команд. Разработаем функцию, которая создает и возвращает таблицу с определенным набором полей. Делать это будем в функции ПолучитьТаблицуКоманд.
Создадим функцию и таблицу значений внутри нее.
Теперь создадим пять колонок этой таблицы.
И первая колонка – Представление (тип строка).
Эта колонка – представление команды в пользовательском интерфейсе, т.е. то, что пользователь увидит при нажатии меню"Печать" в документе или справочнике.
Вторая колонка – Идентификатор.
Это может быть любая текстовая строка, уникальная в пределах данной обработки.
Третья колонка – Использование.
Параметр данной колонки типа строка, должен принимать одно из четырех значений –
- ОткрытиеФормы – Открывает форму обработки.
- ВызовКлиентскогоМетода – будет вызвана клиентская процедура из модуля формы обработки.
- ВызовСерверногоМетода - будет вызвана серверная процедура из модуля обработки.
- СценарийВБезопасномРежиме – тоже будет вызвана серверная процедура из модуля обработки в безопасном режиме.
Конкретно мы будем использовать вызов серверного метода.
Следующая колонка – показывать оповещение. Принимает значение истина или ложь, в зависимости от того надо показывать оповещение или нет.
И последняя колонка – модификатор. Это дополнительный модификатор команды. В нашем случае будет иметь название ПечатьXML.
Теперь создадим процедуру, которая будет заполнять данную таблицу значений.
В данном коде все понятно.
В функции СведенияОВнешнейОбработке создадим команду и заполним ее.
Создаем таблицу значений:
Теперь заполним ее.
Еще раз пройдемся по параметрам.
- Первый параметр, непосредственно таблица команд вновь созданная.
- Второй параметр, как будет отображаться команда пользователю на форме (документа, справочника).
- Третий – уникальный идентификатор команды, запомните его, он нам еще пригодится!
- Четвертый параметр – использование, что вызовет Ваша команда.
- Пятый параметр – показывать оповещение, мы не будем это делать.
- Шестой параметр – модификатор, в нашем случае он всегда один ПечатьXML.
Теперь передадим вновь созданную таблицу команд в структуру ПараметрыРегистрации.
И пусть наша функция СведенияОВнешнейОбработке возвращает данную структуру.
Все теперь наша обработка будет передавать нужные параметры регистрации, которые будут необходимы при создании элемента справочника дополнительные печатные формы и обработки. Обращаю ваше внимание, что название всех полей в структуре Параметры регистрации, а также название и типы всех колонок в таблице команд, должны быть те которые приведены в примере, иначе Ваша обработка не зарегистрируется.
Теперь в модуле объекта создадим процедуру Печать. Это процедура с четырьмя параметрами: МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода.
И вот начинается самое интересное, теперь вам необходимо войти в аналогичную процедуру в менеджере объекта счет на оплату покупателю, или в обработке, которая, по сути, является менеджером печати.
Как узнать, где находится нужная нам функция?
Откроем модуль менеджера документа Счет на оплату покупателю.
И найдем процедуру ДобавитьКомандыПечати, которая заполняет список команд .
В этой процедуре найдем код, где добавляется команда для нужной нам печатной формы (список команд добавляется в таблицу значений КомандыПечати). И обратим внимание на свойство МенеджерПечати. Если этому свойству присваивается какое-нибудь значение - это путь к объекту метаданных, как правило к обработке, то значит при выводе нужной печатной формы будет отработан код в процедуре Печать, которая находится в модуле менеджере этого объекта (в обработке). А если это свойство в принципе не фигурирует при заполнении команды печати, то значит будет отработан код в процедуре Печать, которая находится в модуле менеджера нашего основного объекта (в нашем случае это документ СчетНаОплатуПокупателю)
Посмотрим на процедуру ДобавитьКомандыПечати в модуле менеджера документа "Счет на оплату покупателя".
Поскольку мы делаем внешнюю печатную форму счета на оплату, то нас интересует первое добавление в таблицу значений (см. свойство Представление), и мы видим, что в этом случае заполнено свойство МенеджерПечати, где указан объект Обработка.ПечатьСчетаНаОплату. Это значит, что нам нужно найти процедуру Печать в модуле менеджера обработки ПечатьСчетаНаОплату.
А если бы мы решили сделать внешнюю печатную форму договора счета на оплату (второе добавление в таблицу значений КомандыПечати), то нам нужно было бы найти процедуру Печать в модуле менеджера документа СчетНаОплатуПокупателя.
Откроем модуль менеджера обработки ПечатьСчетаНаОплату.
И раскроем процедуру Печать.
Нас интересует второе условие (где фигурирует строка "СчетЗаказ", см. идентификатор нужной команды в процедуре ДобавитьКомандыПечати модуля менеджера документа), скопируем это условие в процедуру Печать нашей внешней обработки.
Внимание! Копировать напрямую процедуру Печать из модуля менеджера (без разницы обработка это, документ или справочник) не следует. Поскольку у них отличается количество параметров, в последствие это приводит к ошибкам при работе.
Так же из модуля менеджера обработки скопируем процедуру СформироватьПечатнуюФорму.
В этом коде есть строка, где заполняется таблица сведений счета на оплату.
Эта таблица получается при помощи функции модуля менеджера объекта (в нашем случае это документ СчетНаОплатуПокупателю). Найдем эту функцию в модуле менеджера документа СчетНаОплатуПокупателю.
И скопируем её в модель нашей внешней обработки.
А сам код процедуры СформироватьПечатнуюФорму в модуле внешней обработки исправим, убрав все не нужное от туда.
Если мы сейчас сделаем проверку модуля внешней обработки, то выйдет две ошибки. Первая, что не определена переменная ПараметрыПечати в процедуре Печать, и, что не найдена функция ПолучитьТекстЗапросаДляФормированияТаблицыСведенийСчетаНаОплату в функции ПолучитьТаблицуСведенийСчетаНаОплату.
Создадим переменную ПараметрыПечати в процедуре Печать. Это будет простая структура.
А потом найдем функцию ПолучитьТекстЗапросаДляФормированияТаблицыСведенийСчетаНаОплату в модуле менеджера документа СчетНаОплатуПокупателю и скопируем её в модуль внешней обработки.
Должен получится следующий состав процедур и функций модуля внешней обработки (для удобства я разделил их на две области).
Еще раз делаем проверку модуля. Ошибок не обнаружено.
Продолжаем, теперь нам необходимо, что бы брался наш макет, и печатался по нашей команде.
Нас интересует процедура СформироватьПечатнуюФорму, а в ней мы уделим внимание методу ПечатьСчетаНаОплату общего модуля ПечатьТорговыхДокументов.
Очевидно, она непосредственно формирует табличный документ. Перейдем в этот общий модуль, и скопируем функцию ПечатьСчетаНаОплату в модуль нашей внешней обработки.
Делаем проверку модуля внешней обработки. Ругается на несуществующие методы ВывестиЗаголовокПредупреждение и НомерСчетаНаОплату.
Переходим в общий модуль, от куда мы взяли функцию ПечатьСчетаНаОплату, находим процедуру ВывестиЗаголовокПредупреждение , и копируем ее в модуль внешней обработки.
А функция НомерСчетаНаОплату в общем модуле ПечатьТорговыхДокументов экспортная, поэтому мы просто исправим код в процедуре ПечатьСчетаНаОплату, где используется проблемная функция, сделав вызов этой функции из вышеупомянутого общего модуля.
Проверяем еще раз ошибки. Все нормально.
Не забудем в процедуре СформироватьПечатнуюФорму убрать вызов метода ПечатьСчетаНаОплату из общего модуля.
Теперь зайдем в скопированную функцию ПечатьСчетаНаОплату, и посмотрим, где в ней подтягивается макет.
Находим данный макет в общих макетах и копируем его в макеты нашей обработки.
Исправляем выделенный код, где подтягивается макет, следующий образом.
Теперь зайдем в наш скопированный макет, и сделаем какое-нибудь изменение, чтобы вы видели, что команда подтянула именно макет из внешней обработки.
Вернемся обратно в процедуру Печать нашей внешней обработки.
И теперь осталась одна небольшая хитрость, без которой ваш внешний отчет не будет работать. Необходимо текст "СчетЗаказ" (это идентификатор типовой печатной формы).
Заменить на название идентификатора команды ("СчетНаОплатуВнешний").
Все, сохраняем данную обработку. И запускаем "1С: Предприятие" из конфигуратора.
Идем в администрирование. В дополнительные отчеты и обработки.
Нажимаем на кнопку "Добавить из файла" и выбираем нашу созданную обработку.
Все не раз видели, как в типовых конфигурациях, построенных на основе БСП (Библиотека стандартных подсистем), печатные формы, построенные на основе Табличного документа, выводятся в специальную форму "ПечатьДокументов". Эта форма входит в состав подсистемы "Печать" из БСП. При разработке своих печатных форм, иногда необходимо запросить у пользователя дополнительные данные необходимые для печати. Тут встает вопрос, как в этом случае вывести печатную форму в форму "Печать документа". В этой статье я рассмотрю, как реализовать вывод печатной формы в упомянутую форму из подсистемы "Печать", в случае если мы хотим перед выводом печатной формы запросить у пользователя дополнительные данные. Здесь будут рассмотрены два случая: когда реализуется печатная форма с использованием подсистемы "Дополнительные отчеты и обработки" и когда печатная форма добавляется в конфигурацию в режиме конфигуратора, т.е. вносятся изменения в типовую конфигурацию.
Форма "ПечатьДокументов" предоставляет некоторые дополнительные функции при работе с печатными формами, такие как:
- кнопка печати на принтер, непосредственно в форме;
- указание количества копий, печатной формы;
- редактирование сформированной печатной формы;
- возможность сохранения печатной формы в различные форматы данных(Excel, Word, PDF и др.);
- отправка печатной формы по электронной почте;
- удобная работа с комплектом документов.
Эта форма сейчас используется фирмой 1С во всех типовых конфигурациях для вывода печатных форм документов и элементов справочников. И конечно же нам, при разработке своих печатных форм, чтобы не выходить за рамки принятой практики, следует так же выводить свои печатные формы используя предоставляемые инструменты.
При использовании стандартных методов добавления печатных форм подсистема "Печать" все сделает за нас и выведет печатную форму, как надо. Например:
- При добавлении команды печати в документ с использованием подсистемы "Печать", нам необходимо в процедуре ДобавитьКомандыПечати описать команду печати с указанием менеджера печати, в котором реализована прцоедура Печать;
- При создании Дополнительной обработки, нам необходимо, в модуле объекта обработки в функции СведенияОВнешнейОбработке, описать команду с типом использования Вызов серверного метода и тут же реализовать процедуру Печать, которая определенным образом реализует вызов формирования печатной формы.
В подобных случаях, как я уже сказал, подсистема печать выведет сформированную нами печатную форму сама, как нужно. Подобные способы подразумевают непосредственное формирование печатной формы, т.е. передали объекты для печати в процедуру печать, сформировали табличный документ и вывели на экран.
А что если перед началом формирования табличного документа, необходимо запросить у пользователя какие-то данные? Т.е. нам необходимо показать форму. В этом случае стандартный порядок формирвоания печатной формы нарушается и нам надо думать, как же передать нашу печатную форму в форму "ПечатьДокументов".
- Когда печатная форма создается с изменение конфигурации;
- Когда печатная форма создается без изменения конфигурации, т.е. используетя подсистема "Дополнительные отчеты и обработки".
Создаем печатную форму добавляя её через конфигуратор.
Первый вариат. Через создание обработки с командой.
Этот вариант предусматривает, добавление обработки непосредственно в Объекты метаданных:
Рассмотрим вариант, когда нам необходимо реализовать печатную форму определенного объекта, например, элемента справочника. Для этого нам необходимо поработать в четырех местах обработки:
- Создать команду, которая будет вызывать форму нашей печатной формы;
- Создать саму форму;
- Создать макет печатной формы;
- Внести изменения в модуль менеджера обработки.
- Группу где хотим, чтобы команда отображалась в форме;
- Тип параметра, это как раз тот справочник или документ, печатную форму которого мы делаем;
- Режим использования параметра - Множественный. Чтобы можно было выводить печатных формы, сразу по нескольким выбранным в списке элементам.
В модуле команды открываем форму обработки передавая её выбранные элементы справочника, для которых необходимо сформировать печатные формы. Не будем тут мудровствовать лукаво и слегка подправим типовой код, который подставляется платформой в процедуру обрабокти команды:
Добавим в обработку форму, создадим реквизит формы типа СписокЗначений и необходые для нас реквизиты для ввода дополнительных параметров для печатной формы:
Мой пример, будет чисто демонстрационный, поэтому условно определимся, что моя цель вывести в печатную строку представления выбранного элемента и то количество строк, которое мы выберем в качестве дополнительного параметра на форме.
Определяем процедуру ПриСозданииНаСервере и в ней считываем из параметра, который мы передали из команды при открытии формы, список объектов для которых надо формировать печатную форму.
Создаем в форме команду Печать и пишем её обработчик, в котором вызываем функцию общего модуля УправлениеПечатьюКлиент.ВыполнитьКомандуПечати, задаем необходимые параметры этой функции, а именно:
- Менеджер печати - имя объекта в модуле менеджера, которого определена функция Печать, формирующая нашу печатную форму;
- Идентификатор - идентификатор печатной формы, которую необходимо напечатать. По этому идентификатору, мы будем в функции Печать модуля менеджера выбирать, какую печатную форму необходимо напечатать;
- Объекты печати - это непосредтвенно те объекты для которых формируются печатные формы;
- Владелец формы;
- Параметры печати - сюда мы формируем и передаем структуру с параметрами печати, тут же мы передаем наши дополнительные параметры, которые мы запросили у пользователя в форме обработки.
Собственно, вызывая функцию ВыполнитьКомандуПечати из формы обработки, мы решаем нашу задачу вывода печатной формы в форму "ПечатьДокументов". Дальше подсистема "Печать" выполнит стандартные действия и доведет выполнение до процедуры Печать, которую мы должны определить в модуле менеджере нашей обработки.
Тут все просто, не будем здесь останавливаться. Скажу лишь, что необходимо соблюсти стиль именования макета, предусмотренный подсистемой "Печать": ПФ_MXL_ <Имя печатной формы>- для макетов типа Табличный документ.Имя>
С этого момента мы выполняем стандартные действия по разработки печатных форм с использованием подсистемы "Печать" из БСП.
Второй вариант. Через реализацию команды печати.
Этот вариант, очень похож на первый по реализации печати. Отличие его в способе создания команды, которая будет выводиться в интерфейс и запускать нашу печать.
В этом случае при определении команды печати мы так же задействуем подсистему "Печать" из БСП. Вместо того, чтобы определять команду для открытия обработки в самой обработке, нам необходимо перейти в модуль менеджера, того объекта, в который мы хотим добавить печатную форму, и задать описание команды печати в процедуре ДобавитьКомандыПечати(КомандыПечати):
Здесь мы добавляем на все формы справочника(напоминаю, что мы работаем со справочником контрагенты), команду печати с названием "Печать печатной формы". И вот здесь главный момент, который надо учесть. На форму можно добавить два вида команд:
1. Вызов процедуры Печать из модуля менеджера;
2. Вызов клиентского метода.
Вот именно вызов клиентского метода нам и нужен. Клиентский метод позволит нам вызвать форму обработки, в которой мы перед печатью запросим у пользователя необходимые нам данные.
Чтобы реализовать такой вызов, необходимо при определении команды, задать для неё Обработчик(см. код выше). В Обработчик команды передается строка, содержащая путь к клиентской функции, т.е. путь к Экспортной функции общего модуля на клиенте. Именно эта функция будет вызвана, при нажатии на команду печати, которую мы добавляем на формы.
Как вы понимаете, чтобы это все заработало, необходимо создать этот самый ОбщийМодуль и определить Экспортную функцию. Поэтому пишем в нашем общем модуле следующий код:
Здесь мы делаем тоже самое, что и при первой реализации, открываем форму печатной формы, только теперь наши ДанныеДляПечати, будут содержаться в параметре переданном функции ПараметрыПечати, а точнее в его поле ОбъектыПечати.
После того, как мы открыли форму обработки, все действия аналогичны первому варианту.
Реализацию подобного варианта можно найти в типовых конфигурациях, в механизмах связанных с печатью согласия на обработку персональных данных.
Создаем дополнительную обработку.
В этом случае нам необходимо воспользоватья подсистемой "Дополнительные отчеты и обработки" из БСП.
При таком варианте решения, нам необходимо писать код, только в двух местах и все они находятся в нашей будущей дополнительной обработке:
1. Модуль объекта обработки;
2. Модуль формы обработки.
В модуле объекта пишем следующий код:
Здесь две функции и одна процедура.
Стандартная функция для Дополнительной обработки СведенияОВнешнейОбработке(), без неё система не поймет, что это дополнительная обработка. Здесь важным моментом является, указание того, что команда реализуемая в данной обработке имеет тип Открытие формы. Т.е. мы будем открывать форму, как нам и нужно. Дальше следует определение процедуры Печать и функции, которая непосредственно формирует наш табличный документ.
Тут нужно обратить внимание на то, что команда печать в этом случае должна содержать только 4 параметра, а не 5 как это при привычном определение команды печати в модуле менеджера. В данном случае отсутвует параметр для передачи Параметров печати. Поэтому нам придетя проявить изобретательность, чтобы передать помимо самих объектов, для которых формируется печатная форма, но так же и параметры которые мы запрашиваем у пользователя в форме.
И так мы определили дополнительную обработку, команда из которой будет открывать форму обработк. Поэтому следующим шагом создаем форму обработки.
В этой форме нам необходимо создать три реквизита для сохранения значений, которые нам понадобятся в дальнейшем. Назовем эти реквизиты следующим образом:
ДополнительнаяОбработкаСсылка - тип СправочникСсылка.ДополнительныеОтчетыИОбработки
ИдентификаторКоманды - тип Строка
ОбъектыНазначения - тип СписокЗначений
В модуле этой формы пишем следующий код:
В процедуре ПриСозданииНаСервере, заполняем наши три реквизита, которые мы создали для хранения параметров передаваемых в форму обработки.
Дальше определяем обработчик кнопки печать на форме. В этом обработчике нам необходимо самим открыть форму "Печать документов", для этого необходимо подготовить ПараметрыОткрытия определенной структуры. В этой структуре, как минимум должны быть определены два поля:
ИсточникДанных - ссылка на нашу дополнительную обработку в справочнике Дополнительных обработок и отчетов. Этот параметр мы сохранили из параметров формы, при создании на сервере;
ПараметрыИсточника, которые включают в себя ИдентификаторКоманды и ОбъектыНазначения:
ИдентификаторКоманды - так же сохранили при создании на сервере, это идентификатор, той команды, которая вызвала форму нашей обработки. Поэтому идентификатору, мы будем определять, что нам необходимо печатать в процедуре Печать в модуле объекта.
ОбъектыНазначения - именно в этом поле нам необходимо передать массив объектов, для которых формируется печатная форма, а так же параметры, запрашиваемые у пользователя в форме.
Как я определяю объекты назначения, можно увидеть в функции ПолучитьОбъектыНазначенияИПараметрыПечати. Здесь я копирую наши объекты назначения из реквизита формы, на место элемента массива с индексом 0, я вставляю наши параметры печати.
В дальнейшем массив определенный таким образом будет передан из формы "Печать документов", в качестве первого параметра процедуры Печать модуля объекта, которую мы определили ранее.
Если вернуться к определению модуля объекта обработки и посмотреть на функцию НапечататьМакет, в первых трех строках функции можно увидеть, как я вытаскиваю из переданных данных в процедуру Печать наши параметры и объекты и дальше с ними работаю.
Такие манипуляции с параметром ОбъектыНазначения, обусловленны спецификой вызова процедуры Печать модуля объекта. Вы можете сами отследить, как передаются параметры и выполняются вызовы функций, открыв модуль формы ПечатьДокументов.
Результат.
В итоге таких манипуляций, мы получим три команды на форме, из которой мы хотим выводить печатную форму:
Нумерация команд, соответствует порядку вариантов реализации.
Все эти команды будут выполнять одинаковые действия:
Показывать форму запроса дополнительных параметров
Выводить в форму "Печать документов" сформированные печатные форм . Как раз то, чего мы и добивались:
P.S. В качестве шаблонов, для реализации своих печатных форм с запросом дополнительных параметров, выгружаю обе обработки, которые учавствуют во всех трех способах формирования печатной формы.
Внешние обработки, печатные формы, обработки по заполнению табличных частей
В данном материале описываются особенности реализации механизма подключения "Внешние обработки, печатные формы, обработки по заполнению табличных частей" (далее ВПФО). Также перечисляются требования, предъявляемые к внешним обработкам, для возможности их использования данным механизмом.
Общее описание
Механизм предназначен для подключения (без изменения конфигурации):
- Внешних обработок для произвольного выполнения
- Внешних обработок в качестве дополнительных печатных форм объектов (справочников и документов)
- Обработок для заполнения табличных частей объектов
Внешние печатные формы и обработки создаются разработчиком с соблюдением определенных условий. Условия обязательны для выполнения на этапе создания внешней обработки, для ее корректной работы в качестве подключаемой к конфигурации.
Для реализации механизма ВПФО используется справочник "Внешние обработки".
Для справочника предусмотрены специализированные реквизиты*:
- "Вид обработки" - описывает, какого вида данная ВПФО
- Произвольная обработка
- Обработка для заполнения табличных частей объектов
- Внешняя печатная форма
- "Хранилище внешней обработки" - хранит двоичные данные подключаемой внешней обработки. При использовании двоичные данные сохраняются на диск во временный файл, и обращение к файлу производится программно как к внешней обработке.
- Возможность использования механизма пользователями, НЕ имеющими права на интерактивное открытие внешних обработок
- Ограничение доступа к использованию и изменению обработок на уровне записей (RLS), т.е. к каждой обработке отдельно
- Целостность БД и неизменность функционала в зависимости от внешних факторов (переноса БД, сетевой работы пользователей, создания архивных копий БД и пр.)
- Объект – ДокументОбъект, СправочникОбъект. Откуда был произведен вызов процедуры заполнения внешней обработки;
- ИмяТабличнойЧасти – Строка. Имя табличной части, для которой вызвана обработка;
- ТабличноеПолеОбъекта – Элемент формы: Табличное поле. Табличное поле формы, для которого вызвана обработка.
- внешняя обработка
- список объектов, для которых данная печатная форма используется
- Отбор. Печатная форма будет доступной только для объектов, удовлетворяющих установленному отбору.
- Отдельную печатную форму. Следует учитывать, что в списках печатных форм в объектах будет всегда появляться одинаковый пункт подменю. Если отдельная печатная форма не указана, то будет использоваться печатная форма из шапки элемента ВПФО.
- Встроенную печатную форму. При заполнении данного реквизита, указанная встроенная печатная форма будет заменена внешней.
- заполняется реквизит "СсылкаНаОбъект" - тип "Любая ссылки", в который передается ссылка на объект, для которого необходимо выполнить печать;
- вызывается функция "Печать()" (должна располагаться в модуле обработки с признаком "Экспорт") без параметров, возвращающая табличный документ.
- ХранилищеВнешнейОбработки. Хранилище значения, хранятся двоичные данные обработки, определенной для всего элемента.
- ВидОбработки. ПеречислениеСсылка. ВидыДополнительныхВнешнихОбработок, определяет вид ВПФО каждый вид (печатная форма, заполнение табличных частей, обработка) рассмотрен отдельно в разделе "Описание видов справочника ВПФО и требования к подключаемым внешним обработкам".
- Комментарий. Строка неограниченной длинны.
- КомментарийКФайлуИсточнику. Строка, неограниченной длинны, хранит параметры файла, дату создания и пр. Заполняется автоматически в момент интерактивного выбора файла внешней обработки. Пользователем не изменяется.
- ПредставлениеОбъекта. Строка, неограниченной длинны, хранит строковое представление выбранного объекта, для отображения пользователю.
- СсылкаОбъекта. СправочникСсылка, ДокументСсылка, содержит пустую ссылку на объект конфигурации. т.к. реквизит типа "Тип" для табличной части не может быть определен, то по пустой ссылке определяется тип объекта, для которого следует подключать внешнюю печатную форму или обработку по заполнению табличной части. Ссылку на пустое значение определенного типа удобно использовать в запросах.
- ТабличнаяЧастьИмя**. Строка, 100. Содержит имя ТЧ объекта, для которого задается ВПФО.
- ТабличнаяЧастьПредставление**. Строка, неограниченной длинны. Содержит синоним ТЧ объекта, используется для отображения пользователю представления табличной части объекта, для которого задается.
- НастройкиПостроителяДляОтбора***. Хранилище значения, может содержать настройки построителя отчета, выгруженные из него отборы для выбранного объекта.
- ХранилищеВнешнейОбработки***. ХранилищеЗначения, может содержит двоичные данные подключаемой внешней обработки., которая будет использоваться в первую очередь, вместо обработки расположенной в шапке.
- ЗаменяемаяПечатнаяФорма***. Строка, 200. Имя печатной встроенной формы объекта, которую необходимо заменить подключаемой.
- ИмяФайлаПечатнойФормы***. Строка, неограниченной длинны - имя файла подключенной печатной формы.
- ПредставлениеОтбораПостроителя***. Строка, неограниченной длинны, хранит представление отбора построителя, используется для отображения представления отбора в табличной части формы элемента справочника "Внешние обработки".
- Главная
- Программирование 1С
- 1С. Печать из формы внешней обработки, вывод табличного документа в общую форму "Печать документов" посредством БСП.
- 1С
- Управляемые формы
- Обработки
- Внешняя печатная форма
- Печать
- Библиотека стандартных подсистем (БСП)
ПРИМЕЧАНИЕ
Полный перечень реквизитов будет описан ниже, в разделе Техническая реализация механизма "Внешние обработки, печатные формы, обработки по заполнению табличных частей"
Для удобства, формы списков ВПФО вызываются раздельно, с предустановленным отбором по реквизиту "Вид обработки", из подменю "Сервис".
Добавлять и изменять ВПФО в базе данных может пользователь, обладающий правом администрирования дополнительных форм и обработок. Это отдельная роль в конфигурации.
Для остальных пользователей назначаются права на чтение(использование) и запись(изменение) по каждому элементу справочника ВПФО.
Преимущества использования механизма ВПФО перед механизмом платформы открытия внешних обработок:
Описание видов справочника ВПФО и требования к подключаемым внешним обработкам
Рассмотрим каждый вид ВПФО по отдельности.
Произвольная обработка
Для включения произвольных обработок в базу данных, необходимо указывать только внешнюю обработку, которая находится на диске.
Открытие произвольных обработок в форме списка производится при выборе элемента ВПФО с видом "Произвольная обработка". При этом, производится сохранение двоичных данных из реквизита "Хранилище внешней обработки" на диск во временный файл. После этого, у сохраненной внешней обработки открывается основная форма.
Основная форма для произвольной обработки должна быть определена обязательно.
Обработка для заполнения ТЧ объектов
Для обработок заполнения ТЧ необходимо указывать внешнюю обработку (файл на диске, с расширением epf), список объектов и их ТЧ, для которых необходимо использовать данную обработку.
В типовых конфигурациях объектами, использующими данный механизм, являются все документы, содержащие хоть одну табличную часть.
Перед открытием формы объекта в командных панелях табличных полей (источником данных для которых является табличная часть объекта), которым соответствуют определенные строки в справочнике ВПФО, программно добавляются пункты в подменю "Заполнить" (если подменю "Заполнить" отсутствует на командной панели, оно создается).
При нажатии на созданную перед открытием кнопку подменю "Заполнить" происходит сохранение соответствующей обработки на диск во временный файл, для сохраненной внешней обработки вызывается процедура:
Инициализировать (Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта)
Наличие экспортной процедуры "Инициализировать()" в модуле объекта обработки с видом "Заполнение табличных частей" обязательно. В теле данной процедуры должен располагаться программный код, заполняющий табличную часть в соответствии с назначением обработки.
Обработка так же может иметь в своем составе макет "Параметры_Авторегистрации", используемый для автоматического заполнения принадлежности печатной формы в справочнике "Внешние обработки". Макет должен состоять из 2-х колонок – "полное имя объекта" и "имя табличной части".
Пример макета Параметры_Авторегистрации:
Внешняя печатная форма
Для подключаемых внешних печатных форм указывается:
Для каждого типа объекта дополнительно можно указать:
Вызов диалога настройка условий отбора осуществляется при начале выбора значения в колонке "отбор":
В формах объектов, в командной панели формы (обычно это нижняя командная панель) формируется подменю кнопок печатных форм. Подменю формируется программно, при открытии формы и при записи объекта в форме (для обеспечения изменения пунктов меню в зависимости от данных объекта, и срабатыванию указанных в печатных формах условий отборов). В формируемом меню стандартные печатные формы отделяется от подключаемых разделителем.
Например:
Если находится подключаемая печатная форма, которой необходимо заменить стандартную, то она заменяется и показывается в списке стандартных печатных форм. В этом случае подключенная печатная форма отдельно в списке подключенных печатных форм не отображается.
При нажатии на любую из кнопок печати происходит определение, соответствует ли данная кнопка внешней печатной форме или встроенной в конфигурацию.
Для кнопок, соответствующих печатным формам встроенным в конфигурацию, вызывается встроенный механизм печати (данный механизм в рамках текущего проекта не рассматривается).
Для кнопок, соответствующих внешним печатным формам, происходит сохранение соответствующей обработки на диск во временный файл.
Для сохраненной внешней обработки:
Наличие реквизита "СсылкаНаОбъект" и экспортной функции "Печать()" в модуле объекта обработки с видом "Внешняя печатная форма" обязательно.
В теле функции "Печать()" должен располагаться программный код, который формирует и возвращает табличный документ, в соответствии со значением реквизита "СсылкаНаОбъект".
Обработка так же может иметь в своем составе макет "Параметры_Авторегистрации", используемый для автоматического заполнения принадлежности печатной формы в справочнике "Внешние обработки" состоящий из одной колонки – полное имя объекта для которого будет создаваться соответствующая кнопка печати.
Пример макета Параметры_Авторегистрации:
При соблюдении этих требований пользователю будет достаточно указать при регистрации дополнительной печатной формы файл внешней обработки, после чего все реквизиты формы заполнятся автоматически.
Техническая реализация механизма "Внешние обработки, печатные формы, обработки по заполнению табличных частей"
В базе данных внешние обработки, печатные формы, обработки по заполнению табличных частей хранятся в справочнике "Внешние обработки". Справочник имеет следующую структуру:
ТабличнаяЧасть.Принадлежность. Хранит типы объектов, для которых задается ВПФО и прочие описанные ниже параметры. Табличная часть используется для элементов с видом обработки: "Печатная форма" или "Заполнение табличных частей".
Реквизиты табличной части:
** Используется только для элементов с видом обработки: "Заполнение табличных частей"
*** Используется только для элементов с видом обработки: "печатная форма".
Подключение дополнительных печатных форм к формам объектов конфигурации
Механизм дополнительных печатных форм является расширением стандартного механизма печатных форм объекта. Добавление дополнительной формы в общий список форм выполняется в процедурах модуля формы объекта перед открытием, после записи и при нажатии на кнопку "Установить печать по умолчанию".
Подменю "Печать" и кнопка "Печать по умолчанию" в форме объекта не должны присутствовать в обязательном порядке. Они формируются программно, в том случае, если есть хоть одна печатная форма и задана печать по умолчанию.
Подключение обработок по заполнению табличных частей к формам объектов конфигурации
Для обеспечения подключения механизма в форме объекта должны присутствовать следующие процедуры и функции:
Заходим в Сервис->Дополнительные отчеты и обработки->Дополнительные внешние печатные формы.
Открылась форма списка справочника с внешними печатными формами. В верхнем меню списка нажимаем Добавить. Появляется форма создания элемента справочника.
Нажимаем кнопку Открыть и выбираем файл с нужной печатной формой. После этого при необходимости задаем нужное имя (поле Наименование).
Затем нажимаем ОК, чтобы сохранить изменения.
После этого заходим в любой документ Требование-накладная, нажимаем Печать, и выбираем только что добавленную форму.
Для БП 3.0, ЗУП 3.0, УТ 11, КА 2.0, ERP 2.0.
Для демонстрации добавления печатной формы в управляемом интерфейсе покажу добавление внешней формы счета на оплату к одноименному документу в Бухгалтерии 3.0.
Заходим в соответствующий раздел программы:
Необходимо, чтобы был включен признак использования внешних отчетов и обработок, переходим по гиперссылке в список внешних объектов:
В открывшемся списке нажимаем Создать:
В диалоговом окне выбираем нужный файл:
Заполнилась карточка внешнего объекта: в размещении видим тип объекта базы, к которому будет привязана форма и чуть ниже ее название:
Запишем и закроем форму созданного внешнего объекта.
Теперь зайдем в любой документ Счет на оплату покупателю и выведем меню печати:
Видим, что печатная форма добавилась успешно.
Вас может заинтересовать
Расширение позволяет быстро накладывать отборы по номенклатуре в любых типовых и внешних отчетах программы согласно списка наименований из буфера обмена.
Групповое создание документов и заполнение табличной части выбранных документов Требование-накладная и документов комплектации из любых табличных файлов (Excel, dbf и.т.п).
Использование соглашений с клиентами и поставщиками. Корректировки, заказы, причины отмены заказов. Импорт и экспорт, комиссионная схема, графики оплаты.
1С. Печать из формы внешней обработки, вывод табличного документа в общую форму "Печать документов" посредством БСП.
Изменение существующих или создание новых печатных форм – задача довольно распространённая. Как правило, в таких случаях создаётся внешняя печатная форма и подключается через стандартную подсистему дополнительных отчётов и обработок. Однако, иногда возникают задачи, в которых печатная форма должна формироваться с учётом данных, вводимых пользователями непосредственно перед печатью. То есть, сначала должна открыться форма, в которую пользователь вводит данные, и только потом выполняется команда "Печать".
Допустим, нам нужно создать печатную форму некой справки, часть данных которой вводятся в форме перед печатью. Кнопка "Печать" должна располагаться на форме.
Создаём внешнюю обработку. В модуле обработки, в функции СведенияОВнешнейОбработке () , устанавливаем параметры регистрации внешней обработки.
Обычно для внешних печатных форм параметру "Вид" присваивается значение "Печатная форма", но так как у нас сначала должна открываться форма, то устанавливаем значение "Дополнительная обработка".
В этой же функции СведенияОВнешнейОбработке () при обращении к процедуре ДобавитьКоманду () для внешних печатных форм в параметр "Использование" обыкновенно передаётся значение "ВызовСерверногоМетода" или "ВызовКлиентскогоМетода". Здесь же мы укажем значение "ОткрытиеФормы".
В итоге функция будет выглядеть так:
Создаём макет печатной формы.
Далее создаём основную форму обработки и необходимые реквизиты формы. Создаём и размещаем на форме команду "Печать". Формировать табличный документ для печати будем в обработчике этой команды. В зависимости от того, какие данные требуются для печатной формы, организовываем заполнение табличного документа либо на клиенте, либо на сервере. В данном примере заполняем на сервере и затем возвращаем табличный документ на клиент.
Итак, в модуле формы:
Табличный документ сформирован, осталось вывести его для печати в предназначенную для этого общую форму "Печать документов". Сделаем это с помощью стандартных механизмов БСП.
Дополним обработчик команды "Печать":
Теперь в результате выполнения команды "Печать" из формы нашей внешней обработки, табличный документ будет выводиться в форму "Печать документов", которая предоставляет удобный интерфейс для печати:
Комментарии
Простите, а как получить данные того объекта, к которому будет привязана эта форма?
Печатная форма же должна заполняться данными из документа или справочника, к которому привязана.
Реально работающий пример в отличие от других советов. Большое спасибо, у меня наконец все получилось .
Читайте также: