gifts2017

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

Опубликовал q_i в раздел Программирование - Практика программирования

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

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


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

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

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

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

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


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

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

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

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

 

CC-BY

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Igоr Sаulеviсh (gutentag) 28.02.12 04:42
.....на сайте есть ВПФ с выбором подписанта в отдельном окне.
И не зачем в конфигуратор, ИМХО
2. Алексей (АлексейН) 28.02.12 08:33
Просто при данном исполнении подписи, кто подписывает документы значение реквизитов сохраняются, что очень необходимо при повторном распечатывании документов.
3. Алексей Фурманов (Aleksey-29) 29.02.12 08:09
я через внешнюю печ. форму все сделал с диалогом выбора подписанта. Мне так удобнее!
4. Алексей Фурманов (Aleksey-29) 29.02.12 08:09
Хотя такой вариант тоже хорошо.
5. Сергей Сергеев (Рамзес) 29.02.12 09:39
Идея понравилась. Хорошо, что подписанты сохраняются в документе.
6. Олег Петров (Лен75) 29.02.12 10:22
Эта статья для программиста, а не для бухгалтера...очень сложно, тем более лезть в настройки самому....А после обновления эти настройки слетают и надо весь путь проделывать заново или сохраняются?
7. q_i 29.02.12 20:02
(1) gutentag, во-первых, никто не мешает этот механизм использовать в ВПФ.
а во-вторых, для себя я определил примерно следующие критерии для выбора "править код"/"делать внешнюю печ.форму": если в печ.форме нужно только добавить статический текст в макет, или, не меняя макета, изменить код для его формирования, и при этом объём необходимых правок не превышает
(примерно) 10-20 строк и сами правки расположены не более чем в 2-3 местах в модуле, то правлю в конфе, иначе - выношу в ВПФ. т.е. до описанного предела я считаю что форма штатная, но с небольшими доработками, и при приходе новой версии печ.формы в обновлении я обновляюсь на новую форму + возвращаю свои доработки (эквивалент поддержки с возможностью редактирования). свыше описанного предела я считаю что печ.форма уже не-штатная, а очень сугубо специфическая, что обновляться она не будет (а если будет - то это будет изготовление новой ВПФ на основе изменённой штатной печ.формы) и поэтому выношу её в ВПФ (эквилент снятия с поддержки). в связи с изложенными соображениями, я считаю, что если все изменение печатной формы сводятся только лишь к добавлению трёх строк (одной строки кода и двух строк комментариев), то выносить печатную форму во внешнюю обработку нецелесообразно.
8. q_i 29.02.12 20:05
(6) Лен75, да, эта статья для разработчиков. после обновления ничего не слетает, если печать вынесена в отдельные обработки (внешние печатные формы), но сделать это может опять же только разработчик.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа