Добавляем свою кнопку печати в форму документа или справочника 1С 8.3
Содержание
Заказчик просит: «Нужна кнопка Печать, чтобы по документу сразу выходила наша форма, а не типовая». В 1С 8.3 это три действия: нарисовать макет, добавить на форму команду и написать процедуру, которая заполнит макет данными и покажет его на экране. Дальше разберём каждое и добавим то, что обычно упускают: печать через подсистему БСП, расширение конфигурации и прямую отправку на принтер.
Пример ниже работает на управляемых формах (интерфейс «Такси», платформа 8.3.2x и новее). Объект на форме условно называем документом, для справочника всё делается так же, меняются только имена реквизитов.
Какой способ выбрать до начала работы
Кнопка печати бывает трёх видов. Выбор зависит от того, можно ли менять конфигурацию.
| Способ | Когда подходит | Риски |
|---|---|---|
| Макет и команда прямо в конфигурации | Конфигурация без поддержки или самописная | При обновлении типовой конфигурации правки придётся переносить |
| Расширение конфигурации | Типовая конфигурация на поддержке (БП, ЗУП, УТ) | Нужна платформа 8.3.6 и новее; после загрузки расширения требуется обновить конфигурацию БД |
| Дополнительная внешняя печатная форма | Нет доступа к конфигуратору, форма нужна одному заказчику | Работает только там, где подключена подсистема дополнительных отчётов и обработок |
Если у вас типовая конфигурация, начинайте с расширения. Правка основной конфигурации снимает объект с поддержки, и каждое обновление превращается в ручное сравнение.
Расширение создают в конфигураторе: меню «Конфигурация → Расширения конфигурации », кнопка «Добавить». В нём «заимствуют» нужный документ и уже в заимствованном объекте добавляют макет, команду и модуль. Основная конфигурация при этом не меняется, поэтому обновления типового релиза проходят без ручного слияния.
Готовим макет печатной формы в конфигураторе
Макет — это табличный документ, в котором вы заранее рисуете, как будет выглядеть бланк.
- В конфигураторе откройте дерево конфигурации, найдите нужный документ.
- Раскройте его ветку, у пункта «Макеты» нажмите «Добавить».
- Тип макета — «Табличный документ». Имя задайте без пробелов, например
МоюФорма. - В открывшемся редакторе нарисуйте шапку, строку таблицы и подвал.
Каждый логический блок оформите отдельной именованной областью: выделите строки, в меню «Таблица» выберите пункт «Имена» и задайте имя, например Шапка, Строка, Подвал. Именно по этим именам код потом будет забирать куски макета.
Динамические значения вписывайте в ячейки в формате параметра. Выделите ячейку, в окне свойств откройте «Заполнение» и поставьте значение «Параметр». Затем в ячейке напишите имя параметра, например Номер или Контрагент. Для шапки достаточно нескольких параметров: номер, дата, организация, контрагент. Для строк таблицы — наименование, количество, цена, сумма.
Ширину колонок задавайте в шапке первой же областью, а не в строке. Тогда при выводе областей друг под другом сетка не поедет.
Для оформления бланка используйте границы и шрифты прямо в редакторе. Строку с наименованием товара делайте с переносом по словам, иначе длинные названия обрежутся. Для числовых колонок задайте выравнивание по правому краю и маску формата, например два знака после запятой для сумм. Эти настройки хранятся в ячейке и не требуют кода.
Заранее подумайте о повторяющихся элементах. Если у вас в бланке есть подпись руководителя и главного бухгалтера, выведите их в отдельную область Подписи: её легко поменять, не трогая остальной макет. А если печать должна содержать логотип, добавьте его в макет как картинку на листе, а не в ячейку: тогда размер не зависит от ширины колонки. Печатная форма обычно идёт на А4: задайте ориентацию и поля в свойствах табличного документа, чтобы потом не править их кодом.
Добавляем кнопку на форму документа или справочника
В управляемой форме кнопка — это отображение команды. Порядок такой:
- Откройте форму документа (например,
ФормаДокумента) в редакторе форм. - На вкладке «Команды» нажмите «Добавить», назовите команду
Печать_МояФорма, в поле «Заголовок» укажите, что увидит пользователь: «Печать (моя форма)». - В поле «Действие» нажмите лупу и выберите создание обработчика на клиенте. Платформа сама создаст процедуру в модуле формы.
- Перетащите команду из списка команд на вкладку «Элементы» — в командную панель или в группу
ГруппаПечать, если она есть. Так кнопка появится на форме.
Если нужна кнопка в списке документов, а не в самом документе, добавьте команду на форму списка. Тогда в обработчике придётся брать выделенные строки списка и печатать по ссылкам.
Есть и способ без конфигуратора. Пользователь с правами администратора открывает форму, в меню «Ещё» выбирает «Изменить форму», перетаскивает нужную команду на панель и сохраняет. Но своих команд так не создать — только расставить имеющиеся.
Пишем обработчик нажатия
Платформа 1С делит код на клиентский и серверный. Макет и данные читаются на сервере, а показ формы пользователю идёт на клиенте. Поэтому обработчик из двух частей: клиентская процедура вызывает серверную функцию и показывает результат.
&НаКлиенте
Процедура Печать_МояФорма(Команда)
Если Объект.Ссылка.Пустая() Тогда
ПоказатьПредупреждение(, "Сначала запишите документ.");
Возврат;
КонецЕсли;
ТабДок = СформироватьМояФорму();
ТабДок.Показать("Моя форма");
КонецПроцедуры
&НаСервере
Функция СформироватьМояФорму()
ТабДок = Новый ТабличныйДокумент;
Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("МоюФорму");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.Номер = Объект.Номер;
ОбластьШапка.Параметры.Дата = Формат(Объект.Дата, "ДЛФ=D");
ОбластьШапка.Параметры.Контрагент = Объект.Контрагент;
ТабДок.Вывести(ОбластьШапка);
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого Стр Из Объект.Товары Цикл
ОбластьСтрока.Параметры.Заполнить(Стр);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Подвал = Макет.ПолучитьОбласть("Подвал");
ТабДок.Вывести(Подвал);
Возврат ТабДок;
КонецФункции
Имя документа в Документы.РеализацияТоваровУслуг замените на своё, а ПолучитьМакет("МоюФорму") — на то имя, что дали макету. Для справочника вместо Документы будет Справочники. Реквизиты Контрагент и табличная часть Товары у вашего объекта могут называться иначе, сверьтесь с конфигуратором.
Что здесь важно:
- 📌 Проверка
Ссылка.Пустая()отсекает случай, когда документ ещё не записан. Для новых объектов часть данных может быть неполной. - 📌 Метод
Параметры.Заполнить(Стр)переносит в параметры области значения одноимённых колонок строки табличной части. Имена параметров в макете должны совпадать с именами колонок. - 📌 Показ делает метод
Показать(), ему передают заголовок окна.
Параметры и поля макета: что с ними делать
Параметр в макете бывает двух видов, и разница в тонкостях.
Простой параметр подставляет значение как есть. Дату выводят через Формат(), иначе в ячейке окажется длинная строка вроде «07.10.2026 0:00:00».
Расшифровка превращает ячейку в ссылку: клик по ней открывает объект. В макете для такой ячейки в свойстве «Расшифровка» указывают параметр с именем, например, КонтрагентРасшифровка, а в коде присваивают ему ссылку:
ОбластьШапка.Параметры.Контрагент = Объект.Контрагент;
ОбластьШапка.Параметры.КонтрагентРасшифровка = Объект.Контрагент;
Числа склеивайте со строками через Формат(Число, "ЧГ=0") или СтрШаблон, а не знаком плюс: иначе получите ошибку преобразования типов.
Итоги считайте до вывода подвала и кладите в его параметр, например Подвал.Параметры.Итого = СуммаИтого. Не пересчитывайте суммы вручную в ячейках макета.
Если строк много и таблица не влезает на лист, перед выводом подвала проверьте, помещается ли он на страницу. Для этого собирают массив областей и вызывают у табличного документа проверку вывода: ТабДок.ПроверитьВывод(МассивОбластей). Если область не помещается, вставьте разрыв страницы через ТабДок.ВывестиГоризонтальныйРазделительСтраниц().
Печать через подсистему БСП: как это делают в типовых
В типовых конфигурациях (БП 3.0, ЗУП 3.1, УТ 11) своя кнопка «Печать» обычно не нужна: на формах уже стоит универсальная команда с выпадающим списком форм. Вместо ручной кнопки регистрируют новую печатную форму в подсистеме «Печать» библиотеки стандартных подсистем.
Принцип такой. В модуле менеджера объекта процедура ДобавитьКомандыПечати описывает, какие формы доступны. Процедура Печать получает список документов и формирует табличные документы, которые подсистема сама покажет в общем окне с выбором формы и числом копий. Выгода: вы получаете печать нескольких документов сразу, сохранение в файл и отправку по почте без единой строки своего кода.
Если же нужно только добавить форму и не трогать типовой код, делайте это в расширении. Там вы описываете команду печати в собственном модуле, а типовая кнопка подхватывает её.
Расширение подключается к базе отдельно от основной конфигурации: загрузка файла .cfe и применение изменений («Обновить конфигурацию БД») — два разных шага. Забыв второй, вы увидите, что кнопка есть, а новой формы нет.
Прямая печать и выбор принтера
Показ формы на экране — стандартный путь, но иногда нужно, чтобы документ ушёл на принтер сразу.
&НаКлиенте
Процедура ПечатьНаПринтер(Команда)
ТабДок = СформироватьМояФорму();
ТабДок.КоличествоЭкземпляров = 2;
ТабДок.Напечатать();
КонецПроцедуры
Что можно настроить до отправки:
- 🖨
ИмяПринтера— точное имя принтера, как оно называется в системе у пользователя. - 📄
КоличествоЭкземпляров— число копий. - 📐
ОриентацияСтраницы,ПолеСлева,ПолеСправаи другие поля — если не заданы в макете.
Метод Напечатать() принимает параметр, который задаёт, показывать ли диалог выбора принтера: с диалогом пользователь сам выберет устройство и число копий, без диалога печать уйдёт сразу. Для общего случая диалог оставляйте: у разных сотрудников разные принтеры по умолчанию, а жёстко прописанное имя принтера на другой машине даст ошибку.
Прямая печать без показа нарушает привычный сценарий: пользователь не видит результат до распечатки. Давайте её отдельной командой, а не заменяйте ей обычный предпросмотр.
Отладка и типичные ошибки
Если кнопка есть, а печать не работает , проверьте по порядку.
ПолучитьОбласть("…") не совпадает с именем области в макете. Откройте макет и сверьте регистр и написание.&НаСервере.Для поиска причин используйте отладку. Поставьте точку останова на первой строке серверной функции и запустите базу в режиме отладки из конфигуратора (клавиша F5). Проходите код по шагам и смотрите значения параметров в окне «Вычислить выражение». Если форма запущена как тонкий клиент без отладчика, ошибку покажет окно сообщения: прочитайте её текст целиком, там указана строка модуля.
Права пользователя тоже могут блокировать печать: если у роли нет права на просмотр нужного реквизита, область выведется с пустыми значениями. Проверьте роль на тестовом пользователе, а не только под администратором.
Частые вопросы
Можно ли добавить кнопку печати без доступа к конфигуратору?
Администрирование и найдите в нём подраздел про печатные формы, отчёты и обработки. Создавать команды печати без разработки при этом нельзя, только подключить готовую внешнюю форму.Чем отличается печать документа от печати списка?
Объект, в списке — из ссылок на выделенные строки. Для списка в обработчик передают массив выделенных элементов и запрашивают данные на сервере запросом.