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

Published by Nicholas on 15 ноября, 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

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

Комментарии

Аватар пользователя Андрей

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

Аватар пользователя Светлана

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

Аватар пользователя Иван

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

Аватар пользователя Анна

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

Аватар пользователя Петр

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

Аватар пользователя Андрей

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

Аватар пользователя Nicholas

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

Аватар пользователя Юрий

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

Аватар пользователя Nicholas

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

Аватар пользователя Александр

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

Аватар пользователя OleGazz

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

Аватар пользователя Nicholas

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

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

Аватар пользователя Алексей

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

Аватар пользователя Марат

Добрый день,

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

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

Аватар пользователя Татьяна

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

Аватар пользователя Михаил

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

Аватар пользователя Nicholas

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

Аватар пользователя Михаил

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

Аватар пользователя Nicholas

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

Аватар пользователя Гость

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

Аватар пользователя Лена

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

Аватар пользователя Nicholas

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

Аватар пользователя Денис

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

Аватар пользователя Ринат

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

Аватар пользователя Ольга

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

Аватар пользователя Денис

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

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

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

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

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

Аватар пользователя Nicholas

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

Аватар пользователя Жизель

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

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

Аватар пользователя Nicholas

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

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

Аватар пользователя Жизель

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

Аватар пользователя Ринат

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

Аватар пользователя Ирина

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

Аватар пользователя Nicholas

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

Аватар пользователя Степан

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

Аватар пользователя Виталий

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

Аватар пользователя Nicholas

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

Аватар пользователя Наталья

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

Аватар пользователя Nicholas

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

Аватар пользователя Наталья

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

Аватар пользователя Алекс

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

Аватар пользователя Nicholas

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

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

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

Аватар пользователя Алексей

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

Аватар пользователя Nicholas

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

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Строки и абзацы переносятся автоматически.
CAPTCHA
Вы человек или автоматическая спам-рассылка?
Target Image