Трудовой договор в формате MS Word
Для большенства организаций стандартная печатная форма трудового договора в программе 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» и файл шаблона.
Функция Печать()
Вернемся к функции, которую мы создали ранее. Настало время написать ее тело.
// Предопределенная функция для внешних печатных форм
//
Функция Печать() Экспорт
// Получим объект Microsoft Word из макета
ОбъектВорд = ПолучитьМакет("ТрудовойДоговор").Получить();
// Получим документ из объекта и активируем его
Документ = ОбъектВорд.Application.Documents(1);
Документ.Activate();
// Поиск и замена маркеров
Замена = Документ.Content.Find;
Замена.Execute("[НомерДоговора]", , , , , , , , , "007", 2);
// Вывод документа
ОбъектВорд.Application.Visible = Истина;
ОбъектВорд.Activate();
КонецФункции // Печать()
Из кода видно, что в файле шаблона производится поиск строки «[НомерДоговора]» и ее замена на строку «007».
Параметры авторегистрации
Для автоматического заполнения принадлежности печатной формы к объектам конфигурации, добавим еще один макет «Параметры_Авторегистрации». Это будет табличный документ, содержащий одну колонку с именами объектов метаданных, к которым будет принадлежать печатная форма. В нашем случае таблица будет выглядить следующим образом.
Сохраним получившуюся внешнюю обработку.
Подключение дополнительных внешних печатных форм
Запустим 1С Предприятие. Откроем справочник «Дополнительные внешние печатные формы» через меню «Сервис» - «Дополнительные отчеты и обработки».
Нажмем кнопку «Добавить», затем зарегистрируем новую печатную форму, нажав «Заменить файл внешней обработки». Автоматически заполнится принадлежность печатной формы справочнику «Сотрудники». Выберем «Трудовой договор» в колонке «Заменяемая печатная форма» чтобы стандартная печатная форма более не использовалась.
В итоге справочник будет выглядить следующим образом.
Проверка результата
Откроем любого работающего сотрудника и нажмем кнопку «Печать» - «Трудовой договор». Откроется документ Microsoft Word с трудовым договором под номером «007».
Дальнейшее описывать не имет смысла. Думаю, не составит большого труда доработать функцию Печать() и макет договора.
Комментарии
Полезная статья! Спасибо.
Полезная статья! Спасибо.
Большое спасибо за статью,
Большое спасибо за статью, все очень понятно и подробно.
Спасибо! Очень помогло.
Спасибо! Очень помогло. Успехов!
Здорово! Все так просто...
Здорово! Все так просто... Еще бы возможные параметры основных команд - вообще идеал был бы.
Огромное спасибо!
ОГРОМНОЕ СПАСИБО!!!
ОГРОМНОЕ СПАСИБО!!!
Подскажите, при попытке
Подскажите, при попытке загрузки файла в конструктор макета, выдает ошибку неизвестный формат файла, что это может быть??? Формат ставлю такой же как и на картинке у автора.
Спасибо за комментаририй. На
Спасибо за комментаририй. На картинке была ошибка. Исправил. Программа не поддерживает формат *.docx, а только *.doc
А как быть, если из 1С нужно
А как быть, если из 1С нужно вставлять большой фрагмент, содержащий несколько абзацев, имеющий списки (например нумерованные)? Я пробовал - все сбивается в один абзац...
К примеру, можно использовать
К примеру, можно использовать Символы.ВТаб или Символы.ПС.
Спасибо. Отлично написано.
Спасибо. Отлично написано.
а как сделать чтоб номер
а как сделать чтоб номер трудового договора подставлялся не из конфигуратора, как у вас написано 007, а из справочника сотрудника, из вкладки трудовой договор, № трудового договора? ну и в дальнейшем чтоб можно было подставлять реквизиты из формы справочника сотрудника
Например, вот так:Замена
Например, вот так:
Замена.Execute("[НомерДоговора]", , , , , , , , , СсылкаНаОбъект.НомерДоговора, 2);
Большое спасибо!
Большое спасибо!
Добрый день,
Добрый день,
Подскажите как вытащить паспортные данные сотрудника в этот договор?
Замена.Execute("[УдостоверениеЛичности]", , , , , , , , , СсылкаНаОбъект.Физлицо.Удостоверениеличности, 2);
Огромное Вам человеческое спасибо!
Огромное Вам человеческое спасибо!
Добрый день.
Добрый день.
А где можно узнать ссылки по другим объектам?
В данном примере обработка
В данном примере обработка регистрируется для справочника «Сотрдуники организаций», следовательно, вам доступны все реквизиты данного справочника. Посмотреть их можно в конфигурации.
А если нужна обработка не по
А если нужна обработка не по одному справочнику, а по нескольким (ЗУП) - "Сотрудники организаций", "Физические лица", а также регистру сведений - паспортные данные?
С этим тоже никаких проблем
С этим тоже никаких проблем если Вы программист 1С. Например, можно сделать запрос, выбрать необходимые данные, затем заполнить ими шаблон.
Спасибо!Очень полезная статья!!!
Спасибо!Очень полезная статья!!!
Подскажите, при запуске
Подскажите, при запуске внешней обработки выдает ошибку "Поле объекта не обнаружено (СсылкаНаОбъект)"
Обработку нужно
Обработку нужно регистрировать как внешнюю, например, для справочника Сотрудники (описано в статье). Если хотите запускать ее без регистрации, например, через меню "Файл - Открыть", тогда Вам нужно создать форму и разместить на ней реквизит СсылкаНаОбъект с нужным типом, например, Справочник.Сотрудники.
Спасибо, очень классно все
Спасибо, очень классно все написано, я впервые с 1С и получил желаемое, а вот подскажите еще: как сделать чтобы в шаблон константа подставлялась?
Большое спасибо
Большое спасибо
Спасибо! Очень просто и
Спасибо! Очень просто и понятно все описано, замечательная статья, мне очень помогла!
Спасибо за прекрасную статью.
Спасибо за прекрасную статью. Но возникла странная проблема.
При подмене числовых переменных все работает отлично, но как только пытаюсь заменить тестовые переменные, получаю такую ошибку:
Не удалось сформировать внешнюю печатную форму!
Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (0x80020005)
В чем может быть проблема? 1С 8.2 (УПП 1.3)
Заранее спасибо.
Трудно ответить не видя ваш
Трудно ответить не видя ваш код и значения переменных. Попробуйте передавать числа строками или отформатировать их так, чтобы не было пробелов между разрядами. Возможно также, что Вы передаете не строку, а объект, например, нужно передавать СправочникСотрудники.Наименование, а не СправочникСотрудники.Ссылка.
Добрый день! Не подскажите
Добрый день! Не подскажите как увеличить длину строки замены, по умолчанию стоит 255 символов этого не достаточно.
Для каждого парамстрока Из ПарамСоотв Цикл
Replace = Doc.Content.Find;
Replace.Execute(парамстрока.Ключ,Ложь,Истина,Ложь,,,Истина,,Ложь,Строка(парамстрока.Значение),2);
КонецЦикла;
К сожалению, я не знаю иного
К сожалению, я не знаю иного способа обойти это ограничение, как разбить Вашу строку на сегменты длиной не более 255 сиволов и сделать замену в цикле.
Либо использовать другой вариант, например, метки или вставку через буфер обмена.
Текст ошибки: Ошибка при
Текст ошибки: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft Word): Слишком длинный строковый параметр.
Я решил эту проблему:
Я решил эту проблему:
Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft Word): Слишком длинный строковый параметр.
кому нужен пишите сюда rinat@list.ru )
Подскажите, при попытке
Подскажите, при попытке загрузки файла в конструктор макета, выдает ошибку неизвестный формат файла, что это может быть?
Возможно вы указали тип макет
Возможно вы указали тип макет отличный от "Active Document", либо файл не поддерживаемого формата (желательно использовать обычный *.doc).
Спасибо помогло.
Спасибо помогло.
только нужно добавить в статью как писать в колнтитулы
Да, статья, конечно, хорошая.
Да, статья, конечно, хорошая. Но этот метод давно известен. К сожалению, он имеет один существенный "минус": макет договора (ActiveDocumet или текстовый макет с html-тэгами) представляет из себя статический набор данных. И когда у пользователя возникнет необходимость что-то дополнить в типовом договоре, который сохранен в конфигурации в виде макета, мы не сможем предоставить ему такой функциональности. Я сейчас пытаюсь найти ее решение; погуглил, но информации нет. Логично предположить, что структура договора может задаваться определенным справочником, причем иерархия элементов справочника задает структуру такого договора. Однако, мне не хотелось бы выводить текст договора в МС Ворд, поскольку тогда, если возникнет необходимость в ручной правке, надо будет где-то сохранять этот вордовский файл, а пихать его в объект документа в виде хранилища значения тоже не хочется. Кроме этого, хотелось бы что бы пользовательское редактирование текста договора происходило в одном месте - в форме документа. Поэтому я склоняюсь к использованию форматированного документа. К сожалению, форматированный документ не поддерживает работу с таблицами, многоуровневыми списками, тэгами типа <h1>, <h2>, ..., да и использование CSS весьма неважное... В общем, прошу прощения за сумбурность изложения... Будем, как говорится, посмотреть...
Я делал справочник "Договоры"
Я делал справочник "Договоры", один из реквизитов которого - хранилище данных. И делал документ "Договор", в котором выбирается необходимый макет из справочника "Договоры".
Здравствуйте, у меня 1С 8.2
Здравствуйте, у меня 1С 8.2.19.90 и там нет в меню «Сервис» - «Дополнительные отчеты и обработки»
Наличие этого пункта зависит
Наличие этого пункта зависит не от версии платформы, а от версии конкретной конфигурации.
Я только учучь
Я только учучь программировать, пишу конфигурацию с нуля..
А если нужно заполнить также
А если нужно заполнить также номер и дату договора в колонтитулах шаблона, то данный алгоритм не отрабатывает. Как быть в этом случае?
Для верхнего и нижнего
Для верхнего и нижнего колонтитулов соответственно:
Документ.Sections(1).Headers(1).Range.Find.Execute("[НомерДоговораВШапке]", Ложь, Истина, Ложь, , , Истина, , Ложь, НомерДоговора, 2);
Документ.Sections(1).Footers(1).Range.Find.Execute("[НомерДоговораВПодвале]", Ложь, Истина, Ложь, , , Истина, , Ложь, НомерДоговора, 2);
А что нужно прописать в
А что нужно прописать в СведенияОВнешнейОбработке()? Почему может отсутствовать «Заменяемая печатная форма»?
Эта статья про внешние
Эта статья про внешние обработки для 8.2. В ней СведенияОВнешнейОбработке() не используется.
Возможно скачать?
Возможно скачать?
К сожалению, файл обработки
К сожалению, файл обработки не сохранился. Но в нем ничего особого нет, только то, что в статье.
Добавить комментарий