В некоторых случаях перед печатью документа требуется вручную указать какие-либо значения или параметры и передать в процедуру Печать() обработки. Для конфигураций линии УТ 10.3, БП 2.0 есть возможность передачи параметров, а также возможность без особых ухищрений вызвать форму обработки перед печатью с последующим выводом результата печати в штатное окно. В конфигурациях на основе Библиотеки стандартных процедур (Управление торговлей 11, Розница 2, УНФ, Бухгалтерия предприятия 3 и прочие) предусмотрены способы вызова команды печати в виде «ОткрытиеФормы» или «ВызовКлиентскогоМетода», но в этом случае вывод сформированного табличного документа необходимо реализовывать самостоятельно.
Рассмотрим один из способов передачи параметров для печати, не претендующий на оригинальность, так как используются штатные процедуры БСП.
В качестве примера выбрана печать простой накладной для УТ 11.0.9.15 — УТ 11.3 с возможностью печати со скидками или без них.
Создадим внешнюю обработку с основной формой «Форма» и реквизитом, например, «ПечататьСкидки», значение которого требуется передать в процедуру Печать() модуля обработки.
На вкладке «Параметры» укажем ключевые параметры «ДополнительнаяОбработкаСсылка» тип «СправочникСсылка.ДополнительныеОтчетыИОбработки», «ИдентификаторКоманды» тип «Строка», «ИмяФормы» тип «Строка», «ОбъектыНазначения» тип «Произвольный» (см. скриншот). Эти параметры передаются в обработку из конфигурации, а именно из диалога выбора внешних печатных форм, ключевыми в нашем случае они сделаны для упрощения обработки.
Далее определяем команду для печати или вывода печатной формы, навешиваем кнопку на форму.
Присваиваем команде обработчик действия (код следует поместить в модуль формы)
&НаСервереБезКонтекста
Функция ЕстьОбщийМодуль(НазваниеМодуля)
Возврат Метаданные.ОбщиеМодули.Найти(НазваниеМодуля) <> Неопределено;
КонецФункции
&НаСервереБезКонтекста
Функция ПолучитьВерсиюБСП()
Возврат СтандартныеПодсистемыСервер.ВерсияБиблиотеки();
КонецФункции
&НаКлиенте
Процедура ВыполнитьОткрытиеПечатнойФормы(Команда)
ВыполняемаяКоманда = Параметры;
СтандартнаяОбработка = Истина;
//Проверка на релиз БСП для универсальности.
//Общий модуль ДополнительныеОтчетыИОбработкиКлиентПереопределяемый существует в версии БСП выше 2.0.1.19
Если ЕстьОбщийМодуль(«ДополнительныеОтчетыИОбработкиКлиентПереопределяемый») Тогда
Выполнить(«ДополнительныеОтчетыИОбработкиКлиентПереопределяемый.ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы(ВыполняемаяКоманда.ОбъектыНазначения, СтандартнаяОбработка);»);
КонецЕсли;
Отказ = Ложь;
//Проверка на релиз БСП для универсальности.
//Если необходимо печатать из непроведённых документов, удалите этот фрагмент
ВерсияБСП = ПолучитьВерсиюБСП();
Если СравнитьВерсии(ВерсияБСП, «2.2.3») >= 0 Тогда
Выполнить(«СписокДокументов = ВыполняемаяКоманда.ОбъектыНазначения;
|НепроведенныеДокументы = ОбщегоНазначенияВызовСервера.ПроверитьПроведенностьДокументов(СписокДокументов);
|Если СтандартнаяОбработка И НепроведенныеДокументы.Количество() > 0 Тогда Отказ = Истина; КонецЕсли;
|»);
Иначе
Выполнить(«Если СтандартнаяОбработка И Не УправлениеПечатьюКлиент.ПроверитьДокументыПроведены(ВыполняемаяКоманда.ОбъектыНазначения) Тогда Отказ = Истина; КонецЕсли;»);
КонецЕсли;
Если Не Отказ Тогда
//Определение и заполнение штатных параметров для общей формы ПечатьДокументов
ПараметрыОткрытия = Новый Структура(«ИсточникДанных, ПараметрыИсточника»);
ПараметрыОткрытия.ИсточникДанных = ВыполняемаяКоманда.ДополнительнаяОбработкаСсылка;
ПараметрыОткрытия.ПараметрыИсточника = Новый Структура(«ИдентификаторКоманды, ОбъектыНазначения»);
ПараметрыОткрытия.ПараметрыИсточника.ИдентификаторКоманды = ВыполняемаяКоманда.ИдентификаторКоманды;
//Здесь передаём наши значения в модуль обработки.
//Структура для передачи параметров или значений в процедуру Печать обработки
//В процедуре печати она будет доступна в качестве первого элемента массива МассивОбъектовНазначения
ДополнительныеПараметры = Новый Структура();
//Значения для передачи
ДополнительныеПараметры.Вставить(«ПечататьСкидки», ЭтаФорма.ПечататьСкидки);
//Еще какие-то значения
//ДополнительныеПараметры.Вставить(«РеквизитФормы1», РеквизитФормы1);
//ДополнительныеПараметры.Вставить(«РеквизитФормы2», РеквизитФормы2);
//В массиве ОбъектыНазначения будут содержаться ссылки на вызвавший форму объект (документ, справочник)
// и наши значения из реквизитов формы или обработки
ОбъектыНазначения = Новый СписокЗначений;
ОбъектыНазначения.Добавить(ДополнительныеПараметры);
//Ссылки на вызвавшие форму объекты
Для каждого ОбъектНазначения Из ВыполняемаяКоманда.ОбъектыНазначения Цикл
ОбъектыНазначения.Добавить(ОбъектНазначения);
КонецЦикла; //Для каждого ОбъектНазначения Из
ПараметрыОткрытия.ПараметрыИсточника.ОбъектыНазначения = ОбъектыНазначения;
//Вывод сформированного табличного документа в штатную форму.
ОткрытьФорму(«ОбщаяФорма.ПечатьДокументов», ПараметрыОткрытия);
КонецЕсли;
ЭтаФорма.Закрыть();
КонецПроцедуры
В модуле обработки создаём экспортную процедуру Печать(), с параметрами согласно стандартам БСП для печати с использованием серверной процедуры примерно такого вида
// Экспортная процедура печати, вызываемая из основной программы
//
// Параметры:
// ВХОДЯЩИЕ:
// МассивОбъектовНазначения — Массив — список объектов ссылочного типа для печати документа
// Как правило, содержит один элемент с ссылкой на вызвавший форму объект (документ, справочник)
//
// ИСХОДЯЩИЕ:
// КоллекцияПечатныхФорм — ТаблицаЗначений — таблица сформированных табличных документов.
// Как правило, содержит одну строку с именем текущей печатной формы
// ОбъектыПечати — СписокЗначений — список объектов печати.
// ПараметрыВывода — Структура — Параметры сформированных табличных документов. Содержит поля:
// ДоступнаПечатьПоКомплектно — булево — по умолчанию Ложь
// ПолучательЭлектронногоПисьма
// ОтправительЭлектронногоПисьма
//
Процедура Печать(МассивОбъектовНазначения, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;
//Получаем переданные из формы параметры для печати документа
//Из формы МассивОбъектовНазначения передаётся как список значений, поэтому преобразуем его в массив
Если ТипЗнч(МассивОбъектовНазначения) = Тип(«СписокЗначений») Тогда
МассивОбъектовНазначения = МассивОбъектовНазначения.ВыгрузитьЗначения();
КонецЕсли;
//Присваиваем значение по умолчанию нашему параметру, переданному из формы
ПечататьСкидки = Истина;
//Смотрим, что содержится в первом элементе массива МассивОбъектовНазначения
//Если это структура, значит есть дополнительные параметры, почти как в прежних конфигурациях
Если ТипЗнч(МассивОбъектовНазначения[0]) = Тип(«Структура») Тогда
ДополнительныеПараметры = МассивОбъектовНазначения[0];
Если ДополнительныеПараметры.Свойство(«ПечататьСкидки») Тогда
ПечататьСкидки = ДополнительныеПараметры.ПечататьСкидки;
КонецЕсли;
//А теперь структуру из массива объектов можно удалить, больше она там не нужна
МассивОбъектовНазначения.Удалить(0);
КонецЕсли;
//Дальше используем штатный функционал БСП
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, «РасходнаяНакладнаяСДиалогомВыбора») Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, «РасходнаяНакладнаяСДиалогомВыбора», «Расходная накладная», СформироватьПечатнуюФормуНакладная(МассивОбъектовНазначения, ОбъектыПечати, ПечататьСкидки));
КонецЕсли;
Реализация функции СформироватьПечатнуюФормуНакладная() зависит от конкретной задачи и здесь не рассматривается.
В экспортной функции СведенияОВнешнейОбработке() необходимо указать использование команды печати «ОткрытиеФормы» с модификатором «ПечатьMXL».
Подробнее смотрите статью Внешние обработки и отчеты 1С:Предприятие 8.2 или прилагаемый пример обработки.
//Определяем команды для печати формы
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд,
«Расходная накладная (с диалогом выбора)», // Представление команды в пользовательском интерфейсе
«РасходнаяНакладнаяСДиалогомВыбора», // Уникальный идентификатор команды
«ОткрытиеФормы», // Использование команды
Истина, // Показывать оповещение.
«ПечатьMXL» // Дополнительный модификатор команды.
);
В
Если всё сделано правильно, после регистрации внешней печатной формы в справочнике «ДополнительныеОбработки» она будет доступна из формы списка или документа в меню «Дополнительные печатные формы». После выбора из списка ВПФ на экране появится форма обработки.
Всё описанное выше изложено и прокомментировано в прилагаемой обработке.
Другой пример обработки можно скачать в Cпецификация на товар к договору с контрагентом — Бухгалтерия предприятия 3.0
Бухгалтерия предприятия, редакция 3.0 (3.0.26.11)
Все скопировал из Вашего описания. Функция СформироватьПечатнуюФормуНакладная() пустая, только создает ТабличныйДокумент и возвращает его. Поставил в этой функции Сообщить(«ааа»), сообщение не появилось, видимо она не выполнялась.
Результат работы, ошибка:
{Форма.ФормаПечати.Форма(83)}: Ошибка при вызове метода контекста (ОткрытьФорму)
http://v8.1c.ru/8.2/mngsrv/ws }val
http://v8.1c.ru/8.1/data/core }Value
http://v8.1c.ru/8.1/data/core }value
ОткрытьФорму(«ОбщаяФорма.ПечатьДокументов», ПараметрыОткрытия);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства ‘val’:
форма: Элемент
имя: {
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства ‘Value’:
форма: Элемент
имя: {
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства ‘value’:
форма: Элемент
имя: {
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства ‘Value’:
форма: Элемент
(1) Откуда мне знать, куда вы что скопировали и как что сделали.
(1) Добавил печатную форму с выбором для Бухгалтерии предприятия 3.0. Ссылку найдёте в описании. Учитесь.
Ещё одна обработка с использованием методики.
http://infostart.ru/public/248458/
Внешняя печатная форма «Счет на оплату покупателю» для БУ 3.0 с ручным выбором параметров
Небольшие изменения в обработке для БСП недавних релизов.
Отлично! Спасибо!
Небольшие изменения в обработке для БСП недавних релизов.?????????
А что за изменения, а то моя обработка вдруг перестала работать
выдает ошибку МЕТОД ОБЪЕКТА НЕ ОБНАРУЖЕН (МЕТАДАННЫЕ)
(7) Одноэсники через одного дятлы, точнее из трёх два дятла. И вот почему — что за обработка, какая конфигурация, типа протелепатируй, мне лень писать.
Короче, разбирайся сам как знаешь. Приложенная ВПФ нормально работает в Управление торговлей 11.0.9 — 11.1.4.
Большое спасибо за подсказанную методику по использованию общей формы ПечатьДокументов. У меня как раз с этим был затык, открытие формы для ввода параметров делается без проблем просто в описании сведений о внешней обработке
Обработка портирована для использования с БСП 2.2.3
Обработка портирована для использования с УТ 11.1.6
Поручик, спасибо большое за классную инструкцию. Хотелось бы уточнить:
1. Где можно почитать мануал про БСП, на ИТС разбирался с данной обработкой печати — ни хорошего примера, нифига не нашел.
2. Как отлаживать такую обработку?
Хорошо написано. Главное по делу и с примером.
Возможность то вызова есть
вот только никто не использует 🙁
В отраслевом ВДГБ Ломбард столкнулся. Печатные формы реализованы в виде отчета в конфигурации. Чтоб не передавать параметры (или, вернее чтоб передать параметр-объект документа, для вызова его (ДокументОбъекта) методов:
Показать
А уже от нажатой кнопки и как параметра «галочки» зависит вариант печати. Такой вот «штатный» механизм передачи параметров.
(12) davdykin, (12) davdykin, найти то в закрытке на ИТС, но там паролик нужен. Отдельно то конфигурация БСП поставляется как демка, но она, как и вся документация больше разработчикам в крупных фирмах нужна, где есть корпоративные стандарты.
И это только для разработчиков новых конфигураций. Все равно подстраиваться приходится под то что есть.
Автору спасибо.
Разжевано специально для ленивых программистов.
Спасибо за статью. Всё разжёвано, и при этом ни капли воды. То, что нужно.
Спасибо за статью, очень интересный метод.
Все верно. Кроме как таких «танцев с бубном» передать в обработку печати свое значение невозможно.
Почему в БСП процедура написана таким образом? Что мешает добавить еще один параметр для передачи произвольных значений в эту процедуру. Непонятно.
Если бы в процедуре печати была доступна ссылка на внешнюю обработку (справочник «ДополнительныеВнешниеОтчетыИОбработки»), то это облегчило бы жизнь.
Иногда бывает нужно печатать с доп.параметрами, но при этом не открывать предварительно диалоговое окно. Классический пример — печатная форма с какими-нибудь ответственными или должностями, которые меняются время от времени, но не часто. Вбивать их в макет — тупо, показывать каждый раз при печати тоже не айс.
Я использовал такой метод: сделал две команды печати, одна команда печатной формы — для настройки параметров печати, вторая команда — для печати с уже настроенными ранее параметрами.
Форма для настройки параметров открывается и сохраняет значения в реквизит «ХранилищеНастроек» справочника «ДополнительныеВнешниеОтчетыИОбработки».
Вторая команда (печать с готовыми настройками) при открытии имея ссылку на справочник «ДополнительныеВнешниеОтчетыИОбработки» читает сохраненные настройки и сразу уходит на печать не открывая форму.
Единственный недостаток такого метода — видимость двух команд печати в списке команд (с открытием формы и без). Победить можно, но это предмет отдельного поста, пожалуй.
При запуске печатной формы такие проблемы:
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(54)}: Поле объекта не обнаружено (БезопасныйРежим)
ВнешняяОбработкаОбъект = ПолучитьОбъектВнешнейОбработки(ИсточникДанных, ПараметрыИсточника.БезопасныйРежим);
Подскажите пжл куда копать?
(21) И как мне протелепатировать релиз используемой БСП или конфы? И какая именно обработка?
обработка — «Расходная накладная с диалогом выбора» (параметры в печатную форму передать нужно)
конфигурация — УТ11.0.6.9 платформа 8.3.5.1383
При выборе печатной формы с документа происходит открытие диалогового окна, после нажатия «печать» вываливается в данную ошибку.
(23) Спасибо, поржал. Вы бы ещё УТ 11.0.4 от 2010 года использовали. Со старой УТ разбирайтесь сами.
Благодарю, пригодилось!
Нашел, скачал, заработало.
Хороший пример!
УТ 11.1.9.66
А можно ли как-нибудь реализовать печать с выводом диалоговой формы при печати комплекта? Команда печати комплекта отличается от команды печати отдельной формы тем, что комплект подготавливается полностью серверной процедурой.
Имеется ввиду комплект, настраиваемый через форму «НастройкаПечатиКомплекта». Готовый комплект (список форм и их количество) печатаются модулем менеджера регистра НастройкаПечатиОбъектов (процедура СформироватьКомплектВнешнихПечатныхФорм). Я не знаю как вызвать форму (причем логично и удобней) один раз для всего комплекта. (это где то в БСП 2.1.9)
(27) Наверное, можно. Сам не интересовался
Работает ли подобный код в Бухгалтерии предприятия 3.0?
У меня возникает ошибка «Поле объекта не обнаружено(ИдентификаторКоманды)»
(29) С чего она у тебя возникает? Скачай обработку для БП 3.0 и сделай по образцу. Предварительно вкурись в матчасть.
Спасибо, хоть и не с первого раза, но всё получилось.
Спасибо ERP 2.0 все работает. Долго парился с задачей пока не нашел эту статью.
Отличная статья. Можно еще ВызовКлиентскогоМетода вместо ОткрытиеФормы опробывать, все равно в итоге общая форма .печатьдокументов вызывается.
Подскажите, как методами БСП вывести ВПФ документа (Акт) из произвольной обработки?
Сама ВПФ превосходно зарегистрирована и печатается из самого документа, а вот из обработки/другого документа (Реализация) не получается.
Разобрался. При вызове общей формы «ПечатьДокументов» в качестве «ПараметрыОткрытия.ИсточникДанных» передал Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(Моя_ВПФ).
Добрый день,
Очень интересная и разжеванная статья!
Подскажите как модуле формы обработки можно получить ссылку на документ? Мне необходимо вывести для пользователя некоторые реквизиты из документа.
(35)
Передо мной стояла аналогичная задача и я решил её таким же способом — посредством передачи параметра в первом элементе массива ОбъектыНазначения. Решение не очень красивое, но работает и альтернативы ему я не вижу. Жаль что 1С не предоставила удобного механизма решения этой задачи.
Добрый вечер!
Подскажите пожалуйста: у вас в форме обработки есть реквизит ТаблицаНоменклатуры, в которую попадает номенклатура из документа, и можно установить пометку. А как сделать так, чтоб в печатную форму попадала только помеченная номенклатура? У меня аналогичная задача. С обычными реквизитами все ок, а вот с тз что-то никак (((
(38) Только помеченная и попадает, что не так?
(38)https://infostart.ru/public/73548/
ТоварныйЧек для УТ 11078 (с выбором товара).epf — для Управление Торговлей 11.0.7.8 и позднее (для документов Чек ККМ, реализация товаров/услуг, заказ клиента) с формой выбора позиций для печати
(39) Странно, попадает вся. Приложу скриншоты, чтоб не быть голословным. УТ 11.3.4.103
Использовал Вызов клиентского метода. В форме обработки в процедуре Печать(ИдентификаторКоманды,ОбъектыНазначения) Экспорт
На кнопку Выполнить формы повесил команду, в ней написал
https://infostart.ru/public/310553/
ОбъектыНазначения = ПолучитьИзВременногоХранилища(ЭтаФорма.КлючУникальности);
Через реквизиты формы(обработки) достал нужные данные (ЭтаФорма.Объект.ИмяРеквизита)
А как перед печатью ВПФ задать вопрос и по ответу печатать ту или иную форму (без кнопочки печать)
ошибка как в первом посте «Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.» может возникнуть, когда в список в качестве значения добавляется элемент списка, а не его значение. Надо тогда исправить следующую строчку:
Спасибо большое за подробное объяснение! Всё получилось.
Спасибо)