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