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