gifts2017

Трудовой договор в формате MS Word

Опубликовал Nicholas Mikuslas (Nicholas) в раздел Программирование - Практика программирования

Для большенства организаций стандартная печатная форма трудового договора в программе 1С:Зарплата и управление персоналом не подходит. Фирма 1С, в восьмой версии своей программы, любезно предусмотрела возможность добавлять дополнительные печатные формы для документов и других объектов. Воспользуемся данной возможностью и создадим трудовой договор, который будет открываться в Microsoft Word.

Специалисты по конфигурированию могут разрабатывать внешние обработки вне конфигурации, используемой в организации. Разработанный отчет или обработка передается в виде файла так называемой внешней обработки с расширением .epf. Пользователь может подключить эту обработку к конфигурации самостоятельно.

Сведения о подключенных обработках хранятся в справочнике «Внешние обработки». Чтобы подключить новую внешнюю обработку, нужно зарегистрировать ее в указанном справочнике.

Технические требования к внешней печатной форме

Внешняя обработка должна содержать:

  • Реквизит «СсылкаНаОбъект», куда при вызове будет передана ссылка на объект, для которого необходимо выполнить печать;
  • Необязательный реквизит «ДополнительныеПараметры» произвольного типа, которому будут передаваться дополнительные параметры примитивного типа в виде структуры;
  • Функция Печать() - без параметров,  возвращающая табличный документ;
  • Также внешняя печатная обработка может иметь в своем составе макет «Параметры_Авторегистрации», используемый для автоматического заполнения принадлежности печатной формы в справочнике «Внешние обработки» и состоящий из двух колонок: «Полное имя метаданного» и «Имя табличной части».

Создание внешней обработки

Запустим 1С:Предприятие в режиме «Конфигуратор» и через меню «Файл» - «Новый» создадим внешнюю обработку.

Создание внешней обработки

Создадим реквизит «СсылкаНаОбъект». Для этого нажимем кнопку «Добавить» или клавишу «Insert» и заполним свойства. В зависимости от того, для каких объектов будет использоваться эта печатная форма, нужно выбрать тип. В нашем случае, внешняя печатная форма будет использоваться только для справочника «Сотрудники организации», поэтому укажем соответствующий тип «СправочникСсылка.СотрудникиОрганизаций».

Свойства реквизита

Реквизит «ДополнительныеПараметры» нам не понадобится. Создадим экспортную функцию Печать() («Действия» - «Открыть модуль объекта»).

 Функция Печать()

Прежде чем написать тело этой функции, создадим макет, который она будет возвращать.

Макет трудового договора в формате Microsoft Word

Существует, по меньшей мере, три способа создания шаблона.

Первый. В тексте документа содаются метки особого формата, например, «м_НомерДоговора», затем, в модуле обработки производится поиск и замена значений.

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

Способ три. В шаблон добавляются служебные поля, например, «DocVariable» или «Author». Используя DocVariable можно обращаться к переменной по имени, например, «ДокументВорд.Variables.Add(ИмяПеременной, ЗначениеПеременной);», но ее не видно в шаблоне. Поле «Author» отображается в шаблоне, но обращаться к нему придется в цикле по индексу: «ДокументВорд.Fields.item(Индекс).Result.Text = Значение;».

На мой взгляд, первый способ является самым оптимальным. Шаблон документа легко редактируется, метки видны в тексте, для создания меток не нужны сложные вставки. Поэтому будем делать шаблон именно этим способом.

Откроем программу Microsoft Office. Для примера добавим лишь одну строку: «Трудовой договор № [НомерДоговора]».

Сохраним шаблон. Рекомендую сохранить в формате «Шаблон Word (*.dot)». Это защитит от случайного редактирования.

Добавим получившийся шаблон в нашу обаботку. Для этого выбираем «Макеты» и нажимаем кнопку «Добавить» или клавишу «Insert».

Выбор макета трудового договора

Откроется конструктор запроса, в котором выберем тип «Active Document» и файл шаблона.

Конструктор макета Active Document

Функция Печать()

Вернемся к функции, которую мы создали ранее. Настало время написать ее тело.

// Предопределенная функция для внешних печатных форм
//
Функция Печать() Экспорт

    
// Получим объект Microsoft Word из макета
    
ОбъектВорд ПолучитьМакет("ТрудовойДоговор").Получить();

    
// Получим документ из объекта и активируем его
    
Документ ОбъектВорд.Application.Documents(1);
    
Документ.Activate();

    
// Поиск и замена маркеров
    
Замена Документ.Content.Find;
    
Замена.Execute("[НомерДоговора]", , , , , , , , , "007"2);

    
// Вывод документа
    
ОбъектВорд.Application.Visible = Истина;
    
