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