1С:Предприятие 8.3
Документооборот 8 КОРП, редакция 2.1
--

Помогите с кодом, пожалуйста!
Нужно, чтобы в форме бизнес-процесса, в зависимости от типа документа, менялись названия элементов формы. Как скрыть кнопки или переименовать элементы могу написать, а вот как привязаться к виду документа - нет ((

Для примера: Есть вид внутреннего документа "Оценка риска". По нему запущен комплексный процесс. В бизнес-процессе "Исполнить" для этого вида документа элемент формы "Исполнено" нужно переименовать "Оценка".
---
А вот так попробуйте
ПредметыВыборка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Ссылка, "Предметы");
---
Может из-за того что когда файл добавляют нет основного предмета ( файл будет вспомогательным)

Перед строкой

```1c
    ВидДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Документ , "ВидДокумента");
```

попробуйте добавить проверку

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

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

    Если ВидДокумента = ВидОценкаРиска тогда
    ........
    КонецЕсли;
```
---
Укажите в бизнес процессе Документ Основание
И записывайте туда документ по которому создается бизнес процесс
---
А вообще указывается в бп документ?
---
да, как основной предмет
---
Ну вот, при создании на сервере проверяете, как в (4) написано, с помощью типЗнч. но так надо будет для каждого документа делать.
---
Для изменения имени отображаемого реквизита формы можно в переменной документ соответственно должен быть Ваш документ, не обязательно в процедуре ПриСозданииНаСервере главное в серверной процедуре

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если НЕ Элементы.Найти("Исполнено") = Неопределено Тогда
    Если ТипЗнч(Документ) = Тип("ДокументСсылка.ОценкаРиска") Тогда
    Элементы.Исполнено.Заголовок = "Оценка";
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
```
---
Ошибка при сохранении конфигурации:

{БизнесПроцесс.Исполнение.Форма.ФормаЗадачиИсполнителя.Форма(9,13)}: Переменная не определена (Документ)
Если ТипЗнч(<<?>>Документ) = Тип("ДокументСсылка.ОценкаРиска") Тогда (Проверка: Сервер)
---
Да нету у задачи такого реквизита "Документ" .
---
Еще раз - это не реквизит, не глобальная переменная я имел ввиду что в условии
Если ТипЗнч(...) = Тип("ДокументСсылка.ОценкаРиска") - вместо документ нужно указать переменную или реквизит или то, что должно проверять данное условие!
---
Документ - это переменная в которой должен хранится Ваш внутренний документ - например "Оценка риска".
---
```1c
    ПредметыВыборка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект, "Предметы");
    Предметы = ПредметыВыборка.Выгрузить();

    Документ = ОбзорЗадачВызовСервера.ПолучитьОсновнойПредметДокумент(Предметы);
    Если ТипЗнч(Документ) = Тип("ДокументСсылка.ОценкаРиска") Тогда
    ........
    КонецЕсли;
```
---
Если ТипЗнч(Документ) = Тип("ДокументСсылка.ОценкаРиска") Тогда - вот это тоже неправильно, скопировала не глядя.
Вам надо проверять что вид внутреннего документа это ОценкаРиска.
---
```1c
    ПредметыВыборка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект, "Предметы");
    Предметы = ПредметыВыборка.Выгрузить();

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

    Если ВидДокумента = ВидОценкаРиска тогда
    ........
    КонецЕсли;
```
---
Возможно мой вопрос будет снова не оч. умным ))

 При попытке войти в задачу появляется ошибка:

{ОбщийМодуль.ОбщегоНазначения.Модуль(86)}: Метод объекта не обнаружен (Метаданные)
 Запрос.Текст =
---
Запрос.Текст =
А что в тексте запроса?
---
```1c
    Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты) Экспорт

    Если ТипЗнч(Реквизиты) = Тип("Строка") Тогда
    Если ПустаяСтрока(Реквизиты) Тогда
    Возврат Новый Структура;
    КонецЕсли;
    Реквизиты = СтрРазделить(Реквизиты, ",", Ложь);
    КонецЕсли;

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

    ТекстПолей = ";
    Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл
    ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение),
    СокрЛП(КлючИЗначение.Значение),
    СокрЛП(КлючИЗначение.Ключ));

    Псевдоним = СокрЛП(КлючИЗначение.Ключ);

    ТекстПолей = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), ", ",") + "
    | " + ИмяПоля + " КАК " + Псевдоним;
    КонецЦикла;

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

    Результат = Новый Структура;
    Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл
    Результат.Вставить(КлючИЗначение.Ключ);
    КонецЦикла;
    ЗаполнитьЗначенияСвойств(Результат, Выборка);

    Возврат Результат;

    КонецФункции
```
---
А вот так попробуйте
ПредметыВыборка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Ссылка, "Предметы");
---
Всё отлично! Спасибо!
---
Не поможете с неожиданно возникшей и вполне логичной ошибкой?

Всё хорошо работало, все были счастливы, пока кто-то не решил создать отдельно процесс и прикрепил к нему файл.

На формах, где добавлен ваш код возникает ошибка
{ОбщийМодуль.ОбщегоНазначения.Модуль(86)}: Значение не является значением объектного типа (Метаданные)
    Запрос.Текст =
---
Может из-за того что когда файл добавляют нет основного предмета ( файл будет вспомогательным)

Перед строкой

```1c
    ВидДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Документ , "ВидДокумента");
```

попробуйте добавить проверку

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

По образу и подобию подправила для элемента Согласовано в форме Задачи ЗадачиИсполнителя ЗадачиМне, процедура:

```1c
    Процедура ПолучитьРеквизитыИСвойстваЗадачиСогласованиеСогласовать(Задача, Знач РеквизитыЗадачи, ДополнительныеРеквизиты, СвойстваЭлементов)
```

Что может быть не так с Подсказкой? Поле не найдено.

```1c
    //Наименования кнопок в задаче согласование в зависимости от вида документа (Реестр Рисков)
    ПредметыВыборка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Задача, "Предметы");
    Предметы = ПредметыВыборка.Выгрузить();
    ПредметДокумент = ОбзорЗадачВызовСервера.ПолучитьОсновнойПредметДокумент(Предметы);
    ВидРеестрРисков = Справочники.ВидыВнутреннихДокументов.НайтиПонаименованию("Реестр рисков");
    РеквизитыЗадачи.Вставить("ПредметДокумент", ПредметДокумент);
    ВидДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПредметДокумент, "ВидДокумента");

    // заголовки и видимость команд

    СвойстваЭлементов.Вставить("Согласовано", Новый Соответствие);
    СвойстваЭлементов.Вставить("НеСогласовано", Новый Соответствие);
    СвойстваЭлементов.Вставить("СогласованоСЗамечаниями", Новый Соответствие);

    Если ВидДокумента = ВидРеестрРисков тогда
    ЗаголовокСогласовано = "Отправить";
    ПодсказкаСогласовано = ЗаголовокСогласовано;
    ВидимостьНеСогласовано = Ложь;
    ВидимостьСогласованоСЗамечаниями = Ложь;

    КонецЕсли;
    СвойстваЭлементов.Согласовано.Вставить("Заголовок", ЗаголовокСогласовано);
    СвойстваЭлементов.Согласовано.Вставить("Подсказка", ПодсказкаСогласовано);
    СвойстваЭлементов.НеСогласовано.Вставить("Видимость", ВидимостьНеСогласовано);
    СвойстваЭлементов.СогласованоСЗамечаниями.Вставить("Видимость", ВидимостьСогласованоСЗамечаниями);
```
---
огда - вот это тоже неправильно, скопировала не глядя.
Вам надо проверять что вид внутреннего документа это ОценкаРиска.
Я к сожалению, не программист, мне дали ДО и сказали "Делай", поэтому я вынуждена изучать с нуля методом проб и ошибок) Иногда делаю очень тупые вещи)
---
поэтому я вынуждена изучать с нуля методом проб и ошибок)
Остановились в отладчике на

```1c
    Если ТипЗнч(Документ) = Тип("ДокументСсылка.ОценкаРиска") Тогда
```

И посмотрели, где находится нужный вам документ.
---
ТипЗнач(тут должен быть ваш реквизит в котором указывается документ)
---
Определяйте по основному предмету.
У бизнес-процесса есть таб.часть Предметы, отбираете тот у кого РольПредмета = Перечисление.РолиПредметов.Основной, проверяете что у предмета нужный вам тип внутр. документа