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

24.11.11

Разработка - Универсальные функции

Для большинства организаций стандартная печатная форма трудового договора в программе 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» и файл шаблона.

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

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

// Предопределенная функция для внешних печатных форм
//
Функция Печать() Экспорт
    
    // Получим объект Microsoft Word из макета
    ОбъектВорд = ПолучитьМакет("ТрудовойДоговор").Получить();
    
    // Получим документ из объекта и активируем его
    Документ = ОбъектВорд.Application.Documents(1);
    Документ.Activate();
    
    // Поиск и замена маркеров
    Замена = Документ.Content.Find;
    Замена.Execute("[НомерДоговора]", , , , , , , , , "007", 2);
    
    // Вывод документа
    ОбъектВорд.Application.Visible = Истина;
    ОбъектВорд.Activate();
    
КонецФункции // Печать()

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

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

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

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

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

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

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

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

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

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

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

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    22347    dimanich70    81    

147

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    4257    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    21283    atdonya    25    

58

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

Используются для создания новых объектов в конфигурации, чтобы не забыть, что нужно сделать. Сделано на примере 1С:Бухгалтерия предприятия, в других конфигурациях могут быть другие, а могут быть и похожие объекты.

28.12.2023    6701    mrXoxot    11    

112

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    5753    ke.92@mail.ru    17    

65

Механизмы типовых конфигураций Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Россия Управленческий учет Бесплатно (free)

Разбираемся, зачем в системе ЕРП созданы справочники: ключи аналитик учета, зачем созданы аналогичные по набору измерений регистры сведений. Какие проблемы они решают, какие создают новые и что с этим делать.

08.11.2023    13541    ids79    25    

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

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

Функция ПолучитьОписаниеОбластейМакетаОфисногоДокумента()
	
	ОписаниеОбластей = Новый Структура;
	
	УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ВерхнийКолонтитул", 	"ВерхнийКолонтитул");
	УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийКолонтитул", 	"НижнийКолонтитул");
	УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Договор", 				"Общая");
	
	Возврат ОписаниеОбластей;
	
КонецФункции
Показать
gortol; gutentag; Nicholas; +3 Ответить
2. Nicholas 902 24.11.11 12:09 Сейчас в теме
(1) Пожалуйста, расскажите подробнее про систему печати.
3. Armando 1401 24.11.11 12:25 Сейчас в теме
10. Niakitomi 21.06.12 14:34 Сейчас в теме
Возник вопрос, как заменить метку на что то конкретное из таблицы Сотрудники?
Пробовал поставить дату и ФИО (полное)физического лица - ничего не получилось.
Ставил через конструктор в конфигураторе.

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

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

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

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

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


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

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


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

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

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

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

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

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

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

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


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

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

Во-вторых, конструктор не зря написал: "// Вставить обработку выборки ВыборкаДетальныеЗаписи". Там должно быть хотябы что-то типа: "ТекущийСотрудникНаименование = ВыборкаДетальныеЗаписи.Наименование". Кстати, это будет строка. Т.е. вы в цикле перебираете каждую строку выборки, которую вернул запрос.
Niakitomi; +1 Ответить
4. Vital88 30.11.11 20:26 Сейчас в теме
Спасибо! Очень полезная статья!
5. SERJ_1CC 50 06.12.11 09:06 Сейчас в теме
Действительно полезная информация, особенно для новечков +1
6. itek.09 12.12.11 12:10 Сейчас в теме
замечательная обработка . кадровики отдыхают. всемр рекомендую . просто конфетка а не обработка
7. пользователь 13.12.11 10:57
Сообщение было скрыто модератором.
...
8. Rustamvrz 20.01.12 12:08 Сейчас в теме
Спасибо ...замечательно
9. Niakitomi 21.06.12 13:50 Сейчас в теме
Только начинаю осваивать 1с, наткнулся на эту статью - всё толково понятно.
Хотя сначала с именами напутал - вылезала Ошибка при вызове метода контекста (ПолучитьМакет): Недопустимое значение параметра (параметр номер '1') .
Перечитал статью ещё раз (сделал всё как на картинках), поправил - работает.
Автору респект и уважуха.
11. Borisych 500 21.06.12 14:47 Сейчас в теме
15. Niakitomi 26.06.12 15:41 Сейчас в теме
16. fzt 03.07.14 05:38 Сейчас в теме
Способ три. В шаблон добавляются служебные поля, например, «DocVariable» или «Author». Используя DocVariable можно обращаться к переменной по имени, например, «ДокументВорд.Variables.Add(ИмяПеременной, ЗначениеПеременной);», но ее не видно в шаблоне.

Беру над Вами духовное наставничество. Отныне Ваша религия не запрещает нажимать Shift + F9, для отображения полей. Аминь.
17. uri1963 23.02.16 17:53 Сейчас в теме
Сегодня попробовал воспроизвести эту форму с доработкой. Получилось наполовину. Не получилось вставить в шаблон данные по организации, конкретно ФИО генерального директора, юридический адрес, ИНН,КПП и ОГРН. Может знающие люди подскажут что сделать.
18. Nicholas 902 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 902 29.02.16 07:19 Сейчас в теме
(20) uri1963,
В типовых конфигурациях есть функция:

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

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

КонецФункции
Показать
Оставьте свое сообщение