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