Как использовать параметрывывода во внешней обработке 1с
Пытаюсь вывести макет на печать, но почему-то процедура печать не запускается и поэтому выводится просто пустая страница. Вот код:
Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = Новый Структура; МассивНазначений = Новый Массив; МассивНазначений.Добавить("Справочники.Партнеры"); //Указываем документ к которому делаем внешнюю печ. форму ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //может быть - ПечатнаяФорма, ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов. ПараметрыРегистрации.Вставить("Назначение", МассивНазначений); ПараметрыРегистрации.Вставить("Наименование", "Договор-Поставки (Внешняя)"); //имя под которым обработка будет зарегестрирована в справочнике внешних обработок ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ); ПараметрыРегистрации.Вставить("Версия", "1.0"); ПараметрыРегистрации.Вставить("Информация", "Изготовлено wpg"); ТаблицаКоманд = ПолучитьТаблицуКоманд(); ДобавитьКоманду(ТаблицаКоманд, "Договор-Поставки (Внешняя)", "ДоговорПоПоставкам", "ОткрытиеФормы", Истина, "ПечатьMXL"); ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); Возврат ПараметрыРегистрации; КонецФункции
Функция ПолучитьТаблицуКоманд() Команды = Новый ТаблицаЗначений; Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));//как будет выглядеть описание печ.формы для пользователя Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); //имя макета печ.формы Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); //ВызовСерверногоМетода Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка")); Возврат Команды; КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "") НоваяКоманда = ТаблицаКоманд.Добавить(); НоваяКоманда.Представление = Представление; НоваяКоманда.Идентификатор = Идентификатор; НоваяКоманда.Использование = Использование; НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение; НоваяКоманда.Модификатор = Модификатор; КонецПроцедуры
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию( КоллекцияПечатныхФорм, "ДоговорПоПоставкам", "Договор-Поставки (Внешняя)", СформироватьПечатнуюФорму(МассивОбъектов[0], ОбъектыПечати)); КонецПроцедуры // Печать
Функция СформироватьПечатнуюФорму(СсылкаНаДокумент, ОбъектыПечати) ТабличныйДокумент = Новый ТабличныйДокумент; ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ДоговорПоПоставкам"; МакетОбработки = ПолучитьМакет("Макет_ДоговорПоставки"); ОбластьШапки = МакетОбработки.ПолучитьОбласть("Шапка"); Сообщить("123"); ОбластьШапки.Вставить("Пункт0_2","-"); ОбластьШапки.Параметры.Пункт0_2 = "-"; ТабличныйДокумент.Вывести(ОбластьШапки); ТабличныйДокумент.АвтоМасштаб = Истина; Возврат ТабличныйДокумент; КонецФункции
Сделайте код поменьше и добейтесь, что он просто вызывается, а потом уже добавляйте плюшки типа
Разработка внешней печатной формы с формой диалога ввода параметров, 1С БСП 3.1.9
«Обратная совместимость? Неее, не слышали )». После обновления на последние релизы во многих типовых конфигурациях (например ЗУП 3.1.27) ломаются древние внешние печатные формы, из-за сущности «КоллекцияПечатныхФорм». Причина в новом БСП 3.1.9, а значит фирма 1С решила снова взбодрить программистов и пришло время освежить всем свои шпаргалки.
В качестве примера разработаем внешнюю печатную форму для элемента справочника ‘Сотрудники’. Создаём новую внешнюю обработку (epf). Весь код будет размещён в 3-х разных местах.
Модуль объекта
Стандартное описание внешней обработки, согласно спецификации БСП:
#Область ПрограммныйИнтерфейс_ПодсистемаПечатьБСП Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(); ПараметрыРегистрации.Назначение = СтрРазделить("Справочник.Сотрудники", ",", Ложь); ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма(); ПараметрыРегистрации.Версия = "1.0.0.1"; ПараметрыРегистрации.БезопасныйРежим = Ложь; ПараметрыРегистрации.Наименование = НСтр("ru = 'Доп соглашение'"); НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(); НоваяКоманда.Представление = НСтр("ru = 'Доп соглашение'"); НоваяКоманда.Идентификатор = "ид_ДопСоглашение"; НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода(); НоваяКоманда.ПоказыватьОповещение = Истина; НоваяКоманда.Модификатор = "ПечатьMXL"; Возврат ПараметрыРегистрации; КонецФункции
В описании важно указать, что вид обработки это ‘Печатная Форма’, а вид использования команды — ‘Вызов Клиентского Метода’. Идентификатор команды позднее будет передаваться подсистеме печати БСП в качестве наименования макета.
Продолжим в модуле объекта, добавим предопределенную в библиотеке БСП экспортную процедуру Печать: здесь нужно только поменять идентификатор макета на свой, можно поиграться с параметрами вывода, остальное это стандартный код:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода = Неопределено) Экспорт ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина; Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ид_ДопСоглашение") Тогда УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию( КоллекцияПечатныхФорм, "ид_ДопСоглашение", НСтр("ru='Доп соглашение'"), ПечатьДоговора(МассивОбъектов, ОбъектыПечати) ); КонецЕсли; КонецПроцедуры #КонецОбласти
Далее пишем свою функцию, непосредственно формирующую печатную форму с типом значения ТабличныйДокумент:
Функция ПечатьДоговора(МассивОбъектов, ОбъектыПечати) Макет = ПолучитьМакет("Макет"); ТабДокумент = Новый ТабличныйДокумент; ТабДокумент.КлючПараметровПечати = "ПараметрыПечати_ДопСоглашение"; // МассивОбъектов - это массив структур с параметрами, которые мы будем формировать // сами в дополнительной форме диалога перед печатью Для Каждого Парам Из МассивОбъектов Цикл Если Парам.Печать = Истина Тогда Сотрудник = Парам.Сотрудник; ТекстДопСоглашения = Парам.ТекстДопСоглашения; /////// здесь заполняем табличный документ по своему усмотрению //////// КонецЕсли; КонецЦикла; Возврат ТабДокумент; КонецФункции
Основная форма обработки
Создаем новую форму обработки, назовём её Клиентский метод и обязательно назначаем основной формой:

В форме ничего не рисуем, никаких реквизитов и команд не добавляем. Требуется добавить лишь предопределённые стандартом БСП параметры, которые нужно пометить как ключевые:
Подсистема печати библиотеки БСП будет искать в модуле этой формы экспортную процедуру Печать. В общем-то содержимое всего этого модуля стандартное и можно копипастить из проекта в проект. Различие только в том, хотим ли мы обрабатывать множественный выбор при печати из формы списка. В моем примере не хотим:
#Область ПрограммныйИнтерфейс_БСП &НаКлиенте Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт Если ОбъектыНазначенияМассив.Количество() > 1 Тогда ОбщегоНазначенияКлиент.СообщитьПользователю("Печатная форма не предназначена для множественного выбора объектов. Выберите только один!"); Возврат; КонецЕсли; ПараметрыФормы = Новый Структура("Сотрудник", ОбъектыНазначенияМассив[0]); ОткрытьФорму("ВнешняяОбработка.ДопСоглашение.Форма.ФормаВвода", ПараметрыФормы. Новый ОписаниеОповещения("ПечатьЗавершение", ЭтаФорма), РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс ); КонецПроцедуры #КонецОбласти #Область СлужебныеПроцедурыИФункции &НаКлиенте Процедура ПечатьЗавершение(Результат, ДополнительныеПараметры) Экспорт Если Результат <> Неопределено Тогда Если Результат.Печать Тогда ВыполняемаяКоманда = Параметры; ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника, КоллекцияПечатныхФорм"); ПараметрыОткрытия.ИсточникДанных = Параметры.ДополнительнаяОбработкаСсылка; ПараметрыОткрытия.ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения"); ПараметрыОткрытия.ПараметрыИсточника.ИдентификаторКоманды = ВыполняемаяКоманда.ИдентификаторКоманды; ДополнительныеПараметры = Новый Структура("СтруктураПараметров", Результат); ОбъектыНазначения = Новый Массив; ОбъектыНазначения.Добавить(Результат); // Ссылки на вызвавшие форму объекты Для каждого ОбъектНазначения Из ВыполняемаяКоманда.ОбъектыНазначения Цикл ОбъектыНазначения.Добавить(ОбъектНазначения); КонецЦикла; ПараметрыОткрытия.ПараметрыИсточника.ОбъектыНазначения = ОбъектыНазначения; // Формирование КоллекцияПечатныхФорм СформироватьПечатныеФормы(ПараметрыОткрытия); // Открытие формы диалога ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия); КонецЕсли; КонецЕсли; КонецПроцедуры Процедура СформироватьПечатныеФормы(ПараметрыОткрытия) Результат = Неопределено; ОбъектыПечати = Новый СписокЗначений; ПараметрыВывода = Неопределено; УправлениеПечатью.ПечатьПоВнешнемуИсточнику( ПараметрыОткрытия.ИсточникДанных, ПараметрыОткрытия.ПараметрыИсточника, Результат, ОбъектыПечати, ПараметрыВывода ); ПараметрыОткрытия.КоллекцияПечатныхФорм = Общегоназначения.ТаблицаЗначенийВМассив(Результат); КонецПроцедуры #КонецОбласти
Форма диалога ввода параметров
Создаём новую форму, назовём её ФормаВвода. В качестве примера добавляем реквизиты с наименованиями Дата, Сотрудник и ТекстДопСоглашения. В модуле формы:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Дата = ТекущаяДатаСеанса(); // Инициализируем реквизит формы 'Дата' Сотрудник = Параметры.Сотрудник; // Получаем ссылку на сотрудника из формы 'Клиенский метод' // Пишем эту процедуру, если необходимо что-то еще заполнить исходя из параметров формы: ИнициализироватьДанные(); КонецПроцедуры &НаСервере Процедура ИнициализироватьДанные() /////// заполнение полей формы первоначальными данными ///////// ТекстДопСоглашения = . КонецПроцедуры
Добавляем новую команду с любым именем, например ВывестиНаПросмотр и в его обработчике пишем:
&НаКлиенте Процедура ВывестиНаПросмотр(Команда) ЭтаФорма.Закрыть(Новый Структура( "Сотрудник, Дата, ТекстДопСоглашения, Печать", Сотрудник, Дата, ТекстДопСоглашения, Истина )); КонецПроцедуры
Именно в этом обработчике команды и заполняем параметры, которые в итоге попадут в модуль объекта обработки в виде первого параметра предопределенной экспортной процедуры Печать с типом массив и именем МассивОбъектов.
Не добавляется внешняя обработка 1с?
Сделала внешнюю обработку и при попытке ее добавить выдает «Невозможно подключить дополнительную обработку из файла.
Возможно, она не подходит для этой версии программы.»
Работаю в демо управление торговлей
Подскажите, пожалуйста, что делать
Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = Новый Структура; МассивНазначений = Новый Массив; МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг"); //Указываем документ к которому делаем внешнюю печ. форму ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //может быть - ПечатнаяФорма, ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов. ПараметрыРегистрации.Вставить("Назначение", МассивНазначений); ПараметрыРегистрации.Вставить("Наименование", "ПечатнаяФормаНомер1"); //имя под которым обработка будет зарегестрирована в справочнике внешних обработок ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ); ПараметрыРегистрации.Вставить("Версия", "1.0"); ПараметрыРегистрации.Вставить("Информация", "Лизочка тестирует ВПФ"); ТаблицаКоманд = ПолучитьТаблицуКоманд(); ДобавитьКоманду(ТаблицаКоманд, "Печатная форма номер 1", "ПечатнаяФормаНомер1", "ВызовСерверногоМетода", Истина, "ПечатьMXL"); ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); Возврат ПараметрыРегистрации; КонецФункции Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "") НоваяКоманда = ТаблицаКоманд.Добавить(); НоваяКоманда.Представление = Представление; НоваяКоманда.Идентификатор = Идентификатор; НоваяКоманда.Использование = Использование; НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение; НоваяКоманда.Модификатор = Модификатор; КонецПроцедуры Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "ПечатнаяФормаНомер1", "Печатная форма номер 1", СформироватьПечатнуюФорму(МассивОбъектов[0], ОбъектыПечати)); КонецПроцедуры // Печать() Функция СформироватьПечатнуюФорму(СсылкаНаОбъект, ОбъектПечати) ТабличныйДокумент = Новый ТабличныйДокумент; МакетОбработки = ПолучитьМакет ("МакетНомер1"); ОбластьШапки = МакетОбработки.ПолучитьОбласть("Шапка"); ТабличныйДокумент.Вывести(ОбластьШапки); ОбластьСтроки = МакетОбработки.ПолучитьОбласть("СтрокаТЧ"); Для каждого ТекущаяСтрока из СсылкаНаОбъект.Товары Цикл ОбластьСтроки.Параметры.Товар = ТекущаяСтрока.Номенклатура; ОбластьСтроки.Цена = ТекущаяСтрока.Цена; ОбластьСтроки.Параметры.Количество = ТекущаяСтрока.Количество; ОбластьСтроки.Параметры.Сумма = ТекущаяСтрока.Цена; ТабличныйДокумент.Вывести(ОбластьСтроки); КонецЦикла; ОбластьПодвала = МакетОбработки.ПолучитьОбласть("Подвал"); ОбластьПодвала.Параметры.Ответсвенный = СсылкаНаОбъект.Ответственный ; ОбластьПодвала.Параметры.СуммаИтого = СсылкаНаОбъект.Товары.Итог("Сумма") ; ТабличныйДокумент.Вывести(ОбластьПодвала); Возврат ТабличныйДокумент; КонецФункции
- Вопрос задан более трёх лет назад
- 5002 просмотра
# Разработка внешних печатных форм для 1С 8.3
Типовые решения 1С разработаны на базе Библиотеки стандартных подсистем (БСП). БСП предоставляет набор универсальных функциональных подсистем. Одна из подсистем — «Дополнительные отчеты и обработки». Данный функционал позволяет без изменения конфигурации добавить новую печатную форму для документа или справочника.
Внешняя печатная форма — это обработка 1С (файл с расширением epf), в модуле которой прописаны стандартные экспортные функции и процедуры.
# Функция СведенияОВнешнейОбработке()
Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.5.221"); ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма(); МассивНазначений = Новый Массив; МассивНазначений.Добавить("Документ.РеализацияТоваров"); ПараметрыРегистрации.Вставить("Назначение", МассивНазначений); ПараметрыРегистрации.Версия = "21.12.16"; НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(); НоваяКоманда.Представление = "Реализация товаров (доработанная)"; НоваяКоманда.Идентификатор = "РеализацияТоваровДоработанная"; НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(); НоваяКоманда.ПоказыватьОповещение = Истина; Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина); ПараметрыРегистрации.Разрешения.Добавить(Разрешение); Возврат ПараметрыРегистрации; КонецФункции
# Функция Печать()
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт ТабличныйДокумент = ПечатьМассиваОбъектов(МассивОбъектов); УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию( КоллекцияПечатныхФорм, "РеализацияТоваровДоработанная", "Реализация товаров (доработанная)", ТабличныйДокумент ); КонецПроцедуры Функция ПечатьМассиваОбъектов(МассивОбъектов) ТабДок = Новый ТабличныйДокумент; Для каждого Ссылка из МассивОбъектов Цикл ПечатьОбъекта(ТабДок, Ссылка); КонецЦикла; Возврат ТабДок; КонецФункции Процедура ПечатьОбъекта(ТабДок, Ссылка) // Заполнение Табличного документа с использованием // конструктора запроса с обработкой результата КонецПроцедуры
# Формирование табличного документа

Простейший макет и его заполнение проще всего разработать используя «Конструктор запроса с обработкой результата».
В простейшем случае запросом выбираются нужные поля объекта, отбор задается по ссылке.
ВЫБРАТЬ РеализацияТоваров.Номер КАК Номер, РеализацияТоваров.Дата КАК Дата ИЗ Документ.РеализацияТоваров КАК РеализацияТоваров ГДЕ РеализацияТоваров.Ссылка = &Ссылка
# Отладка внешней печатной формы
Отладку печатной формы легче всего осуществлять без подключения обработки, через Файл — Открыть. Для этого необходимо создать простейшую Форму обработки с ссылочным реквизитом ОбъектСсылка и кнопкой «ПечатьОбъекта» с обработчиком следующего содержания.
&НаКлиенте Процедура ПечатьОбъекта(Команда) ТабДок = Новый ТабличныйДокумент; ПечатьОбъектаНаСервере(ТабДок); ТабДок.Показать(); КонецПроцедуры &НаСервере Процедура ПечатьОбъектаНаСервере(ТабДок) ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); ОбработкаОбъект.ПечатьОбъекта(ТабДок, ОбъектСсылка); КонецПроцедуры