Печатная форма 1С — это табличный документ, который программа собирает по данным документа или справочника и показывает перед печатью: накладная, счёт, акт, этикетка. Пользователь видит одну кнопку «Печать», а внутри работает цепочка из четырёх звеньев: команда, серверная процедура, макет и табличный документ. Ниже — схема целиком, сравнение трёх способов добавить свою форму (в конфигурации, в расширении, внешним файлом) и рабочий пример для конфигураций на БСП 3.1.
В управляемом приложении печатная форма 1С 8.3 проходит один и тот же путь, есть в конфигурации БСП или нет:
Запрос, поэтому ссылки сразу уходят на сервер, обычно в модуль менеджера документа.ТабличныйДокумент. Результат возвращается на клиент, где его печатают или сохраняют в PDF и Excel.Устройство макета — области, параметры, режимы заполнения ячеек — разобрано в статье о создании макета печатной формы в конструкторе, а объект, в который всё выводится, — в руководстве по табличному документу.
В конфигурации без Библиотеки стандартных подсистем всё собирается руками. У документа создают команду, указывают тип параметра — ссылку на этот документ — и режим использования параметра «Множественный», чтобы команда работала и из списка. Модуль команды получается коротким:
// Модуль команды ПечатьНакладной документа РасходнаяНакладная (конфигурация без БСП).
// Свойства команды: тип параметра - ДокументСсылка.РасходнаяНакладная,
// режим использования параметра - Множественный.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ТабДок = СформироватьНаСервере(ПараметрКоманды);
ТабДок.ОтображатьСетку = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.ТолькоПросмотр = Истина;
ТабДок.Показать(НСтр("ru = 'Расходная накладная'"));
КонецПроцедуры
&НаСервере
Функция СформироватьНаСервере(МассивСсылок)
// Запрос, макет и вывод областей - в модуле менеджера документа.
Возврат Документы.РасходнаяНакладная.ПечатнаяФорма(МассивСсылок);
КонецФункции
Экспортная функция ПечатнаяФорма(МассивСсылок) в модуле менеджера устроена как ПечатьНакладной из примера ниже, только макет берётся через ПолучитьМакет("Накладная") и нет вызовов БСП. Заготовку такого кода генерирует «Конструктор печати» в конфигураторе.
В типовых конфигурациях на БСП (Бухгалтерия 3.0, УТ 11, КА 2, ERP 2, УНФ) команду печати в дереве метаданных не создают. Модуль менеджера документа отвечает подсистеме «Печать» на два вопроса:
ДобавитьКомандыПечати(КомандыПечати) — какие пункты показать в меню «Печать»;Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) — какие табличные документы сформировать по выбранной команде.Остальное делает библиотека: строит подменю «Печать» через подсистему «Подключаемые команды», проверяет проведение, открывает окно предпросмотра с количеством копий, сохранением в файл и отправкой по почте, а если пользователь правил макет в режиме предприятия, подставляет его версию.
Свои печатные формы документов в 1С добавляют тремя способами. Логика формирования — запрос, макет, вывод областей — везде одна, разница в том, где хранится код и что происходит при обновлении типовой конфигурации.
| Способ | Где код и макет | Обновление типовой | Когда выбирать |
|---|---|---|---|
| В конфигурации | Модуль менеджера документа и макет документа | Изменённый объект требует ручного сравнения при каждом обновлении | Своя конфигурация или объект уже снят с поддержки |
| Расширение конфигурации | Файл расширения (.cfe): заимствованный документ и своя обработка | Типовая обновляется штатно, расширение проверяют после обновления | Несколько связанных доработок: печать, новые реквизиты, права |
| Внешняя печатная форма | Файл .epf в справочнике «Дополнительные отчеты и обработки» | Не мешает обновлению | Одна-две формы, которые администратор подключает и заменяет сам |
Для владельца базы коротко: правка прямо в типовой конфигурации означает, что каждое обновление будет стоить времени программиста. Расширение и внешняя обработка этого избегают. У внешней формы своя обвязка кода — отличия разобраны ниже.
Пример для нетипового документа РасходнаяНакладная с реквизитами Организация, Контрагент, СуммаДокумента и табличной частью Товары. Имена условные — подставьте свои. Порядок работы:
ПФ_MXL_Накладная. Префикс ПФ_MXL_ — соглашение БСП: по нему макет попадает в список «Макеты печатных форм», где его можно поправить без конфигуратора. Разметьте области «Шапка», «ШапкаТаблицы», «Строка», «Подвал» и заведите параметры: ЗаголовокДокумента, Организация, Контрагент, НомерСтроки, Номенклатура, Количество, Цена, Сумма, СуммаДокумента, СуммаПрописью.УправлениеПечатьюПереопределяемый. В БСП 3.1.4 и новее это процедура ПриОпределенииНастроекПечати, а в модуле менеджера нужна одноимённая процедура с флагом ПриДобавленииКомандПечати — она есть в основном листинге. В более ранних версиях документ добавляют в процедуру ПриОпределенииОбъектовСКомандамиПечати, которая теперь считается устаревшей.ПриСозданииНаСервере вызовите ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект) и добавьте клиентские обработчики Подключаемый_… по инструкции внедрения подсистемы «Подключаемые команды» вашей версии. В типовых формах это уже сделано.// Общий модуль УправлениеПечатьюПереопределяемый (фрагмент), БСП 3.1.4 и новее.
Процедура ПриОпределенииНастроекПечати(Настройки) Экспорт
// ... строки, которые уже есть в конфигурации ...
Настройки.ОбъектыПечати.Добавить(Документы.РасходнаяНакладная);
КонецПроцедуры
// В более ранних версиях БСП та же строка добавляется
// в процедуру ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов):
// СписокОбъектов.Добавить(Документы.РасходнаяНакладная);
Модуль менеджера документа целиком:
// Модуль менеджера документа РасходнаяНакладная.
// Конфигурация на БСП 3.1, документ зарегистрирован в подсистеме «Печать».
// У документа есть макет ПФ_MXL_Накладная с областями
// Шапка, ШапкаТаблицы, Строка, Подвал.
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
// Сообщает подсистеме «Печать», что у документа есть процедура
// ДобавитьКомандыПечати. Нужна в БСП 3.1.4 и новее, раньше не вызывается.
//
// Параметры:
// НастройкиОбъекта - Структура - настройки объекта для подсистемы «Печать».
//
Процедура ПриОпределенииНастроекПечати(НастройкиОбъекта) Экспорт
НастройкиОбъекта.ПриДобавленииКомандПечати = Истина;
КонецПроцедуры
// Заполняет список команд печати документа.
//
// Параметры:
// КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "Накладная";
КомандаПечати.Представление = НСтр("ru = 'Расходная накладная'");
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
КонецПроцедуры
// Формирует печатные формы по выбранной команде.
// Вызывается подсистемой «Печать» на сервере.
//
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Накладная") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
"Накладная",
НСтр("ru = 'Расходная накладная'"),
ПечатьНакладной(МассивОбъектов, ОбъектыПечати),
,
"Документ.РасходнаяНакладная.ПФ_MXL_Накладная");
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ПечатьНакладной(МассивОбъектов, ОбъектыПечати)
ТабличныйДокумент = Новый ТабличныйДокумент;
// Сначала значения по умолчанию, затем ключ: при установке ключа
// платформа подставляет настройки страницы, сохранённые пользователем.
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабличныйДокумент.АвтоМасштаб = Истина;
ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РасходнаяНакладная_Накладная";
// Учитывает правки макета, сделанные пользователем в режиме предприятия.
Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.РасходнаяНакладная.ПФ_MXL_Накладная");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Ссылка,
| Док.Номер КАК Номер,
| Док.Дата КАК Дата,
| Док.Организация КАК Организация,
| Док.Контрагент КАК Контрагент,
| Док.СуммаДокумента КАК СуммаДокумента
|ИЗ
| Документ.РасходнаяНакладная КАК Док
|ГДЕ
| Док.Ссылка В (&МассивОбъектов)
|
|УПОРЯДОЧИТЬ ПО
| Док.Дата,
| Док.Ссылка
|;
|
|ВЫБРАТЬ
| Товары.Ссылка КАК Ссылка,
| Товары.НомерСтроки КАК НомерСтроки,
| Товары.Номенклатура КАК Номенклатура,
| Товары.Количество КАК Количество,
| Товары.Цена КАК Цена,
| Товары.Сумма КАК Сумма
|ИЗ
| Документ.РасходнаяНакладная.Товары КАК Товары
|ГДЕ
| Товары.Ссылка В (&МассивОбъектов)
|
|УПОРЯДОЧИТЬ ПО
| Товары.Ссылка,
| Товары.НомерСтроки";
Результаты = Запрос.ВыполнитьПакет();
ВыборкаШапок = Результаты[0].Выбрать();
ТаблицаТоваров = Результаты[1].Выгрузить();
ПервыйДокумент = Истина;
Пока ВыборкаШапок.Следующий() Цикл
// Каждый документ комплекта печатается с новой страницы.
Если Не ПервыйДокумент Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ПервыйДокумент = Ложь;
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
ОбластьШапка.Параметры.Заполнить(ВыборкаШапок);
ОбластьШапка.Параметры.ЗаголовокДокумента = СтрШаблон(
НСтр("ru = 'Расходная накладная № %1 от %2'"),
ВыборкаШапок.Номер,
Формат(ВыборкаШапок.Дата, "ДЛФ=Д"));
ТабличныйДокумент.Вывести(ОбластьШапка);
ТабличныйДокумент.Вывести(ОбластьШапкаТаблицы);
Отбор = Новый Структура("Ссылка", ВыборкаШапок.Ссылка);
Для Каждого СтрокаТоваров Из ТаблицаТоваров.НайтиСтроки(Отбор) Цикл
ОбластьСтрока.Параметры.Заполнить(СтрокаТоваров);
ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
ОбластьПодвал.Параметры.Заполнить(ВыборкаШапок);
ОбластьПодвал.Параметры.СуммаПрописью = ЧислоПрописью(ВыборкаШапок.СуммаДокумента,
"Л = ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
ТабличныйДокумент.Вывести(ОбластьПодвал);
// Связывает строки табличного документа со ссылкой на документ.
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент,
НомерСтрокиНачало, ОбъектыПечати, ВыборкаШапок.Ссылка);
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции
#КонецОбласти
#КонецЕсли
ПриДобавленииКомандПечати = Истина — без этого флага БСП 3.1.4+ не вызовет ДобавитьКомандыПечати, даже если документ зарегистрирован в переопределяемом модуле.КомандаПечати.Идентификатор = "Накладная" — не просто имя команды. БСП передаёт его в КоллекцияПечатныхФорм как имя формы, поэтому та же строка должна стоять в НужноПечататьМакет и ВывестиТабличныйДокументВКоллекцию. Несколько имён через запятую в идентификаторе — и одна команда откроет комплект форм.ПроверкаПроведенияПередПечатью — непроведённый документ библиотека предложит провести, а не напечатает черновик.УправлениеПечатью.МакетПечатнойФормы вместо ПолучитьМакет — возвращает пользовательскую версию макета, если её правили в режиме предприятия. С ПолучитьМакет такие правки молча игнорируются.КлючПараметровПечати — под этим ключом платформа запоминает настройки страницы (поля, ориентацию, принтер), выбранные пользователем. Ключ ставят после ориентации и масштаба: если сделать наоборот, значения по умолчанию затрут сохранённые настройки.Параметры.Заполнить — переносит в область все параметры, имена которых совпадают с полями выборки. Лишние поля выборки не мешают.ЗадатьОбластьПечатиДокумента — помечает, какие строки табличного документа относятся к какой ссылке. БСП опирается на эту разметку, когда комплект нужно разделить по документам, например при отправке по почте.Чем отличаются способы получения макета и где хранятся общие макеты, подробно описано в статье про ПолучитьМакет и общие макеты.
Для типового документа на поддержке код переносят в расширение. Надёжная схема — не вмешиваться в типовую процедуру Печать, а завести в расширении свою обработку, которая будет «менеджером печати», и сослаться на неё из команды. В расширении заимствуют документ (например, РеализацияТоваровУслуг) и в модуле его менеджера пишут:
// Расширение конфигурации с префиксом Расш1_.
// Модуль менеджера заимствованного документа РеализацияТоваровУслуг.
&После("ДобавитьКомандыПечати")
Процедура Расш1_ДобавитьКомандыПечати(КомандыПечати)
КомандаПечати = КомандыПечати.Добавить();
// Формировать форму будет обработка из расширения, а не типовой модуль.
КомандаПечати.МенеджерПечати = "Обработка.Расш1_ПечатьДляСклада";
КомандаПечати.Идентификатор = "НакладнаяСклад";
КомандаПечати.Представление = НСтр("ru = 'Накладная для склада'");
КонецПроцедуры
Затем в расширении создают обработку Расш1_ПечатьДляСклада с макетом ПФ_MXL_НакладнаяСклад и кладут в модуль её менеджера экспортную процедуру Печать с пятью параметрами, как в основном примере, с идентификатором "НакладнаяСклад" и путём к макету "Обработка.Расш1_ПечатьДляСклада.ПФ_MXL_НакладнаяСклад". Если типовую процедуру Печать перепишут в следующем релизе, расширение этого не заметит. Перед заимствованием проверьте, что в модуле менеджера выбранного документа есть ДобавитьКомандыПечати, — иначе расширение не применится.
Запрос и вывод областей из основного примера переносятся во внешнюю обработку без изменений, а обвязка другая. У файла .epf нет модуля менеджера, поэтому процедура Печать лежит в модуле объекта и принимает четыре параметра — без ПараметрыПечати. Обработка сообщает о себе экспортной функцией СведенияОВнешнейОбработке(): вид «Печатная форма», документы, к которым она подключается, и команды. Макет берут из самой обработки через ПолучитьМакет: путь вида "Документ.РасходнаяНакладная.ПФ_MXL_Накладная" ведёт к макету конфигурации, а не файла.
// Модуль объекта внешней печатной формы (.epf), конфигурация на БСП.
// В этом же модуле: функция СведенияОВнешнейОбработке() с командой
// "Накладная" и функция ПечатьНакладной из основного примера.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Накладная") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
"Накладная",
НСтр("ru = 'Расходная накладная'"),
ПечатьНакладной(МассивОбъектов, ОбъектыПечати));
КонецЕсли;
КонецПроцедуры
// В ПечатьНакладной меняется одна строка - макет берётся из самой обработки:
// Макет = ПолучитьМакет("ПФ_MXL_Накладная");
Полный шаблон с функцией регистрации, подключением к документам и отладкой — в статье о внешней печатной форме на БСП.
Настройки.ОбъектыПечати (в старых версиях — в СписокОбъектов), в модуле менеджера не выставлен ПриДобавленииКомандПечати, форма не подключена к «Подключаемым командам» или сеанс держит старый список команд (помогает перезапуск 1С).Печать отработала, но ничего не положила в коллекцию. Обычно идентификатор команды не совпадает со строкой в НужноПечататьМакет и ВывестиТабличныйДокументВКоллекцию. У внешней формы причиной бывает и лишний пятый параметр в сигнатуре Печать. Подробности — в журнале регистрации.НомерСтроки порядок строк табличной части в запросе не гарантирован.Частично. В конфигурациях на БСП есть список «Макеты печатных форм» (обычно «Администрирование» → «Печатные формы, отчеты и обработки»). Там можно поменять текст, шрифты, ширину колонок, вставить логотип, и правки переживут обновление. Добавить данные, которых нет среди параметров макета, так нельзя — нужен код.
Выделите их в списке и вызовите команду: в процедуру печати придёт массив ссылок, и пример выше выведет каждый документ с новой страницы. Для команды без БСП нужен режим использования параметра «Множественный». Ценники и этикетки на товары печатаются отдельными механизмами — см. статью про печать этикеток.
На сервере вызовите ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF) — тем же методом пишутся XLSX и другие форматы. Если файл нужен пользователю, запишите его во временный файл, поместите двоичные данные во временное хранилище и заберите на клиенте.
Одна-две формы, которые администратор хочет подключать и обновлять сам, — внешняя обработка. Несколько связанных доработок (печать плюс новый реквизит плюс права) — расширение: всё в одном месте, и форма может выводить реквизиты, добавленные тем же расширением.
Если нужен бланк по образцу, комплект форм для печати из списка или своя форма в типовой конфигурации без снятия с поддержки, быстрее отдать задачу программисту, который делает такие формы регулярно. Опишите, что должно быть на бланке, и приложите образец — на 1c-only.ru оценка задачи бесплатная, ответ в течение рабочего дня. Подробнее — на странице доработки печатных форм, а задачу можно разместить бесплатно.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.