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