К статье
Практический материал

Документы и Печать · 13 мин

Как написать печатную форму 1С: от макета до регистрации в базе

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

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

Механика одинакова для большинства конфигураций на БСП (Библиотека стандартных подсистем): «Управление торговлей», «ERP», «Комплексная автоматизация», «Бухгалтерия предприятия». Вы создаете внешнюю обработку с макетом и экспортными процедурами СведенияОВнешнейОбработке и Печать, регистрируете её в базе — и кнопка «Печать» документа начинает показывать вашу форму в общем списке.

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

Выберите способ: внешняя обработка или расширение конфигурации

Первое решение, которое нужно принять, — где будет жить код печатной формы. Внешняя печатная форма (файл .epf) подключается без изменения конфигурации, не требует снятия с поддержки и легко откатывается: достаточно отключить её в списке дополнительных обработок. Это стандартный вариант для доработки бланков, счетов, актов и доверенностей.

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

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

Сравнение вариантов

Внешняя печатная форма (.epf)

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

Расширение конфигурации

Подходит, когда нужно переопределить типовую команду печати или расширить модуль менеджера объекта. Требует проверки совместимости при каждом обновлении.

Правка типовой конфигурации

Только как крайняя мера. Снимает объект с поддержки, усложняет обновления, изменения легко потерять.

Подготовьте макет табличного документа

Макет — это «шаблон» будущего документа. Создайте внешнюю обработку (Файл → Новый → Внешняя обработка), затем в дереве обработки добавьте макет типа «Табличный документ». В макете вы рисуете структуру формы: шапку с реквизитами организации, табличную часть с номенклатурой, подвал с итогами и подписями.

Ключевой прием — именованные области и параметры. Выделите строки шапки и задайте имя области, например «Шапка» (свойство «Имя» у выделенных строк). В ячейках, куда подставляются данные, вместо фиксированного текста укажите параметр в квадратных скобках: [НомерДокумента], [Контрагент], [Сумма]. В свойствах ячейки параметр «Заполнение» должен быть установлен в «Параметр» — иначе подстановка не сработает.

Для табличной части создайте область «Строка» с параметрами колонок ([Номенклатура], [Количество], [Цена], [СуммаСтроки]) и отдельно область «Итого». Такое деление позволяет в коде выводить шапку один раз, строки — в цикле, а итоги — после цикла. Имена параметров должны в точности совпадать с тем, что вы передадите в метод Параметры.ИмяПараметра при заполнении.

Напишите функцию СведенияОВнешнейОбработке

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

Типовой каркас функции выглядит так:

Функция СведенияОВнешнейОбработке() Экспорт

ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();

ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();

ПараметрыРегистрации.Версия = "1.0";

НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();

НоваяКоманда.Представление = НСтр("ru = 'Счет на оплату (наш бланк)'");

НоваяКоманда.Идентификатор = "СчетНашБланк";

НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();

НоваяКоманда.ПоказыватьОповещение = Ложь;

Возврат ПараметрыРегистрации;

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

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

Реализуйте процедуру Печать

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

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетНашБланк");

Если ПечатнаяФорма <> Неопределено Тогда

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

ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Счет на оплату (наш бланк)'");

ПечатнаяФорма.ИмяФайлаПечатнойФормы = "Счет на оплату";

КонецЕсли;

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

Основную работу удобно вынести в отдельную функцию СформироватьПечатнуюФорму. Её логика стандартна: получить макет методом ПолучитьМакет("ИмяМакета"), подготовить данные запросом к документу, затем в цикле по документам выводить области. Для каждого документа шапка заполняется через ОбластьШапка.Параметры.Заполнить(Выборка) или поименным присвоением, строки — выводом области «Строка» в цикле по табличной части.

Чтобы в табличном документе корректно работали гиперссылки на документы, вызывайте УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, СсылкаНаДокумент) перед выводом первой области каждого документа. Без этого механизм «подсветки» объектов печати и пакетная печать нескольких документов будут работать неправильно.

Порядок создания печатной формы
  1. 1
    Создайте внешнюю обработку и добавьте макет табличного документа
  2. 2
    Разметьте макет: именованные области «Шапка», «Строка», «Итого», параметры в квадратных скобках
  3. 3
    Добавьте функцию СведенияОВнешнейОбработке с командой печати
  4. 4
    Реализуйте процедуру Печать и функцию формирования табличного документа
  5. 5
    Проверьте обработку в режиме предприятия через Файл → Открыть
  6. 6
    Зарегистрируйте обработку в «Дополнительные отчеты и обработки» и назначьте разделы/объекты
  7. 7
    Напечатайте тестовый документ и сверьте все поля с исходными данными

Заполните макет данными: запрос и вывод областей

Данные для печати получайте запросом, а не обращением к реквизитам через точку в цикле — это быстрее и безопаснее при пакетной печати десятков документов. Типовой запрос выбирает шапку документа и табличную часть, соединяя их по ссылке. Результат обходите двумя выборками: по документам и вложенной — по строкам.