ОбъектВорд.Activate();

КонецФункции 
// Печать()

Из кода видно, что в файле шаблона производится поиск строки «[НомерДоговора]» и ее замена на строку «007».

Параметры авторегистрации

Для автоматического заполнения принадлежности печатной формы к объектам конфигурации, добавим еще один макет «Параметры_Авторегистрации». Это будет табличный документ, содержащий одну колонку с именами объектов метаданных, к которым будет принадлежать печатная форма. В нашем случае таблица будет выглядить следующим образом.

Параметры авторегистрации

Сохраним получившуюся внешнюю обработку.

Подключение дополнительных внешних печатных форм

Запустим 1С Предприятие. Откроем справочник «Дополнительные внешние печатные формы» через меню «Сервис» - «Дополнительные отчеты и обработки».

Нажмем кнопку «Добавить», затем зарегистрируем новую печатную форму, нажав «Заменить файл внешней обработки». Автоматически заполнится принадлежность печатной формы справочнику «Сотрудники». Выберем «Трудовой договор» в колонке «Заменяемая печатная форма» чтобы стандартная печатная форма более не использовалась.

Регистрация внешней печатной формы

В итоге справочник будет выглядить следующим образом.

Дополнительные внешние печатные формы

Проверка результата

Откроем любого работающего сотрудника и нажмем кнопку «Печать» - «Трудовой договор». Откроется документ Microsoft Word с трудовым договором под номером «007».

Трудовой договор в MS Word

Дальнейшее описывать не имет смысла. Думаю, не составит большого труда доработать функцию Печать() и макет договора.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Armando Armando (Armando) 24.11.11 11:39
Несколько дней назад заморачивался с подобной задачей, только для ЗУП КОРП. Там внедрена подсистема печати из БСП с поддержкой офисных документов (в ЗУПе, возможно, тоже есть, не проверял).
Вот что вышло:
Функция Печать() Экспорт
	
	Состояние(НСтр("ru = 'Выполняется формирование печатной формы...'"));
	
	ИмяМакета = "ПФ_DOC_ТрудовойДоговор";
	ТипМакета = "DOC";
	ДвоичныеДанныеМакета = ПолучитьМакет(ИмяМакета);
	Области = ПолучитьОписаниеОбластейМакетаОфисногоДокумента();
	ДанныеОбъекта = ПолучитьДанныеОбъекта();
	
	Попытка
		Макет = УправлениеПечатьюКлиент.ИнициализироватьМакет(ДвоичныеДанныеМакета, ТипМакета);
		Если Макет = Неопределено Тогда
			Возврат Неопределено;
		КонецЕсли;
		ПечатнаяФорма =	УправлениеПечатьюКлиент.ИнициализироватьПечатнуюФорму(ТипМакета, Макет.НастройкиСтраницыМакета);
		Если ПечатнаяФорма = Неопределено Тогда
			Возврат Неопределено;
		КонецЕсли;
		
		Область = УправлениеПечатьюКлиент.ПолучитьОбласть(Макет, Области["ВерхнийКолонтитул"]);
		УправлениеПечатьюКлиент.ПрисоединитьОбласть(ПечатнаяФорма, Область, Ложь);
		
		Область = УправлениеПечатьюКлиент.ПолучитьОбласть(Макет, Области["НижнийКолонтитул"]);
		УправлениеПечатьюКлиент.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь);
		
		Область = УправлениеПечатьюКлиент.ПолучитьОбласть(Макет, Области["Договор"]);
		УправлениеПечатьюКлиент.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь);
		
		УправлениеПечатьюКлиент.ПоказатьДокумент(ПечатнаяФорма);
	Исключение
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ИнформацияОбОшибке());
		УправлениеПечатьюКлиент.ОчиститьСсылки(ПечатнаяФорма);
		УправлениеПечатьюКлиент.ОчиститьСсылки(Макет);
		Возврат Неопределено;
	КонецПопытки;
	
	УправлениеПечатьюКлиент.ОчиститьСсылки(ПечатнаяФорма, Ложь);
	УправлениеПечатьюКлиент.ОчиститьСсылки(Макет);
	
КонецФункции

Функция ПолучитьДанныеОбъекта()
	
	Запрос = Новый Запрос;
	Запрос.Текст = ""; // тут запрос
	Выборка = Запрос.Выполнить().Выбрать();
	Выборка.Следующий();	
	
	ДанныеОбъекта = Новый Структура;
	
	ДанныеОбъекта.Вставить("НомерДоговора", 		Выборка.НомерДоговора);
	ДанныеОбъекта.Вставить("ДатаДоговора", 			Формат(Выборка.ДатаДоговора, "ДФ='dd MMMM yyyy ""г.""'"));
	ДанныеОбъекта.Вставить("ФИО", 					Выборка.ФИО);
	ДанныеОбъекта.Вставить("ФИОИнициалы", 			Выборка.ФИОИнициалы);
	ДанныеОбъекта.Вставить("Именуемый", 			Выборка.Именуемый);
	ДанныеОбъекта.Вставить("Должность", 			Выборка.Должность);
	ДанныеОбъекта.Вставить("Подразделение", 		Выборка.Подразделение);
	ДанныеОбъекта.Вставить("СрокДоговора", 			Выборка.СрокДоговора);
	ДанныеОбъекта.Вставить("ДатаПриема", 			СтрЗаменить(Формат(Выборка.ДатаПриема, "ДФ='dd MMMM yyyy ""г.""'"), " ", Символы.НПП));
	ДанныеОбъекта.Вставить("МестоРаботы", 			Выборка.МестоРаботы);
	ДанныеОбъекта.Вставить("Оклад", 				Формат(Выборка.Оклад, "ЧДЦ=2"));	
	ДанныеОбъекта.Вставить("ИспытательныйСрок", 	Выборка.ИспытательныйСрок);
		
	Возврат ДанныеОбъекта;
	
КонецФункции

Функция ПолучитьОписаниеОбластейМакетаОфисногоДокумента()
	
	ОписаниеОбластей = Новый Структура;
	
	УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ВерхнийКолонтитул", 	"ВерхнийКолонтитул");
	УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийКолонтитул", 	"НижнийКолонтитул");
	УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Договор", 				"Общая");
	
	Возврат ОписаниеОбластей;
	
КонецФункции
...Показать Скрыть
gortol; gutentag; Nicholas; +3 Ответить 3
2. Nicholas Mikuslas (Nicholas) 24.11.11 12:09
(1) Пожалуйста, расскажите подробнее про систему печати.
3. Armando Armando (Armando) 24.11.11 12:25
4. Виталий Вин (Vital88) 30.11.11 20:26
Спасибо! Очень полезная статья!
5. Сергей Сергеев (SERJ_1CC) 06.12.11 09:06
Действительно полезная информация, особенно для новечков +1
6. Юрий Иванов (itek.09) 12.12.11 12:10
замечательная обработка . кадровики отдыхают. всемр рекомендую . просто конфетка а не обработка
8. Рустам Валетдинов (Rustamvrz) 20.01.12 12:08
9. Niakitomi Nia (Niakitomi) 21.06.12 13:50
Только начинаю осваивать 1с, наткнулся на эту статью - всё толково понятно.
Хотя сначала с именами напутал - вылезала Ошибка при вызове метода контекста (ПолучитьМакет): Недопустимое значение параметра (параметр номер '1') .
Перечитал статью ещё раз (сделал всё как на картинках), поправил - работает.
Автору респект и уважуха.
10. Niakitomi Nia (Niakitomi) 21.06.12 14:34
Возник вопрос, как заменить метку на что то конкретное из таблицы Сотрудники?
Пробовал поставить дату и ФИО (полное)физического лица - ничего не получилось.
Ставил через конструктор в конфигураторе.

