Добавляем кнопку печати в форму документа или справочника 1С

· 9 мин

Содержание

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

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

С чего начать: что должно быть под рукой

Прежде чем открывать форму, проверьте три вещи.

  • 🔑 Конфигуратор открыт под пользователем с правом администрирования, а конфигурация снята с поддержки или разрешает изменения. Для типовой конфигурации сделайте расширение.
  • 📄 Решено, к какому объекту относится печатная форма: документ, справочник, обработка. Макет добавляется именно в этот объект.
  • 🧾 Есть образец готового бланка: что в шапке, что в табличной части, где подписи.

Если нужна печатная форма «как у типового документа», посмотрите, как устроены макеты рядом. В дереве конфигурации раскройте объект, ветку Макеты — там лежат образцы, на которые удобно ориентироваться.

Для работы нужен режим Конфигуратора: запуск базы с пометкой «Конфигуратор» в списке баз. Изменения применяются после нажатия F7 (обновление конфигурации базы данных) или запуска базы в режиме «1С:Предприятие» из меню Отладка.

Макет печатной формы: рисуем бланк

Кнопка без макета печатать нечего. Поэтому макет делаем первым.

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

Три области — минимум для документа с табличной частью. Шапка выводится один раз, строка повторяется по числу строк документа, подвал содержит итоги и подписи.

Если параметр в ячейке назван иначе, чем в коде, ячейка останется пустой, а ошибки не будет. Это самая частая причина «кнопка есть, а форма пустая».

Команда формы и кнопка в командной панели

Теперь добавляем саму кнопку. В управляемых формах кнопка не создаётся «сама по себе»: сначала команда, потом элемент, который её показывает.

  1. Откройте нужную форму: в ветке Формы объекта дважды щёлкните по форме, например ФормаДокумента.
  2. Перейдите на закладку Команды в нижней части редактора формы и нажмите Добавить.
  3. Задайте имя команды: Печать. В свойстве Заголовок напишите то, что увидит пользователь, например Печатная форма.
  4. В свойстве Действие нажмите на значок лупы и выберите Создать на клиенте. Платформа откроет модуль формы с заготовкой процедуры.
  5. Перетащите команду из списка на закладку Элементы, в командную панель формы. Появится кнопка.

Для наглядности пользуйтесь свойствами команды: Картинка (значок принтера из библиотеки картинок), Подсказка (всплывает при наведении) и Отображение (картинка, текст или оба).

Где разместитьКогда подходитМинус
Командная панель формыОсновное действие над документомЗанимает место, если кнопок много
Подменю «Печать»Несколько печатных формНужно создать группу-подменю
Контекстное меню таблицыПечать по выделенной строкеПользователи редко заглядывают

Обработчик: клиентская процедура и серверная функция

В модуле формы появилась заготовка. Напишем её целиком.

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

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

	ТабличныйДокумент = СформироватьПечатнуюФорму();
	ТабличныйДокумент.Показать(НСтр("ru = 'Печатная форма'"));

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

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

	ТабличныйДокумент = Новый ТабличныйДокумент;
	ДокументОбъект = РеквизитФормыВЗначение("Объект");
	Макет = ДокументОбъект.ПолучитьМакет("ПечатнаяФорма");

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

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

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

	Возврат ТабличныйДокумент;

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

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

Почему всё делается на сервере? Макеты лежат в конфигурации, а доступ к данным и к ПолучитьМакет нужен именно там. Клиент получает только готовый табличный документ и показывает его.

Печать сразу на принтер

Иногда пользователю нужен не предварительный просмотр, а немедленная печать. Тогда вместо Показать на клиенте вызывают Напечатать:

ТабличныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.Использовать);

Режим Использовать покажет стандартное окно выбора принтера и числа копий. Для тихой печати есть режим НеИспользовать, но тогда документ уйдёт на принтер по умолчанию, и пользователь не сможет ничего поправить.

Если форма открыта у нового документа

Проверка Объект.Ссылка.Пустая() из примера нужна, потому что у несохранённого документа нет ссылки и номера. Альтернатива — записать документ прямо из обработчика через Записать(). Решайте по политике базы: молча записывать черновик без согласия пользователя не всегда уместно, особенно если запись запускает проверки и блокировки.

Подключение печатной формы через подсистему печати БСП

Если в конфигурации есть Библиотека стандартных подсистем (в «Бухгалтерии», ЗУП, УТ она есть), ручной код нужен реже. Подсистема Печать собирает все формы объекта в единое меню «Печать» и умеет выводить несколько форм одним пакетом, отправлять по почте и сохранять в файл.

Принцип такой:

  • 📦 В модуле менеджера объекта (документа, справочника) создаётся экспортная процедура ДобавитьКомандыПечати(КомандыПечати).
  • ➕ Внутри неё добавляется команда: КомандаПечати = КомандыПечати.Добавить();, затем задаются Идентификатор (имя макета), Представление (заголовок в меню) и Обработчик.
  • 🖨 В том же модуле реализуется процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода): она наполняет КоллекцияПечатныхФорм и заполняет табличный документ по каждому объекту из массива.
  • 🧩 На форме подменю «Печать» появляется само, если форма подключена к подсистеме подключаемых команд.

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

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

Какой способ выбрать

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

Оформление макета: что сделать, чтобы форма выглядела как бланк

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

  • 📏 Ширину колонок подгоняйте под лист A4: книжная ориентация вмещает примерно 90 символов шрифта 10 пунктов, альбомная заметно больше. Ориентацию и поля задают в свойствах табличного документа макета.
  • 🔲 Границы рисуйте у ячеек строки, а не у всей области. Тогда строки таблицы не склеиваются при выводе.
  • 🔤 Длинные наименования включайте в режим переноса по словам и ставьте автоматическую высоту строки, иначе текст обрежется.
  • 🧮 Итоговые суммы выводите в подвале, а не считайте в ячейках формулами: считайте в коде и передавайте как параметр.
  • ✍️ Подписи и расшифровки выносите в отдельную область Подвал, чтобы при переносе на следующий лист они не повисали одиноко.

Чтобы шапка повторялась на каждой странице, отметьте её как повторяемую при печати: в редакторе макета выделите строки шапки и в меню таблицы включите Повторять при печати. Колонтитулы с номером страницы настраивают в окне Колонтитулы того же макета.

Для разных видов бланка (например, с печатью и без) удобнее держать два макета и выбирать нужный по параметру команды, чем плодить условия внутри одной области.

Несколько печатных форм у одного объекта

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

&НаКлиенте
Процедура ПечатьПоКоманде(Команда)
	ТабличныйДокумент = СформироватьФорму(Команда.Имя);
	ТабличныйДокумент.Показать(Команда.Заголовок);
КонецПроцедуры

На сервере по имени команды выбирается макет: ПолучитьМакет(ИмяМакета). Так добавление новой формы сводится к трём действиям: новый макет, новая команда, новая строка в выборе имени.

Доступ и видимость: кто увидит кнопку

Кнопку нужно показывать не всем. И не потому, что печать — секрет, а потому что у пользователя может не быть права на чтение данных, из которых собрана форма.

  1. Проверьте роль пользователя: в ней должны быть права Чтение и Просмотр на объект и на связанные справочники. Без них серверная функция выдаст ошибку нехватки прав.
  2. Если кнопку надо спрятать от части пользователей, делайте это в обработчике ПриСозданииНаСервере формы: Элементы.Печать.Видимость = РольДоступна("ПечатьБланков"); — имя роли подставьте своё.
  3. Для кнопки, которая зависит от состояния документа, используйте Доступность: например, блокируйте печать у непроведённых документов.
  4. Если печатная форма нужна только при включённой настройке, привяжите команду к функциональной опции: свойство Функциональные опции команды управляет её доступностью централизованно.

Скрытая кнопка — не защита. Настоящее ограничение — роли и права на объекты. Видимость нужна только для удобства.

Проверка и отладка

После сохранения формы запустите базу в режиме «1С:Предприятие» (F5 в Конфигураторе запускает с отладкой). Откройте документ и нажмите кнопку.

Проверьте по списку, что происходит на экране.

  • 👀 Кнопка отображается в нужном месте и открывает окно просмотра.
  • 📐 Области выводятся друг за другом без пропусков и пустых строк.
  • 🔢 Числа и даты в нужном формате, итоги совпадают с документом.
  • 📄 В режиме предварительного просмотра влезает на лист по ширине: проверьте параметр ориентации и поля страницы в макете.

Если что-то не работает , посмотрите на симптом.

Диагностика: выберите симптом

Для отладки поставьте точку останова на строке Макет = ДокументОбъект.ПолучитьМакет(...) в серверной функции (F9) и пройдите её по шагам (F11). Переменные смотрите в окне Вычислить выражение (Shift+F9).

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

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