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

Published by Nicholas on 15 November, 2011 - 16:13

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сохраним шаблон.

Добавим получившийся шаблон в нашу обаботку. Для этого выбираем «Макеты» и нажимаем кнопку «Добавить» или клавишу «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

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

Comments

Андрей's picture

Полезная статья! Спасибо.

Светлана's picture

Большое спасибо за статью, все очень понятно и подробно.

Иван's picture

Спасибо! Очень помогло. Успехов!

Анна's picture

Здорово! Все так просто... Еще бы возможные параметры основных команд - вообще идеал был бы.
Огромное спасибо!

Петр's picture

ОГРОМНОЕ СПАСИБО!!!

Андрей's picture

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

Nicholas's picture

Спасибо за комментаририй. На картинке была ошибка. Исправил. Программа не поддерживает формат *.docx, а только *.doc

Юрий's picture

А как быть, если из 1С нужно вставлять большой фрагмент, содержащий несколько абзацев, имеющий списки (например нумерованные)? Я пробовал - все сбивается в один абзац...

Nicholas's picture

К примеру, можно использовать Символы.ВТаб или Символы.ПС.

Александр's picture

Спасибо. Отлично написано.

OleGazz's picture

а как сделать чтоб номер трудового договора подставлялся не из конфигуратора, как у вас написано 007, а из справочника сотрудника, из вкладки трудовой договор, № трудового договора? ну и в дальнейшем чтоб можно было подставлять реквизиты из формы справочника сотрудника

Nicholas's picture

Например, вот так:

Замена.Execute("[НомерДоговора]", , , , , , , , , СсылкаНаОбъект.НомерДоговора2);

Алексей's picture

Большое спасибо!

Марат's picture

Добрый день,

Подскажите как вытащить паспортные данные сотрудника в этот договор?

Замена.Execute("[УдостоверениеЛичности]", , , , , , , , , СсылкаНаОбъект.Физлицо.Удостоверениеличности, 2);

Татьяна's picture

Огромное Вам человеческое спасибо!

Михаил's picture

Добрый день.
А где можно узнать ссылки по другим объектам?

Nicholas's picture

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

Михаил's picture

А если нужна обработка не по одному справочнику, а по нескольким (ЗУП) - "Сотрудники организаций", "Физические лица", а также регистру сведений - паспортные данные?

Nicholas's picture

С этим тоже никаких проблем если Вы программист 1С. Например, можно сделать запрос, выбрать необходимые данные, затем заполнить ими шаблон.

Гость's picture

Спасибо!Очень полезная статья!!!

Лена's picture

Подскажите, при запуске внешней обработки выдает ошибку "Поле объекта не обнаружено (СсылкаНаОбъект)"

Nicholas's picture

Обработку нужно регистрировать как внешнюю, например, для справочника Сотрудники (описано в статье). Если хотите запускать ее без регистрации, например, через меню "Файл - Открыть", тогда Вам нужно создать форму и разместить на ней реквизит СсылкаНаОбъект с нужным типом, например, Справочник.Сотрудники.

Денис's picture

Спасибо, очень классно все написано, я впервые с 1С и получил желаемое, а вот подскажите еще: как сделать чтобы в шаблон константа подставлялась?

Ринат's picture

Большое спасибо

Ольга's picture

Спасибо! Очень просто и понятно все описано, замечательная статья, мне очень помогла!

Денис's picture

Спасибо за прекрасную статью. Но возникла странная проблема.

При подмене числовых переменных все работает отлично, но как только пытаюсь заменить тестовые переменные, получаю такую ошибку:

Не удалось сформировать внешнюю печатную форму!
Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (0x80020005)

В чем может быть проблема? 1С 8.2 (УПП 1.3)

Заранее спасибо.

Nicholas's picture

Трудно ответить не видя ваш код и значения переменных. Попробуйте передавать числа строками или отформатировать их так, чтобы не было пробелов между разрядами. Возможно также, что Вы передаете не строку, а объект, например, нужно передавать СправочникСотрудники.Наименование, а не СправочникСотрудники.Ссылка.

Жизель's picture