// Предопределенная функция для внешних печатных форм
//
Функция Печать() Экспорт

    // Получим объект Microsoft Word из макета
    ОбъектВорд = ПолучитьМакет("ТрудовойДоговор").Получить();

    // Получим документ из объекта и активируем его
    Документ = ОбъектВорд.Application.Documents(1);
    Документ.Activate();

    // Поиск и замена маркеров
    Замена = Документ.Content.Find;
	  Замена.Execute("м_число", , , , , , , , , "ВЫБРАТЬ
	                                            |	СотрудникиОрганизаций.ДатаДоговора
	                                            |ИЗ
	                                            |	Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций", 2);
	  Замена.Execute("м_ФИО", , , , , , , , , "ВЫБРАТЬ
	                                          |	СотрудникиОрганизаций.Физлицо.Наименование
	                                          |ИЗ
	                                          |	Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций", 2);
    // Вывод документа
    ОбъектВорд.Application.Visible = Истина;
    ОбъектВорд.Activate();

КонецФункции // Печать()
...Показать Скрыть


Если кто сталкивался с этим напишите пример на основе этого кода.
Ну и пояснения если возможно.

Есть какие нибудь учебники по созданию внешних печатных форм?
11. Андрей Григорьев (Borisych) 21.06.12 14:47
12. Nicholas Mikuslas (Nicholas) 21.06.12 19:21
(10) Запрос Вы вставили, но нужно еще его выполнить и затем выбрать данные, которые он вернет. Воспользуйтесь конструктором запроса с обработкой результата.
13. Niakitomi Nia (Niakitomi) 22.06.12 15:56
(12) Nicholas,
воспользовался - не помогло.
// Предопределенная функция для внешних печатных форм
//
Функция Печать() Экспорт


	  		//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	СотрудникиОрганизаций.Наименование
		|ИЗ
		|	Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций";

	Результат = Запрос.Выполнить();

	ВыборкаДетальныеЗаписи = Результат.Выбрать();

	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		// Вставить обработку выборки ВыборкаДетальныеЗаписи
	КонецЦикла;
 	//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА  	
	
	
	
    // Получим объект Microsoft Word из макета
    ОбъектВорд = ПолучитьМакет("ТрудовойДоговор").Получить();

    // Получим документ из объекта и активируем его
    Документ = ОбъектВорд.Application.Documents(1);
    Документ.Activate();

	// Поиск и замена маркеров
    Замена = Документ.Content.Find;
	Замена.Execute("м_ФИО", , , , , , , , ,ВыборкаДетальныеЗаписи , 2);
    // Вывод документа
    ОбъектВорд.Application.Visible = Истина;
    ОбъектВорд.Activate();

КонецФункции // Печать()
...Показать Скрыть


Где то на форуме прочитал что нужно преобразовать тип ссылка в тип строка - тогда всё получится.
Возник вопрос: как преобразовать? Что нужно написать?
Замена.Execute("м_ФИО", , , , , , , , ,ВыборкаДетальныеЗаписи , 2);
14. Nicholas Mikuslas (Nicholas) 25.06.12 06:35
(13) Читайте маны!

Во-первых, ваш запрос возвращает весь справочник сотрудников и как вы его потом собираетесь вставить в один маркер - не понятно.

Во-вторых, конструктор не зря написал: "// Вставить обработку выборки ВыборкаДетальныеЗаписи". Там должно быть хотябы что-то типа: "ТекущийСотрудникНаименование = ВыборкаДетальныеЗаписи.Наименование". Кстати, это будет строка. Т.е. вы в цикле перебираете каждую строку выборки, которую вернул запрос.
Niakitomi; +1 Ответить
15. Niakitomi Nia (Niakitomi) 26.06.12 15:41
16. fzt fzt (fzt) 03.07.14 05:38
Способ три. В шаблон добавляются служебные поля, например, «DocVariable» или «Author». Используя DocVariable можно обращаться к переменной по имени, например, «ДокументВорд.Variables.Add(ИмяПеременной, ЗначениеПеременной);», но ее не видно в шаблоне.

Беру над Вами духовное наставничество. Отныне Ваша религия не запрещает нажимать Shift + F9, для отображения полей. Аминь.
17. Николай Иванов (uri1963) 23.02.16 17:53
Сегодня попробовал воспроизвести эту форму с доработкой. Получилось наполовину. Не получилось вставить в шаблон данные по организации, конкретно ФИО генерального директора, юридический адрес, ИНН,КПП и ОГРН. Может знающие люди подскажут что сделать.
18. Nicholas Mikuslas (Nicholas) 24.02.16 07:08
(17) uri1963,
"Юридический адрес, ИНН, КПП и ОГРН" - эти данные можно получить непосредственно из организации. ФИО директора - из регистра сведений "Ответственные лица организаций".
19. Николай Иванов (uri1963) 26.02.16 21:16
Спасибо за ответ и помощь. Я уже разобрался, вроде заработало.
Теперь возникла очередная проблема. Сразу оговорюсь, я не программист 1С, учусь на ходу.
Проблема такая:
Мне необходимо сделать внешнюю обработку для подготовки и печати кадровых документов из 1С 8.3 ЗУП.
Все вроде сделал и работает, за исключением:
1. Не могу разобраться как вытащить из таблицы ШтатноеРасписаниеОрганизаций поле МаксимальнаяТарифнаяСтавка и вставить данные этого поля в макет для печати;
2. Должности у меня склоняются, но заносятся в макет с маленькой буквы, а надо с Заглавной, например: заносится - заместителя генерального директора, а надо - Заместителя генерального директора;

Подскажите знающие люди. Заранее благодарен.
20. Николай Иванов (uri1963) 26.02.16 22:57
Вроде и штатное расписание победил. Осталось букву озаглавить....
21. Nicholas Mikuslas (Nicholas) 29.02.16 07:19
(20) uri1963,
В типовых конфигурациях есть функция:

Функция ПредложениеСЗаглавнойБуквы(Строка)

    Если ЗначениеЗаполнено(Строка) Тогда
        Возврат (ВРег(Лев(Строка, 1)) + Нрег(Сред(Строка, 2));
    Иначе
        Возврат Строка;
    КонецЕсли;

КонецФункции
...Показать Скрыть