Примеры реализации собственных автоподстановок в 1С:Документооборот

16.03.18

Разработка - Универсальные функции

Примеры реализации функций автоподстановок для использования в шаблонах процессов в 1С:Документооборот.

Добрый день, уважаемые коллеги!

Часто сталкиваюсь с вопросами, неизбежно возникающими на внедрениях 1С:Документооборот. Большое количество вопросов связано с настройкой маршрутов процессов обработки документов (согласование, утверждение, рассмотрение и т.д.).

Первое место в моем рейтинге занимает группа вопросов, касающихся настройки маршрута в зависимости от реквизита предмета процесса. Например:

  • Как сделать так, чтобы договоры организации А попадали на согласование бухгалтеру Петрову, а договоры организации Б - бухгалтеру Сидорову?
  • Как эскалировать задачу руководителю проекта?
  • Как настроить адресацию входящего документа на роль "Руководитель подразделения документа"?

Конечно, всегда можно сделать разные шаблоны для разных организаций/подразделений или прямо в шаблоне процесса прописать условия ветвления. Но, согласитесь, это крайне неудобно: а если организаций не один десяток? а если орг. структура поменяется? Все шаблоны переделывать?

Казалось бы, вот тут и нужно задействовать механизм объектов адресации: сделать роль "Бухгалтер", включить для этой роли флаг "Используется с объектами адресации" и указать тип объекта адресации (Организация). Но все не так просто: коробочное решение не умеет автоматически подставлять объект адресации. То есть, нужно руками прямо в шаблоне выбирать и роль (Бухгалтер), и объект адресации (Организация). 

Тут то нас и выручит механизм автоподстановок (при условии, что вы готовы "снять с замка" корень конфигурации и один общий модуль).

Итак, нам понадобится:

1. Включить возможность изменения конфигурации:

Для этого открываем конфигуратор, переходим в меню Конфигурация --> Поддержка --> Настройка поддержки и нажимаем Включить возможность изменения. Все объекты поставщика при этом оставляем нередактируемыми.

 

2. Снимаем с замка корень конфигурации и общий модуль ШаблоныБизнесПроцессовПереопределяемый.

3. Добавляем общий модуль АвтоподстановкиПереопределяемый с флагами СерверВнешнее соединение и Вызов сервера

Нужные нам функции автоподстановок будем включать в программный интерфейс добавленного модуля и вызывать из метода ШаблоныБизнесПроцессовПереопределяемый.ПолучитьСписокДоступныхФункций(). Кроме того, нам понадобится несколько служебных универсальных методов:

Функция, возвращающая ссылку на предмет процесса по его имени:

Функция ПредметПоИмени(БизнесПроцессОбъект, ИмяПредмета)
	
	СтрокаПредмета = БизнесПроцессОбъект.Предметы.Найти(ИмяПредмета,"ИмяПредмета");
	
	Если СтрокаПредмета = Неопределено Тогда
		
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Автоподстановка не может быть выполнена, так как не найден предмет ""%1"" процесса.'")
			, Строка(ИмяПредмета)
			);
		
	ИначеЕсли Не ЗначениеЗаполнено(СтрокаПредмета.Предмет) Тогда 
		
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Автоподстановка не может быть выполнена, так как не указан предмет ""%1"" процесса.'")
			, Строка(ИмяПредмета)
			);
			
	КонецЕсли;
	
	Возврат СтрокаПредмета.Предмет;
	
КонецФункции

 

Функция, возвращающая значение реквизита предмета процесса:

Функция ЗначениеРеквизитаПредмета(БизнесПроцессОбъект, ИмяПредмета, ИмяРеквизита)
	
	Предмет = ПредметПоИмени(БизнесПроцессОбъект, ИмяПредмета);
	
	Если Не ОбщегоНазначенияКлиентСервер.ЕстьРеквизитОбъекта(Предмет, ИмяРеквизита) Тогда 
		
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Автоподстановка не может быть выполнена, так как предмет ""%1"" процесса имеет неверный тип (%2).'")
			, Строка(ИмяПредмета)
			, ТипЗнч(Предмет)
			);
		
	КонецЕсли;
	
	Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Предмет, ИмяРеквизита);
	
