Предлагаю вашему вниманию универсальный механизм печати из типовых конфигураций 1С 8.1 печатных документов на базе макетов сделанных в MS Word.
Для работы механизма необходимо:
- Скопировать в вашу конфигурацию справочник «ПечатныеФормыWord»
- В модуль «Универсальные механизмы» (или «Работа с диалогами» в зависимости от версии конфигурации) добавить следующую процедуру:
// Процедура дополняет таблицу печатных форма (ТаблицаМакетовWord) объекта
// из справочника "ПечатныеФормыWord"
Процедура ДобавитьВДеревоМакетовФормыWord(ДеревоМакетов, СсылкаОбъекта, Действие)
СтрокиДерева = ДеревоМакетов.Строки;
Если ТипЗнч(СсылкаОбъекта) = Тип("ОбъектМетаданных") Тогда
Возврат;
КонецЕсли;
МетаданныеОбъекта = СсылкаОбъекта.Метаданные();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ПечатныеФормыWord.Ссылка,
| ПечатныеФормыWord.Наименование
|ИЗ
| Справочник.ПечатныеФормыWord КАК ПечатныеФормыWord
|ГДЕ
| ПечатныеФормыWord.ИмяМетоданных = &ИмяМетоданных
| И ПечатныеФормыWord.ТипМетаданных = &ТипМетаданных";
ИмяТаблицыОбъекта = "";
Если Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
Запрос.УстановитьПараметр("ТипМетаданных", "Документ");
ИначеЕсли Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
Запрос.УстановитьПараметр("ТипМетаданных", "Справочник");
ИначеЕсли Метаданные.Отчеты.Содержит(МетаданныеОбъекта) Тогда
Запрос.УстановитьПараметр("ТипМетаданных", "Отчет");
Иначе
Возврат;
КонецЕсли;
Запрос.УстановитьПараметр("ИмяМетоданных", МетаданныеОбъекта.Имя);
БылРазделитель = СтрокиДерева.Количество() = 0 ;
Выборка = Запрос.Выполнить().Выбрать();//ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл
ПорядковыйНомер = 0;
// Только тут будем добавлять новую печ. форму в дополнение списка
Если Не БылРазделитель Тогда
ДобавитьСтрокуВДеревоКнопок(ДеревоМакетов, Строка(Новый УникальныйИдентификатор), ТипКнопкиКоманднойПанели.Разделитель);
БылРазделитель = Истина;
КонецЕсли;
Суффикс = ?(ПорядковыйНомер = 0 ,"" , "("+ПорядковыйНомер+")");
ДобавитьСтрокуВДеревоКнопок(ДеревоМакетов, Строка(Новый УникальныйИдентификатор), ТипКнопкиКоманднойПанели.Действие, Выборка.Наименование + Суффикс, Действие ,,,,,,Выборка.Ссылка);
КонецЦикла;
КонецПроцедуры
- В функции «ИнициализироватьДеревоДополнительныхКнопок» добавить Колонку «СправочникWord» в возвращаемое дерево:
Функция ИнициализироватьДеревоДополнительныхКнопок() Экспорт
ДеревоКнопок = Новый ДеревоЗначений;
//Если ИмяКнопки = Неопределено, создается разделитель
//Если Дерево имеет подчиненные, то
ДеревоКнопок.Колонки.Добавить("Имя");
ДеревоКнопок.Колонки.Добавить("ТипКнопки");
ДеревоКнопок.Колонки.Добавить("Текст");
ДеревоКнопок.Колонки.Добавить("Подсказка");
ДеревоКнопок.Колонки.Добавить("Картинка");
ДеревоКнопок.Колонки.Добавить("Действие");
ДеревоКнопок.Колонки.Добавить("Пометка");
ДеревоКнопок.Колонки.Добавить("ИзменяетДанные");
//Остальные свойства кнопки
ДеревоКнопок.Колонки.Добавить("Расшифровка");
// *****Вот здесь добавить колонку
ДеревоКнопок.Колонки.Добавить("СправочникWord");
//******Добавили колонку.
Возврат ДеревоКнопок;
КонецФункции // ()
- В функцию «ДобавитьСтрокуВДеревоКнопок» добавить параметр «СсылкаНаСправочникWord» и реализовать заполнение этим параметром строки дерева:
Функция ДобавитьСтрокуВДеревоКнопок(СтрокаПодменю, Имя, Знач ТипКнопки = Неопределено ,Текст = "", Действие = Неопределено,
Расшифровка = Неопределено, Пометка = Ложь, Подсказка = "", Картинка = Неопределено,
ИзменяетДанные = Ложь, СсылкаНаСправочникWord = Неопределено)
Если ТипКнопки = Неопределено Тогда
ТипКнопки = ТипКнопкиКоманднойПанели.Действие;
КонецЕсли;
СтрокаКнопки = СтрокаПодменю.Строки.Добавить();
СтрокаКнопки.Имя = Имя;
СтрокаКнопки.ТипКнопки = ТипКнопки;
СтрокаКнопки.Текст = Текст;
СтрокаКнопки.Действие = Действие;
СтрокаКнопки.Картинка = Картинка;
СтрокаКнопки.Подсказка = Подсказка;
СтрокаКнопки.Пометка = Пометка;
СтрокаКнопки.ИзменяетДанные = ИзменяетДанные;
СтрокаКнопки.Расшифровка = Расшифровка;
// *****Начало изменений Сахно Дмитрий
Если не СсылкаНаСправочникWord = Неопределено Тогда
СтрокаКнопки.СправочникWord = СсылкаНаСправочникWord;
КонецЕсли;
//******Конец изменений Сахно Дмитрий
Возврат СтрокаКнопки;
КонецФункции
- В функцию «ПолучитьДеревоМакетовПечати» добавить вызов новой процедуры «ДобавитьВДеревоМакетовФормыWord»
Функция ПолучитьДеревоМакетовПечати(СсылкаОбъекта, ВнутренниеПечатныеФормы, Действие = Неопределено,
ДействиеУстановитьПечатьПоУмолчанию = Неопределено) Экспорт
ДеревоКнопок = ИнициализироватьДеревоДополнительныхКнопок();
Если Не ВнутренниеПечатныеФормы = Неопределено Тогда
ДобавитьВДеревоМакетовВстроенныеФормы(ДеревоКнопок, ВнутренниеПечатныеФормы, Действие);
КонецЕсли;
ДобавитьВДеревоМакетовДополнительныеФормы(ДеревоКнопок, СсылкаОбъекта, Действие);
//******Начало изменений
ДобавитьВДеревоМакетовФормыWord(ДеревоКнопок, СсылкаОбъекта, Действие);
//******Конец изменений
СтрокаПоУмолчанию = ПолучитьСтрокуДереваМакетовПоУмолчанию(СсылкаОбъекта.Метаданные().Имя ,ДеревоКнопок);
…
- В процедуре «ПечатьПоДополнительнойКнопке» изменить следующий код
Процедура ПечатьПоДополнительнойКнопке(УдалитьДеревоМакетов, Объект, Форма = Неопределено, ТекстКнопки) Экспорт
Если Не Форма = Неопределено Тогда
Если Не РаботаСДиалогами.ПроверитьМодифицированностьВФорме(Объект,Форма) Тогда
Возврат;
КонецЕсли;
КонецЕсли;
Попытка
СтруктураВнутреннихПечатныхФорм = Объект.ПолучитьСтруктуруПечатныхФорм()
Исключение
СтруктураВнутреннихПечатныхФорм = Новый Структура;
КонецПопытки;
ДеревоМакетовПечати = ПолучитьДеревоМакетовПечати(Объект.Ссылка, СтруктураВнутреннихПечатныхФорм);
СтрокаКнопки = ДеревоМакетовПечати.Строки.Найти(ТекстКнопки,"Текст");
Если СтрокаКнопки = Неопределено Тогда
Предупреждение(НСтр("ru='Печать не доступна. Изменился набор реквизитов!';uk='Друк не доступний. Змінився набір реквізитів!'"));
Возврат;
КонецЕсли;
НаПринтер = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, "ПечатьДокументовБезПредварительногоПросмотра") = Истина;
Расшифровка = СтрокаКнопки.Расшифровка;
//*****Начало изменений
Если ЗначениеЗаполнено(СтрокаКнопки.СправочникWord) Тогда // Печать через ворд
СправочникОбъект = СтрокаКнопки.СправочникWord.ПолучитьОбъект();
СправочникОбъект.ОбъектВладелец = Объект.Ссылка;
СправочникОбъект.ПечатьВорда(НаПринтер, ЗначениеЗаполнено(СправочникОбъект.ссылка.ИмяФайлаКопии));
Иначе
//*****Конец изменений
Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда
ТабДокумент = НапечататьВнешнююФорму(Объект.Ссылка, Расшифровка);
УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, 0, НаПринтер, ОбщегоНазначения.СформироватьЗаголовокДокумента(Объект), Объект.Ссылка);
Иначе
Объект.Печать(СтрокаКнопки.Имя, 0, НаПринтер);
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ПечатьПоДополнительнойКнопке()
По конфигурации все!!!
Как пользоваться:
- Подготавливаем в Word файл шаблона c расширением (.dot). В файле набираем текст и устанавливаем параметры.
Установка параметров В MS Word 2007 Вставка => Экспресс - блоки => поле => В диалоговом окне : Категории (Все), Поля Author, Новое имя: <Имя вашего параметра>, Формат (Нет).
Установка параметров В MS Word 2003 Вставка = поле => см. выше. - Заходим из предприятия в справочник «Печатные формы Word». Добавляем элемент. Указываем наименование печатной формы. Выбираем тип владельца (например реализация товаров и услуг). Нажимаем выбрать файл шаблона, и выбираем подготовленный в п1. Файл. Важно выбранный файл именно загружается в конфигурацию и в дальнейшем берется из нее, это НЕ ССЫЛКА на файл на диске. Дальше переходим на закладку Параметры. Нажимаем получить из шаблона. Табличная часть должна заполниться названиями, которые вы вводили в шаблон в п.1 как поля.
Дальше для каждого параметра можно определить либо постоянное значение в колонке значение. Либо выбрать из стандартного набора (например «Реквизит» позволяет выбрать любой реквизит объекта (тип владельца)). Или написать произвольный алгоритм. Произвольный алгоритм - это функция, которая должна вернуть одно значение, которое и будет подставлено вместо параметра при печати.
В результате в любой документ, который использует типовой механизм формирования меню печати и стандартный обработчик печати, можно добавить в меню печати документа и он будет печататься. (в нашем случае в документе «Реализация товаров и услуг появится еще один пункт (так же как и работа внешних форм.).
НА МАШИНЕ-КЛИЕНТЕ ДОЛЖЕН БЫТЬ УСТАНОВЛЕН MSWord