Примеры реализации собственных автоподстановок в 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С 8.3.24)

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

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

1 стартмани

18.03.2024    2652    0    John_d    8    

53

GUID в 1С 8.3 - как с ними быть

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

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

12.02.2024    4588    atdonya    22    

44

Переоткрытие внешних обработок

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

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

30.11.2023    3950    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    8795    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

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

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

2 стартмани

22.08.2023    2069    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 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    16138    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

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

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7241    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 Сейчас в теме
Добрый день! Как реализовать автоподстановка для роли юрист? В процессе нужно ФИО юриста, который согласовал документ в процессе согласования.
Оставьте свое сообщение