Печатная форма в 1С своими руками: от макета до кнопки на форме
Содержание
Чтобы создать кнопку печати в 1С, нужны четыре вещи: макет с областями в объекте конфигурации, команда на форме, клиентский обработчик и серверная функция, которая заполняет табличный документ данными. Всё делается в Конфигураторе. Порядок такой: сначала макет, потом команда, потом код.
Ниже разобран классический путь на примере документа с шапкой и табличной частью. Он работает в любой конфигурации на платформе 8.3 с интерфейсом «Такси», где вы вправе менять метаданные. В типовых конфигурациях лучше идти через расширение: правка самой конфигурации блокирует обновления.
Перед стартом: что нужно решить заранее
Три вопроса определяют всю работу.
- 🔧 Где менять. Своя конфигурация — правьте напрямую. Типовая на поддержке — создайте расширение и подключите к нему нужный документ.
- 📄 Какой документ печатаем. Нужно знать имя объекта метаданных, реквизиты шапки и состав табличной части.
- 🧩 Есть ли в конфигурации БСП. Если подсистема «Печать» встроена, кнопка «Печать» на форме уже есть, и вам остаётся добавить новую форму в её список. Это самый чистый вариант (он описан в отдельном разделе ниже).
Свою кнопку вручную делают в учебных базах, в самописных конфигурациях и там, где нужна одна нестандартная форма без выбора из списка.
Шаг 1. Макет печатной формы
Макет — это табличный документ с именованными областями. Код потом берёт область, подставляет значения и выводит её на лист.
- В дереве конфигурации раскройте документ и найдите ветку
Макеты. - Нажмите «Добавить», выберите тип «Табличный документ», задайте имя, например
ПФ_Счёт. - Выделите строки и выберите в меню «Таблица → Имена → Назначить имя» (или через контекстное меню выделенных строк). Так создаются области.
Для документа с табличной частью нужны минимум три области:
| Область | Что в ней | Сколько раз выводится |
|---|---|---|
Шапка | Заголовок, номер, дата, контрагент | Один раз |
Строка | Одна строка табличной части | По разу на каждую строку |
Подвал | Итого, подписи | Один раз |
Параметры в ячейках пишутся без знака равенства: просто имя, например Номер, а в свойствах ячейки заполнение выставляется как «Параметр». Если нужен текст вместе с параметром, используйте «Шаблон», а в тексте имя берётся в квадратные скобки: Счёт № [Номер].
Дайте параметрам понятные имена. Если имя параметра совпадает с именем поля в выборке запроса, потом всё заполнится одной строкой кода.
Шаг 2. Как разместить кнопку на форме документа
Откройте форму документа в Конфигураторе и перейдите на закладку «Команды».
- Добавьте новую команду с именем
Печать, синонимом «Печать счёта». - В свойстве «Действие» нажмите лупу: платформа создаст пустой обработчик в модуле формы.
- Перетащите команду из списка на закладку «Командный интерфейс» или в панель элементов формы, в нужную группу.
- Задайте картинку (стандартная картинка «Печать») и отображение «Картинка и текст».
Если форма управляемая, а в корне формы уже стоит командная панель, кнопку можно положить в неё. Это и есть «кнопка печати»: платформа рисует её сама из команды.
У команды стоит проверить свойство «Использование»: если оставить доступность только для некоторых ролей, остальные пользователи кнопки не увидят и решат, что у вас ничего не вышло.
Шаг 3. Код: клиент вызывает сервер
Печатную форму формируют на сервере: там есть доступ к базе и макетам. Клиентский обработчик только вызывает серверную функцию и показывает результат.
&НаКлиенте
Процедура Печать(Команда)
Если Объект.Ссылка.Пустая() Тогда
ПоказатьПредупреждение(, "Сначала запишите документ.");
Возврат;
КонецЕсли;
Если Модифицированность Тогда
Записать();
КонецЕсли;
ТабДок = СформироватьПечатнуюФорму(Объект.Ссылка);
ТабДок.Показать("Счёт");
КонецПроцедуры
Почему сначала проверка ссылки. Запрос в серверной функции читает данные из базы, а новый несохранённый документ там ещё не лежит. Без записи кнопка напечатает пустой лист или упадёт.
Серверная часть:
&НаСервере
Функция СформироватьПечатнуюФорму(ДокументСсылка)
ТабДок = Новый ТабличныйДокумент;
ТабДок.КлючПараметровПечати = "ПЕЧАТЬ_МойДокумент_Счёт";
Макет = Документы.МойДокумент.ПолучитьМакет("ПФ_Счёт");
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Запрос.Текст =
"ВЫБРАТЬ
| Док.Номер КАК Номер,
| Док.Дата КАК Дата,
| Док.Контрагент.Наименование КАК Контрагент
|ИЗ
| Документ.МойДокумент КАК Док
|ГДЕ
| Док.Ссылка = &Ссылка";
ВыборкаШапки = Запрос.Выполнить().Выбрать();
ВыборкаШапки.Следующий();
Область = Макет.ПолучитьОбласть("Шапка");
ЗаполнитьЗначенияСвойств(Область.Параметры, ВыборкаШапки);
ТабДок.Вывести(Область);
// Табличная часть — следующий раздел
Возврат ТабДок;
КонецФункции
Здесь МойДокумент — условное имя. Подставьте имя своего документа и своего макета.
Реквизит КлючПараметровПечати нужен, чтобы платформа запоминала настройки печати пользователя (поля, ориентацию) именно для этой формы.
Шаг 4. Заполнение табличной части
Строки выводятся в цикле, по одной области на строку. Лучше брать их вторым запросом с упорядочиванием по номеру строки, а не обходить Объект.Товары на форме: тогда печатается то, что реально записано в базе.
Запрос.Текст =
"ВЫБРАТЬ
| Т.НомерСтроки КАК НомерСтроки,
| Т.Номенклатура.Наименование КАК Товар,
| Т.Количество КАК Количество,
| Т.Цена КАК Цена,
| Т.Сумма КАК Сумма
|ИЗ
| Документ.МойДокумент.Товары КАК Т
|ГДЕ
| Т.Ссылка = &Ссылка
|УПОРЯДОЧИТЬ ПО
| Т.НомерСтроки";
ВыборкаСтрок = Запрос.Выполнить().Выбрать();
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
Итого = 0;
Пока ВыборкаСтрок.Следующий() Цикл
ЗаполнитьЗначенияСвойств(ОбластьСтроки.Параметры, ВыборкаСтрок);
ТабДок.Вывести(ОбластьСтроки);
Итого = Итого + ВыборкаСтрок.Сумма;
КонецЦикла;
ОбластьПодвала = Макет.ПолучитьОбласть("Подвал");
ОбластьПодвала.Параметры.Итого = Итого;
ТабДок.Вывести(ОбластьПодвала);
Область ОбластьСтроки берётся из макета один раз перед циклом. Заполнять и выводить её можно сколько угодно раз.
Ещё один приём — не разрывать подвал и подписи между страницами. Перед выводом подвала проверьте, помещается ли он на лист:
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьСтроки);
МассивОбластей.Добавить(ОбластьПодвала);
Если Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
Если не помещается, начинайте новую страницу: подписи на отдельном листе без таблицы — частая претензия бухгалтерии.
Настройка печати: масштаб, поля, предпросмотр
Свойства табличного документа задают до вывода областей.
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
- 📐 Автомасштаб вписывает ширину таблицы в лист, и широкая форма не уезжает на вторую страницу.
- 🧭 Ориентация. Для таблиц шире шести-семи колонок берите альбомную:
ОриентацияСтраницы.Ландшафт. - 🖨 Предпросмотр. Метод
Показатьоткрывает форму табличного документа. В ней есть предварительный просмотр, выбор принтера и число копий, отдельный код для этого не нужен. - 📋 Количество копий. Задаётся свойством
КоличествоЭкземпляров, но пользователь всё равно может поменять его в окне печати.
Если форму нужно сразу отправить на принтер без показа, используйте метод Напечатать(). Но тогда пользователь не увидит результата и не сможет проверить ошибки, поэтому для документов лучше оставлять Показать.
Печать из БСП: когда подсистема уже есть
Если в конфигурации подключена подсистема «Печать» из библиотеки стандартных подсистем, вручную рисовать кнопку и обработчик не нужно. Работа сводится к трём шагам:
- Макет создаётся так же, как выше.
- В модуле менеджера документа добавляется процедура, которая регистрирует команду печати: у неё задают идентификатор и представление (то, что увидит пользователь в меню «Печать»). Там же пишется процедура
Печатьс параметрамиМассивОбъектов,ПараметрыПечати,КоллекцияПечатныхФорм,ОбъектыПечати,ПараметрыВывода. - В форме документа вызывается инициализация подключаемых команд при создании на сервере. Тогда меню «Печать» формируется само.
Внутри процедуры Печать вы находите нужную печатную форму в коллекции по идентификатору и кладёте в неё готовый табличный документ. Дальше БСП сама разберётся с предпросмотром, выбором нескольких документов и выводом комплектом.
Плюс подхода: пользователь выбирает из списка, можно печатать сразу несколько документов из журнала, работает общий механизм редактируемых макетов. Минус: нужно знать устройство БСП вашей версии, а в расширении часть команд регистрируется иначе. Если не уверены, откройте комментарии к процедурам регистрации в самой конфигурации: они описывают параметры подробнее любой статьи.
Расширение вместо правки типовой конфигурации
Для типовых «Бухгалтерии», ЗУП, УТ правка конфигурации превращает каждое обновление в слияние кода. Расширение этого не требует.
- Создайте расширение в Конфигураторе (меню «Конфигурация → Расширения конфигурации »).
- Добавьте в него «заимствованные» объекты: документ, форму, которую нужно доработать.
- Макет создавайте уже в расширении — у документа появится свой макет.
- Кнопку и код добавляйте в заимствованную форму расширения.
- После загрузки обязательно обновите конфигурацию базы данных.
Расширения доступны начиная с платформы 8.3.6, на актуальных версиях с этим проблем нет. Обновление структуры базы требует монопольного доступа: выберите время, когда пользователей нет.
Типичные ошибки и что проверить
Эти симптомы встречаются чаще всего, и причины у них разные.
Кнопка не видна. Проверьте, что команда добавлена в элементы формы (в одном списке команд её недостаточно), доступна по ролям и не скрыта свойством «Видимость». В режиме пользователя форму стоит переоткрыть: открытое окно не обновляется само.
«Область не найдена» или пустые поля. Имя области в ПолучитьОбласть("Строка") должно совпадать с именем в макете до буквы. Частая причина — латинская «C» вместо русской «С», которую глазом не отличить. Параметр без заполнения оставляет пустую ячейку: проверьте, что имя параметра совпало с псевдонимом поля в запросе.
Печатается пустой лист или одна шапка. Документ не записан, запрос вернул пустой результат или цикл не дошёл до строк. Выведите ВыборкаСтрок.Количество() в сообщение при отладке.
Дата и числа выглядят криво. В ячейке макета задайте формат (даты, числа с двумя знаками после запятой). Другой путь — формат применяется на лету функцией Формат() в коде.
Форма не помещается на лист. Включите автомасштаб или переведите ориентацию в альбомную. Если ширина колонок в макете больше ширины листа, автомасштаб ужмёт шрифт до нечитаемого, поэтому сузьте колонки.
Не меняйте типовую форму в рабочей базе без копии базы и без отдельного расширения: неудачная правка может сломать открытие документа у всех пользователей.
Что можно добавить к простой кнопке
Когда базовая печать заработала, форму можно улучшить.
- 🖋 Подпись и печать. Картинки хранятся в макете или в справочнике. Для вставки используйте область-рисунок и заполняйте её параметр картинкой.
- 🧾 Сумма прописью. Нужная функция есть в библиотеках: проверьте общие модули вашей конфигурации перед тем, как писать свою.
- 📚 Несколько вариантов формы. Делайте отдельные макеты и отдельные команды или выпадающее меню «Печать» с группой команд.
- 📤 Экспорт. Готовый табличный документ сохраняется в PDF и Excel стандартным диалогом сохранения; ничего писать не нужно.
- 🔁 Общий код. Если печатных форм больше трёх, вынесите вывод шапки и подвала в общий серверный модуль.
Частые вопросы
Можно ли сделать кнопку печати без программирования?
Где хранится макет печатной формы: в документе или отдельно?
Как показать форму не в окне, а сразу отправить на принтер?
Напечатать() у табличного документа. Пользователь не увидит предпросмотра, поэтому для рабочих документов обычно оставляют Показать.Почему на клиенте нельзя собрать форму целиком?
Что делать, если печатная форма нужна для нескольких документов сразу?
МассивОбъектов.