КонецФункции

Для получения ссылок на нужные нам роли будем описывать функции следующего вида:

Функция НайтиСоздатьРоль_БухгалтерОрганизации()
	
	ИдентификаторСсылки = Новый УникальныйИдентификатор("11d8bbbe-1fd6-11e5-926b-d485646b0d9a");
	РольСсылка = Справочники.РолиИсполнителей.ПолучитьСсылку(ИдентификаторСсылки);
	
	Если Не ОбщегоНазначения.СсылкаСуществует(РольСсылка) Тогда 
		
		РольОбъект = Справочники.РолиИсполнителей.СоздатьЭлемент();
		РольОбъект.УстановитьСсылкуНового(РольСсылка);
		
		РольОбъект.Наименование = НСтр("ru = 'Бухгалтер организации'");
		РольОбъект.КраткоеПредставление = НСтр("ru = 'Бух'");
		РольОбъект.ИспользуетсяСОбъектамиАдресации = Истина;
		РольОбъект.ТипыОсновногоОбъектаАдресации = ПланыВидовХарактеристик.ОбъектыАдресацииЗадач.Организация;
		
		РольОбъект.УстановитьНовыйКод();
		
		РольОбъект.Записать();
		
	КонецЕсли;
	
	Возврат РольСсылка;
	
КонецФункции

То есть мы прямо в коде указываем идентификатор нужной нам ссылки, а случае, если роль с заданным идентификатором отсутствует, она будет создана автоматически при первом вызове функции. Естественно, для каждой роли следует указывать собственный идентификатор (сгенерировать новый или указать идентификатор роли, созданной вручную в пользовательском режиме).

 

Примеры автоподстановок, возвращающих полные роли с нужными объектами адресации:

Функция БухгалтерОрганизации(БизнесПроцессОбъект, ИмяПредмета) Экспорт 
	
	РольИсполнителя = НайтиСоздатьРоль_БухгалтерОрганизации();
	ОсновнойОбъектАдресации = ЗначениеРеквизитаПредмета(БизнесПроцессОбъект, ИмяПредмета, "Организация");
	ДополнительныйОбъектАдресации = Неопределено;
	
	ПолнаяРоль = Справочники.ПолныеРоли.НайтиСоздатьПолнуюРоль(РольИсполнителя
					, ОсновнойОбъектАдресации
					, ДополнительныйОбъектАдресации
					);
	
	Возврат ПолнаяРоль;
	
КонецФункции

Функция РуководительПроекта(БизнесПроцессОбъект, ИмяПредмета) Экспорт 
	
	РольИсполнителя = НайтиСоздатьРоль_РуководительПроекта();
	ОсновнойОбъектАдресации = ЗначениеРеквизитаПредмета(БизнесПроцессОбъект, ИмяПредмета, "Проект");
	ДополнительныйОбъектАдресации = Неопределено;
	
	ПолнаяРоль = Справочники.ПолныеРоли.НайтиСоздатьПолнуюРоль(РольИсполнителя
					, ОсновнойОбъектАдресации
					, ДополнительныйОбъектАдресации
					);
	
	Возврат ПолнаяРоль;
	
КонецФункции

 

Осталось только включить эти автоподстановки в список доступных функций. Для этого нужно немного подправить модуль ШаблоныБизнесПроцессовПереопределяемый:

// Возвращает список пользовательских функций для автоподстановки исполнителей в шаблонах бизнес-процессов
// Параметры:
//	ИменаПредметовДляФункций - массив - массив имен предметов для функций автоподстановки
//
Функция ПолучитьСписокДоступныхФункций(ИменаПредметовДляФункций) Экспорт
	
	ДоступныеФункции = Новый СписокЗначений;
	//ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.<ИмяФункции>(Объект)", "<Представление функции>");
	//ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ЗаместительРуководителяАвтораПроцесса(Объект)", "Заместитель руководителя автора процесса");
	
	#Область МодификацияКонфигурации
	Если ИменаПредметовДляФункций <> Неопределено И ИменаПредметовДляФункций.Количество() > 0 Тогда 
		
		Для Каждого ИмяПредмета Из ИменаПредметовДляФункций Цикл 
			
			ДоступныеФункции.Добавить("АвтоподстановкиПереопределяемый.БухгалтерОрганизации(Объект, ИмяПредмета)"			, 
				СтрШаблон(НСтр("ru = '%1.Бухгалтер организации документа'"		), Строка(ИмяПредмета)));
				
			ДоступныеФункции.Добавить("АвтоподстановкиПереопределяемый.РуководительПроекта(Объект, ИмяПредмета)", 
				СтрШаблон(НСтр("ru = '%1.Руководитель проекта документа'"	), Строка(ИмяПредмета)));
				
		КонецЦикла;
	
	КонецЕсли;
	#КонецОбласти

	Возврат ДоступныеФункции;
	
