1с как создать внешнюю печатную форму управляемое приложение
Внешние обработки, печатные формы, обработки по заполнению табличных частей
В данном материале описываются особенности реализации механизма подключения "Внешние обработки, печатные формы, обработки по заполнению табличных частей" (далее ВПФО). Также перечисляются требования, предъявляемые к внешним обработкам, для возможности их использования данным механизмом.
Общее описание
Механизм предназначен для подключения (без изменения конфигурации):
- Внешних обработок для произвольного выполнения
- Внешних обработок в качестве дополнительных печатных форм объектов (справочников и документов)
- Обработок для заполнения табличных частей объектов
Внешние печатные формы и обработки создаются разработчиком с соблюдением определенных условий. Условия обязательны для выполнения на этапе создания внешней обработки, для ее корректной работы в качестве подключаемой к конфигурации.
Для реализации механизма ВПФО используется справочник "Внешние обработки".
Для справочника предусмотрены специализированные реквизиты*:
- "Вид обработки" - описывает, какого вида данная ВПФО
- Произвольная обработка
- Обработка для заполнения табличных частей объектов
- Внешняя печатная форма
- "Хранилище внешней обработки" - хранит двоичные данные подключаемой внешней обработки. При использовании двоичные данные сохраняются на диск во временный файл, и обращение к файлу производится программно как к внешней обработке.
- Возможность использования механизма пользователями, НЕ имеющими права на интерактивное открытие внешних обработок
- Ограничение доступа к использованию и изменению обработок на уровне записей (RLS), т.е. к каждой обработке отдельно
- Целостность БД и неизменность функционала в зависимости от внешних факторов (переноса БД, сетевой работы пользователей, создания архивных копий БД и пр.)
- Объект – ДокументОбъект, СправочникОбъект. Откуда был произведен вызов процедуры заполнения внешней обработки;
- ИмяТабличнойЧасти – Строка. Имя табличной части, для которой вызвана обработка;
- ТабличноеПолеОбъекта – Элемент формы: Табличное поле. Табличное поле формы, для которого вызвана обработка.
- внешняя обработка
- список объектов, для которых данная печатная форма используется
- Отбор. Печатная форма будет доступной только для объектов, удовлетворяющих установленному отбору.
- Отдельную печатную форму. Следует учитывать, что в списках печатных форм в объектах будет всегда появляться одинаковый пункт подменю. Если отдельная печатная форма не указана, то будет использоваться печатная форма из шапки элемента ВПФО.
- Встроенную печатную форму. При заполнении данного реквизита, указанная встроенная печатная форма будет заменена внешней.
- заполняется реквизит "СсылкаНаОбъект" - тип "Любая ссылки", в который передается ссылка на объект, для которого необходимо выполнить печать;
- вызывается функция "Печать()" (должна располагаться в модуле обработки с признаком "Экспорт") без параметров, возвращающая табличный документ.
- ХранилищеВнешнейОбработки. Хранилище значения, хранятся двоичные данные обработки, определенной для всего элемента.
- ВидОбработки. ПеречислениеСсылка. ВидыДополнительныхВнешнихОбработок, определяет вид ВПФО каждый вид (печатная форма, заполнение табличных частей, обработка) рассмотрен отдельно в разделе "Описание видов справочника ВПФО и требования к подключаемым внешним обработкам".
- Комментарий. Строка неограниченной длинны.
- КомментарийКФайлуИсточнику. Строка, неограниченной длинны, хранит параметры файла, дату создания и пр. Заполняется автоматически в момент интерактивного выбора файла внешней обработки. Пользователем не изменяется.
- ПредставлениеОбъекта. Строка, неограниченной длинны, хранит строковое представление выбранного объекта, для отображения пользователю.
- СсылкаОбъекта. СправочникСсылка, ДокументСсылка, содержит пустую ссылку на объект конфигурации. т.к. реквизит типа "Тип" для табличной части не может быть определен, то по пустой ссылке определяется тип объекта, для которого следует подключать внешнюю печатную форму или обработку по заполнению табличной части. Ссылку на пустое значение определенного типа удобно использовать в запросах.
- ТабличнаяЧастьИмя**. Строка, 100. Содержит имя ТЧ объекта, для которого задается ВПФО.
- ТабличнаяЧастьПредставление**. Строка, неограниченной длинны. Содержит синоним ТЧ объекта, используется для отображения пользователю представления табличной части объекта, для которого задается.
- НастройкиПостроителяДляОтбора***. Хранилище значения, может содержать настройки построителя отчета, выгруженные из него отборы для выбранного объекта.
- ХранилищеВнешнейОбработки***. ХранилищеЗначения, может содержит двоичные данные подключаемой внешней обработки., которая будет использоваться в первую очередь, вместо обработки расположенной в шапке.
- ЗаменяемаяПечатнаяФорма***. Строка, 200. Имя печатной встроенной формы объекта, которую необходимо заменить подключаемой.
- ИмяФайлаПечатнойФормы***. Строка, неограниченной длинны - имя файла подключенной печатной формы.
- ПредставлениеОтбораПостроителя***. Строка, неограниченной длинны, хранит представление отбора построителя, используется для отображения представления отбора в табличной части формы элемента справочника "Внешние обработки".
- «ДополнительнаяОбработка»
- «ДополнительныйОтчет»
- «ЗаполнениеОбъекта»
- «Отчет»
- «ПечатнаяФорма»
- «СозданиеСвязанныхОбъектов»
- ОткрытиеФормы – Открывает форму обработки.
- ВызовКлиентскогоМетода – будет вызвана клиентская процедура из модуля формы обработки.
- ВызовСерверногоМетода - будет вызвана серверная процедура из модуля обработки.
- СценарийВБезопасномРежиме – тоже будет вызвана серверная процедура из модуля обработки в безопасном режиме.
- Первый параметр, непосредственно таблица команд вновь созданная.
- Второй параметр, как будет отображаться команда пользователю на форме (документа, справочника).
- Третий – уникальный идентификатор команды, запомните его, он нам еще пригодится!
- Четвертый параметр – использование, что вызовет Ваша команда.
- Пятый параметр – показывать оповещение, мы не будем это делать.
- Шестой параметр – модификатор, в нашем случае он всегда один ПечатьXML.
- Первый параметр, непосредственно таблица команд вновь созданная.
- Второй параметр, как будет отображаться команда пользователю на форме (документа, справочника).
- Третий – уникальный идентификатор команды, запомните его, он нам еще пригодится!
- Четвертый параметр – использование, что вызовет Ваша команда.
- Пятый параметр – показывать оповещение, мы не будем это делать.
- Шестой параметр – модификатор, в нашем случае он всегда один ПечатьMXL.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
ПРИМЕЧАНИЕ
Полный перечень реквизитов будет описан ниже, в разделе Техническая реализация механизма "Внешние обработки, печатные формы, обработки по заполнению табличных частей"
Для удобства, формы списков ВПФО вызываются раздельно, с предустановленным отбором по реквизиту "Вид обработки", из подменю "Сервис".
Добавлять и изменять ВПФО в базе данных может пользователь, обладающий правом администрирования дополнительных форм и обработок. Это отдельная роль в конфигурации.
Для остальных пользователей назначаются права на чтение(использование) и запись(изменение) по каждому элементу справочника ВПФО.
Преимущества использования механизма ВПФО перед механизмом платформы открытия внешних обработок:
Описание видов справочника ВПФО и требования к подключаемым внешним обработкам
Рассмотрим каждый вид ВПФО по отдельности.
Произвольная обработка
Для включения произвольных обработок в базу данных, необходимо указывать только внешнюю обработку, которая находится на диске.
Открытие произвольных обработок в форме списка производится при выборе элемента ВПФО с видом "Произвольная обработка". При этом, производится сохранение двоичных данных из реквизита "Хранилище внешней обработки" на диск во временный файл. После этого, у сохраненной внешней обработки открывается основная форма.
Основная форма для произвольной обработки должна быть определена обязательно.
Обработка для заполнения ТЧ объектов
Для обработок заполнения ТЧ необходимо указывать внешнюю обработку (файл на диске, с расширением epf), список объектов и их ТЧ, для которых необходимо использовать данную обработку.
В типовых конфигурациях объектами, использующими данный механизм, являются все документы, содержащие хоть одну табличную часть.
Перед открытием формы объекта в командных панелях табличных полей (источником данных для которых является табличная часть объекта), которым соответствуют определенные строки в справочнике ВПФО, программно добавляются пункты в подменю "Заполнить" (если подменю "Заполнить" отсутствует на командной панели, оно создается).
При нажатии на созданную перед открытием кнопку подменю "Заполнить" происходит сохранение соответствующей обработки на диск во временный файл, для сохраненной внешней обработки вызывается процедура:
Инициализировать (Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта)
Наличие экспортной процедуры "Инициализировать()" в модуле объекта обработки с видом "Заполнение табличных частей" обязательно. В теле данной процедуры должен располагаться программный код, заполняющий табличную часть в соответствии с назначением обработки.
Обработка так же может иметь в своем составе макет "Параметры_Авторегистрации", используемый для автоматического заполнения принадлежности печатной формы в справочнике "Внешние обработки". Макет должен состоять из 2-х колонок – "полное имя объекта" и "имя табличной части".
Пример макета Параметры_Авторегистрации:
Внешняя печатная форма
Для подключаемых внешних печатных форм указывается:
Для каждого типа объекта дополнительно можно указать:
Вызов диалога настройка условий отбора осуществляется при начале выбора значения в колонке "отбор":
В формах объектов, в командной панели формы (обычно это нижняя командная панель) формируется подменю кнопок печатных форм. Подменю формируется программно, при открытии формы и при записи объекта в форме (для обеспечения изменения пунктов меню в зависимости от данных объекта, и срабатыванию указанных в печатных формах условий отборов). В формируемом меню стандартные печатные формы отделяется от подключаемых разделителем.
Например:
Если находится подключаемая печатная форма, которой необходимо заменить стандартную, то она заменяется и показывается в списке стандартных печатных форм. В этом случае подключенная печатная форма отдельно в списке подключенных печатных форм не отображается.
При нажатии на любую из кнопок печати происходит определение, соответствует ли данная кнопка внешней печатной форме или встроенной в конфигурацию.
Для кнопок, соответствующих печатным формам встроенным в конфигурацию, вызывается встроенный механизм печати (данный механизм в рамках текущего проекта не рассматривается).
Для кнопок, соответствующих внешним печатным формам, происходит сохранение соответствующей обработки на диск во временный файл.
Для сохраненной внешней обработки:
Наличие реквизита "СсылкаНаОбъект" и экспортной функции "Печать()" в модуле объекта обработки с видом "Внешняя печатная форма" обязательно.
В теле функции "Печать()" должен располагаться программный код, который формирует и возвращает табличный документ, в соответствии со значением реквизита "СсылкаНаОбъект".
Обработка так же может иметь в своем составе макет "Параметры_Авторегистрации", используемый для автоматического заполнения принадлежности печатной формы в справочнике "Внешние обработки" состоящий из одной колонки – полное имя объекта для которого будет создаваться соответствующая кнопка печати.
Пример макета Параметры_Авторегистрации:
При соблюдении этих требований пользователю будет достаточно указать при регистрации дополнительной печатной формы файл внешней обработки, после чего все реквизиты формы заполнятся автоматически.
Техническая реализация механизма "Внешние обработки, печатные формы, обработки по заполнению табличных частей"
В базе данных внешние обработки, печатные формы, обработки по заполнению табличных частей хранятся в справочнике "Внешние обработки". Справочник имеет следующую структуру:
ТабличнаяЧасть.Принадлежность. Хранит типы объектов, для которых задается ВПФО и прочие описанные ниже параметры. Табличная часть используется для элементов с видом обработки: "Печатная форма" или "Заполнение табличных частей".
Реквизиты табличной части:
** Используется только для элементов с видом обработки: "Заполнение табличных частей"
*** Используется только для элементов с видом обработки: "печатная форма".
Подключение дополнительных печатных форм к формам объектов конфигурации
Механизм дополнительных печатных форм является расширением стандартного механизма печатных форм объекта. Добавление дополнительной формы в общий список форм выполняется в процедурах модуля формы объекта перед открытием, после записи и при нажатии на кнопку "Установить печать по умолчанию".
Подменю "Печать" и кнопка "Печать по умолчанию" в форме объекта не должны присутствовать в обязательном порядке. Они формируются программно, в том случае, если есть хоть одна печатная форма и задана печать по умолчанию.
Подключение обработок по заполнению табличных частей к формам объектов конфигурации
Для обеспечения подключения механизма в форме объекта должны присутствовать следующие процедуры и функции:
В этой статье мы научимся создавать внешнюю печатную форму для "1С: Бухгалтерия предприятия 3.0". Причем создавать с нуля, не используя так называемые шаблоны. Вы сами научитесь создавать шаблоны внешних печатных форм.
Все это делается довольно просто))
И так, создадим новую обработку.
Мы будем создавать внешний счет на оплату покупателю, поэтому обработку так и назовем: «СчетНаОплатуВнешний».
Сохраним ее на жесткий диск.
Зайдем в модуль обработки, и создадим экспортную функцию СведенияОВнешнейОбработке.
Внутри этой функции создадим структуру ПараметрыРегистрации, которая будет содержать определенный список полей. Каждое поле мы разберем в отдельности.
Создадим первый элемент структуры, он будет иметь ключ с название «Вид».
Значением данной связки КлючИЗначение идет одна из строк:
В нашем случае должна быть строка "ПечатнаяФорма".
Следующий элемент структуры должен иметь ключ с названием Назначение.
В качестве значения данного элемента должен выступать массив, где перечислены будут все документы или справочники, в которых будет выходить данная печатная форма.
Они должны иметь тип строка, и быть в следующем формате:
Документ."НазваниеДокумента"
Справочник."НазваниеСправочника"
У нас этот массив будет возвращать отдельная функция ПолучитьНазначениеОбработки.
Допишем созданный последним элемент структуры.
Создадим новый элемент структуры, ключ которого будет называться «Наименование», а в значении будет содержаться наименование обработки, которое будет отображаться в справочнике "Дополнительные внешние печатные формы".
Следующий элемент структуры будет иметь название «Версия», значением данного элемента будет версия обработки. Задается программистом на его усмотрение.
Следующий элемент имеет название «Информация», который содержит краткую информацию по обработке.
Следующий элемент имеет название «БезопасныйРежим», его необходим устанавливать в значение истина или ложь, в зависимости от того необходимо устанавливать или отключать безопасный режим во время выполнения обработки. Мы установим значение Истина.
И в последнем параметре необходимо добавить команды, которые будут поставляться обработкой. Для этого нам необходимо создать и заполнить таблицу команд. Разработаем функцию, которая создает и возвращает таблицу с определенным набором полей. Делать это будем в функции ПолучитьТаблицуКоманд.
Создадим функцию и таблицу значений внутри нее.
Теперь создадим пять колонок этой таблицы.
И первая колонка – Представление (тип строка).
Эта колонка – представление команды в пользовательском интерфейсе, т.е. то, что пользователь увидит при нажатии меню"Печать" в документе или справочнике.
Вторая колонка – Идентификатор.
Это может быть любая текстовая строка, уникальная в пределах данной обработки.
Третья колонка – Использование.
Параметр данной колонки типа строка, должен принимать одно из четырех значений –
Конкретно мы будем использовать вызов серверного метода.
Следующая колонка – показывать оповещение. Принимает значение истина или ложь, в зависимости от того надо показывать оповещение или нет.
И последняя колонка – модификатор. Это дополнительный модификатор команды. В нашем случае будет иметь название ПечатьXML.
Теперь создадим процедуру, которая будет заполнять данную таблицу значений.
В данном коде все понятно.
В функции СведенияОВнешнейОбработке создадим команду и заполним ее.
Создаем таблицу значений:
Теперь заполним ее.
Еще раз пройдемся по параметрам.
Теперь передадим вновь созданную таблицу команд в структуру ПараметрыРегистрации.
И пусть наша функция СведенияОВнешнейОбработке возвращает данную структуру.
Все теперь наша обработка будет передавать нужные параметры регистрации, которые будут необходимы при создании элемента справочника дополнительные печатные формы и обработки. Обращаю ваше внимание, что название всех полей в структуре Параметры регистрации, а также название и типы всех колонок в таблице команд, должны быть те которые приведены в примере, иначе Ваша обработка не зарегистрируется.
Теперь в модуле объекта создадим процедуру Печать. Это процедура с четырьмя параметрами: МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода.
И вот начинается самое интересное, теперь вам необходимо войти в аналогичную процедуру в менеджере объекта счет на оплату покупателю, или в обработке, которая, по сути, является менеджером печати.
Как узнать, где находится нужная нам функция?
Откроем модуль менеджера документа Счет на оплату покупателю.
И найдем процедуру ДобавитьКомандыПечати, которая заполняет список команд .
В этой процедуре найдем код, где добавляется команда для нужной нам печатной формы (список команд добавляется в таблицу значений КомандыПечати). И обратим внимание на свойство МенеджерПечати. Если этому свойству присваивается какое-нибудь значение - это путь к объекту метаданных, как правило к обработке, то значит при выводе нужной печатной формы будет отработан код в процедуре Печать, которая находится в модуле менеджере этого объекта (в обработке). А если это свойство в принципе не фигурирует при заполнении команды печати, то значит будет отработан код в процедуре Печать, которая находится в модуле менеджера нашего основного объекта (в нашем случае это документ СчетНаОплатуПокупателю)
Посмотрим на процедуру ДобавитьКомандыПечати в модуле менеджера документа "Счет на оплату покупателя".
Поскольку мы делаем внешнюю печатную форму счета на оплату, то нас интересует первое добавление в таблицу значений (см. свойство Представление), и мы видим, что в этом случае заполнено свойство МенеджерПечати, где указан объект Обработка.ПечатьСчетаНаОплату. Это значит, что нам нужно найти процедуру Печать в модуле менеджера обработки ПечатьСчетаНаОплату.
А если бы мы решили сделать внешнюю печатную форму договора счета на оплату (второе добавление в таблицу значений КомандыПечати), то нам нужно было бы найти процедуру Печать в модуле менеджера документа СчетНаОплатуПокупателя.
Откроем модуль менеджера обработки ПечатьСчетаНаОплату.
И раскроем процедуру Печать.
Нас интересует второе условие (где фигурирует строка "СчетЗаказ", см. идентификатор нужной команды в процедуре ДобавитьКомандыПечати модуля менеджера документа), скопируем это условие в процедуру Печать нашей внешней обработки.
Внимание! Копировать напрямую процедуру Печать из модуля менеджера (без разницы обработка это, документ или справочник) не следует. Поскольку у них отличается количество параметров, в последствие это приводит к ошибкам при работе.
Так же из модуля менеджера обработки скопируем процедуру СформироватьПечатнуюФорму.
В этом коде есть строка, где заполняется таблица сведений счета на оплату.
Эта таблица получается при помощи функции модуля менеджера объекта (в нашем случае это документ СчетНаОплатуПокупателю). Найдем эту функцию в модуле менеджера документа СчетНаОплатуПокупателю.
И скопируем её в модель нашей внешней обработки.
А сам код процедуры СформироватьПечатнуюФорму в модуле внешней обработки исправим, убрав все не нужное от туда.
Если мы сейчас сделаем проверку модуля внешней обработки, то выйдет две ошибки. Первая, что не определена переменная ПараметрыПечати в процедуре Печать, и, что не найдена функция ПолучитьТекстЗапросаДляФормированияТаблицыСведенийСчетаНаОплату в функции ПолучитьТаблицуСведенийСчетаНаОплату.
Создадим переменную ПараметрыПечати в процедуре Печать. Это будет простая структура.
А потом найдем функцию ПолучитьТекстЗапросаДляФормированияТаблицыСведенийСчетаНаОплату в модуле менеджера документа СчетНаОплатуПокупателю и скопируем её в модуль внешней обработки.
Должен получится следующий состав процедур и функций модуля внешней обработки (для удобства я разделил их на две области).
Еще раз делаем проверку модуля. Ошибок не обнаружено.
Продолжаем, теперь нам необходимо, что бы брался наш макет, и печатался по нашей команде.
Нас интересует процедура СформироватьПечатнуюФорму, а в ней мы уделим внимание методу ПечатьСчетаНаОплату общего модуля ПечатьТорговыхДокументов.
Очевидно, она непосредственно формирует табличный документ. Перейдем в этот общий модуль, и скопируем функцию ПечатьСчетаНаОплату в модуль нашей внешней обработки.
Делаем проверку модуля внешней обработки. Ругается на несуществующие методы ВывестиЗаголовокПредупреждение и НомерСчетаНаОплату.
Переходим в общий модуль, от куда мы взяли функцию ПечатьСчетаНаОплату, находим процедуру ВывестиЗаголовокПредупреждение , и копируем ее в модуль внешней обработки.
А функция НомерСчетаНаОплату в общем модуле ПечатьТорговыхДокументов экспортная, поэтому мы просто исправим код в процедуре ПечатьСчетаНаОплату, где используется проблемная функция, сделав вызов этой функции из вышеупомянутого общего модуля.
Проверяем еще раз ошибки. Все нормально.
Не забудем в процедуре СформироватьПечатнуюФорму убрать вызов метода ПечатьСчетаНаОплату из общего модуля.
Теперь зайдем в скопированную функцию ПечатьСчетаНаОплату, и посмотрим, где в ней подтягивается макет.
Находим данный макет в общих макетах и копируем его в макеты нашей обработки.
Исправляем выделенный код, где подтягивается макет, следующий образом.
Теперь зайдем в наш скопированный макет, и сделаем какое-нибудь изменение, чтобы вы видели, что команда подтянула именно макет из внешней обработки.
Вернемся обратно в процедуру Печать нашей внешней обработки.
И теперь осталась одна небольшая хитрость, без которой ваш внешний отчет не будет работать. Необходимо текст "СчетЗаказ" (это идентификатор типовой печатной формы).
Заменить на название идентификатора команды ("СчетНаОплатуВнешний").
Все, сохраняем данную обработку. И запускаем "1С: Предприятие" из конфигуратора.
Идем в администрирование. В дополнительные отчеты и обработки.
Нажимаем на кнопку "Добавить из файла" и выбираем нашу созданную обработку.
Все это делается довольно просто))
И так, создадим новую обработку 1С.
Мы будем создавать внешний счет на оплату покупателю, поэтому обработку так и назовем: «СчетНаОплатуВнешний».
Сохраним ее на жесткий диск.
Зайдем в модуль обработки, и создадим экспортную функцию СведенияОВнешнейОбработке.
Внутри этой функции создадим структуру ПараметрыРегистрации, которая будет содержать определенный список полей. Каждое поле мы разберем в отдельности.
Создадим первый элемент структуры, он будет иметь ключ с название «Вид».
Значением данной связки КлючИЗначение идет одна из строк:
Следующий элемент структуры должен иметь ключ с названием Назначение.
В качестве значения данного элемента должен выступать массив, где перечислены будут все документы или справочники, в которых будет выходить данная печатная форма.
Они должны иметь тип строка, и быть в следующем формате:
У нас этот массив будет возвращать отдельная функция ПолучитьНазначениеОбработки.
Допишем созданный последним элемент структуры.
Следующий элемент структуры будет иметь название «Версия», значением данного элемента будет версия обработки. Задается программистом на его усмотрение.
Следующий элемент имеет название «Информация», который содержит краткую информацию по обработке.
Следующий элемент имеет название «БезопасныйРежим», его необходим устанавливать в значение истина или ложь, в зависимости от того необходимо устанавливать или отключать безопасный режим во время выполнения обработки. Мы установим значение Истина.
И в последнем параметре необходимо добавить команды, которые будут поставляться обработкой. Для этого нам необходимо создать и заполнить таблицу команд. Разработаем функцию, которая создает и возвращает таблицу с определенным набором полей. Делать это будем в функции ПолучитьТаблицуКоманд.
Создадим функцию и таблицу значений внутри нее.
Теперь создадим пять колонок этой таблицы.
И первая колонка – Представление (тип строка).
Вторая колонка – Идентификатор.
Это может быть любая текстовая строка, уникальная в пределах данной обработки.
Третья колонка – Использование.
Параметр данной колонки типа строка, должен принимать одно из четырех значений –
Конкретно мы будем использовать вызов серверного метода.
Следующая колонка – показывать оповещение. Принимает значение истина или ложь, в зависимости от того надо показывать оповещение или нет.
И последняя колонка – модификатор. Это дополнительный модификатор команды. В нашем случае будет иметь название ПечатьMXL.
Теперь создадим процедуру, которая будет заполнять данную таблицу значений.
В данном коде все понятно.
В функции СведенияОВнешнейОбработке создадим команду и заполним ее.
Создаем таблицу значений:
Теперь заполним ее.
Еще раз пройдемся по параметрам.
Теперь передадим вновь созданную таблицу команд в структуру ПараметрыРегистрации.
И пусть наша функция СведенияОВнешнейОбработке возвращает данную структуру.
Все теперь наша обработка будет передавать нужные параметры регистрации, которые будут необходимы при создании элемента справочника дополнительные печатные формы и обработки. Обращаю ваше внимание, что название всех полей в структуре Параметры регистрации, а также название и типы всех колонок в таблице команд, должны быть те которые приведены в примере, иначе Ваша обработка не зарегистрируется.
Теперь в модуле объекта создадим процедуру Печать. Это процедура с четырьмя параметрами: МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода.
И вот начинается самое интересное, теперь вам необходимо войти в аналогичную процедуру в менеджере объекта счет на оплату покупателю, или в обработке, которая, по сути, является менеджером печати.
Как узнать, где находится нужная нам функция?
Откроем модуль менеджера документа Счет на оплату покупателю.
И найдем процедуру ДобавитьКомандыПечати, которая заполняет список команд .
оскольку мы делаем внешнюю печатную форму счета на оплату, то нас интересует первое добавление в таблицу значений (см. свойство Представление), и мы видим, что в этом случае заполнено свойство МенеджерПечати, где указан объект Обработка.ПечатьСчетаНаОплату. Это значит, что нам нужно найти процедуру Печать в модуле менеджера обработки ПечатьСчетаНаОплату.
А если бы мы решили сделать внешнюю печатную форму договора счета на оплату (второе добавление в таблицу значений КомандыПечати), то нам нужно было бы найти процедуру Печать в модуле менеджера документа СчетНаОплатуПокупателя.
Откроем модуль менеджера обработки ПечатьСчетаНаОплату.
И раскроем процедуру Печать.
Внимание! Копировать напрямую процедуру Печать из модуля менеджера (без разницы обработка это, документ или справочник) не следует. Поскольку у них отличается количество параметров, в последствие это приводит к ошибкам при работе.
Так же из модуля менеджера обработки скопируем процедуру СформироватьПечатнуюФорм
В этом коде есть строка, где заполняется таблица сведений счета на оплату.
Эта таблица получается при помощи процедуры модуля менеджера объекта (в нашем случае это документ СчетНаОплатуПокупателю). Найдем эту процедуру в модуле менеджера документа СчетНаОплатуПокупателю.
И скопируем её в модель нашей внешней обработки.
А сам код процедуры СформироватьПечатнуюФорму в модуле внешней обработки исправим, убрав все не нужное от туда.
Если мы сейчас сделаем проверку модуля внешней обработки, то выйдет две ошибки. Первая, что не определена переменная ПараметрыПечати в процедуре Печать, и, что не найдена функция ПолучитьТекстЗапросаДляФормированияТаблицыСведенийСчетаНаОплату в функции ПолучитьТаблицуСведенийСчетаНаОплату.
Создадим переменную ПараметрыПечати в процедуре Печать. Это будет простая структура.
А потом найдем функцию ПолучитьТекстЗапросаДляФормированияТаблицыСведенийСчетаНаОплату в модуле менеджера документа СчетНаОплатуПокупателю и скопируем её в модуль внешней обработки.
Должен получится следующий состав процедур и функций модуля внешней обработки (для удобства я разделил их на две области).
Еще раз делаем проверку модуля. Ошибок не обнаружено.
Продолжаем, теперь нам необходимо, что бы брался наш макет, и печатался по нашей команде.
Нас интересует процедура СформироватьПечатнуюФорму, а в ней мы уделим внимание методу ПечатьСчетаНаОплату общего модуля ПечатьТорговыхДокументов.
Очевидно, она непосредственно формирует табличный документ. Перейдем в этот общий модуль, и скопируем функцию ПечатьСчетаНаОплату в модуль нашей внешней обработки.
Делаем проверку модуля внешней обработки. Ругается на несуществующие методы ВывестиЗаголовокПредупреждение и НомерСчетаНаОплату.
Переходим в общий модуль, от куда мы взяли функцию ПечатьСчетаНаОплату, находим процедуру ВывестиЗаголовокПредупреждение , и копируем ее в модуль внешней обработки.
А функция НомерСчетаНаОплату в общем модуле ПечатьТорговыхДокументов экспортная, поэтому мы просто исправим код в процедуре ПечатьСчетаНаОплату, где используется проблемная функция, сделав вызов этой функции из вышеупомянутого общего модуля.
Проверяем еще раз ошибки. Все нормально.
Не забудем в процедуре СформироватьПечатнуюФорму убрать вызов метода ПечатьСчетаНаОплату из общего модуля.
Теперь зайдем в скопированную функцию ПечатьСчетаНаОплату, и посмотрим, где в ней подтягивается макет.
Находим данный макет в общих макетах и копируем его в макеты нашей обработки.
Исправляем выделенный код, где подтягивается макет, следующий образом.
Теперь зайдем в наш скопированный макет, и сделаем какое-нибудь изменение, чтобы вы видели, что команда подтянула именно макет из внешней обработки.
Вернемся обратно в процедуру Печать нашей внешней обработки.
Идем в администрирование. В дополнительные отчеты и обработки.
Записываем. И смотрим, как выходит наша печатная форма.
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Вступайте в мои группы:
2 thoughts on “ Создание внешней печатной формы в типовых конфигурациях 1С 8.3 ”
Не суть так важно. Такая задача вероятно не так часто бывает. Но в любом случае внешние формы и т.п. наверное надо научиться делать.
Добрый день! В этой статье мы рассмотрим создание внешней печатной формы «Авансовый отчёт» на основании имеющейся «Авансовый отчёт (АО-1)» с помощью одной интересной и полезной функции 1С, «Замера производительности». Она позволяет, в том числе, отследить, какие блоки кода скомпилировались в ходе работы той или иной функции или процедуры. Преимущество внешних печатных форм заключается в том, что их можно настраивать или дорабатывать, изменять для конкретных нужд, в отличие от неизменяемой стандартной печатной формы.
Для начала, поскольку мы, всё-таки, создаём внешнюю печатную форму, потребуется создание внешней обработки. В левом верхнем углу ищем «Файл», далее «Новый» и жмём «Внешняя обработка» (рис. 1). Описанные ниже действия стандартны для создания внешней обработки.
Рисунок 1 Создание внешней обработки
Назначим нашей обработке имя и синоним и перейдём в модуль внешней обработки. Для этого снизу в меню процедуры нажмём на кнопку «Действия → Открыть модуль объекта» (рис. 2).
Рисунок 2 Открытие модуля объекта при создании внешней обработки
Затем в модуле объекта пропишем ряд типовых для всех внешних обработок функций и процедур (рис. 3-4).
Рисунок 3 Код в модуле объекта при создании внешней обработки
Рисунок 4 Пример кода в модуле объекта при создании внешней обработки
Сохраним полученную процедуру (нажмём сочетание клавиш Ctrl + S или перейдём в «Файл → Сохранить»).
Рисунок 5 Сохранение при создании внешней обработки
Выбираем нужную локацию и сохраняем.
Далее начинается самое интересное. Вернёмся к нашему модулю объекта. Поставим точку останова (нажав F9) около любой строки кода в модуле объекта и начинаем отладку (нажав F5 или через «Отладка → Начать отладку») (рис. 6).
Рисунок 6 Запуск отладки – первый шаг при создании внешней печатной формы
После этого открываем нужный нам объект, для которого мы создаём данную обработку. В нашем случае это документ «Авансовые отчёты».
2. Использование Замера производительности
При всё также запущенной программе 1С:Предприятие 8 переключаемся в режим Конфигуратора. Всё в том же меню «Отладка» жмём «Замер производительности» (рис. 7).
Рисунок 7 Запуск Замера производительности
Затем переходим обратно на уже запущенный режим версии 1С:Предприятия 8, жмём пункт «Печать» и выбираем ту стандартную обработку, на основе которой будет создаваться наша. В нашем случае это «Авансовый отчёт АО-1» (рис. 8). Жмём на неё.
Рисунок 8 Стандартная обработка Авансового отчета АО-1
Открылась стандартная (встроенная) печатная форма (рис. 9).
Рисунок 9 Печатная форма Авансового отчета АО-1
Снова, не закрывая режим конфигурации 1С:Предприятия 8, переходим в режим Конфигуратора. Также как включали режим Замера производительности (рисунок 7), выключаем его.
Откроется таблица со всеми выполненными процедурами и функциями (рис. 10).
Рисунок 10 Результат замера производительности
Отсортируем результаты запроса по модулю – кликнем по любой строке и откроем модуль Менеджера нашего документа. Именно здесь, в основном, и формируются все необходимые процедуры и функции.
Найдём здесь процедуру, содержащую код запроса (обычно именно через код запроса формируется то, что будет на печатной форме). В данном случае она называется «ПечатьАвансовогоОтчета» (рис. 11). Откомпилированные процедуры и функции помечаются серым значком слева.
Рисунок 11 Функция ПечатьАвансовогоОтчета в программе 1С:Предприятие 8
Копируем её в нашу обработку (рис. 12), кроме последних строк. В данном случае они нам не пригодятся (рис. 13).
Рисунок 12 Функция ПечатьАвансовогоОтчета в программе 1С:Предприятие 8 в нашей обработке
Рисунок 13 Строки кода из ПечатьАвансовогоОтчета не для копирования
Теперь всё в том же модуле менеджера найдём процедуру, ответственную за непосредственно вывод на печать (рис. 14). Здесь нас интересует блок печати авансового отчёта М4.
Рисунок 14 Печать Авансового отчета АО-1
Копируем и вставляем в нашу обработку эту процедуру, убрав из передаваемых значений ПараметрыПечати (это важно!), оставляем только блок авансового отчёта (рис. 15)
Рисунок 15 Блок АвансовыйОтчет в программе 1С:Предприятие 8
Далее заменим имя макета «Аванс_Отчет» на то имя макета, который прописали в своей обработке. Ищем функцию «СведенияОВнешнейОбработке», в ней – пункт «ДобавитьКоманды» и наш идентификатор. Это прописанная слитно, с заглавными буквами фраза (рис. 16).
Рисунок 16 Задаем имя макета в программе 1С:Предприятие 8
Оттуда же берём синоним макета (фраза с пробелами, скобками) (рис. 17), которым мы заменяем фразу «Авансовый отчет» в процедуре «Печать».
Рисунок 17 В данном случае синонимом макета является фраза «Авансовый отчёт (внешняя обработка)»
Вот так наш изменённый блок кода выглядит в процедуре «Печать» теперь (рис. 18).
Рисунок 18 Текущий код в процедуре печать в программе 1С:Предприятие 8
Как мы видим, процедура «Печать» также обращается к некоему макету «ПФ.MXL_АвансовыйОтчет». Найдём его в нашем конфигураторе в макетах документа АвансовыйОтчет (рис. 19).
Рисунок 19 Макет «ПФ.MXL_АвансовыйОтчет» у документа «АвансовыйОтчет»
Теперь просто скопируем (перетащим) макет с документа в нашу обработку (рис. 20).
Рисунок 20 Перенесённый макет документа при создании внешней печатной формы в 1С
Затем «отсоединим» в нашей обработке (рис. 21) макет от документа, сделав его независимым (в противном случае наша обработка будет всегда обращаться только к макету в конфигурации, игнорируя наш, измененные / добавленные поля там и проч). Для этого в процедуре «Печать» просто убираем фразу «Документ.АвансовыйОтчет» (рис. 22).
Рисунок 21 Неизменная процедура при создании внешней печатной формы в 1С
Рисунок 22 Итоговая процедура при создании внешней печатной формы
Сохраняем обработку (Ctrl+S). Как мы видим, сохраниться не даёт ошибка (рис. 23) о том, что не хватает процедуры «ПолучитьДанныеДокументов».
Рисунок 23 Ошибка об отсутствии процедуры или функции при создании внешней печатной формы
Найдём её в модуле менеджера документа «Авансовый отчёт» (рис. 24) и скопируем в нашу обработку. Сохраняем обработку (Ctrl+S).
Рисунок 24 Функция ПолучитьДанныеДокумента в программе 1С:Предприятие 8
Теперь нам нужно добавить в обработку реквизит (в нашем случае он называется «СсылкаНаОткрываемыйДокумент»). Важно, чтобы его длина не была неограниченной – ставим 30 символов. Тип – «ДокументСсылка». Далее требуется добавить форму и вывести созданный реквизит на форму, далее – создать команду (у нас это «Открыть документ») и также вынести её на форму. Зачем это нужно? В дальнейшем это позволит открывать созданную процедуру в программе 1С:Предприятие 8 через «Файл → Открыть», что гораздо быстрее, чем регистрировать её в разделе «Администрирование» после каждого внесённого изменения.
В итоге у нас получилась форма с реквизитом и кнопкой-командой (рис. 25).
Рисунок 25 Итог создания печатных форм
Создадим действие команды (на клиенте и процедуру на сервере) (рис. 26).
Рисунок 26 Создание команд при создании печатных форм в 1С
Перейдём в модуль формы, где пропишем следующий код:
Рисунок 27 Код в модуле при создании печатной формы в 1С
Уберём «ОбъектыПечати» (иначе обработка будет ругаться на слишком большое количество передаваемых элементов), а также сделаем функцию экспортной (чтобы код из модуля объекта мог обращаться к ней).
Рисунок 28 Изменения в функции при создании внешних печатных форм
И допишем наш код из рисунка 27 (рис. 29).
Рисунок 29 Итоговый код при создании внешних печатных форм в 1С 8.3
Сохраняем процедуру (Ctrl+S), снимаем точки останова в модуле объекта, которые мы ставили ранее (рис. 30).
Рисунок 30 Удаление точек останова при создании внешних печатных форм
В запущенном режиме программы 1С:Предприятия 8 откроем нашу процедуру, притом не долгим путём (через регистрацию в Администрировании), а через «Файл → Открыть» (рис27). Открываем обработку из той локации, где мы её сохранили.
Рисунок 31 Открытие созданной обработки в программе 1С:Предприятие 8
Игнорируем предупреждение безопасности, жмём «Да» (рис. 32).
Рисунок 32 Предупреждение безопасности в программе 1С:Предприятие 8
Выберем нужный документ (рис. 33), жмём кнопку «Открыть документ».
Рисунок 33 Выбор нужного документа в программе 1С:Предприятие 8
3. Изменение обработки после создания внешней печатной формы
Вуаля! Наша обработка полностью повторяет стандартную (рис. 34), однако стандартную мы менять не можем, а созданную нами – можем.
Рисунок 34 Документ выведенный на печать в программе 1С:Предприятие 8
После всех изменений и создание внешней печатной формы в 8.3, которые будут внесены в код обработки, изменений макета и прочих действий, нужных при решении конкретных задач, обработку можно будет «встроить» в 1С. Сначала, в главном меню обработки, отключим форму обработки, нажав на крестик справа (рис. 35-36).
Рисунок 35 Отключение формы обработки в программе 1С:Предприятие 8
Рисунок 36 Отключение формы обработки
После этого в меню слева спускаемся вниз до вкладки «Администрирование». В меню «Настройки программы» ищем пункт «Печатные формы, отчёты и обработки» (рис. 37).
Рисунок 37 Печатные формы, отчеты и обработки
Потом переходим на вкладку «Дополнительные отчёты и обработки» (рис. 38).
Рисунок 38 Дополнительные отчеты и обработки в программе 1С:Предприятие 8
Здесь сохранены все имеющиеся внешние обработки. Загрузим нашу обработку, нажав «Добавить из файла» (рис. 39).
Рисунок 39 Загрузка файла в программе 1С:Предприятие 8
Игнорируем предупреждние безопасности (рис 40) и заходим в локацию, где мы сохранили нашу обработку, дважды кликаем по ней.
Рисунок 40 Предупреждение о безопасности в 1С:Предприятие, редакция 3.0
Жмём «Записать и закрыть» (рис. 41).
Рисунок 41 Обработка перед записью в программе 1С:Предприятие 8
Далее её можно будет вызвать из меню «Печать» у документа (в нашем случае «Авансового отчёта») (рис. 42).
Рисунок 42 Вызываем обработку после создания внешней печатной формы в 1С 8.3
Рисунок 43 Итоговая обработка после создания внешней печатной формы в 1С
Читайте также: