Печать WORD из 1С, управляемого приложения (еще один вариант)

02.10.20

Учетные задачи - Печатные формы

Вариант произвольный для печати кадровых и прочих документов, где много слов и мало данных. Минимальное использование БСП. Предназначен для ленивых программистов типа меня, кому лень набирать много текста в печатных формах и которые предпочитают брать готовые документы в формате WORD у кадровиков и юристов и делать из них с минимальными изменениями печатные формы.

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

Наименование Файл Версия Размер
Печать WORD из 1С управляемое приложение (еще один вариант):
.epf 56,58Kb
54
.epf 56,58Kb 54 Скачать

Печатная форма создавалась как заготовка для печати всевозможных кадровых документов из ЗУП 3.1 (3.1.15.40), версия платформы 1С:Предприятие 8.3 (8.3.16.1224). На ее основе очень просто создавать различные договоры, дополнительные соглашения, согласия на обработку персональных данных и прочих документов, которые постоянно меняются. Главное, что большую часть работы выполняет непосредственно кадровик или юрист, верстая образец в формате WORD. Наша задача взять этот образец, в нужных местах слова заменить параметрами и сохранить в макетах печатной формы в качестве двоичных данных.

ШАГ 1 Создание внешней печатной формы.

В модуле обработке добавляем стандартные функции и процедуры

Функция СведенияОВнешнейОбработке() Экспорт
    // Объявим переменную, в которой мы сохраним и вернем "наружу" необходимые данные
    ИмяОбработки = ЭтотОбъект.Метаданные().Имя;
    Синоним = ЭтотОбъект.Метаданные().Синоним;
    Синоним = ?(ЗначениеЗаполнено(Синоним),Синоним, ИмяОбработки);
    
    //Массив назначений
    МассивНазначений = Новый Массив;
    УказанныеТипы = ЭтотОбъект.Метаданные().Реквизиты.СсылкаНаОбъект.Тип.Типы();      // Возьмем типы из реквизита "Документ"
    Для Каждого УказанныйТип ИЗ УказанныеТипы Цикл
        ОбъектМетаданных = Метаданные.НайтиПотипу(УказанныйТип);
        Если ОбъектМетаданных <> Неопределено Тогда
            МассивНазначений.Добавить("Документ." + ОбъектМетаданных.Имя);
        КонецЕсли;    
    КонецЦикла;    
    
    
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", Синоним);
     // Зададим право обработке на использование безопасного режима. Более подробно можно узнать в справке к платформе (метод УстановитьБезопасныйРежим)
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    // Следующие два параметра играют больше информационную роль, т.е. это то, что будет видеть пользователь в информации к обработке
    ПараметрыРегистрации.Вставить("Версия", "1.0");    
    ПараметрыРегистрации.Вставить("Информация", "Обработка"+Синоним);
        
    // Создадим таблицу команд (подробнее смотрим ниже)
    ТаблицаКоманд = ПолучитьТаблицуКоманд();  
    
    // Добавим команду в таблицу                       
    ДобавитьКоманду(ТаблицаКоманд, Синоним, "Справка", "ВызовКлиентскогоМетода", Истина,"ПечатьMXL" );
//    ДобавитьКоманду(ТаблицаКоманд, Синоним, "Справка", "ВызовСерверногоМетода", Истина,"ПечатьMXL" );
    // Сохраним таблицу команд в параметры регистрации обработки
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    
    // Теперь вернем системе наши параметры
    Возврат ПараметрыРегистрации;
КонецФункции

В этой функции важно что  "ВызовКлиентскогоМетода". То есть печать происходит на клиенте.

В модуле печатной формы (модуль объекта) добавляем также стандартные ПолучитьТаблицуКоманд() и

ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = ""), а также пустую процедуру печать

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

        
КонецПроцедуры


Шаг 2. Открываем форму обработки. Переходим в модуль формы. Добавляем Функцию печать на клиенте. Она имеет только два параметра ИдентификаторКоманды и ОбъектыНазначения. Нам интересен второй параметр ОбъектыНазначения. Это список значений, куда передана ссылка на документ, из которого мы печатаем файл.

&НаКлиенте
Функция Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт   

Дата = ТекущаяДата();    
    Номермакета = ""+Год(Дата)+""+ Месяц(Дата)+""+День(Дата)+""+Час(Дата)+""+Минута(Дата)+""+Секунда(Дата);
    МассивДоков = ПолучитьМассивДоков(ОбъектыНазначения);
    for each Результат in МассивДоков do
        ОткрытьФайлПриложением( Результат.АдресХранилища,  "Мат. ответственность"+НомерМакета);
        НомерМакета = НомерМакета + 1;
    EndDo;     

КонецФункции

Но сделать нужный нам запрос обращаясь к документу на форме мы не можем. Ругается, что полученное значение не является объектным. Здесь я не сразу сообразил, что делать, пока не перенес нужный мне запрос в модуль обработки с передачей туда параметра ОбъектыНазначения. Там я смог получить из ОбъектовНазначения нужные мне параметры для передачи в запрос. И обратно получил уже результат запроса.

Для этого сначала передал данные в серверную функцию

&НаСервере
Функция ПолучитьМассивДоков(ОбъектыНазначения)
	ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
	Выборка = ОбработкаОбъект.ПолучитьЗапросНаСервере(ОбъектыНазначения);
	МассивД = New Array;
	
	While Выборка.Следующий() Do
		
		Результат = ВывестиМакетНаСервере(Выборка);
		If Результат = Undefined then
			continue;
		endIf;

		МассивД.Добавить(Результат);
	EndDo; 	
	return МассивД; 	
КонецФункции


Которая уже сделала нужный запрос к данным

Функция ПолучитьЗапросНаСервере(ОбъектыНазначения) Экспорт
    Запрос = New Query;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    СотрудникиОрганизаций.Сотрудник КАК Сотрудник,
    |    КадроваяИсторияСотрудниковИнтервальный.Должность КАК Должность,
    |    СотрудникиОрганизаций.ФизическоеЛицо КАК ФизЛицо,
    |    ПриемНаРаботу.Сотрудник.Код КАК ТабельныйНомер,
    |    ПриемНаРаботу.ТрудовойДоговорНомер КАК ДоговорНомер,
    |    ПриемНаРаботу.Должность КАК ДолжностьПриема,
    |    ПриемНаРаботу.ТрудовойДоговорДата КАК ДоговорДата,
    |    ПриемНаРаботу.ГрафикРаботы КАК ГрафикРаботы,
    |    ПриемНаРаботу.ДатаПриема КАК ДатаПриема,
    |    ПриемНаРаботу.КоличествоСтавок КАК КоличествоСтавок,
    |    ПриемНаРаботу.ДолжностьРуководителя КАК ДолжностьРуководителя,
    |    ПриемНаРаботу.Руководитель КАК Руководитель,
    |    ПриемНаРаботу.Организация КАК Организация,
    |    ПриемНаРаботу.Организация.ОГРН КАК ОрганизацияОГРН,
    |    ПриемНаРаботу.Организация.НаименованиеСокращенное КАК ОрганизацияНаименованиеСокращенное,
    |    ПриемНаРаботу.Организация.НаименованиеПолное КАК ОрганизацияНаименованиеПолное,
    |    ПриемНаРаботу.Организация.ИНН КАК ОрганизацияИНН,
    |    ПриемНаРаботу.Организация.РегистрацияВНалоговомОргане.КПП КАК ОрганизацияКПП,
    |    ПриемНаРаботуНачисления.Размер КАК Оклад,
    |   ПаспортныеДанныеФизЛиц.Серия КАК ПаспортСерия,
    |   ПаспортныеДанныеФизЛиц.Номер КАК ПаспортНомер,
    |   ПаспортныеДанныеФизЛиц.ДатаВыдачи КАК ДатаВыдачи,
    |   ПаспортныеДанныеФизЛиц.КемВыдан КАК КемВыдан,
    |   ПаспортныеДанныеФизЛиц.КодПодразделения КАК КодПодразделения,
    |   ПаспортныеДанныеФизЛиц.Представление КАК ПредставлениеПаспорта,
    |   ПриемНаРаботу.Ссылка.Номер КАК ПриказНомер,
    |   ПриемНаРаботу.Ссылка.Дата КАК ПриказДата,
    |    ЮрАдресОрганизации.Представление КАК ЮрАдресОрганизации,
    |    ЮрАдресОрганизации.Город КАК Город,
    |    ПочтовыйАдресОрганизации.Представление КАК ПочтовыйАдресОрганизации,
    |    АдресПоПропискеФизЛицо.Представление КАК АдресПоПропискеФизЛица,
    |    АдресПроживанияФизЛицо.Представление КАК АдресПроживанияФизЛица
    |
    |
    |ИЗ
    |    РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК СотрудникиОрганизаций
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДокументыФизическихЛиц КАК ПаспортныеДанныеФизЛиц
    |    ПО СотрудникиОрганизаций.ФизическоеЛицо = ПаспортныеДанныеФизЛиц.ФизЛицо
    |   ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриемНаРаботу КАК ПриемНаРаботу
    |   ПО СотрудникиОрганизаций.Сотрудник = ПриемНаРаботу.Сотрудник
    |   ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриемНаРаботу.Начисления КАК ПриемНаРаботуНачисления
    |   ПО СотрудникиОрганизаций.Сотрудник = ПриемНаРаботуНачисления.Ссылка.Сотрудник
    |    И ПриемНаРаботуНачисления.Начисление.Наименование = &ОплатаПоОкладу
    |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.КонтактнаяИнформация КАК АдресПоПропискеФизЛицо
    |    ПО (СотрудникиОрганизаций.ФизическоеЛицо = АдресПоПропискеФизЛицо.Ссылка)
    |        И (АдресПоПропискеФизЛицо.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))
    |        И (АдресПоПропискеФизЛицо.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица))
    |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.КонтактнаяИнформация КАК АдресПроживанияФизЛицо
    |    ПО (СотрудникиОрганизаций.ФизическоеЛицо = АдресПроживанияФизЛицо.Ссылка)
    |        И (АдресПроживанияФизЛицо.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))
    |        И (АдресПроживанияФизЛицо.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.АдресМестаПроживанияФизическиеЛица))
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИсторияСотрудниковИнтервальный
    |    ПО СотрудникиОрганизаций.Сотрудник = КадроваяИсторияСотрудниковИнтервальный.Сотрудник
    |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации.КонтактнаяИнформация КАК ЮрАдресОрганизации
    |    ПО (ПриемНаРаботу.Организация = ЮрАдресОрганизации.Ссылка)
    |        И (ЮрАдресОрганизации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))
    |        И (ЮРАдресОрганизации.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресОрганизации))
    |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации.КонтактнаяИнформация КАК ПочтовыйАдресОрганизации
    |    ПО (ПриемНаРаботу.Организация = ПочтовыйАдресОрганизации.Ссылка)
    |        И (ПочтовыйАдресОрганизации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))
    |        И (ПочтовыйАдресОрганизации.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПочтовыйАдресОрганизации))
    |
    |
    |ГДЕ
    |    СотрудникиОрганизаций.Сотрудник = &Сотрудник";
    
    
    Запрос.УстановитьПараметр("ДатаУвольнения", ТекущаяДата());
    Запрос.УстановитьПараметр("ОплатаПоОкладу", "Оплата по окладу");
    Запрос.УстановитьПараметр("Сотрудник", ОбъектыНазначения.Получить(0).Сотрудник);
    Запрос.УстановитьПараметр("ПодразделениеОрганизации", ОбъектыНазначения.Получить(0).Подразделение);
    Запрос.УстановитьПараметр("ПустаяДата", '00010101');
    Выборка = Запрос.Выполнить().Выбрать();
    Возврат Выборка;
КонецФункции

Не забываем, что в данном случае ОбъектыНазначения это список значений, состоящий из одного значение, поэтому и получить это значение проще всего ОбъектыНазначения.Получить(0).

 

Дальше, с помощью функции