Добрый день! Не подскажите как увеличить длину строки замены, по умолчанию стоит 255 символов этого не достаточно.

Для каждого парамстрока Из ПарамСоотв Цикл
Replace = Doc.Content.Find;
Replace.Execute(парамстрока.Ключ,Ложь,Истина,Ложь,,,Истина,,Ложь,Строка(парамстрока.Значение),2);
КонецЦикла;

Nicholas's picture

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

Либо использовать другой вариант, например, метки или вставку через буфер обмена.

Жизель's picture

Текст ошибки: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft Word): Слишком длинный строковый параметр.

Ринат's picture

Я решил эту проблему:
Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft Word): Слишком длинный строковый параметр.
кому нужен пишите сюда rinat@list.ru )

Ирина's picture

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

Nicholas's picture

Возможно вы указали тип макет отличный от "Active Document", либо файл не поддерживаемого формата (желательно использовать обычный *.doc).

Степан's picture

Спасибо помогло.
только нужно добавить в статью как писать в колнтитулы

Виталий's picture

Да, статья, конечно, хорошая. Но этот метод давно известен. К сожалению, он имеет один существенный "минус": макет договора (ActiveDocumet или текстовый макет с html-тэгами) представляет из себя статический набор данных. И когда у пользователя возникнет необходимость что-то дополнить в типовом договоре, который сохранен в конфигурации в виде макета, мы не сможем предоставить ему такой функциональности. Я сейчас пытаюсь найти ее решение; погуглил, но информации нет. Логично предположить, что структура договора может задаваться определенным справочником, причем иерархия элементов справочника задает структуру такого договора. Однако, мне не хотелось бы выводить текст договора в МС Ворд, поскольку тогда, если возникнет необходимость в ручной правке, надо будет где-то сохранять этот вордовский файл, а пихать его в объект документа в виде хранилища значения тоже не хочется. Кроме этого, хотелось бы что бы пользовательское редактирование текста договора происходило в одном месте - в форме документа. Поэтому я склоняюсь к использованию форматированного документа. К сожалению, форматированный документ не поддерживает работу с таблицами, многоуровневыми списками, тэгами типа <h1>, <h2>, ..., да и использование CSS весьма неважное... В общем, прошу прощения за сумбурность изложения... Будем, как говорится, посмотреть...

Nicholas's picture

Я делал справочник "Договоры", один из реквизитов которого - хранилище данных. И делал документ "Договор", в котором выбирается необходимый макет из справочника "Договоры".

Наталья's picture

Здравствуйте, у меня 1С 8.2.19.90 и там нет в меню «Сервис» - «Дополнительные отчеты и обработки»

Nicholas's picture

Наличие этого пункта зависит не от версии платформы, а от версии конкретной конфигурации.

Наталья's picture

Я только учучь программировать, пишу конфигурацию с нуля..

Алекс's picture

А если нужно заполнить также номер и дату договора в колонтитулах шаблона, то данный алгоритм не отрабатывает. Как быть в этом случае?

Nicholas's picture

Для верхнего и нижнего колонтитулов соответственно:

Документ.Sections(1).Headers(1).Range.Find.Execute("[НомерДоговораВШапке]", Ложь, Истина, Ложь, , , Истина, , Ложь, НомерДоговора, 2);

Документ.Sections(1).Footers(1).Range.Find.Execute("[НомерДоговораВПодвале]", Ложь, Истина, Ложь, , , Истина, , Ложь, НомерДоговора, 2);

Алексей's picture

А что нужно прописать в СведенияОВнешнейОбработке()? Почему может отсутствовать «Заменяемая печатная форма»?

Nicholas's picture

Эта статья про внешние обработки для 8.2. В ней СведенияОВнешнейОбработке() не используется.

Дмитрий's picture

Возможно скачать?

Nicholas's picture

К сожалению, файл обработки не сохранился. Но в нем ничего особого нет, только то, что в статье.

Add new comment

Plain text

  • No HTML tags allowed.
  • Lines and paragraphs break automatically.
CAPTCHA
Are you a human visitor or automated spam submissions?
Target Image