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

· 9 мин

Содержание

Чтобы создать кнопку печати в 1С, нужны четыре вещи: макет с областями в объекте конфигурации, команда на форме, клиентский обработчик и серверная функция, которая заполняет табличный документ данными. Всё делается в Конфигураторе. Порядок такой: сначала макет, потом команда, потом код.

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

Перед стартом: что нужно решить заранее

Три вопроса определяют всю работу.

  • 🔧 Где менять. Своя конфигурация — правьте напрямую. Типовая на поддержке — создайте расширение и подключите к нему нужный документ.
  • 📄 Какой документ печатаем. Нужно знать имя объекта метаданных, реквизиты шапки и состав табличной части.
  • 🧩 Есть ли в конфигурации БСП. Если подсистема «Печать» встроена, кнопка «Печать» на форме уже есть, и вам остаётся добавить новую форму в её список. Это самый чистый вариант (он описан в отдельном разделе ниже).

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

Шаг 1. Макет печатной формы

Макет — это табличный документ с именованными областями. Код потом берёт область, подставляет значения и выводит её на лист.

  1. В дереве конфигурации раскройте документ и найдите ветку Макеты.
  2. Нажмите «Добавить», выберите тип «Табличный документ», задайте имя, например ПФ_Счёт.
  3. Выделите строки и выберите в меню «Таблица → Имена → Назначить имя» (или через контекстное меню выделенных строк). Так создаются области.

Для документа с табличной частью нужны минимум три области:

ОбластьЧто в нейСколько раз выводится
ШапкаЗаголовок, номер, дата, контрагентОдин раз
СтрокаОдна строка табличной частиПо разу на каждую строку
ПодвалИтого, подписиОдин раз

Параметры в ячейках пишутся без знака равенства: просто имя, например Номер, а в свойствах ячейки заполнение выставляется как «Параметр». Если нужен текст вместе с параметром, используйте «Шаблон», а в тексте имя берётся в квадратные скобки: Счёт № [Номер].

Дайте параметрам понятные имена. Если имя параметра совпадает с именем поля в выборке запроса, потом всё заполнится одной строкой кода.

Шаг 2. Как разместить кнопку на форме документа

Откройте форму документа в Конфигураторе и перейдите на закладку «Команды».

  1. Добавьте новую команду с именем Печать, синонимом «Печать счёта».
  2. В свойстве «Действие» нажмите лупу: платформа создаст пустой обработчик в модуле формы.
  3. Перетащите команду из списка на закладку «Командный интерфейс» или в панель элементов формы, в нужную группу.
  4. Задайте картинку (стандартная картинка «Печать») и отображение «Картинка и текст».

Если форма управляемая, а в корне формы уже стоит командная панель, кнопку можно положить в неё. Это и есть «кнопка печати»: платформа рисует её сама из команды.

У команды стоит проверить свойство «Использование»: если оставить доступность только для некоторых ролей, остальные пользователи кнопки не увидят и решат, что у вас ничего не вышло.

Шаг 3. Код: клиент вызывает сервер

Печатную форму формируют на сервере: там есть доступ к базе и макетам. Клиентский обработчик только вызывает серверную функцию и показывает результат.

&НаКлиенте
Процедура Печать(Команда)

	Если Объект.Ссылка.Пустая() Тогда
		ПоказатьПредупреждение(, "Сначала запишите документ.");
		Возврат;
	КонецЕсли;

	Если Модифицированность Тогда
		Записать();
	КонецЕсли;

	ТабДок = СформироватьПечатнуюФорму(Объект.Ссылка);
	ТабДок.Показать("Счёт");

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

Почему сначала проверка ссылки. Запрос в серверной функции читает данные из базы, а новый несохранённый документ там ещё не лежит. Без записи кнопка напечатает пустой лист или упадёт.

Серверная часть:

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

	ТабДок = Новый ТабличныйДокумент;
	ТабДок.КлючПараметровПечати = "ПЕЧАТЬ_МойДокумент_Счёт";

	Макет = Документы.МойДокумент.ПолучитьМакет("ПФ_Счёт");

	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Док.Номер КАК Номер,
	|	Док.Дата КАК Дата,
	|	Док.Контрагент.Наименование КАК Контрагент
	|ИЗ
	|	Документ.МойДокумент КАК Док
	|ГДЕ
	|	Док.Ссылка = &Ссылка";

	ВыборкаШапки = Запрос.Выполнить().Выбрать();
	ВыборкаШапки.Следующий();

	Область = Макет.ПолучитьОбласть("Шапка");
	ЗаполнитьЗначенияСвойств(Область.Параметры, ВыборкаШапки);
	ТабДок.Вывести(Область);

	// Табличная часть — следующий раздел
	Возврат ТабДок;

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

Здесь МойДокумент — условное имя. Подставьте имя своего документа и своего макета.

Реквизит КлючПараметровПечати нужен, чтобы платформа запоминала настройки печати пользователя (поля, ориентацию) именно для этой формы.

Шаг 4. Заполнение табличной части

Строки выводятся в цикле, по одной области на строку. Лучше брать их вторым запросом с упорядочиванием по номеру строки, а не обходить Объект.Товары на форме: тогда печатается то, что реально записано в базе.

	Запрос.Текст =
	"ВЫБРАТЬ
	|	Т.НомерСтроки КАК НомерСтроки,
	|	Т.Номенклатура.Наименование КАК Товар,
	|	Т.Количество КАК Количество,
	|	Т.Цена КАК Цена,
	|	Т.Сумма КАК Сумма
	|ИЗ
	|	Документ.МойДокумент.Товары КАК Т
	|ГДЕ
	|	Т.Ссылка = &Ссылка
	|УПОРЯДОЧИТЬ ПО
	|	Т.НомерСтроки";

	ВыборкаСтрок = Запрос.Выполнить().Выбрать();
	ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
	Итого = 0;

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

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

