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

В статье — как нарисовать макет, какой код нужен для внешней печатной формы на БСП, как её подключить и с какими ошибками сталкиваются чаще всего.

Когда нужно создавать новую форму, а когда хватит правки

Если нужно поменять шрифт, добавить строку текста, логотип или подпись в уже существующий бланк — новую форму делать не надо. Это делается в режиме предприятия через «Макеты печатных форм», я подробно разбирал это в статье про печатную форму 1С. Там же — как подключить готовый файл и что делать с ошибкой «Печатная форма недоступна».

Создавать свою форму нужно, когда:

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

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

  1. Внешняя печатная форма — файл .epf, который регистрируется в справочнике дополнительных обработок. Самый удобный способ для типовых конфигураций: не трогает конфигурацию, легко переносится между базами.
  2. Расширение конфигурации — форма добавляется в макеты расширения, команда — в модуль менеджера документа. Подходит, когда форм много или печать нужна там, где нет подключаемых команд.
  3. Изменение конфигурации — макет и код прямо в типовом объекте. Для типовых конфигураций на поддержке не рекомендую: каждое обновление превращается в ручное сравнение и объединение.

Дальше разбираю первый способ — он закрывает большинство задач.

Шаг 1. Создайте обработку и макет

  1. Откройте нужную базу в конфигураторе.
  2. «Файл» → «Новый» → «Внешняя обработка». Задайте имя, например НакладнаяСклад.
  3. На закладке «Макеты» нажмите «Добавить», выберите тип «Табличный документ» и задайте имя, например Накладная. Запомните это имя — оно понадобится в коде.

Как создавать саму обработку и что делать, если не видно типов базы, подробно описано в статье как создать обработку в 1С.

Шаг 2. Нарисуйте макет печатной формы

Макет — это таблица, похожая на Excel. Его делят на именованные области, каждая из которых выводится отдельно:

  • Шапка — название документа, номер, дата, поставщик и покупатель;
  • ШапкаТаблицы — заголовки колонок;
  • Строка — одна строка товаров, она выводится столько раз, сколько строк в документе;
  • Подвал — итоги, подписи.

Как это сделать:

  1. Выделите строки, которые относятся к шапке, и в меню «Таблица» → «Имена» → «Назначить имя» задайте имя Шапка. Так же назовите остальные области.
  2. В ячейки, куда должны попасть данные, впишите имя параметра, например Номер или Контрагент. В свойствах ячейки поставьте «Заполнение» — «Параметр».
  3. Если в ячейке текст с вставками, используйте «Заполнение» — «Шаблон» и пишите параметры в квадратных скобках: Накладная № [Номер] от [Дата].
  4. Ширину колонок подгоняйте под А4 сразу, а не после первой печати: переделывать готовый макет дольше.
Макет печатной формы 1С: именованные области шапки, строк таблицы и подвала заполняются данными
Макет печатной формы 1С: именованные области шапки, строк таблицы и подвала заполняются данными

Шаг 3. Зарегистрируйте форму в модуле объекта

Чтобы БСП знала, что это печатная форма и к какому документу её подключать, в модуль объекта обработки добавляют функцию СведенияОВнешнейОбработке.

1С
Функция СведенияОВнешнейОбработке() Экспорт

	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
	ПараметрыРегистрации.Версия = "1.0";
	ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");

	Команда = ПараметрыРегистрации.Команды.Добавить();
	Команда.Представление = "Накладная для склада";
	Команда.Идентификатор = "Накладная";
	Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
	Команда.Модификатор = "ПечатьMXL";

	Возврат ПараметрыРегистрации;

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

Главное здесь — Идентификатор. Это имя макета, которое придёт в процедуру печати. Назначение — список документов, в меню «Печать» которых появится команда. Можно добавить несколько.

Шаг 4. Напишите процедуру Печать

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

1С
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Накладная") Тогда
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
			"Накладная", "Накладная для склада",
			СформироватьНакладную(МассивОбъектов, ОбъектыПечати));
	КонецЕсли;

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