&НаСервере
Функция ВывестиМакетНаСервере(Выборка)
    
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
//    ДокОбъект = Ссылка.ПолучитьОбъект();
    // Получили параметры шаблонов
    ПараметрыЗаполненияШаблона = Новый Структура;
    ПараметрыЗаполненияШаблона.Вставить("РазделительЛевый","<");
    ПараметрыЗаполненияШаблона.Вставить("РазделительПравый",">");
    
    // Получили макет
    ВременныйФайл = ПолучитьИмяВременногоФайла("docx");
    Если Выборка.Организация.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо Тогда
        ОбработкаОбъект.ПолучитьМакет("СправкаИП").Записать(ВременныйФайл);
    Иначе
        ОбработкаОбъект.ПолучитьМакет("Справка").Записать(ВременныйФайл);
    КонецЕсли;
    
    // Получили данные к выводу
    ДанныеКВыводу = ДанныеКВыводу(Выборка);
    
    
    //Результат - Структура имеет параметр "АдресХранилища" и параметры файла такие как размер, расширение
    Результат = ОбработатьФайлDocx(
    ВременныйФайл,
    ПараметрыЗаполненияШаблона,
    ДанныеКВыводу
    );
    
    Возврат Результат
КонецФункции


и ряда вспомогательныз функций, относящихся к обработке файлов WORD как файлов, имеющих в своей основе MXL вывел файл на экран в формате WORD.

 

&НаСервере
Функция ВывестиМакетНаСервере(Выборка)
    
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
//    ДокОбъект = Ссылка.ПолучитьОбъект();
    // Получили параметры шаблонов
    ПараметрыЗаполненияШаблона = Новый Структура;
    ПараметрыЗаполненияШаблона.Вставить("РазделительЛевый","<");
    ПараметрыЗаполненияШаблона.Вставить("РазделительПравый",">");
    
    // Получили макет
    ВременныйФайл = ПолучитьИмяВременногоФайла("docx");
    Если Выборка.Организация.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо Тогда
        ОбработкаОбъект.ПолучитьМакет("СправкаИП").Записать(ВременныйФайл);
    Иначе
        ОбработкаОбъект.ПолучитьМакет("Справка").Записать(ВременныйФайл);
    КонецЕсли;
    
    // Получили данные к выводу
    ДанныеКВыводу = ДанныеКВыводу(Выборка);
    
    
    //Результат - Структура имеет параметр "АдресХранилища" и параметры файла такие как размер, расширение
    Результат = ОбработатьФайлDocx(
    ВременныйФайл,
    ПараметрыЗаполненияШаблона,
    ДанныеКВыводу
    );
    
    Возврат Результат
КонецФункции


Как видите, здесь параметры заключаются в скобки из знаков <> больше, меньше. В этой печатной форме реализован также вывод параметров в колонтитулы. Это когда кадрам очень хочется чтобы название организации или что еще повторялось в заголовке или внизу каждой страницы.

Печатная форма WORD управляемое приложение.

См. также

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 15300 руб.

06.10.2023    7252    21    6    

39

Универсальная печать по шаблонам Word (Печать договоров из 1С БП 3, УНФ 1.6, ЗУП 3, УТ 11, КА 2, ERP 2, ДО 3)

Печатные формы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

Научите вашу 1C печатать из 1С в файл Word (Например: трудовые договоры, договоры с контрагентами, спецификации, дополнительные соглашения, приказы, коммерческие предложения, акты, накладные, карточки партнера или любого справочника и многие другие). Универсальная печать предназначена для формирования печатных форм на основе шаблонов в формате Word из любой конфигурации 1С. С помощью данного инструмента можно самостоятельно заполнить шаблон реквизитами справочника или документа 1С и сформировать печатные формы на основании ссылки на любой объект.

5400 руб.

08.10.2019    42660    143    88    

134

SALE! 25%

УТ 11, КА 2, ERP 2: Настраиваемые под каждую организацию печать и подпись ответственных лиц в печатных формах (ТОРГ-12, Счёт-фактура, УПД, УКД, Заказ клиента, Акт сверки, М-15 и др.)

Печатные формы Взаиморасчеты Оптовая торговля Производство готовой продукции (работ, услуг) Акт сверки Оперативный учет Управляемые формы 1С:Управление торговлей 11 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Задайте для каждой организации свою печать и для каждого физического лица свою подпись. Выберите в документе печатную форму "... с печатью и подписью" - и автоматически сформируется табличный документ с печатью и подписями той организации и ответственных лиц, которые указаны в документе.

12000 9000 руб.

13.03.2018    56421    179    76    

112

Печатные формы КС-2 и КС-3 в "1С:Бухгалтерия 3.0"

