Произвольные подписи в документах

Если в организации помимо руководителя  есть ещё сотрудники с правом подписи, и вас до сих пор ещё не попросили сделать так чтобы можно было выбирать подписантов, которые будут выводиться в печатных формах документов, то это означает лишь одно —  скоро попросят. ))

Предлагаю один из возможных вариантов решения данной задачи.

Для начала рассмотрим как реализован вывод подписей в штатном механизме печати.
Обычно для получения ФИО и должностей подписантов вызывается функция ОтветственныеЛицаОрганизаций(Организация, ДатаСреза, Исполнитель = Неопределено) из общего модуля РегламентированнаяОтчетность, например:

Руководители = РегламентированнаяОтчетность.ОтветственныеЛицаОрганизаций(Док.Организация, Док.Дата);

Данная функция является универсальной для большинства стандартных конфигураций и возвращает структуру с ключами «Руководитель», «РуководительДолжность», «ГлавныйБухгалтер», «Кассир», «Исполнитель», «ИсполнительДолжность», «ОтветственныйЗаРегистры» и соответствующими им значениями (типа Строка), полученными из регистра сведений «Ответственные лица организаций«.
У этой функции есть очень полезный для нас параметр Исполнитель: если в этом параметре передать ссылку на физ.лицо, то функция вернёт в элементах структуры с ключами «Исполнитель» и «ИсполнительДолжность» значения, содержащие ФИО и должность переданного физ.лица. Именно таким образом мы и будем получать ФИО и должности наших подписантов.

Теперь нужно определиться как и где мы будем хранить подписантов. Во-первых, для них можно добавить соответствующие реквизиты в документы, а во-вторых, можно завести для документов доп.свойства. При прочих равных я обычно предпочитаю второй вариант, поэтому добавляем два доп.свойства: «Подпись 1 (за руководителя)» и «Подпись 2 (за гл.бухгалтера)» (см. скриншот). В качестве типа доп.свойства можно выбрать как СправочникСсылка.ФизическиеЛица, так и СправочникСсылка.Пользователи (в этом случае у пользователей-подписантов должен быть заполнен реквизит ФизЛицо).
Теперь в интересующих нас процедурах печати документов сразу после стандартного вызова РегламентированнаяОтчетность.ОтветственныеЛицаОрганизаций(…) вызываем нашу специальную процедуру для замены подписей:

...
Руководители = РегламентированнаяОтчетность.ОтветственныеЛицаОрганизаций(Док.Организация, Док.Дата);
// +++ Замена подписей руководителей
НАШ_ПечатьДокументов.ПроверитьЗаменитьРуководителей(Док.Организация, Док.Дата, Док, Руководители);
// Замена подписей руководителей +++
...

Код процедуры ПроверитьЗаменитьРуководителей() из нашего общего модуля НАШ_ПечатьДокументов будет примерно такой:

Процедура ПроверитьЗаменитьРуководителей(Знач Организация, Знач ДатаСреза, Знач ДокументСсылка, Руководители) Экспорт

// Руководители - это Структура("Руководитель, РуководительДолжность, ГлавныйБухгалтер, Кассир, Исполнитель, ИсполнительДолжность, ОтветственныйЗаРегистры")
// (подробнее см. функцию РегламентированнаяОтчетность.ОтветственныеЛицаОрганизаций())

// Имена доп.свойств документов.
ИмяСвойстваЗаРуководителя = "Подпись 1 (за руководителя)";
ИмяСвойстваЗаГлБухгалтера = "Подпись 2 (за гл.бухгалтера)";

МассивНаименований = Новый Массив;
МассивНаименований.Добавить(ИмяСвойстваЗаРуководителя);
МассивНаименований.Добавить(ИмяСвойстваЗаГлБухгалтера);

// Получим значения доп.свойств документа.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
 | ЗначенияСвойствОбъектов.Свойство.Наименование КАК ИмяСвойства, 
 | ЗначенияСвойствОбъектов.Значение
 |ИЗ
 | РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
 |ГДЕ
 | ЗначенияСвойствОбъектов.Объект = &Объект
 | И ЗначенияСвойствОбъектов.Свойство.Наименование В(&МассивНаименований)";
Запрос.УстановитьПараметр("Объект"  , ДокументСсылка);
Запрос.УстановитьПараметр("МассивНаименований" , МассивНаименований);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;

// Замена ответственных лиц.
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ИмяСвойства = Выборка.ИмяСвойства;
Значение = Выборка.Значение;
ФизЛицо  = Неопределено;
Если ТипЗнч(Значение) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
ФизЛицо = Значение;
ИначеЕсли ТипЗнч(Значение) = Тип("СправочникСсылка.Пользователи") Тогда
ФизЛицо = Значение.ФизЛицо;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ФизЛицо) Тогда
Продолжить;
КонецЕсли;
ОтвЛица = РегламентированнаяОтчетность.ОтветственныеЛицаОрганизаций(Организация, ДатаСреза, ФизЛицо);
Исполнитель  = ОтвЛица.Исполнитель;
ИсполнительДолжность = ОтвЛица.ИсполнительДолжность;
Если ИмяСвойства = ИмяСвойстваЗаРуководителя Тогда
Руководители.Руководитель  = Исполнитель;
Руководители.РуководительДолжность = ИсполнительДолжность;
ИначеЕсли ИмяСвойства = ИмяСвойстваЗаГлБухгалтера Тогда
Руководители.ГлавныйБухгалтер  = Исполнитель;
КонецЕсли;
КонецЦикла;

КонецПроцедуры

Собственно и всё.

Если кто-то может предложить более оптимальный способ решения данной задачи или если у кого-то есть предложения по усовершенствованию описанного способа — пишите комментарии.

 

CC-BY

9 Comments

  1. gutentag

    …..на сайте есть ВПФ с выбором подписанта в отдельном окне.

    И не зачем в конфигуратор, ИМХО

    Reply
  2. АлексейН

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

    Reply
  3. Aleksey-29

    я через внешнюю печ. форму все сделал с диалогом выбора подписанта. Мне так удобнее!

    Reply
  4. Aleksey-29

    Хотя такой вариант тоже хорошо.

    Reply
  5. Рамзес

    Идея понравилась. Хорошо, что подписанты сохраняются в документе.

    Reply
  6. Лен75

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

    Reply
  7. q_i

    (1) gutentag, во-первых, никто не мешает этот механизм использовать в ВПФ.

    а во-вторых, для себя я определил примерно следующие критерии для выбора «править код»/»делать внешнюю печ.форму»: если в печ.форме нужно только добавить статический текст в макет, или, не меняя макета, изменить код для его формирования, и при этом объём необходимых правок не превышает

    (примерно) 10-20 строк и сами правки расположены не более чем в 2-3 местах в модуле, то правлю в конфе, иначе — выношу в ВПФ. т.е. до описанного предела я считаю что форма штатная, но с небольшими доработками, и при приходе новой версии печ.формы в обновлении я обновляюсь на новую форму + возвращаю свои доработки (эквивалент поддержки с возможностью редактирования). свыше описанного предела я считаю что печ.форма уже не-штатная, а очень сугубо специфическая, что обновляться она не будет (а если будет — то это будет изготовление новой ВПФ на основе изменённой штатной печ.формы) и поэтому выношу её в ВПФ (эквилент снятия с поддержки). в связи с изложенными соображениями, я считаю, что если все изменение печатной формы сводятся только лишь к добавлению трёх строк (одной строки кода и двух строк комментариев), то выносить печатную форму во внешнюю обработку нецелесообразно.

    Reply
  8. q_i

    (6) Лен75, да, эта статья для разработчиков. после обновления ничего не слетает, если печать вынесена в отдельные обработки (внешние печатные формы), но сделать это может опять же только разработчик.

    Reply
  9. aks

    На днях потребовалось для конфигурации ЗУП 2.5 решать подобную задачу – часть кадровых документов вместо генерального директора стал подписывать заместитель по кадрам. Категорически не хотелось что-то править в конфигурации зарплаты. И создавать кучу внешних печатных форм для разных документов тоже желания не было.

    Нашел простой способ, как при помощи одной внешней печатной формы подменить подписи в любом документе.

    Основная идея состоит в том, что сначала формируется стандартный Табличный документ со стандартными подписями Руководителя, а затем в этом табличном документе делается поиск и простая текстовая замена ФИО и должности Руководителя, на ФИО и должность Руководителя кадровой службы.

    Значения для поиска и замены берем из регистра «Ответственные лица организаций».

    Исходный табличный документ формируем стандартной функцией Печать() самого объекта

    // Функция Печать() у объекта возвращает открытую на экране форму сформированного табличного документа, которую закрываем

    ФормаПечати=Объект.Печать(ИмяПечФормы,0,ложь);

    табДок=ФормаПечати.ПечатныйДокумент;

    ФормаПечати.закрыть();

    //Макет печатной формы (ИмяПечатнойФормы) выбираем из списка, сформированного по структуре печатных форм

    СтруктураВнутреннихПечатныхФорм = Объект.ПолучитьСтруктуруПечатныхФорм() ;

    //Для того, чтобы не подменить случайно генерального на зама в самом документе область поиска начинаем с области с текстом «Руководитель»



    ОбластьПодписи=табДок.НайтиТекст(«Руководитель»);

    ОбластьПодписиДолжность=табДок.НайтиТекст(РуководительПодписьДолжность, ОбластьПодписи);

    ОбластьПодписиФИО=табДок.НайтиТекст(РуководительПодписьФИО, ОбластьПодписи);

    ОбластьПодписиДолжность.текст=РуководительКадровПодписьДолжность;

    ОбластьПодписиФИО.текст=РуководительКадровПодписьФИО;

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

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *