Печатная форма 1С: как устроена и как создать свою

Дата: 19.09.2026 04:42:56
печатные формы
БСП
макет
табличный документ
расширения конфигурации
внешние печатные формы
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Управляемые

Печатная форма 1С — это табличный документ, который программа собирает по данным документа или справочника и показывает перед печатью: накладная, счёт, акт, этикетка. Пользователь видит одну кнопку «Печать», а внутри работает цепочка из четырёх звеньев: команда, серверная процедура, макет и табличный документ. Ниже — схема целиком, сравнение трёх способов добавить свою форму (в конфигурации, в расширении, внешним файлом) и рабочий пример для конфигураций на БСП 3.1.

Где встречается задача

  • в типовой форме не хватает колонки, реквизита или подписи, а конфигурация на поддержке;
  • нужен свой бланк: накладная для склада, лист сборки, этикетка на коробку;
  • в самописной конфигурации появился документ, который должен печататься как типовые;
  • печать из списка: выделили двадцать документов — получили двадцать бланков в одном окне, каждый с новой страницы.

Как устроена печатная форма 1С

В управляемом приложении печатная форма 1С 8.3 проходит один и тот же путь, есть в конфигурации БСП или нет:

  1. Команда. Пользователь выбирает пункт меню «Печать» в форме документа или списка. Команда выполняется на клиенте и получает ссылку или массив ссылок.
  2. Серверный вызов. На клиенте нет объекта Запрос, поэтому ссылки сразу уходят на сервер, обычно в модуль менеджера документа.
  3. Макет. Серверная процедура берёт макет — заготовку с именованными областями («Шапка», «Строка», «Подвал») и параметрами в ячейках.
  4. Табличный документ. Процедура выполняет запрос, заполняет параметры областей и выводит их по очереди в новый ТабличныйДокумент. Результат возвращается на клиент, где его печатают или сохраняют в PDF и Excel.

Устройство макета — области, параметры, режимы заполнения ячеек — разобрано в статье о создании макета печатной формы в конструкторе, а объект, в который всё выводится, — в руководстве по табличному документу.

Без БСП: команда и модуль менеджера

В конфигурации без Библиотеки стандартных подсистем всё собирается руками. У документа создают команду, указывают тип параметра — ссылку на этот документ — и режим использования параметра «Множественный», чтобы команда работала и из списка. Модуль команды получается коротким:

// Модуль команды ПечатьНакладной документа РасходнаяНакладная (конфигурация без БСП).
// Свойства команды: тип параметра - ДокументСсылка.РасходнаяНакладная,
// режим использования параметра - Множественный.

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

	ТабДок = СформироватьНаСервере(ПараметрКоманды);
	ТабДок.ОтображатьСетку = Ложь;
	ТабДок.ОтображатьЗаголовки = Ложь;
	ТабДок.ТолькоПросмотр = Истина;
	ТабДок.Показать(НСтр("ru = 'Расходная накладная'"));

КонецПроцедуры

&НаСервере
Функция СформироватьНаСервере(МассивСсылок)

	// Запрос, макет и вывод областей - в модуле менеджера документа.
	Возврат Документы.РасходнаяНакладная.ПечатнаяФорма(МассивСсылок);

КонецФункции

Экспортная функция ПечатнаяФорма(МассивСсылок) в модуле менеджера устроена как ПечатьНакладной из примера ниже, только макет берётся через ПолучитьМакет("Накладная") и нет вызовов БСП. Заготовку такого кода генерирует «Конструктор печати» в конфигураторе.

С БСП: что берёт на себя подсистема «Печать»

В типовых конфигурациях на БСП (Бухгалтерия 3.0, УТ 11, КА 2, ERP 2, УНФ) команду печати в дереве метаданных не создают. Модуль менеджера документа отвечает подсистеме «Печать» на два вопроса:

  • ДобавитьКомандыПечати(КомандыПечати) — какие пункты показать в меню «Печать»;
  • Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) — какие табличные документы сформировать по выбранной команде.

Остальное делает библиотека: строит подменю «Печать» через подсистему «Подключаемые команды», проверяет проведение, открывает окно предпросмотра с количеством копий, сохранением в файл и отправкой по почте, а если пользователь правил макет в режиме предприятия, подставляет его версию.

Три способа подключить свою печатную форму

Свои печатные формы документов в 1С добавляют тремя способами. Логика формирования — запрос, макет, вывод областей — везде одна, разница в том, где хранится код и что происходит при обновлении типовой конфигурации.

СпособГде код и макетОбновление типовойКогда выбирать
В конфигурацииМодуль менеджера документа и макет документаИзменённый объект требует ручного сравнения при каждом обновленииСвоя конфигурация или объект уже снят с поддержки
Расширение конфигурацииФайл расширения (.cfe): заимствованный документ и своя обработкаТиповая обновляется штатно, расширение проверяют после обновленияНесколько связанных доработок: печать, новые реквизиты, права
Внешняя печатная формаФайл .epf в справочнике «Дополнительные отчеты и обработки»Не мешает обновлениюОдна-две формы, которые администратор подключает и заменяет сам

Для владельца базы коротко: правка прямо в типовой конфигурации означает, что каждое обновление будет стоить времени программиста. Расширение и внешняя обработка этого избегают. У внешней формы своя обвязка кода — отличия разобраны ниже.

Рабочий пример на БСП 3.1: накладная в конфигурации

Пример для нетипового документа РасходнаяНакладная с реквизитами Организация, Контрагент, СуммаДокумента и табличной частью Товары. Имена условные — подставьте свои. Порядок работы:

  1. Добавьте документу макет типа «Табличный документ» с именем ПФ_MXL_Накладная. Префикс ПФ_MXL_ — соглашение БСП: по нему макет попадает в список «Макеты печатных форм», где его можно поправить без конфигуратора. Разметьте области «Шапка», «ШапкаТаблицы», «Строка», «Подвал» и заведите параметры: ЗаголовокДокумента, Организация, Контрагент, НомерСтроки, Номенклатура, Количество, Цена, Сумма, СуммаДокумента, СуммаПрописью.
  2. Зарегистрируйте документ в общем модуле УправлениеПечатьюПереопределяемый. В БСП 3.1.4 и новее это процедура ПриОпределенииНастроекПечати, а в модуле менеджера нужна одноимённая процедура с флагом ПриДобавленииКомандПечати — она есть в основном листинге. В более ранних версиях документ добавляют в процедуру ПриОпределенииОбъектовСКомандамиПечати, которая теперь считается устаревшей.
  3. Подключите команды к форме документа и форме списка: в ПриСозданииНаСервере вызовите ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект) и добавьте клиентские обработчики Подключаемый_… по инструкции внедрения подсистемы «Подключаемые команды» вашей версии. В типовых формах это уже сделано.
  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 программно?

На сервере вызовите ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF) — тем же методом пишутся XLSX и другие форматы. Если файл нужен пользователю, запишите его во временный файл, поместите двоичные данные во временное хранилище и заберите на клиенте.

Что выбрать: расширение или внешнюю печатную форму?

Одна-две формы, которые администратор хочет подключать и обновлять сам, — внешняя обработка. Несколько связанных доработок (печать плюс новый реквизит плюс права) — расширение: всё в одном месте, и форма может выводить реквизиты, добавленные тем же расширением.

Когда проще заказать

Если нужен бланк по образцу, комплект форм для печати из списка или своя форма в типовой конфигурации без снятия с поддержки, быстрее отдать задачу программисту, который делает такие формы регулярно. Опишите, что должно быть на бланке, и приложите образец — на 1c-only.ru оценка задачи бесплатная, ответ в течение рабочего дня. Подробнее — на странице доработки печатных форм, а задачу можно разместить бесплатно.

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.