Предлагаю один из возможных вариантов решения данной задачи.
Для начала рассмотрим как реализован вывод подписей в штатном механизме печати.
Обычно для получения ФИО и должностей подписантов вызывается функция ОтветственныеЛицаОрганизаций(Организация, ДатаСреза, Исполнитель = Неопределено) из общего модуля РегламентированнаяОтчетность, например:
Руководители = РегламентированнаяОтчетность.ОтветственныеЛицаОрганизаций(Док.Организация, Док.Дата);
Данная функция является универсальной для большинства стандартных конфигураций и возвращает структуру с ключами «Руководитель», «РуководительДолжность», «ГлавныйБухгалтер», «Кассир», «Исполнитель», «ИсполнительДолжность», «ОтветственныйЗаРегистры» и соответствующими им значениями (типа Строка), полученными из регистра сведений «Ответственные лица организаций«.
У этой функции есть очень полезный для нас параметр Исполнитель: если в этом параметре передать ссылку на физ.лицо, то функция вернёт в элементах структуры с ключами «Исполнитель» и «ИсполнительДолжность» значения, содержащие ФИО и должность переданного физ.лица. Именно таким образом мы и будем получать ФИО и должности наших подписантов.
Теперь нужно определиться как и где мы будем хранить подписантов. Во-первых, для них можно добавить соответствующие реквизиты в документы, а во-вторых, можно завести для документов доп.свойства. При прочих равных я обычно предпочитаю второй вариант, поэтому добавляем два доп.свойства: «Подпись 1 (за руководителя)» и «Подпись 2 (за гл.бухгалтера)» (см. скриншот). В качестве типа доп.свойства можно выбрать как СправочникСсылка.ФизическиеЛица, так и СправочникСсылка.Пользователи (в этом случае у пользователей-подписантов должен быть заполнен реквизит ФизЛицо).
Теперь в интересующих нас процедурах печати документов сразу после стандартного вызова РегламентированнаяОтчетность.ОтветственныеЛицаОрганизаций(…) вызываем нашу специальную процедуру для замены подписей:
... Руководители = РегламентированнаяОтчетность.ОтветственныеЛицаОрганизаций(Док.Организация, Док.Дата); // +++ Замена подписей руководителей НАШ_ПечатьДокументов.ПроверитьЗаменитьРуководителей(Док.Организация, Док.Дата, Док, Руководители); // Замена подписей руководителей +++ ...
Код процедуры ПроверитьЗаменитьРуководителей() из нашего общего модуля НАШ_ПечатьДокументов будет примерно такой:
Процедура ПроверитьЗаменитьРуководителей(Знач Организация, Знач ДатаСреза, Знач ДокументСсылка, Руководители) Экспорт // Руководители - это Структура("Руководитель, РуководительДолжность, ГлавныйБухгалтер, Кассир, Исполнитель, ИсполнительДолжность, ОтветственныйЗаРегистры") // (подробнее см. функцию РегламентированнаяОтчетность.ОтветственныеЛицаОрганизаций()) // Имена доп.свойств документов. ИмяСвойстваЗаРуководителя = "Подпись 1 (за руководителя)"; ИмяСвойстваЗаГлБухгалтера = "Подпись 2 (за гл.бухгалтера)"; МассивНаименований = Новый Массив; МассивНаименований.Добавить(ИмяСвойстваЗаРуководителя); МассивНаименований.Добавить(ИмяСвойстваЗаГлБухгалтера); // Получим значения доп.свойств документа. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗначенияСвойствОбъектов.Свойство.Наименование КАК ИмяСвойства, | ЗначенияСвойствОбъектов.Значение |ИЗ | РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов |ГДЕ | ЗначенияСвойствОбъектов.Объект = &Объект | И ЗначенияСвойствОбъектов.Свойство.Наименование В(&МассивНаименований)"; Запрос.УстановитьПараметр("Объект" , ДокументСсылка); Запрос.УстановитьПараметр("МассивНаименований" , МассивНаименований); РезультатЗапроса = Запрос.Выполнить(); Если РезультатЗапроса.Пустой() Тогда Возврат; КонецЕсли; // Замена ответственных лиц. Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл ИмяСвойства = Выборка.ИмяСвойства; Значение = Выборка.Значение; ФизЛицо = Неопределено; Если ТипЗнч(Значение) = Тип("СправочникСсылка.ФизическиеЛица") Тогда ФизЛицо = Значение; ИначеЕсли ТипЗнч(Значение) = Тип("СправочникСсылка.Пользователи") Тогда ФизЛицо = Значение.ФизЛицо; КонецЕсли; Если НЕ ЗначениеЗаполнено(ФизЛицо) Тогда Продолжить; КонецЕсли; ОтвЛица = РегламентированнаяОтчетность.ОтветственныеЛицаОрганизаций(Организация, ДатаСреза, ФизЛицо); Исполнитель = ОтвЛица.Исполнитель; ИсполнительДолжность = ОтвЛица.ИсполнительДолжность; Если ИмяСвойства = ИмяСвойстваЗаРуководителя Тогда Руководители.Руководитель = Исполнитель; Руководители.РуководительДолжность = ИсполнительДолжность; ИначеЕсли ИмяСвойства = ИмяСвойстваЗаГлБухгалтера Тогда Руководители.ГлавныйБухгалтер = Исполнитель; КонецЕсли; КонецЦикла; КонецПроцедуры
Собственно и всё.
Если кто-то может предложить более оптимальный способ решения данной задачи или если у кого-то есть предложения по усовершенствованию описанного способа — пишите комментарии.
CC-BY
…..на сайте есть ВПФ с выбором подписанта в отдельном окне.
И не зачем в конфигуратор, ИМХО
Просто при данном исполнении подписи, кто подписывает документы значение реквизитов сохраняются, что очень необходимо при повторном распечатывании документов.
я через внешнюю печ. форму все сделал с диалогом выбора подписанта. Мне так удобнее!
Хотя такой вариант тоже хорошо.
Идея понравилась. Хорошо, что подписанты сохраняются в документе.
Эта статья для программиста, а не для бухгалтера…очень сложно, тем более лезть в настройки самому….А после обновления эти настройки слетают и надо весь путь проделывать заново или сохраняются?
(1) gutentag, во-первых, никто не мешает этот механизм использовать в ВПФ.
а во-вторых, для себя я определил примерно следующие критерии для выбора «править код»/»делать внешнюю печ.форму»: если в печ.форме нужно только добавить статический текст в макет, или, не меняя макета, изменить код для его формирования, и при этом объём необходимых правок не превышает
(примерно) 10-20 строк и сами правки расположены не более чем в 2-3 местах в модуле, то правлю в конфе, иначе — выношу в ВПФ. т.е. до описанного предела я считаю что форма штатная, но с небольшими доработками, и при приходе новой версии печ.формы в обновлении я обновляюсь на новую форму + возвращаю свои доработки (эквивалент поддержки с возможностью редактирования). свыше описанного предела я считаю что печ.форма уже не-штатная, а очень сугубо специфическая, что обновляться она не будет (а если будет — то это будет изготовление новой ВПФ на основе изменённой штатной печ.формы) и поэтому выношу её в ВПФ (эквилент снятия с поддержки). в связи с изложенными соображениями, я считаю, что если все изменение печатной формы сводятся только лишь к добавлению трёх строк (одной строки кода и двух строк комментариев), то выносить печатную форму во внешнюю обработку нецелесообразно.
(6) Лен75, да, эта статья для разработчиков. после обновления ничего не слетает, если печать вынесена в отдельные обработки (внешние печатные формы), но сделать это может опять же только разработчик.
На днях потребовалось для конфигурации ЗУП 2.5 решать подобную задачу – часть кадровых документов вместо генерального директора стал подписывать заместитель по кадрам. Категорически не хотелось что-то править в конфигурации зарплаты. И создавать кучу внешних печатных форм для разных документов тоже желания не было.
Нашел простой способ, как при помощи одной внешней печатной формы подменить подписи в любом документе.
Основная идея состоит в том, что сначала формируется стандартный Табличный документ со стандартными подписями Руководителя, а затем в этом табличном документе делается поиск и простая текстовая замена ФИО и должности Руководителя, на ФИО и должность Руководителя кадровой службы.
Значения для поиска и замены берем из регистра «Ответственные лица организаций».
Исходный табличный документ формируем стандартной функцией Печать() самого объекта
// Функция Печать() у объекта возвращает открытую на экране форму сформированного табличного документа, которую закрываем
ФормаПечати=Объект.Печать(ИмяПечФормы,0,ложь);
табДок=ФормаПечати.ПечатныйДокумент;
ФормаПечати.закрыть();
//Макет печатной формы (ИмяПечатнойФормы) выбираем из списка, сформированного по структуре печатных форм
СтруктураВнутреннихПечатныхФорм = Объект.ПолучитьСтруктуруПечатныхФорм() ;
//Для того, чтобы не подменить случайно генерального на зама в самом документе область поиска начинаем с области с текстом «Руководитель»
…
ОбластьПодписи=табДок.НайтиТекст(«Руководитель»);
ОбластьПодписиДолжность=табДок.НайтиТекст(РуководительПодписьДолжность, ОбластьПодписи);
ОбластьПодписиФИО=табДок.НайтиТекст(РуководительПодписьФИО, ОбластьПодписи);
ОбластьПодписиДолжность.текст=РуководительКадровПодписьДолжность;
ОбластьПодписиФИО.текст=РуководительКадровПодписьФИО;
Получилась одна универсальная внешняя печатная форма для любого документа, при этом ничего не исправлял в самой конфигурации.