Пример заполнения области шапки:

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

ОбластьШапка.Параметры.НомерДокумента = Выборка.Номер;

ОбластьШапка.Параметры.ДатаДокумента = Формат(Выборка.Дата, "ДЛФ=D");

ОбластьШапка.Параметры.Контрагент = Выборка.Контрагент;

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

Метод Параметры.Заполнить(Выборка) удобен, когда имена параметров макета совпадают с именами полей запроса — тогда не нужно перечислять каждое поле. Но помните: Заполнить подставляет только совпадающие по имени параметры, остальные останутся пустыми. Для вычисляемых значений (сумма прописью, итоги, форматированные строки) присваивание всё равно делается вручную.

Для суммы прописью используйте функции БСП (РаботаСКурсамиВалют.СформироватьСуммуПрописью или аналог в вашей конфигурации) — не пишите собственный преобразователь чисел в текст, это классический источник ошибок в копейках и склонениях.

Зарегистрируйте форму в базе

Регистрация выполняется в режиме предприятия: Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки (в некоторых конфигурациях путь отличается, но справочник один и тот же). Нажмите «Добавить из файла», выберите ваш .epf, при необходимости укажите разделы или конкретные объекты, для которых доступна форма.

Если механизм дополнительных обработок отключен, включите флажок «Дополнительные отчеты и обработки» в настройках администрирования. В файловых базах и при отладке можно обойтись без регистрации: откройте обработку напрямую через Файл → Открыть — команда печати выполнится, но в меню «Печать» документа она не появится.

После регистрации откройте документ нужного вида, нажмите «Печать» — ваша форма должна быть в списке среди типовых. Если её нет, проверьте: вид обработки (должен быть «Печатная форма»), назначение обработки на нужный вид документов и отсутствие ошибок в СведенияОВнешнейОбработке.

Проверьте результат и типичные ошибки

Проверка печатной формы — не формальность. Сверьте с исходным документом: номер и дату, наименование контрагента и его ИНН, итоговую сумму цифрами и прописью, количество строк табличной части. Особое внимание — документам со скидками, возвратами и частичными оплатами: именно там всплывают ошибки выборки данных.

Проверьте пакетную печать: выделите в журнале несколько документов и выполните команду. Каждый документ должен начинаться с новой страницы (для этого перед выводом шапки второго и последующих документов вызывайте ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц()).

Типичные ошибки
01
Опечатка в имени параметра макета — ячейка остается пустой без сообщения об ошибке; сверяйте имена в макете и коде посимвольно
02
Забыт вызов ЗадатьОбластьПечатиДокумента — ломается пакетная печать и выделение объектов в табличном документе
03
Нет разделителя страниц между документами — при печати нескольких документов они сливаются на одном листе
04
Обращение к реквизитам через точку внутри цикла по документам — резкое замедление при пакетной печати
05
Идентификатор команды изменен после регистрации — команда пропадает из меню «Печать» или вызывается старая версия
06
Заполнение макета методом Заполнить при несовпадающих именах полей запроса и параметров — часть полей пустая
Контрольные точки

Как проверить результат

Форма в меню «Печать» документа
Норма

Команда видна в списке вместе с типовыми

Тревожный признак

Команды нет — проверьте вид обработки и назначение на вид документа

Заполнение полей
Норма

Все параметры подставлены, суммы совпадают с документом

Тревожный признак

Пустые ячейки или текст [Параметр] в квадратных скобках

Пакетная печать нескольких документов
Норма

Каждый документ с новой страницы, итоги по каждому свои

Тревожный признак

Документы сливаются или итоги суммируются нарастающим итогом

Сумма прописью
Норма

Копейки и склонения корректны

Тревожный признак

Ошибки в копейках, неверный падеж валюты

Часто задаваемые вопросы

Можно ли изменить типовую печатную форму без программирования?

Частично. Во многих конфигурациях есть «Редактор печатных форм» (меню «Печать» → «Изменить макет»), позволяющий править тексты, логотипы и расположение полей без кода. Но добавить новое вычисляемое поле или изменить логику выборки данных так нельзя — для этого нужна внешняя обработка.

Почему печатная форма не появляется в меню «Печать» после регистрации?

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

Как вывести печатную форму для нескольких видов документов одной обработкой?

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

Чем отличаются параметры макета от областей?

Область — это именованный фрагмент макета (например, строки «Шапка» или «Строка»), который выводится в табличный документ целиком. Параметр — это ячейка внутри области, значение которой подставляется из кода. Сначала получаете область, затем заполняете её параметры, затем выводите.

Нужно ли перерегистрировать обработку после изменения макета?

Да, если изменился файл .epf. Зарегистрированная в базе обработка хранится внутри информационной базы, поэтому после правок файл нужно загрузить заново через кнопку «Загрузить из файла» в карточке обработки. Идентификаторы команд при этом менять не следует.

Как добавить в форму логотип или подпись-картинку?

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

Итог

Что важно запомнить

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