Область ОбластьСтроки берётся из макета один раз перед циклом. Заполнять и выводить её можно сколько угодно раз.

Ещё один приём — не разрывать подвал и подписи между страницами. Перед выводом подвала проверьте, помещается ли он на лист:

	МассивОбластей = Новый Массив;
	МассивОбластей.Добавить(ОбластьСтроки);
	МассивОбластей.Добавить(ОбластьПодвала);

	Если Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
		ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
	КонецЕсли;

Если не помещается, начинайте новую страницу: подписи на отдельном листе без таблицы — частая претензия бухгалтерии.

Настройка печати: масштаб, поля, предпросмотр

Свойства табличного документа задают до вывода областей.

	ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
	ТабДок.АвтоМасштаб = Истина;
	ТабДок.ОтображатьСетку = Ложь;
	ТабДок.ОтображатьЗаголовки = Ложь;
  • 📐 Автомасштаб вписывает ширину таблицы в лист, и широкая форма не уезжает на вторую страницу.
  • 🧭 Ориентация. Для таблиц шире шести-семи колонок берите альбомную: ОриентацияСтраницы.Ландшафт.
  • 🖨 Предпросмотр. Метод Показать открывает форму табличного документа. В ней есть предварительный просмотр, выбор принтера и число копий, отдельный код для этого не нужен.
  • 📋 Количество копий. Задаётся свойством КоличествоЭкземпляров, но пользователь всё равно может поменять его в окне печати.

Если форму нужно сразу отправить на принтер без показа, используйте метод Напечатать(). Но тогда пользователь не увидит результата и не сможет проверить ошибки, поэтому для документов лучше оставлять Показать.

Печать из БСП: когда подсистема уже есть

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

  1. Макет создаётся так же, как выше.
  2. В модуле менеджера документа добавляется процедура, которая регистрирует команду печати: у неё задают идентификатор и представление (то, что увидит пользователь в меню «Печать»). Там же пишется процедура Печать с параметрами МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода.
  3. В форме документа вызывается инициализация подключаемых команд при создании на сервере. Тогда меню «Печать» формируется само.

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

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

Расширение вместо правки типовой конфигурации

Для типовых «Бухгалтерии», ЗУП, УТ правка конфигурации превращает каждое обновление в слияние кода. Расширение этого не требует.

  1. Создайте расширение в Конфигураторе (меню «Конфигурация → Расширения конфигурации »).
  2. Добавьте в него «заимствованные» объекты: документ, форму, которую нужно доработать.
  3. Макет создавайте уже в расширении — у документа появится свой макет.
  4. Кнопку и код добавляйте в заимствованную форму расширения.
  5. После загрузки обязательно обновите конфигурацию базы данных.

Расширения доступны начиная с платформы 8.3.6, на актуальных версиях с этим проблем нет. Обновление структуры базы требует монопольного доступа: выберите время, когда пользователей нет.

Типичные ошибки и что проверить

Эти симптомы встречаются чаще всего, и причины у них разные.

Кнопка не видна. Проверьте, что команда добавлена в элементы формы (в одном списке команд её недостаточно), доступна по ролям и не скрыта свойством «Видимость». В режиме пользователя форму стоит переоткрыть: открытое окно не обновляется само.

«Область не найдена» или пустые поля. Имя области в ПолучитьОбласть("Строка") должно совпадать с именем в макете до буквы. Частая причина — латинская «C» вместо русской «С», которую глазом не отличить. Параметр без заполнения оставляет пустую ячейку: проверьте, что имя параметра совпало с псевдонимом поля в запросе.

Печатается пустой лист или одна шапка. Документ не записан, запрос вернул пустой результат или цикл не дошёл до строк. Выведите ВыборкаСтрок.Количество() в сообщение при отладке.

Дата и числа выглядят криво. В ячейке макета задайте формат (даты, числа с двумя знаками после запятой). Другой путь — формат применяется на лету функцией Формат() в коде.

Форма не помещается на лист. Включите автомасштаб или переведите ориентацию в альбомную. Если ширина колонок в макете больше ширины листа, автомасштаб ужмёт шрифт до нечитаемого, поэтому сузьте колонки.

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

Что можно добавить к простой кнопке

Когда базовая печать заработала, форму можно улучшить.

  • 🖋 Подпись и печать. Картинки хранятся в макете или в справочнике. Для вставки используйте область-рисунок и заполняйте её параметр картинкой.
  • 🧾 Сумма прописью. Нужная функция есть в библиотеках: проверьте общие модули вашей конфигурации перед тем, как писать свою.
  • 📚 Несколько вариантов формы. Делайте отдельные макеты и отдельные команды или выпадающее меню «Печать» с группой команд.
  • 📤 Экспорт. Готовый табличный документ сохраняется в PDF и Excel стандартным диалогом сохранения; ничего писать не нужно.
  • 🔁 Общий код. Если печатных форм больше трёх, вынесите вывод шапки и подвала в общий серверный модуль.
Проверка перед выдачей пользователям
Выполнено: 0 / 6

Частые вопросы

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