gifts2017

Универсальный механизм печати из типовых конфигураций 1С 8.1 печатных документов на базе макетов, сделанных в MS Word

Опубликовал Дима Сахно (dsahno) в раздел Печать - Универсальные печатные формы

Механизм позволяет без особого труда пользователям создавать и изменять свои печатные формы по средствам MSWord. Механизм заполнения параметров (выбор реквизитов которые будут подставлены в конкретные параметры) определяются  пользователями в режиме предприятия.

Предлагаю вашему вниманию универсальный механизм печати из типовых конфигураций 1С 8.1 печатных документов на базе макетов сделанных в MS Word. 

Для работы механизма необходимо:

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

По конфигурации все!!!


Как пользоваться:

  1. Подготавливаем в Word файл шаблона c расширением (.dot). В файле набираем текст и устанавливаем параметры.
    Установка параметров В MS Word 2007 Вставка => Экспресс - блоки => поле => В диалоговом окне : Категории (Все), Поля Author, Новое имя: <Имя вашего параметра>, Формат (Нет).
    Установка параметров В MS Word 2003 Вставка = поле => см. выше.
  2. Заходим из предприятия в справочник «Печатные формы Word». Добавляем элемент. Указываем наименование печатной формы. Выбираем тип владельца (например реализация товаров и услуг). Нажимаем выбрать файл шаблона, и выбираем подготовленный в п1. Файл. Важно выбранный файл именно загружается в конфигурацию и в дальнейшем берется из нее, это НЕ ССЫЛКА на файл на диске. Дальше переходим на закладку Параметры. Нажимаем получить из шаблона. Табличная часть должна заполниться названиями, которые вы вводили в шаблон в п.1 как поля.
    Дальше для каждого параметра можно определить либо постоянное значение в колонке значение. Либо выбрать из стандартного набора (например «Реквизит» позволяет выбрать любой реквизит объекта (тип владельца)). Или написать произвольный алгоритм. Произвольный алгоритм - это функция, которая должна вернуть одно значение, которое и будет подставлено вместо параметра при печати.
    В результате в любой документ, который использует типовой механизм формирования меню печати и стандартный обработчик печати, можно добавить в меню печати документа и он будет печататься. (в нашем случае в документе «Реализация товаров и услуг появится еще один пункт (так же как и работа внешних форм.).

НА МАШИНЕ-КЛИЕНТЕ ДОЛЖЕН БЫТЬ УСТАНОВЛЕН MSWord

Скачать файлы

Наименование Файл Версия Размер
ПечатьЧерезWord.cf 407
.1252068785 28,66Kb
25.09.09
407
.1252068785 28,66Kb Скачать
ПечатьЧерезWordН.cf 131
.1252475291 32,82Kb
23.06.15
131
.1252475291 32,82Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

0. Дима Сахно (dsahno) 06.09.09 01:28
Механизм позволяет без особого труда пользователям создавать и изменять свои печатные формы по средствам MSWord. Механизм заполнения параметров (выбор реквизитов которые будут подставлены в конкретные параметры) определяются пользователями в режиме предприятия.

Перейти к публикации

1. Андрей Куканов (KukA.5) 06.09.09 01:28
2. Александр (Aragorn) 09.09.09 07:22
3. Дима Сахно (dsahno) 09.09.09 09:51
Выложил более познюю версию. в которой удобнее сделан интерфейс произвольного алгоритма
4. Ivon (Ivon) 09.09.09 12:16
Возможна-ли печать произвольной табличной части, например графика платежей, в случае, если количество платежей заранее не известно?
5. seo23 (seo23) 09.09.09 13:19
Не плохо б сделать там поддержку OpenOffice.org Writer
6. Роман Фомин (Fominro) 10.09.09 07:13
Отличная задумка, интересное решение.
7. Дима Сахно (dsahno) 10.09.09 14:24
... Возможна-ли печать произвольной табличной части, например графика платежей, в случае, если количество платежей заранее не известно?

Вобще средствами VBasic, можно и создавать таблицы любого формата. И из 1с-ки это сделать реально (я просто не пробовал). Можно создать ТЧ, в которой будет ИмяКолонки, ВариантЗаполнения. Кто сделает зачет и уважение. Мне сейчас не до этого. Может быть потом.
8. Пикуло Юлия (sedynov) 04.10.09 02:39
9. alevi (1Cynep4eJIoBek) 22.01.10 11:22
респект мужик плюсище огромный, только вот подскажи плиз, в модуле справочника :

РаботаСФайлами.СохранитьФайлНаДиске(МакетWord, ИмяФайла, Ложь, "ДА", Ложь);

работа с файлами это че за функция у меня еррорит, может из за того что ЕТК Казахстана??? напиши где она у тебя прописана и как???
10. alevi (1Cynep4eJIoBek) 22.01.10 12:12
В Казахстанской конфиге ЗУП строку

РаботаСФайлами.СохранитьФайлНаДиске(МакетWord, ИмяФайла, Ложь, "ДА", Ложь);

надо заменит на

УниверсальныеМеханизмы.СохранитьФайлНаДиске(МакетWord, ИмяФайла, Ложь, "ДА", Ложь);

и будет счастье ;)
11. Галия Бикинева (bikineva) 04.04.10 18:46
А ГДЕ ВЗЯТЬ МОДУЛЬ...справочник скопировали.аа вот..с модулем тупим..
12. Canabis 220 (Canabis220) 28.10.11 08:17
Нужно сказать что данная разработка будет работать без проблем только с крупными конфигурациями. В которых есть общие модули написанные 1с-ми. В конфигурации стороннего разработчика если нет этих модулей сложнее. Выложили бы тогда в конфигурацию и эти модули.
13. Александр М (Fruit83) 04.12.11 23:52
Благодарю за публикацию! Сейчас опробуем что там и как.:)
15. Ирина Волкова (ir-ish-ka) 04.04.12 04:55
Огромное мпасибо за интересное решение, используем в ЗУП 2.5 для печати всех практически кадровых договоров, отпусков, перемещений.... Очень удобно и всем нравится! ПЛЮС!!!
16. Юрий Живов (mrm1212) 10.02.14 17:40
А есть возможность использования макетов со вставкой картинок в орд???
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа