Коллеги, хелп!
У кого есть, поделитесь работающим кодом автоподстановки "Все руководители автора документа, кроме последнего" или "Все руководители автора процесса, кроме последнего".
Этот код должен быть в "Модуль ШаблоныБизнесПроцессовПереопределяемый"
После изменения конфигурации, нужно нажать правой клавишей на автоподстановки и нажать кнопку "Обновить автоподстановки"
Функция ПолучитьСписокДоступныхФункций(ИменаПредметовДляФункций) Экспорт
ДоступныеФункции = Новый СписокЗначений;
ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ВсеРуководителиАвтораБизнесПроцессаКромеПоследнего(Объект)", "Все руководители автора бизнес процесса кроме последнего");
Если ИменаПредметовДляФункций <> Неопределено Тогда
Если ИменаПредметовДляФункций.Количество() > 0 Тогда
Для Каждого ИмяПредмета Из ИменаПредметовДляФункций Цикл
ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ВсеРуководителиАвтораДокументаКромеПоследнего(Объект, ИмяПредмета)",
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1.Все руководители автора документа кроме последнего'"),Строка(ИмяПредмета)));
//ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.<ИмяФункции>(Объект)", "<Представление функции>");
//ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ЗаместительРуководителяАвтораПроцесса(Объект)", "Заместитель руководителя автора процесса");
Возврат ДоступныеФункции;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецФункции
Функция ВсеРуководителиАвтораДокументаКромеПоследнего(БизнесПроцессОбъект, ИмяПредмета) Экспорт
СтрокаПредмета = БизнесПроцессОбъект.Предметы.Найти(ИмяПредмета,"ИмяПредмета");
Если СтрокаПредмета <> Неопределено Тогда
Если Не ЗначениеЗаполнено(СтрокаПредмета.Предмет) Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Автоподстановка не может быть выполнена, так как не указан предмет ""%1"" процесса.'"),
Строка(ИмяПредмета));
КонецЕсли;
Если ТипЗнч(СтрокаПредмета.Предмет) <> Тип("СправочникСсылка.ИсходящиеДокументы") И
ТипЗнч(СтрокаПредмета.Предмет) <> Тип("СправочникСсылка.ВнутренниеДокументы") Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Автоподстановка не может быть выполнена для предмета ""%1"" процесса.'"),
Строка(ИмяПредмета));
КонецЕсли;
Иначе
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не найден предмет ""%1"" процесса.'"),
Строка(ИмяПредмета));
КонецЕсли;
МассивРуководителей = Новый Массив;
АвторДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаПредмета.Предмет, "Подготовил");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СведенияОПользователяхДокументооборот.Подразделение КАК Подразделение
|ИЗ
| РегистрСведений.СведенияОПользователяхДокументооборот КАК СведенияОПользователяхДокументооборот
|ГДЕ
| СведенияОПользователяхДокументооборот.Пользователь = &Пользователь";
Запрос.УстановитьПараметр("Пользователь", АвторДокумента);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат МассивРуководителей;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Подразделение = Выборка.Подразделение;
Пока ЗначениеЗаполнено(Подразделение) И ЗначениеЗаполнено(Подразделение.Родитель.Руководитель) Цикл
РеквизитыПодразделения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
Подразделение, "Руководитель, Руководитель.Недействителен, Родитель");
Руководитель = РеквизитыПодразделения.Руководитель;
Если ЗначениеЗаполнено(Руководитель) И Руководитель <> АвторДокумента Тогда
Если НЕ РеквизитыПодразделения.РуководительНедействителен Тогда
МассивРуководителей.Добавить(Руководитель);
КонецЕсли;
КонецЕсли;
Подразделение = РеквизитыПодразделения.Родитель;
КонецЦикла;
Возврат МассивРуководителей;
КонецФункции
Функция ВсеРуководителиАвтораБизнесПроцессаКромеПоследнего(БизнесПроцессОбъект) Экспорт
АвторБизнесПроцесса = БизнесПроцессОбъект.Автор;
МассивРуководителей = Новый Массив;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СведенияОПользователяхДокументооборот.Подразделение КАК Подразделение
|ИЗ
| РегистрСведений.СведенияОПользователяхДокументооборот КАК СведенияОПользователяхДокументооборот
|ГДЕ
| СведенияОПользователяхДокументооборот.Пользователь = &Пользователь";
Запрос.УстановитьПараметр("Пользователь", АвторБизнесПроцесса);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат МассивРуководителей;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Подразделение = Выборка.Подразделение;
Пока ЗначениеЗаполнено(Подразделение) И ЗначениеЗаполнено(Подразделение.Родитель.Руководитель) Цикл
РеквизитыПодразделения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
Подразделение, "Руководитель, Руководитель.Недействителен, Родитель");
Руководитель = РеквизитыПодразделения.Руководитель;
Если ЗначениеЗаполнено(Руководитель) И Руководитель <> АвторБизнесПроцесса Тогда
Если НЕ РеквизитыПодразделения.РуководительНедействителен Тогда
МассивРуководителей.Добавить(Руководитель);
КонецЕсли;
КонецЕсли;
Подразделение = РеквизитыПодразделения.Родитель;
КонецЦикла;
Возврат МассивРуководителей;
КонецФункции
Функция ПолучитьСписокДоступныхФункций(ИменаПредметовДляФункций) Экспорт
ДоступныеФункции = Новый СписокЗначений;
ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ВсеРуководителиАвтораБизнесПроцессаКромеПоследнего(Объект)", "Все руководители автора бизнес процесса кроме последнего");
Если ИменаПредметовДляФункций <> Неопределено Тогда
Если ИменаПредметовДляФункций.Количество() > 0 Тогда
Для Каждого ИмяПредмета Из ИменаПредметовДляФункций Цикл
ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ВсеРуководителиАвтораДокументаКромеПоследнего(Объект, ИмяПредмета)",
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1.Все руководители автора документа кроме последнего'"),Строка(ИмяПредмета)));
//ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.<ИмяФункции>(Объект)", "<Представление функции>");
//ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ЗаместительРуководителяАвтораПроцесса(Объект)", "Заместитель руководителя автора процесса");
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат ДоступныеФункции;
КонецФункции
-Руководитель службы качества
--Старший контролёр
---Заместитель старшего контролера
----Контролер ОТК
В настройках бизнес-процессов все документы Контролёра ОТК согласовывают все его руководители. Использую автоподстановку. Т.е. получается Зам.старшего контролера-->Старший контролёр-->Рук-ль службы качества.
Но мне из цепочки согласования надо убрать последнего согласующего - Руководителя службы качества. Т.е. получается, написать и добавить свою автоподстановку - "Все руководители, кроме последнего". На форуме есть много тем по этому вопросу, но самого кода нет. Я не программист, мне дали документооборот таким, какой он есть, поэтому прошу помощи).
Этот код должен быть в "Модуль ШаблоныБизнесПроцессовПереопределяемый"
После изменения конфигурации, нужно нажать правой клавишей на автоподстановки и нажать кнопку "Обновить автоподстановки"
Функция ПолучитьСписокДоступныхФункций(ИменаПредметовДляФункций) Экспорт
ДоступныеФункции = Новый СписокЗначений;
ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ВсеРуководителиАвтораБизнесПроцессаКромеПоследнего(Объект)", "Все руководители автора бизнес процесса кроме последнего");
Если ИменаПредметовДляФункций <> Неопределено Тогда
Если ИменаПредметовДляФункций.Количество() > 0 Тогда
Для Каждого ИмяПредмета Из ИменаПредметовДляФункций Цикл
ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ВсеРуководителиАвтораДокументаКромеПоследнего(Объект, ИмяПредмета)",
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1.Все руководители автора документа кроме последнего'"),Строка(ИмяПредмета)));
//ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.<ИмяФункции>(Объект)", "<Представление функции>");
//ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ЗаместительРуководителяАвтораПроцесса(Объект)", "Заместитель руководителя автора процесса");
Возврат ДоступныеФункции;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецФункции
Функция ВсеРуководителиАвтораДокументаКромеПоследнего(БизнесПроцессОбъект, ИмяПредмета) Экспорт
СтрокаПредмета = БизнесПроцессОбъект.Предметы.Найти(ИмяПредмета,"ИмяПредмета");
Если СтрокаПредмета <> Неопределено Тогда
Если Не ЗначениеЗаполнено(СтрокаПредмета.Предмет) Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Автоподстановка не может быть выполнена, так как не указан предмет ""%1"" процесса.'"),
Строка(ИмяПредмета));
КонецЕсли;
Если ТипЗнч(СтрокаПредмета.Предмет) <> Тип("СправочникСсылка.ИсходящиеДокументы") И
ТипЗнч(СтрокаПредмета.Предмет) <> Тип("СправочникСсылка.ВнутренниеДокументы") Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Автоподстановка не может быть выполнена для предмета ""%1"" процесса.'"),
Строка(ИмяПредмета));
КонецЕсли;
Иначе
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не найден предмет ""%1"" процесса.'"),
Строка(ИмяПредмета));
КонецЕсли;
МассивРуководителей = Новый Массив;
АвторДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаПредмета.Предмет, "Подготовил");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СведенияОПользователяхДокументооборот.Подразделение КАК Подразделение
|ИЗ
| РегистрСведений.СведенияОПользователяхДокументооборот КАК СведенияОПользователяхДокументооборот
|ГДЕ
| СведенияОПользователяхДокументооборот.Пользователь = &Пользователь";
Запрос.УстановитьПараметр("Пользователь", АвторДокумента);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат МассивРуководителей;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Подразделение = Выборка.Подразделение;
Пока ЗначениеЗаполнено(Подразделение) И ЗначениеЗаполнено(Подразделение.Родитель.Руководитель) Цикл
РеквизитыПодразделения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
Подразделение, "Руководитель, Руководитель.Недействителен, Родитель");
Руководитель = РеквизитыПодразделения.Руководитель;
Если ЗначениеЗаполнено(Руководитель) И Руководитель <> АвторДокумента Тогда
Если НЕ РеквизитыПодразделения.РуководительНедействителен Тогда
МассивРуководителей.Добавить(Руководитель);
КонецЕсли;
КонецЕсли;
Подразделение = РеквизитыПодразделения.Родитель;
КонецЦикла;
Возврат МассивРуководителей;
КонецФункции
Функция ВсеРуководителиАвтораБизнесПроцессаКромеПоследнего(БизнесПроцессОбъект) Экспорт
АвторБизнесПроцесса = БизнесПроцессОбъект.Автор;
МассивРуководителей = Новый Массив;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СведенияОПользователяхДокументооборот.Подразделение КАК Подразделение
|ИЗ
| РегистрСведений.СведенияОПользователяхДокументооборот КАК СведенияОПользователяхДокументооборот
|ГДЕ
| СведенияОПользователяхДокументооборот.Пользователь = &Пользователь";
Запрос.УстановитьПараметр("Пользователь", АвторБизнесПроцесса);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат МассивРуководителей;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Подразделение = Выборка.Подразделение;
Пока ЗначениеЗаполнено(Подразделение) И ЗначениеЗаполнено(Подразделение.Родитель.Руководитель) Цикл
РеквизитыПодразделения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
Подразделение, "Руководитель, Руководитель.Недействителен, Родитель");
Руководитель = РеквизитыПодразделения.Руководитель;
Если ЗначениеЗаполнено(Руководитель) И Руководитель <> АвторБизнесПроцесса Тогда
Если НЕ РеквизитыПодразделения.РуководительНедействителен Тогда
МассивРуководителей.Добавить(Руководитель);
КонецЕсли;
КонецЕсли;
Подразделение = РеквизитыПодразделения.Родитель;
КонецЦикла;
Возврат МассивРуководителей;
КонецФункции
{ОбщийМодуль.ШаблоныБизнесПроцессовПереопределяемый.Модуль(86,9)}: Процедура или функция с указанным именем уже определена (ПолучитьСписокДоступныхФункций)
Функция <<?>>ПолучитьСписокДоступныхФункций(ИменаПредметовДляФункций) Экспорт (Проверка: Сервер)
Если согласиться с ошибкой, обновить-таки конфигурацию, то в автоподстановках нет обновлений.
(7) В общем модуле ШаблоныБизнесПроцессовПереопределяемый обычно уже есть функция ПолучитьСписокДоступныхФункций, может вы еще одну добавили, вместо того чтобы изменить существующую?
Вы когда добавляете автоподстановку в шаблон , выбирая ее из Адресной книги, нажмите правой кнопкой мышки на Адресной книге и выберите "Обновить автоподстановки". ( именно автоподстановки, не данные адресной книги)
Если у автор процесса один руководитель и он как раз является "последним", то процесс не запускается.
Во время старта этого процесса произошла ошибка:
{ОбщийМодуль.СтартПроцессовСервер.Модуль(179)}: Ошибка при вызове метода контекста (Старт)
БизнесПроцесс.Старт();
по причине:
Ошибка при выполнении обработчика - 'ВложенныйПроцессПередСозданиемВложенныхБизнесПроцессов'
по причине:
{БизнесПроцесс.КомплексныйПроцесс.МодульОбъекта(373)}: Эта задача не может быть выполнена.
Не найдены исполнители для автоподстановки "Все руководители автора бизнес процесса кроме последнего".
Обратитесь к администратору.
ВызватьИсключение ТекстИсключения;
Попробуйте стартовать процесс еще раз.
Любые автоподстановки не сработают, если они возвращают пустой значение (например "все коллеги автора" когда в подразделении один сотрудник - сам автор).
Это обходится условиями маргшрутизации процессов - те маршрут не должен попадать на согласование в случаях когда автоподстановка не сработает.
Всплыли ошибки. Когда пользователи добавляют в задачи исполнителей, например, через рабочие группы, получается такая ошибка:
{ОбщийМодуль.ШаблоныБизнесПроцессов.Модуль(1185)}: Значение не является значением объектного типа (Добавить)
ДоступныеФункции.Добавить("ШаблоныБизнесПроцессов.АвторБизнесПроцесса(Объект)", НСтр("ru = 'Автор процесса'"));
Функция ПолучитьСписокДоступныхФункций(ИменаПредметовДляФункций) Экспорт
ДоступныеФункции = Новый СписокЗначений;
ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ВсеРуководителиАвтораБизнесПроцессаКромеПоследнего(Объект)", "Все руководители автора бизнес процесса кроме последнего");
Если ИменаПредметовДляФункций <> Неопределено Тогда
Если ИменаПредметовДляФункций.Количество() > 0 Тогда
Для Каждого ИмяПредмета Из ИменаПредметовДляФункций Цикл
ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ВсеРуководителиАвтораДокументаКромеПоследнего(Объект, ИмяПредмета)",
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1.Все руководители автора документа кроме последнего'"),Строка(ИмяПредмета)));
//ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.<ИмяФункции>(Объект)", "<Представление функции>");
//ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ЗаместительРуководителяАвтораПроцесса(Объект)", "Заместитель руководителя автора процесса");
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат ДоступныеФункции;
КонецФункции
из-за чего может быть такая ошибка?
Эта задача не может быть выполнена.
Ошибка при выполнении автоподстановки Все руководители автора бизнес процесса кроме последнего:
Не найден предмет "" процесса.
{ОбщийМодуль.КомандыРаботыСБизнесПроцессамиКлиент.Модуль(30)}: РезультатЗаписи = Форма.Записать(ПараметрыЗаписи);
{БизнесПроцесс.КомплексныйПроцесс.Форма.ФормаБизнесПроцесса.Форма(1342)}: КомандыРаботыСБизнесПроцессамиКлиент.СтартоватьИЗакрыть(ЭтаФорма);
по причине:
Ошибка при выполнении обработчика - 'ВложенныйПроцессПередСозданиемВложенныхБизнесПроцессов'
по причине:
Эта задача не может быть выполнена.
Ошибка при выполнении автоподстановки Все руководители автора бизнес процесса кроме последнего:
Не найден предмет "" процесса.
{БизнесПроцесс.КомплексныйПроцесс.МодульОбъекта(376)}: ВызватьИсключение ТекстИсключения;
{БизнесПроцесс.КомплексныйПроцесс.МодульОбъекта(1560)}: СтартоватьНовыеДействия(ФормируемыеБизнесПроцессы, ТочкаМаршрутаБизнесПроцесса, Ложь);