КонецФункции

 

В общем-то, это все: можно обновить конфигурацию и в пользовательском режиме обновить данные в справочнике Адресная книга. Лайфхак: можно обновить не всю адресную книгу целиком, а только автоподстановки. Для этого нужно открыть любой шаблон любого процесса и перейти к выбору исполнителя задачи. Тогда откроется форма "Выбор исполнителя", в контекстном меню которой есть отдельный пункт "Обновить автоподстановки".

Дальше, думаю, все понятно: при настройке шаблонов процессов вместо указания ролей с объектами адресации используем наши автоподстановки. Профит!

Автоподстановка Документооборот Шаблон процесса Ролевая адресация

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    18963    dimanich70    81    

141

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    3993    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    16560    atdonya    23    

56

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    5391    ke.92@mail.ru    16    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14280    YA_418728146    7    

166

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3478    55    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18352    166    sapervodichka    112    

135
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DEG156 28 26.06.18 17:54 Сейчас в теме
Здравствуйте !

А где ответ на вопрос - Как настроить адресацию входящего документа на роль "Руководитель подразделения документа"?
user1965444; user1840128; user809597; +3 Ответить
2. TimurrReznik 31.07.18 12:43 Сейчас в теме
Не знаю, что насчет конфигурации - я ничего толком не понял. В кабинете documentoved.ru намного удобнее синхронизирована работа входящих и исходящих документов. В программе 1С я посмотрел настройки, полазил и по вашему скрипту не смог настроить...
3. TimurrReznik 31.07.18 12:46 Сейчас в теме
Не знаю, что насчет конфигурации - я ничего толком не понял. В кабинете documentoved.ru намного удобнее синхронизирована работа входящих и исходящих документов. В программе 1С я посмотрел настройки, полазил и по вашему скрипту не смог настроить...
4. blandinko 06.12.18 08:54 Сейчас в теме
Здравствуйте! Спасибо большое за пост, очень помог.

Сейчас функция
ОбщегоНазначенияКлиентСервер.ЕстьРеквизитОбъекта(Предмет, ИмяРеквизита)
стала называться
ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Предмет, ИмяРеквизита)
charushkin; Srk47; +2 Ответить
5. blandinko 06.12.18 09:29 Сейчас в теме
Единственное, у меня проблема возникла, которую я не знаю как решить (я новичок совсем):
У меня есть Роль исполнителя под названием "Зам. директора по направлению", и некоторые (не все) подразделения подчиняются своим замам директора. Создала автоподстановку для этой роли (зависит от подразделения автора документа), и шаблон процесса, содержащий эту автоподстановку.

Если в документе указать в качестве автора документа пользователя, подразделение которого подчиняется одному из замов, то есть соответствующая запись есть в Роли исполнителя (надеюсь, понятно объясняю), то все хорошо, автоподстановка работает, задача приходит указанному в Роли исполнителя заму директора по направлению.

Однако если в документе в качестве автора документа указать пользователя, подразделение которого НЕ подчиняется ни одному из замов (нет соответствующей записи в Роли исполнителя "Зам. директора по направлению"), то задача все равно создается, получается, "в никуда".

Можно ли сделать так, чтобы при отсутствии соответствущей роли исполнителя для подразделения автора документа задача бы вообще не создавалась?
6. user1497591 25.11.20 19:29 Сейчас в теме
Добрый день! Как реализовать автоподстановка для роли юрист? В процессе нужно ФИО юриста, который согласовал документ в процессе согласования.
Оставьте свое сообщение