Печатные формы Производство готовой продукции (работ, услуг) Платформа 1С v8.3 Бухгалтерский учет Оперативный учет 1С:Бухгалтерия 3.0 Строительство Россия Бухгалтерский учет Платные (руб)

Откройте для себя заполнение КС-2 и КС-3 в "1С:Бухгалтерия 3.0". Вы получаете удобство, скорость и систему, чтобы заполнить, распечатать и сохранить формы КС-2 и КС-3 из документов "Оказание производственных услуг" или "Реализация товаров услуг". Вы можете заполнить дополнительную информацию о материалах из документов "Требование-накладная" и указать сведения, которые не предусмотрены типовой конфигурацией "1С:Бухгалтерия 3.0". Так же доступно множество настроек для формирования КС-2 и КС-3.

3240 руб.

13.02.2019    87963    388    44    

371

Печать актов МХ-1, МХ-3 в 1С:Бухгалтерия 3.0

Печатные формы Логистика, склад и ТМЦ Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Обработки для "1С:Бухгалтерия 3.0", которые формируют акты МХ-1 и МХ-3 для документов "ПоступлениеТоваровУслуг", "Реализация товаров услуг", "Возврат товаров поставщику", "Передача материалов в эксплуатацию" соответственно. Так же можно сформировать акты с факсимиле, которая загружена в 1С:Бухгалтерия 3.0.

2520 руб.

18.02.2019    61088    170    14    

139

Путевые листы (расширение)

Печатные формы Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Транспорт, автопарки, такси Бухгалтерский учет Платные (руб)

Учет путевых листов выполнен в виде расширения. Предназначен для учета путевых листов в конфигурации Бухгалтерия предприятия 3.0. и Комплексная автоматизация 2. Печатная форма: Типовая межотраслевая форма № 3. Утверждена постановлением Госкомстата России от 28.11.97 № 78. Типовая межотраслевая форма № 4-П от 18.09.2008 г. N 152 с учетом изменений указанных в Приказе Министерства транспорта Российской Федерации №368 от 11 сентября 2020 г. №368, Типовая межотраслевая форма № ЭСМ-7, и др. ЭСМ-2, 4-С, 3 спец., 6 спец., ПЛ для Автомобильного крана. .

2000 руб.

14.10.2019    36509    224    215    

138
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. suepifanov 940 02.10.20 15:16 Сейчас в теме
и ряда вспомогательныз функций, относящихся к обработке файлов WORD как файлов, имеющих в своей основе MXL вывел файл на экран в формате WORD
.
наверное xml, а не mxl.. Алгоритм работы с word взяли из этой публикации - https://infostart.ru/public/675307/ ?
2. user810754 23 02.10.20 21:47 Сейчас в теме
Да, действительно xml. Эту публикацию не читал, алгоритм взят из другого источника, на авторство не претендую. Хотя вообщем-то он стандартный, и секретом не является.
3. G_112708749323588293243 06.07.22 17:08 Сейчас в теме
обработка не работает


Ошибка при вызове метода контекста (КопироватьФайл)
{ВнешняяОбработка.ПечатьДоговорОМатОтветственности.Форма.Форма.Форма(607)}:КопироватьФайл(ДанныеФайла.Текст,ВременныйФайлКопия);
{ВнешняяОбработка.ПечатьДоговорОМатОтветственности.Форма.Форма.Форма(935)}:Результат = ОбработатьФайлDocx(
{ВнешняяОбработка.ПечатьДоговорОМатОтветственности.Форма.Форма.Форма(966)}:Результат = ВывестиМакетНаСервере(Выборка);
{ВнешняяОбработка.ПечатьДоговорОМатОтветственности.Форма.Форма.Форма(950)}:МассивДоков = ПолучитьМассивДоков(ОбъектыНазначения);
{ВнешняяОбработка.ПечатьДоговорОМатОтветственности.Форма.Форма.Форма(10)}:ПечатьСправки(ОбъектыНазначения);

по причине:
Ошибка копирования файлов
по причине:
Ошибка копирования файлов из 'C:\Users\M_Latifov\AppData\Local\Temp\ec9d1280-c818-4b4a-8d88-5a09810bdf44\word\document.xml' в 'C:\Users\M_Latifov\AppData\Local\Temp\v8_FD81_1e3.xml' : Каталог не обнаружен
Оставьте свое сообщение