Добавляем кнопку печати в форму документа или справочника 1С
Содержание
Чтобы добавить кнопку печати в 1С, нужны четыре вещи: макет с оформлением печатной формы, команда формы, клиентский обработчик и серверная функция, которая заполняет макет данными. Всё это делается в Конфигураторе за 20–30 минут, если макет уже нарисован.
Ниже порядок для управляемой формы платформы 8.3 с интерфейсом «Такси». Сначала способ «вручную», который работает в любой конфигурации, потом готовый механизм БСП, если он в ней есть. Менять типовую конфигурацию на поддержке напрямую не стоит: для таких доработок есть расширения.
С чего начать: что должно быть под рукой
Прежде чем открывать форму, проверьте три вещи.
- 🔑 Конфигуратор открыт под пользователем с правом администрирования, а конфигурация снята с поддержки или разрешает изменения. Для типовой конфигурации сделайте расширение.
- 📄 Решено, к какому объекту относится печатная форма: документ, справочник, обработка. Макет добавляется именно в этот объект.
- 🧾 Есть образец готового бланка: что в шапке, что в табличной части, где подписи.
Если нужна печатная форма «как у типового документа», посмотрите, как устроены макеты рядом. В дереве конфигурации раскройте объект, ветку Макеты — там лежат образцы, на которые удобно ориентироваться.
Для работы нужен режим Конфигуратора: запуск базы с пометкой «Конфигуратор» в списке баз. Изменения применяются после нажатия F7 (обновление конфигурации
базы данных) или запуска базы в режиме «1С:Предприятие» из меню Отладка.
Макет печатной формы: рисуем бланк
Кнопка без макета печатать нечего. Поэтому макет делаем первым.
- В дереве конфигурации откройте объект, например документ, и в ветке
МакетынажмитеДобавить. - Тип макета —
Табличный документ, имя задайте латиницей или кириллицей без пробелов, напримерПечатнаяФорма. - В открывшемся редакторе выделите строки и назначьте им имена областей через
Таблица → Имена → Назначить имя:Шапка,Строка,Подвал. - В ячейках, куда будут подставляться значения, пишите имя параметра. Заполнение ячейки в режиме «Параметр» — в свойствах ячейки (
F4), полеЗаполнение.
Три области — минимум для документа с табличной частью. Шапка выводится один раз, строка повторяется по числу строк документа, подвал содержит итоги и подписи.
Если параметр в ячейке назван иначе, чем в коде, ячейка останется пустой, а ошибки не будет. Это самая частая причина «кнопка есть, а форма пустая».
Команда формы и кнопка в командной панели
Теперь добавляем саму кнопку. В управляемых формах кнопка не создаётся «сама по себе»: сначала команда, потом элемент, который её показывает.
- Откройте нужную форму: в ветке
Формыобъекта дважды щёлкните по форме, напримерФормаДокумента. - Перейдите на закладку
Командыв нижней части редактора формы и нажмитеДобавить. - Задайте имя команды:
Печать. В свойствеЗаголовокнапишите то, что увидит пользователь, напримерПечатная форма. - В свойстве
Действиенажмите на значок лупы и выберитеСоздать на клиенте. Платформа откроет модуль формы с заготовкой процедуры. - Перетащите команду из списка на закладку
Элементы, в командную панель формы. Появится кнопка.
Для наглядности пользуйтесь свойствами команды: Картинка (значок принтера из библиотеки картинок), Подсказка (всплывает при наведении) и Отображение (картинка, текст или оба).
| Где разместить | Когда подходит | Минус |
|---|---|---|
| Командная панель формы | Основное действие над документом | Занимает место, если кнопок много |
| Подменю «Печать» | Несколько печатных форм | Нужно создать группу-подменю |
| Контекстное меню таблицы | Печать по выделенной строке | Пользователи редко заглядывают |
Обработчик: клиентская процедура и серверная функция
В модуле формы появилась заготовка. Напишем её целиком.
&НаКлиенте
Процедура Печать(Команда)
Если Объект.Ссылка.Пустая() Или Модифицированность Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Сначала запишите документ.'"));
Возврат;
КонецЕсли;
ТабличныйДокумент = СформироватьПечатнуюФорму();
ТабличныйДокумент.Показать(НСтр("ru = 'Печатная форма'"));
КонецПроцедуры
&НаСервере
Функция СформироватьПечатнуюФорму()
ТабличныйДокумент = Новый ТабличныйДокумент;
ДокументОбъект = РеквизитФормыВЗначение("Объект");
Макет = ДокументОбъект.ПолучитьМакет("ПечатнаяФорма");
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Номер = ДокументОбъект.Номер;
Область.Параметры.Дата = Формат(ДокументОбъект.Дата, "ДЛФ=D");
ТабличныйДокумент.Вывести(Область);
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаТЧ Из ДокументОбъект.Товары Цикл
ОбластьСтроки.Параметры.Заполнить(СтрокаТЧ);
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
ТабличныйДокумент.Вывести(Макет.ПолучитьОбласть("Подвал"));
Возврат ТабличныйДокумент;
КонецФункции
Здесь Товары — имя табличной части, поля строки названы так же, как параметры области Строка. Подставьте свои имена. Метод Заполнить у параметров области копирует значения одноимённых полей строки, это экономит десяток присваиваний.
Почему всё делается на сервере? Макеты лежат в конфигурации, а доступ к данным и к ПолучитьМакет нужен именно там. Клиент получает только готовый табличный документ и показывает его.
Печать сразу на принтер
Иногда пользователю нужен не предварительный просмотр, а немедленная печать. Тогда вместо Показать на клиенте вызывают Напечатать:
ТабличныйДокумент.Напечатать(РежимИспользованияДиалогаПечати.Использовать);
Режим Использовать покажет стандартное окно выбора принтера и числа копий. Для тихой печати есть режим НеИспользовать, но тогда документ уйдёт на принтер по умолчанию, и пользователь не сможет ничего поправить.
Если форма открыта у нового документа
Проверка Объект.Ссылка.Пустая() из примера нужна, потому что у несохранённого документа нет ссылки и номера. Альтернатива — записать документ прямо из обработчика через Записать(). Решайте по политике базы: молча записывать черновик без согласия пользователя не всегда уместно, особенно если запись запускает проверки и блокировки.
Подключение печатной формы через подсистему печати БСП
Если в конфигурации есть Библиотека стандартных подсистем (в «Бухгалтерии», ЗУП, УТ она есть), ручной код нужен реже. Подсистема Печать собирает все формы объекта в единое меню «Печать» и умеет выводить несколько форм одним пакетом, отправлять по почте и сохранять в файл.
Принцип такой:
- 📦 В модуле менеджера объекта (документа, справочника) создаётся экспортная процедура
ДобавитьКомандыПечати(КомандыПечати). - ➕ Внутри неё добавляется команда:
КомандаПечати = КомандыПечати.Добавить();, затем задаютсяИдентификатор(имя макета),Представление(заголовок в меню) иОбработчик. - 🖨 В том же модуле реализуется процедура
Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода): она наполняетКоллекцияПечатныхФорми заполняет табличный документ по каждому объекту из массива. - 🧩 На форме подменю «Печать» появляется само, если форма подключена к подсистеме подключаемых команд.
Точные имена процедур и обязательные параметры зависят от релиза БСП в вашей конфигурации. Скопируйте структуру из любого типового документа, где уже есть печать (например, из документа реализации), и подставьте свой макет.
Бывает, что дорабатывать конфигурацию нельзя вовсе. Тогда вместо правок формы подключают внешнюю печатную форму: в подсистеме Дополнительные отчёты и обработки у обработки вид Печатная форма. Она появится в меню «Печать» выбранных объектов без вмешательства в код.
Какой способ выбрать
| Способ | Когда использовать | Сложность |
|---|---|---|
| Ручная команда с обработчиком | Нетиповая конфигурация, одна простая форма | Низкая |
| Печать через БСП | Типовая конфигурация с подсистемой печати | Средняя |
| Внешняя печатная форма | Нельзя менять конфигурацию, нужно быстро | Низкая, без программиста |
Оформление макета: что сделать, чтобы форма выглядела как бланк
Рабочий макет ещё не значит аккуратный. Пользователи сравнивают вашу форму с бумажным образцом, поэтому потратьте десять минут на оформление.
- 📏 Ширину колонок подгоняйте под лист A4: книжная ориентация вмещает примерно 90 символов шрифта 10 пунктов, альбомная заметно больше. Ориентацию и поля задают в свойствах табличного документа макета.
- 🔲 Границы рисуйте у ячеек строки, а не у всей области. Тогда строки таблицы не склеиваются при выводе.
- 🔤 Длинные наименования включайте в режим переноса по словам и ставьте автоматическую высоту строки, иначе текст обрежется.
- 🧮 Итоговые суммы выводите в подвале, а не считайте в ячейках формулами: считайте в коде и передавайте как параметр.
- ✍️ Подписи и расшифровки выносите в отдельную область
Подвал, чтобы при переносе на следующий лист они не повисали одиноко.
Чтобы шапка повторялась на каждой странице, отметьте её как повторяемую при печати: в редакторе макета выделите строки шапки и в меню таблицы включите Повторять при печати. Колонтитулы с номером страницы настраивают в окне Колонтитулы того же макета.
Для разных видов бланка (например, с печатью и без) удобнее держать два макета и выбирать нужный по параметру команды, чем плодить условия внутри одной области.
Несколько печатных форм у одного объекта
Когда форм больше одной, не заводите по отдельной кнопке на каждую. Сделайте в командной панели группу-подменю Печать и положите команды в неё: Счёт, Акт, Накладная. Обработчики можно свести в одну клиентскую процедуру, которая получает имя команды и передаёт его серверу:
&НаКлиенте
Процедура ПечатьПоКоманде(Команда)
ТабличныйДокумент = СформироватьФорму(Команда.Имя);
ТабличныйДокумент.Показать(Команда.Заголовок);
КонецПроцедуры
На сервере по имени команды выбирается макет: ПолучитьМакет(ИмяМакета). Так добавление новой формы сводится к трём действиям: новый макет, новая команда, новая строка в выборе имени.
Доступ и видимость: кто увидит кнопку
Кнопку нужно показывать не всем. И не потому, что печать — секрет, а потому что у пользователя может не быть права на чтение данных, из которых собрана форма.
- Проверьте роль пользователя: в ней должны быть права
ЧтениеиПросмотрна объект и на связанные справочники. Без них серверная функция выдаст ошибку нехватки прав. - Если кнопку надо спрятать от части пользователей, делайте это в обработчике
ПриСозданииНаСервереформы:Элементы.Печать.Видимость = РольДоступна("ПечатьБланков");— имя роли подставьте своё. - Для кнопки, которая зависит от состояния документа, используйте
Доступность: например, блокируйте печать у непроведённых документов. - Если печатная форма нужна только при включённой настройке, привяжите команду к функциональной опции: свойство
Функциональные опциикоманды управляет её доступностью централизованно.
Скрытая кнопка — не защита. Настоящее ограничение — роли и права на объекты. Видимость нужна только для удобства.
Проверка и отладка
После сохранения формы запустите базу в режиме «1С:Предприятие» (F5 в Конфигураторе запускает с отладкой). Откройте документ и нажмите кнопку.
Проверьте по списку, что происходит на экране.
- 👀 Кнопка отображается в нужном месте и открывает окно просмотра.
- 📐 Области выводятся друг за другом без пропусков и пустых строк.
- 🔢 Числа и даты в нужном формате, итоги совпадают с документом.
- 📄 В режиме предварительного просмотра влезает на лист по ширине: проверьте параметр ориентации и поля страницы в макете.
Если что-то не работает , посмотрите на симптом.
Формат(Значение, "…") и сверьте имя реквизита в метаданных.Для отладки поставьте точку останова на строке Макет = ДокументОбъект.ПолучитьМакет(...) в серверной функции (F9) и пройдите её по шагам (F11). Переменные смотрите в окне Вычислить выражение (Shift+F9).
Частые вопросы
Можно ли добавить кнопку печати без программирования?
Почему кнопка есть у меня, а у бухгалтера её нет?
Как напечатать несколько документов сразу?
Элементы.Список.ВыделенныеСтроки. В БСП эту задачу решает подменю «Печать» с пакетной печатью.Нужно ли менять форму в расширении или можно в основной конфигурации?
Как сохранить печатную форму в PDF?
Файл → Сохранить как и тип PDF, либо вызовите ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF) в коде.