Найти в Дзене

Произвольный код в расширенной адресации согласования 1С:Управление холдингом / 1С:ERP УХ

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

Решали достаточно типовую задачу: нужно направить документ на согласование руководителю подразделения. Типовыми условиями расширенной адресации решить это не удалось, т.к. в подразделении в качестве руководителя указывается не пользователь, а физическое лицо.

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

Немного деталей

  • Пользователя или нескольких (через массив) нужно передавать в переменную "ЗначениеПараметра"
  • Получить доступ к полям согласуемого объекта можно через реквизит "КлючевойОбъектПроцесса" переменной "ДокументПроцессаВход" типа "ЭкземплярПроцесса"

Но где это написано?

Первоначальный вариант

Первый вариант был такой:

ЗначениеПараметра = Справочники.Пользователи.НайтиПоРеквизиту("ФизическоеЛицо", ДокументПроцессаВход.КлючевойОбъектПроцесса.Подразделение.ТекущийРуководитель);

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

Итоговый вариант

Итоговый текст кода:

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

Выглядеть это должно так:

Больше деталей

Сама процедура обработки произвольного кода расширенной адресации согласования находится в общем модуле "МодульУправленияПроцессамиУХ". Текст процедуры выглядит следующим образом:

// Осуществляет расшифровку расширенной адресации для вида адресации ПроизвольныйКод.
Процедура ПроизвольныйКодРасширеннаяАдресация(ДокументПроцессаВход, АдресацияВход, СтрокаОтветственныхВход, ТабОтветственныхИзм, СтрокаПредставленияИзм)

Если ЗначениеЗаполнено(ДокументПроцессаВход) Тогда

КодПроцедуры = АдресацияВход.ТекстПроцедуры;
ЗначениеПараметра = Справочники.Пользователи.ПустаяСсылка();
Выполнить(КодПроцедуры);
Если ТипЗнч(ЗначениеПараметра) = Тип("СправочникСсылка.Пользователи") Тогда
ДобавитьПользователяВТаблицуОтветсвенных(ЗначениеПараметра, СтрокаОтветственныхВход, ТабОтветственныхИзм, СтрокаПредставленияИзм);
ИначеЕсли ТипЗнч(ЗначениеПараметра) = Тип("Массив") Тогда
Для Каждого ТекЗначениеПараметра Из ЗначениеПараметра Цикл
ДобавитьПользователяВТаблицуОтветсвенных(ТекЗначениеПараметра, СтрокаОтветственныхВход, ТабОтветственныхИзм, СтрокаПредставленияИзм);
КонецЦикла;
Иначе
ТекстСообщения = НСтр("ru = 'Неизвестный вариант заполнения параметра - %ЗначениеПараметра%. Значение пропущено.'");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ЗначениеПараметра%", Строка(ЗначениеПараметра));
ОбщегоНазначенияУХ.СообщитьОбОшибке(ТекстСообщения);
КонецЕсли;
Иначе
// Пустой документ согласования. Пропускаем.
КонецЕсли;

КонецПроцедуры // ПроизвольныйКодРасширеннаяАдресация()