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