Разработка внешних печатных форм — одна из самых частых задач при адаптации типовых конфигураций под нужды бизнеса. Использование Microsoft Word в качестве шаблона позволяет создавать документы со сложным форматированием, которые трудно реализовать в стандартном табличном документе 1С. В данной статье мы подробно разберем, как интегрировать Word-макет во внешнюю обработку, используя механизмы Библиотеки стандартных подсистем (БСП).
Для начала нам необходимо создать файл шаблона. В современных версиях 1С (платформа 8.3 и выше) работа с Word строится на использовании файлов с расширением .docx. Разберем основные правила оформления такого макета:
{v8 ИмяПараметра}. Например, текст в Word может выглядеть так: "Договор № {v8 Номер} от {v8 Дата}".{v8 Область.ИмяОбласти}, а конец — {v8 /Область.ИмяОбласти}.После подготовки файла сохраните его. В конфигураторе 1С во внешней обработке создайте новый макет, выберите тип Двоичные данные и загрузите ваш файл .docx. Назовите макет, например, ПФ_WORD_Договор.
Чтобы БСП «увидела» нашу обработку и позволила добавить ее в список печатных форм документа, нам нужно прописать стандартную функцию СведенияОВнешнейОбработке() в модуле объекта. Проанализируем пример кода для этой функции:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг"); // Укажите свой документ
ПараметрыРегистрации.Наименование = "Печать договора в Word";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
ПараметрыРегистрации.Версия = "1.0";
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Договор (Word)";
НоваяКоманда.Идентификатор = "ДоговорWord";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипВызоваКомандыВызовСерверногоМетода();
НоваяКоманда.Модификатор = "ПечатьMXL";
Возврат ПараметрыРегистрации;
КонецФункции
Обратите внимание на Идентификатор — он понадобится нам позже для определения того, какую именно форму выбрал пользователь.
Согласно стандартам БСП, при вызове команды печати система обращается к экспортной процедуре Печать() в модуле объекта. Выясним, как должна выглядеть структура этой процедуры для работы с Word.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПараметрыПечати = Новый Структура;
// Проверяем, выбрана ли наша команда
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ДоговорWord");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати);
ПечатнаяФорма.СинонимМакета = "Договор в формате Word";
КонецЕсли;
КонецПроцедуры
Важный нюанс: несмотря на то, что мы выводим Word, БСП часто оперирует объектом ПечатнаяФорма.ТабличныйДокумент или специфическими методами для офисных документов. Разберем подробнее формирование самих данных.
Теперь рассмотрим самый ответственный этап — заполнение макета данными из информационной базы. Мы будем использовать механизм УправлениеПечатью. Основная идея заключается в создании структуры данных, где ключи соответствуют параметрам {v8 ...} в Word.
Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
// Получаем макет из двоичных данных
Макет = ПолучитьМакет("ПФ_WORD_Договор");
// Создаем временное хранилище для печати через БСП
ДанныеОбъектов = Новый Соответствие;
Для Каждого СсылкаИзМассива Из МассивОбъектов Цикл
// Здесь мы подготавливаем структуру данных для одного документа
ДанныеДокумента = Новый Структура;
ДанныеДокумента.Вставить("Номер", СсылкаИзМассива.Номер);
ДанныеДокумента.Вставить("Дата", Формат(СсылкаИзМассива.Дата, "ДЛФ=DD"));
ДанныеДокумента.Вставить("Контрагент", СокрЛП(СсылкаИзМассива.Контрагент));
// Пример заполнения таблицы внутри Word
ТаблицаТовары = Новый Массив;
Для Каждого СтрокаТЧ Из СсылкаИзМассива.Товары Цикл
СтрокаДанных = Новый Структура;
СтрокаДанных.Вставить("Номенклатура", СокрЛП(СтрокаТЧ.Номенклатура));
СтрокаДанных.Вставить("Количество", СтрокаТЧ.Количество);
СтрокаДанных.Вставить("Цена", СтрокаТЧ.Цена);
ТаблицаТовары.Добавить(СтрокаДанных);
КонецЦикла;
// Описание областей для Word
ОписаниеОбластей = Новый Структура;
ОписаниеОбластей.Вставить("СтрокаТаблицы", "СтрокаТаблицы"); // Имя области в Word
// Формируем финальные данные для этого объекта
ДанныеОбъекта = Новый Структура;
ДанныеОбъекта.Вставить("ДанныеЗаполнения", ДанныеДокумента);
ДанныеОбъекта.Вставить("Таблицы", Новый Структура("Товары", ТаблицаТовары));
ДанныеОбъектов.Вставить(СсылкаИзМассива, ДанныеОбъекта);
КонецЦикла;
// Вызываем механизм БСП для генерации печатных форм Word
// В зависимости от версии БСП метод может отличаться
// Обычно используется УправлениеПечатью.СформироватьДокументыMicrosoftWord
Возврат УправлениеПечатью.СформироватьДокументыMicrosoftWord(Макет, ДанныеОбъектов);
КонецФункции
Работа с областями: Проанализируем ситуацию, когда вам нужно скрыть целый блок текста. В Word это делается через механизм описания областей. Вы можете определить область {v8 Область.УсловиеДоставки} и программно решить, выводить её или нет, добавляя её в структуру описания только при выполнении определенных условий.
Склонение имен: В юридических документах часто требуется склонять ФИО. Рекомендуем использовать встроенный механизм БСП: ФизическиеЛица.Просклонять. Результат склонения передавайте в структуру ДанныеДокумента как готовый параметр.
Отладка: Основная сложность внешних обработок — трудность отладки кода в модуле объекта. Мы рекомендуем сначала протестировать запрос и логику формирования структуры ДанныеДокумента в обычной консоли запросов или создать временную форму внутри обработки для вызова процедур печати кнопкой. Для упрощения этого процесса подойдёт шаблон внешней печатной формы с формой для отладки и авторегистрацией.
Зависимость от ПО: Помните, что классический метод формирования документов через COM-объект требует установленного Microsoft Word на компьютере пользователя. Если ваша база работает в облаке или через веб-клиент на Linux, следует рассмотреть современные методы генерации через шаблоны Office Open XML, которые не требуют наличия Word на сервере или клиенте.
Используя приведенные инструкции, вы сможете создавать профессиональные и гибкие печатные формы, которые будут легко поддерживаться и обновляться без изменения основной конфигурации 1С. В качестве основы можно использовать готовый шаблон внешней печатной формы для вывода данных в Word средствами БСП.