Как реализовать автоматическое заполнение и печать шаблона в обработке 1С

Программист 1С v8.3 (Управляемые формы)
← На главную

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

Разберем постановку задачи

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

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

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

Выясним основные правила работы с макетом:

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

Шаг 2. Создание команды и кнопки на форме

Перейдем в редактор формы обработки. Нам нужно создать команду, которая будет запускать процесс формирования печати:

Шаг 3. Получение данных из выделенной строки

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

На стороне клиента мы получаем ссылку на текущие данные:


&НаКлиенте
Процедура ПечатьСправки(Команда)
    
    // Получаем данные текущей строки из таблицы формы
    ТекущиеДанные = Элементы.СписокСтудентов.ТекущиеДанные;
    
    Если ТекущиеДанные = Неопределено Тогда
        Сообщить("Пожалуйста, выберите студента в списке!");
        Возврат;
    КонецЕсли;
    
    // Вызываем серверную функцию для формирования печатной формы
    ТабДок = СформироватьПечатнуюФормуНаСервере(ТекущиеДанные.Ссылка);
    
    // Выводим результат пользователю
    ТабДок.Показать("Справка в военкомат");
    
КонецПроцедуры

Шаг 4. Программное заполнение макета на сервере

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

Разберем пример серверной функции:


&НаСервере
Функция СформироватьПечатнуюФормуНаСервере(СсылкаНаСтудента)
    
    // Создаем объект итогового табличного документа
    ТабДок = Новый ТабличныйДокумент;
    
    // Получаем макет из нашей обработки
    Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("МакетСправки");
    
    // Получаем область "Шапка"
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    
    // Заполняем параметры области данными из ссылки
    // Допустим, у студента есть реквизиты ФИО и ДатаРождения
    ОбластьШапка.Параметры.ФИОСтудента = СсылкаНаСтудента.ФИО;
    ОбластьШапка.Параметры.ДатаРождения = Формат(СсылкаНаСтудента.ДатаРождения, "ДЛФ=Д");
    
    // Если данные нужно брать из регистров (например, воинский учет)
    // Проанализируем запрос к регистру сведений
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ВоинскийУчетСрезПоследних.Военкомат,
        |   ВоинскийУчетСрезПоследних.Годность
        |ИЗ
        |   РегистрСведений.ВоинскийУчет.СрезПоследних(, ФизЛицо = &ФизЛицо) КАК ВоинскийУчетСрезПоследних";
    
    Запрос.УстановитьПараметр("ФизЛицо", СсылкаНаСтудента);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        ОбластьШапка.Параметры.Военкомат = Выборка.Военкомат;
    КонецЕсли;
    
    // Выводим заполненную область в итоговый документ
    ТабДок.Вывести(ОбластьШапка);
    
    // Устанавливаем параметры печати
    ТабДок.АвтоМасштаб = Истина;
    ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
    
    Возврат ТабДок;
    
КонецФункции

Шаг 5. Мгновенная печать документа

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

В клиентской процедуре вместо ТабДок.Показать() следует использовать:


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

// Или прямая печать на принтер по умолчанию без лишних вопросов
ТабДок.Напечатать(РежимИспользованияПринтера.БезЗапроса);

Важные рекомендации при работе с пустой базой

Поскольку учебная база может быть пустой, при нажатии кнопки вы можете увидеть пустой лист или ошибку. Выясним, почему это происходит и как это исправить:

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

← На главную