Коллеги, хелп!
У кого есть, поделитесь работающим кодом автоподстановки "Все руководители автора документа, кроме последнего" или "Все руководители автора процесса, кроме последнего".
---
Этот код должен быть в "Модуль ШаблоныБизнесПроцессовПереопределяемый"
После изменения конфигурации, нужно нажать правой клавишей на автоподстановки и нажать кнопку "Обновить автоподстановки"

```1c
    Функция ПолучитьСписокДоступныхФункций(ИменаПредметовДляФункций) Экспорт

    ДоступныеФункции = Новый СписокЗначений;

    ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ВсеРуководителиАвтораБизнесПроцессаКромеПоследнего(Объект)", "Все руководители автора бизнес процесса кроме последнего");

    Если ИменаПредметовДляФункций <> Неопределено Тогда
    Если ИменаПредметовДляФункций.Количество() > 0 Тогда
    Для Каждого ИмяПредмета Из ИменаПредметовДляФункций Цикл

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

    //ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.<ИмяФункции>(Объект)", "<Представление функции>");
    //ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ЗаместительРуководителяАвтораПроцесса(Объект)", "Заместитель руководителя автора процесса");

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

    КонецЦикла;
    КонецЕсли;
    КонецЕсли;

    КонецФункции

    Функция ВсеРуководителиАвтораДокументаКромеПоследнего(БизнесПроцессОбъект, ИмяПредмета) Экспорт

    СтрокаПредмета = БизнесПроцессОбъект.Предметы.Найти(ИмяПредмета,"ИмяПредмета");

    Если СтрокаПредмета <> Неопределено Тогда

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

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

    Иначе

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

    КонецЕсли;

    МассивРуководителей = Новый Массив;
    АвторДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаПредмета.Предмет, "Подготовил");

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

    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
    Возврат МассивРуководителей;
    КонецЕсли;

    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    Подразделение = Выборка.Подразделение;

    Пока ЗначениеЗаполнено(Подразделение) И ЗначениеЗаполнено(Подразделение.Родитель.Руководитель) Цикл

    РеквизитыПодразделения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
    Подразделение, "Руководитель, Руководитель.Недействителен, Родитель");
    Руководитель = РеквизитыПодразделения.Руководитель;
    Если ЗначениеЗаполнено(Руководитель) И Руководитель <> АвторДокумента Тогда
    Если НЕ РеквизитыПодразделения.РуководительНедействителен Тогда
    МассивРуководителей.Добавить(Руководитель);
    КонецЕсли;
    КонецЕсли;
    Подразделение = РеквизитыПодразделения.Родитель;

    КонецЦикла;

    Возврат МассивРуководителей;

    КонецФункции

    Функция ВсеРуководителиАвтораБизнесПроцессаКромеПоследнего(БизнесПроцессОбъект) Экспорт

    АвторБизнесПроцесса = БизнесПроцессОбъект.Автор;
    МассивРуководителей = Новый Массив;

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

    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
    Возврат МассивРуководителей;
    КонецЕсли;

    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    Подразделение = Выборка.Подразделение;

    Пока ЗначениеЗаполнено(Подразделение) И ЗначениеЗаполнено(Подразделение.Родитель.Руководитель) Цикл

    РеквизитыПодразделения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
    Подразделение, "Руководитель, Руководитель.Недействителен, Родитель");
    Руководитель = РеквизитыПодразделения.Руководитель;
    Если ЗначениеЗаполнено(Руководитель) И Руководитель <> АвторБизнесПроцесса Тогда
    Если НЕ РеквизитыПодразделения.РуководительНедействителен Тогда
    МассивРуководителей.Добавить(Руководитель);
    КонецЕсли;
    КонецЕсли;
    Подразделение = РеквизитыПодразделения.Родитель;

    КонецЦикла;

    Возврат МассивРуководителей;

    КонецФункции
```
---
```1c
    Функция ПолучитьСписокДоступныхФункций(ИменаПредметовДляФункций) Экспорт

    ДоступныеФункции = Новый СписокЗначений;

    ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ВсеРуководителиАвтораБизнесПроцессаКромеПоследнего(Объект)", "Все руководители автора бизнес процесса кроме последнего");

    Если ИменаПредметовДляФункций <> Неопределено Тогда
    Если ИменаПредметовДляФункций.Количество() > 0 Тогда
    Для Каждого ИмяПредмета Из ИменаПредметовДляФункций Цикл

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

    //ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.<ИмяФункции>(Объект)", "<Представление функции>");
    //ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ЗаместительРуководителяАвтораПроцесса(Объект)", "Заместитель руководителя автора процесса");

    КонецЦикла;
    КонецЕсли;
    КонецЕсли;

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

    КонецФункции
```

Это должно исправить.
---
в Справочнике сотрудники, есть реквизит "Руководитель" , при распечатке подставляйте его
---
Последний - это непосредственный руководитель или руководитель организации?
---
например, есть такая структура:

-Руководитель службы качества
--Старший контролёр
---Заместитель старшего контролера
----Контролер ОТК

В настройках бизнес-процессов все документы Контролёра ОТК согласовывают все его руководители. Использую автоподстановку. Т.е. получается Зам.старшего контролера-->Старший контролёр-->Рук-ль службы качества.
Но мне из цепочки согласования надо убрать последнего согласующего - Руководителя службы качества. Т.е. получается, написать и добавить свою автоподстановку - "Все руководители, кроме последнего". На форуме есть много тем по этому вопросу, но самого кода нет. Я не программист, мне дали документооборот таким, какой он есть, поэтому прошу помощи).
---
```1c
    &НаСервере
    Функция ПолучитьСтруктураПодразделений()
    Пользователь = Справочники.Пользователи.НайтиПоНаименованию("Пупкин Сергей Иванович");
    ПользовательПодразделение = Пользователь.Подразделение;

    МассивПодразделений = Новый Массив;

    МассивПодразделений.Добавить(Пользователь.Подразделение);
    ПолучитьВышестоящееПодразделение(МассивПодразделений,Пользователь.Подразделение);

    Количество = МассивПодразделений.Количество();

    КонецФункции

    &НаСервере
    Процедура ПолучитьВышестоящееПодразделение(МассивПодразделений,Подразделение)
    Если Подразделение.Родитель.Родитель = Справочники.СтруктураПредприятия.ПустаяСсылка() Тогда
    Возврат;
    КонецЕсли;
    ПодразделениеРодитель = Подразделение.Родитель;
    МассивПодразделений.Добавить(ПодразделениеРодитель);
    ПолучитьВышестоящееПодразделение(МассивПодразделений,Подразделение.Родитель);
    КонецПроцедуры
```
---
Этот код должен быть в "Модуль ШаблоныБизнесПроцессовПереопределяемый"
После изменения конфигурации, нужно нажать правой клавишей на автоподстановки и нажать кнопку "Обновить автоподстановки"

```1c
    Функция ПолучитьСписокДоступныхФункций(ИменаПредметовДляФункций) Экспорт

    ДоступныеФункции = Новый СписокЗначений;

    ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ВсеРуководителиАвтораБизнесПроцессаКромеПоследнего(Объект)", "Все руководители автора бизнес процесса кроме последнего");

    Если ИменаПредметовДляФункций <> Неопределено Тогда
    Если ИменаПредметовДляФункций.Количество() > 0 Тогда
    Для Каждого ИмяПредмета Из ИменаПредметовДляФункций Цикл

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

    //ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.<ИмяФункции>(Объект)", "<Представление функции>");
    //ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ЗаместительРуководителяАвтораПроцесса(Объект)", "Заместитель руководителя автора процесса");

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

    КонецЦикла;
    КонецЕсли;
    КонецЕсли;

    КонецФункции

    Функция ВсеРуководителиАвтораДокументаКромеПоследнего(БизнесПроцессОбъект, ИмяПредмета) Экспорт

    СтрокаПредмета = БизнесПроцессОбъект.Предметы.Найти(ИмяПредмета,"ИмяПредмета");

    Если СтрокаПредмета <> Неопределено Тогда

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

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

    Иначе

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

    КонецЕсли;

    МассивРуководителей = Новый Массив;
    АвторДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаПредмета.Предмет, "Подготовил");

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

    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
    Возврат МассивРуководителей;
    КонецЕсли;

    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    Подразделение = Выборка.Подразделение;

    Пока ЗначениеЗаполнено(Подразделение) И ЗначениеЗаполнено(Подразделение.Родитель.Руководитель) Цикл

    РеквизитыПодразделения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
    Подразделение, "Руководитель, Руководитель.Недействителен, Родитель");
    Руководитель = РеквизитыПодразделения.Руководитель;
    Если ЗначениеЗаполнено(Руководитель) И Руководитель <> АвторДокумента Тогда
    Если НЕ РеквизитыПодразделения.РуководительНедействителен Тогда
    МассивРуководителей.Добавить(Руководитель);
    КонецЕсли;
    КонецЕсли;
    Подразделение = РеквизитыПодразделения.Родитель;

    КонецЦикла;

    Возврат МассивРуководителей;

    КонецФункции

    Функция ВсеРуководителиАвтораБизнесПроцессаКромеПоследнего(БизнесПроцессОбъект) Экспорт

    АвторБизнесПроцесса = БизнесПроцессОбъект.Автор;
    МассивРуководителей = Новый Массив;

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

    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
    Возврат МассивРуководителей;
    КонецЕсли;

    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    Подразделение = Выборка.Подразделение;

    Пока ЗначениеЗаполнено(Подразделение) И ЗначениеЗаполнено(Подразделение.Родитель.Руководитель) Цикл

    РеквизитыПодразделения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
    Подразделение, "Руководитель, Руководитель.Недействителен, Родитель");
    Руководитель = РеквизитыПодразделения.Руководитель;
    Если ЗначениеЗаполнено(Руководитель) И Руководитель <> АвторБизнесПроцесса Тогда
    Если НЕ РеквизитыПодразделения.РуководительНедействителен Тогда
    МассивРуководителей.Добавить(Руководитель);
    КонецЕсли;
    КонецЕсли;
    Подразделение = РеквизитыПодразделения.Родитель;

    КонецЦикла;

    Возврат МассивРуководителей;

    КонецФункции
```
---
Спасибо!

При сохранении конфигурации ошибка:

```1c
    {ОбщийМодуль.ШаблоныБизнесПроцессовПереопределяемый.Модуль(86,9)}: Процедура или функция с указанным именем уже определена (ПолучитьСписокДоступныхФункций)
    Функция <<?>>ПолучитьСписокДоступныхФункций(ИменаПредметовДляФункций) Экспорт (Проверка: Сервер)
```

Если согласиться с ошибкой, обновить-таки конфигурацию, то в автоподстановках нет обновлений.

(5) Этот код куда нужно записать?
---
В общем модуле ШаблоныБизнесПроцессовПереопределяемый обычно уже есть функция ПолучитьСписокДоступныхФункций, может вы еще одну добавили, вместо того чтобы изменить существующую?
Вы когда добавляете автоподстановку в шаблон , выбирая ее из Адресной книги, нажмите правой кнопкой мышки на Адресной книге и выберите "Обновить автоподстановки". ( именно автоподстановки, не данные адресной книги)
---
да, всё верно, я не прочитала в коде, что функция дублируется) В автоподстановках всё появилось.
Осталось протестировать.
---
отлично работает! Спасибо!
---
Блин, есть косяк.

Если у автор процесса один руководитель и он как раз является "последним", то процесс не запускается.

```1c
    Во время старта этого процесса произошла ошибка:
    {ОбщийМодуль.СтартПроцессовСервер.Модуль(179)}: Ошибка при вызове метода контекста (Старт)
    БизнесПроцесс.Старт();
    по причине:
    Ошибка при выполнении обработчика - 'ВложенныйПроцессПередСозданиемВложенныхБизнесПроцессов'
    по причине:
    {БизнесПроцесс.КомплексныйПроцесс.МодульОбъекта(373)}: Эта задача не может быть выполнена.
    Не найдены исполнители для автоподстановки "Все руководители автора бизнес процесса кроме последнего".
    Обратитесь к администратору.
    ВызватьИсключение ТекстИсключения;
    Попробуйте стартовать процесс еще раз.
```
---
Любые автоподстановки не сработают, если они возвращают пустой значение (например "все коллеги автора" когда в подразделении один сотрудник - сам автор).
Это обходится условиями маргшрутизации процессов - те маршрут не должен попадать на согласование в случаях когда автоподстановка не сработает.
---
да, так и сделала, настроила маршрутизацию.
---
Всплыли ошибки. Когда пользователи добавляют в задачи исполнителей, например, через рабочие группы, получается такая ошибка:

```1c
    {ОбщийМодуль.ШаблоныБизнесПроцессов.Модуль(1185)}: Значение не является значением объектного типа (Добавить)
    ДоступныеФункции.Добавить("ШаблоныБизнесПроцессов.АвторБизнесПроцесса(Объект)", НСтр("ru = 'Автор процесса'"));
```
---
```1c
    Функция ПолучитьСписокДоступныхФункций(ИменаПредметовДляФункций) Экспорт

    ДоступныеФункции = Новый СписокЗначений;

    ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ВсеРуководителиАвтораБизнесПроцессаКромеПоследнего(Объект)", "Все руководители автора бизнес процесса кроме последнего");

    Если ИменаПредметовДляФункций <> Неопределено Тогда
    Если ИменаПредметовДляФункций.Количество() > 0 Тогда
    Для Каждого ИмяПредмета Из ИменаПредметовДляФункций Цикл

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

    //ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.<ИмяФункции>(Объект)", "<Представление функции>");
    //ДоступныеФункции.Добавить("ШаблоныБизнесПроцессовПереопределяемый.ЗаместительРуководителяАвтораПроцесса(Объект)", "Заместитель руководителя автора процесса");

    КонецЦикла;
    КонецЕсли;
    КонецЕсли;

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

    КонецФункции
```

Это должно исправить.
---
да, всё отлично!
---
Как поправить чтобы работало для случая "Все руководители автора документа кроме первого и последнего"?
---
а точно сюда ШаблоныБизнесПроцессовПереопределяемый? может сюда ШаблоныБизнесПроцессов?
---
из-за чего может быть такая ошибка?
Эта задача не может быть выполнена.
Ошибка при выполнении автоподстановки Все руководители автора бизнес процесса кроме последнего:
Не найден предмет "" процесса.
{ОбщийМодуль.КомандыРаботыСБизнесПроцессамиКлиент.Модуль(30)}: РезультатЗаписи = Форма.Записать(ПараметрыЗаписи);
{БизнесПроцесс.КомплексныйПроцесс.Форма.ФормаБизнесПроцесса.Форма(1342)}: КомандыРаботыСБизнесПроцессамиКлиент.СтартоватьИЗакрыть(ЭтаФорма);

по причине:
Ошибка при выполнении обработчика - 'ВложенныйПроцессПередСозданиемВложенныхБизнесПроцессов'
по причине:
Эта задача не может быть выполнена.
Ошибка при выполнении автоподстановки Все руководители автора бизнес процесса кроме последнего:
Не найден предмет "" процесса.
{БизнесПроцесс.КомплексныйПроцесс.МодульОбъекта(376)}: ВызватьИсключение ТекстИсключения;
{БизнесПроцесс.КомплексныйПроцесс.МодульОбъекта(1560)}: СтартоватьНовыеДействия(ФормируемыеБизнесПроцессы, ТочкаМаршрутаБизнесПроцесса, Ложь);