Функция СформироватьНакладную(МассивОбъектов, ОбъектыПечати)

	ТабДок = Новый ТабличныйДокумент;
	ТабДок.КлючПараметровПечати = "ПараметрыПечати_НакладнаяСклад";
	Макет = ПолучитьМакет("Накладная");

	Для Каждого Документ Из МассивОбъектов Цикл

		Если ТабДок.ВысотаТаблицы > 0 Тогда
			ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
		НачалоДокумента = ТабДок.ВысотаТаблицы + 1;

		Область = Макет.ПолучитьОбласть("Шапка");
		Область.Параметры.Номер = Документ.Номер;
		Область.Параметры.Дата = Формат(Документ.Дата, "ДЛФ=D");
		Область.Параметры.Контрагент = Документ.Контрагент;
		ТабДок.Вывести(Область);

		ТабДок.Вывести(Макет.ПолучитьОбласть("ШапкаТаблицы"));

		ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
		Для Каждого СтрокаТоваров Из Документ.Товары Цикл
			ОбластьСтроки.Параметры.Заполнить(СтрокаТоваров);
			ТабДок.Вывести(ОбластьСтроки);
		КонецЦикла;

		ТабДок.Вывести(Макет.ПолучитьОбласть("Подвал"));

		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДок, НачалоДокумента, ОбъектыПечати, Документ);

	КонецЦикла;

	Возврат ТабДок;

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

Пара пояснений:

  • Параметры.Заполнить(СтрокаТоваров) подставит все параметры, имена которых совпадают с колонками табличной части: Номенклатура, Количество, Цена, Сумма. Остальные заполняйте вручную.
  • ВывестиГоризонтальныйРазделительСтраниц нужен, чтобы при печати нескольких документов каждый начинался с нового листа.
  • ЗадатьОбластьПечатиДокумента связывает кусок табличного документа с конкретной накладной — это нужно, например, для отправки по почте каждому контрагенту своей формы.
  • КлючПараметровПечати запоминает настройки страницы (поля, ориентацию), которые пользователь задал при печати.

Обращение к реквизитам через точку в цикле для небольших документов допустимо. Если в документах сотни строк или форма печатается пачками, данные лучше получить одним запросом заранее.

Шаг 5. Подключите и проверьте

  1. Сохраните файл .epf.
  2. В режиме предприятия откройте «Администрирование» → «Печатные формы, отчеты и обработки» → «Дополнительные отчеты и обработки» и добавьте файл.
  3. Проверьте, что в размещении указан нужный документ, и запишите.
  4. Откройте любой документ реализации и нажмите «Печать» — в списке появится «Накладная для склада».

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

Печатная форма в расширении

Если форм несколько и у них общий код, или печать нужна для объекта, к которому не подключаются внешние печатные формы, форму делают в расширении. Логика та же, меняется только место:

  1. Документ заимствуют в расширение, макет добавляют в его ветку «Макеты».
  2. Команду печати добавляют в модуле менеджера документа: в БСП для этого служит процедура ДобавитьКомандыПечати, а в расширении к ней пишут обработчик с аннотацией &После, который добавляет в таблицу команд свою строку.
  3. Формирование табличного документа — в процедуре Печать модуля менеджера, тоже через обработчик расширения.

Плюс расширения — всё хранится в одном месте и версионируется вместе с остальными доработками. Минус — для правки нужен конфигуратор, а внешнюю форму можно просто заменить файлом в карточке. Подробнее о том, как устроены расширения, — в статье как создать расширение в 1С.

Типовые ошибки при создании печатных форм

  • Команда есть, но форма пустая. Идентификатор команды не совпадает с именем, которое проверяется в НужноПечататьМакет. Сравните их посимвольно.
  • «Область с именем ... не найдена». Область в макете названа иначе или не назначено имя. Проверьте «Таблица» → «Имена».
  • Параметр в ячейке не заполняется. Не указан тип заполнения «Параметр» или «Шаблон», либо в параметре опечатка.
  • «Поле объекта не обнаружено» после обновления. В новой версии конфигурации реквизит переименован. Нужно поправить код под новую версию.
  • Форма не помещается на лист. Слишком широкие колонки. Уменьшите ширину или включите в коде автомасштаб: ТабДок.АвтоМасштаб = Истина.
  • Форма печатается, но не появилась у других пользователей. В карточке дополнительной обработки не включена публикация или нет доступа к ней у нужных пользователей.

Если нужна печатная форма под ваш бланк, форма сломалась после обновления или нужно перенести старые формы на новую версию конфигурации — помогу удалённо: печатные формы 1С, доработка 1С под задачи. Отдельно про параметры принтера и вывод на печать — в статье настройка печати в 1С.

Итог

  • Печатная форма — это макет (табличный документ с именованными областями и параметрами) плюс код, который его заполняет.
  • В типовых конфигурациях удобнее всего делать внешнюю печатную форму на БСП: она не трогает конфигурацию и переживает обновления.
  • В модуле объекта нужны функция СведенияОВнешнейОбработке с видом «Печатная форма» и процедура Печать.
  • Идентификатор команды должен совпадать с именем макета, которое проверяется в коде.
  • Подключается форма через «Дополнительные отчеты и обработки», после чего сама появляется в меню «Печать» документа.
  • Правку готовых бланков без новой логики делайте в «Макетах печатных форм», без программирования.