Приветствую, Форумчане!
Документооборот 1.2

Пытаюсь получить объект Задачи

```1c
    &НаСервере
    Процедура АхКакаяпроцедура()

    ПриемникЗадачи = МояЗадачаСсылка.ПолучитьОбъект();

    КонецПроцедуры
```

"МояЗадачаСсылка" - тип ЗадачаСсылка.МояЗадача

Выдает сообщение "Метод объект не обнаружен (ПолучитьОбъект)"

Когда разрабатывал код на своей тестовой базе, то всё срабатывало. Перенес код в рабочую базу и стало выдавать такую ошибку.
Есть моё предположение, что рабочая база работает на тонком клиенте, а моя тестовая база на толстом.
Посмотрел синтаксис помощник, там говорится, что для Задач "ПолучитьОбъект()" работает - "Сервер, толстый клиент, внешнее соединение".

Как получить объект Задачи для приложения тонкого клиента? Или в чем причина ошибки?
---
Вообще, реализация у тебя достаточно странная получается. Доп реквизиты ты заполняешь при интерактивном действии (при открытии задачи). А если форму задачи вообще не откроют? Доп реквизиты так и останутся недозаполнены? И это нормально?...

Вариантов вижу 2:
1. Вписываться в код создания задачи (ну или где-нить ПередЗаписью) и дозаполнять реквизиты.
2. Переносить доп реквизиты на документ - уже писал тебе об этом в другой теме.

Ну а твой код, судя по всему, глючит из-за того, что ты работаешь с объектом формы "сбоку". Т.е., ПриемникЗадачи - это ведь ЭтаФорма.Объект? Дак зачем ты ищешь его вообще через ПолучитьЗадачуБизнесПроцесса, если его нормально и правильно можно получить через РеквизитФормыВЗначение(...) ? Потом поменяешь состав доп реквизитов и обновишь данные в форме через обратное действие ЗначениеВРеквизитФормы(...).
---
ошибка говорит от том, что в МояЗадачаСсылка значение не ссылочного типа.
Включите режим отладки и проверьте.
---
никак не получить в тонком клиенте. Перенести выполнение кода на сервер.
---
starjevschik,

так процедура и так на сервере

```1c
    &НаСервере
    Процедура АхКакаяпроцедура()
    ПриемникЗадачи = МояЗадачаСсылка.ПолучитьОбъект();
    КонецПроцедуры
```

Или нужно создать функцию на сервере для получения объекта? Типа

```1c
    &НаСервере
    Процедура АхКакаяпроцедура()
    ПриемникЗадачи = ПоучитьОбъектНаСервере(МояЗадачаСсылка);
    КонецПроцедуры

    &НаСервере
    Функция ПоучитьОбъектНаСервере(СсылкаЗадачи)
    Возврат СсылкаЗадачи.ПолучитьОбъект();
    КонецПроцедуры
```
---
волшебный шар сломался, не заметил. Надо было починить его сначала, конечно, потом уже искать ошибку в коде, которого я не вижу.
Он (шар) продолжает у меня барахлить, не вижу, что показывает отладчик, какой тип у МояЗадачаСсылка в этой процедуре?
---
"МояЗадачаСсылка" - тип ЗадачаСсылка.МояЗадача (это показывает отладчик перед ПолучитьОбъект())

Ссылочный тип. Я написал об этом в первом посте. Т.е. получена ссылка на Задачу "МояЗадача"
---
Вероятно, МояЗадачаСсылка - это переменная модуля? Нужно в реквизиты формы перенести.
---
ImHunter,
это переменная, полученная в модуле одной из форм БизнесПроцесса
У этой формы основной реквизит "Объект" с типом (ЗадачаОбъект.МояЗадача)
---
Тогда правильнее

```1c
    ПриемникЗадачи = РеквизитФормыВЗначение("Объект");
```
---
Тут я конечно сплоховал. Надо было изначально описывать проблему детально.

Да, Ваше предложение правильно и действительно получаем объект. Но в данном случае я получаю объект
ЗадачаОбъект.МояЗадача
Но с "ТочкаМаршрута" - "Исполнить"
А мне нужно получить этот объект с точкой маршрута "Проверить" той же задачи..., т.е.

```1c
    МояЗадачаСсылка = ПолучитьЗадачу(Объект.БизнесПроцесс, ....ТочкиМаршрута.Проверить);
```

"ПолучитьЗадачу" - функция получение ссылки из Задача.ЗадачаИсполнителя посредством запроса.

```1c
    ВЫБРАТЬ
    ЗадачаИсполнителя.Ссылка КАК Ссылка
    ИЗ
    Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
    ГДЕ
    ЗадачаИсполнителя.БизнесПроцесс = &БизнесПроцесс
    И ЗадачаИсполнителя.ТочкаМаршрута = &ТочкаМаршрута
```

Т.е. мне нужно получить объект Задачи с другой точкой маршрута одно и того же бизнеспроцесса. Код запускается из формы, где точка маршрута = "исполнить"
---
Проверь, что возвращает ПолучитьЗадачу(...). Может банально Возврат не написал.
---
Написал. Возвращает правильную ссылку существующего объекта.
В моей тестовой базе на толстом клиенте весь код отрабатывает правильно. У пользователей на тонком клиенте выдает ошибку
---
Уже выложи полные листинги методов.
---
```1c
    &НаКлиенте
    Процедура Исполнено(Команда)

    *******
    УстановитьДополнительныеРеквизиты();

    КонецПроцедуры

    &НаСервере
    Процедура УстановитьДополнительныеРеквизиты()

    ИсточникЗадачи = ПолучитьЗадачуБизнесПроцесса(Объект.БизнесПроцесс, БизнесПроцессы.Исполнение.ТочкиМаршрута.Исполнить);
    //ППП = РеквизитФормыВЗначение("Объект");
    ПриемникЗадачи = ПолучитьЗадачуБизнесПроцесса(Объект.БизнесПроцесс, БизнесПроцессы.Исполнение.ТочкиМаршрута.Проверить).ПолучитьОбъект();
    РаботаСБизнесПроцессамиВызовСервера.СкопироватьЗначенияДопРеквизитов(ИсточникЗадачи, ПриемникЗадачи); //Источник/Приемник
    ПриемникЗадачи.Записать();

    КонецПроцедуры

    &НаСервере
    Функция ПолучитьЗадачуБизнесПроцесса(БизнесПроцесс, ТочкаМаршрута)

    Результат = Задачи.ЗадачаИсполнителя.ПустаяСсылка();

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ЗадачаИсполнителя.Ссылка Как Задача
    |ИЗ
    | Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
    |ГДЕ
    | ЗадачаИсполнителя.БизнесПроцесс = &БизнесПроцесс
    | И ЗадачаИсполнителя.ТочкаМаршрута = &ТочкаМаршрута";

    Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцесс);
    Запрос.УстановитьПараметр("ТочкаМаршрута", ТочкаМаршрута);

    Результат = Запрос.Выполнить();

    Выборка = Результат.Выбрать();

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

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

    КонецФункции
```
---
Попробуй так:

```1c
    ПриемникЗадачи = ПолучитьЗадачуБизнесПроцесса(Объект.БизнесПроцесс, БизнесПроцессы.Исполнение.ТочкиМаршрута.Проверить);

    Если ПриемникЗадачи <> Задачи.ЗадачаИсполнителя.ПустаяСсылка() Тогда

    ПриемникЗадачиОбъект = ПриемникЗадачи.ПолучитьОбъект();

    РаботаСБизнесПроцессамиВызовСервера.СкопироватьЗначенияДопРеквизитов(ИсточникЗадачи, ПриемникЗадачи); //Источник/Приемник

    ПриемникЗадачи.Записать();

    КонецЕсли;
```

и в функции ПолучитьЗадачуБизнесПроцесса будет лучше так:

```1c
    &НаСервере
    Функция ПолучитьЗадачуБизнесПроцесса(БизнесПроцесс, ТочкаМаршрута)

    ЗадачаИсполнителя = Задачи.ЗадачаИсполнителя.ПустаяСсылка();

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ЗадачаИсполнителя.Ссылка Как Задача
    |ИЗ
    | Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
    |ГДЕ
    | ЗадачаИсполнителя.БизнесПроцесс = &БизнесПроцесс
    | И ЗадачаИсполнителя.ТочкаМаршрута = &ТочкаМаршрута";

    Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцесс);
    Запрос.УстановитьПараметр("ТочкаМаршрута", ТочкаМаршрута);

    Результат = Запрос.Выполнить();

    Если Не Результат.Пустой() Тогда
    ЗадачиИсполнителей = РезультатЗапроса.Выгрузить();
    ЗадачаИсполнителя = ЗадачиИсполнителей[0].Задача;
    КонецЕсли;

    Возврат ЗадачаИсполнителя;

    КонецФункции
```
---
Это что за код такой?

```1c
    Если Не Результат.Пустой() Тогда
    ЗадачаИсполнителя = Результат[0].Задача;
    КонецЕсли;

    Возврат ЗадачаИсполнителя;
```

Он не рабочий, потому что РезультЗапроса[0] приведет к ошибке выполнения.
---
;-) Все исправил)
---
Ну либо сделать так

```1c
    Результат = Запрос.Выполнить();

    Если Не Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    ЗадачаИсполнителя = Выборка.Задача;
    КонецЕсли;

    Возврат ЗадачаИсполнителя;
```
---
Мне кажется, ты себя запутываешь, думая что виноват тонкий клиент. Вероятно, виноваты разные тестовые данные.
И в ПолучитьЗадачуБизнесПроцесса ты пишешь бяку с переприсвоением Результат.
Видимо, в каких-то условиях выборка становится пустая. Но в Результат уже лежит Запрос.Выполнить(). Он и возвращается.
---
Прямо Возврат Результат ?...
---
Не усмотрел. Спасибо)
Писал быстро)
Нужно

```1c
    Возврат ЗадачаИсполнителя;
```
---
Мда... Вывел код с сообщением

```1c
    Сообщить(ПолучитьЗадачуБизнесПроцесса(Объект.БизнесПроцесс, БизнесПроцессы.Исполнение.ТочкиМаршрута.Проверить));
```

Получил пустую строку, т.е. код не нашел задачи.
Посмотрел далее по самой программе.

Там стоит фоновое задание и складывается впечатление, что новая задача создается этим фоновым заданием с задержкой на 10 сек.

Т.е. когда я нажимаю на кнопку с кодом

```1c
    УстановитьДополнительныеРеквизиты();
```

То новая задача еще не создана. Это моё предположение. Насколько это предположение верно?

А в моей тестовой все фоновые задачи заблокированы
---
То новая задача еще не создана. Это моё предположение. Насколько это предположение верно?
Ну есть такая вероятность.
---
Пошел немного другим путем.
Сделал точно такой же код, только теперь для задачи, которая создается фоновым заданием.

Поместил код

```1c
    УстановитьДополнительныеРеквизиты();
```

на форму этой задачи на "ПриСозданииНаСервере" или "ПриОткрытии"

Вроде всё происходит правильно, но только при повторном открытии (со второго раза) данные обновляются.

Вот этот код записывает данные в Задачу:

```1c
    &НаСервере
    Процедура УстановитьДополнительныеРеквизиты()

    ИсточникЗадачи = ПолучитьЗадачуБизнесПроцесса(Объект.БизнесПроцесс, БизнесПроцессы.Исполнение.ТочкиМаршрута.Исполнить);
    ПриемникЗадачи = ПолучитьЗадачуБизнесПроцесса(Объект.БизнесПроцесс, БизнесПроцессы.Исполнение.ТочкиМаршрута.Проверить).ПолучитьОбъект();
    РаботаСБизнесПроцессамиВызовСервера.СкопироватьЗначенияДопРеквизитов(ИсточникЗадачи, ПриемникЗадачи); //Источник/Приемник
    ПриемникЗадачи.Записать();
    //ЭтаФорма.Записать();
    //ЭтаФорма.Прочитать();

    КонецПроцедуры
```

Как и где правильнее разместить

```1c
    УстановитьДополнительныеРеквизиты();
```

И как сделать так, чтобы данные, которые были записаны отобразились на форме с первого раза...?
---
Вообще, реализация у тебя достаточно странная получается. Доп реквизиты ты заполняешь при интерактивном действии (при открытии задачи). А если форму задачи вообще не откроют? Доп реквизиты так и останутся недозаполнены? И это нормально?...

Вариантов вижу 2:
1. Вписываться в код создания задачи (ну или где-нить ПередЗаписью) и дозаполнять реквизиты.
2. Переносить доп реквизиты на документ - уже писал тебе об этом в другой теме.

Ну а твой код, судя по всему, глючит из-за того, что ты работаешь с объектом формы "сбоку". Т.е., ПриемникЗадачи - это ведь ЭтаФорма.Объект? Дак зачем ты ищешь его вообще через ПолучитьЗадачуБизнесПроцесса, если его нормально и правильно можно получить через РеквизитФормыВЗначение(...) ? Потом поменяешь состав доп реквизитов и обновишь данные в форме через обратное действие ЗначениеВРеквизитФормы(...).
---
Сделал так. В форме приемника на событие "При создании на сервере" повесил код

```1c
    ИсточникЗадачи = ПолучитьЗадачуБизнесПроцесса(Объект.БизнесПроцесс, БизнесПроцессы.Исполнение.ТочкиМаршрута.Исполнить);
    ПриемникЗадачи = РеквизитФормыВЗначение("Объект");
    РаботаСБизнесПроцессамиВызовСервера.СкопироватьЗначенияДопРеквизитов(ИсточникЗадачи, ПриемникЗадачи); //Источник/Приемник
    ЗначениеВРеквизитФоры(ПриемникЗадачи, "Объект");
```

Вроде сработало. ДопРеквизиты заполнились. Правда смущает, что каждый раз при открытии формы будут перезаполняться данные.
для меня показалось странным, но ЗначениеВРеквизитФоры(ПриемникЗадачи, "Объект") записывает форму сразу?
---
То, что тебя смущает перезапись - это ты сам такой путь выбрал. Остается либо сделать по-человечески, где-нить в окрестностях событий объекта дописать копирование. Либо развивать костыльное решение, чтобы знать дозаполнять ли реквизиты при открытии формы.

Насчет записи методом ЗначениеВРеквизитФоры(...). Тут, кстати, неочевидно. Есть вероятность, что в Приемнике данные не дополняются, если было просто открытие формы, без какого-либо интерактивного изменения данных. По идее, после копирования реквизитов нужно устанавливать флаг Модифицированность. Проверь состав реквизитов...
---
нашел среди процедур БСП в ДО

```1c
    Процедура СкопироватьЗначенияДопРеквизитовВФормуБизнесПроцесса(ИсточникСсылка, ФормаПроцесса, КопироватьВсеРеквизиты = Ложь) Экспорт

    УстановитьПривилегированныйРежим(Истина);
    Если Не ЗначениеЗаполнено(ИсточникСсылка)
    ИЛИ ИсточникСсылка.Метаданные().ТабличныеЧасти.Найти("ДополнительныеРеквизиты") = Неопределено
    ИЛИ Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеРеквизитыИСведения") Тогда
    Возврат;
    КонецЕсли;

    Для Каждого Реквизит Из ИсточникСсылка.ДополнительныеРеквизиты Цикл
    СтруктураПоиска = Новый Структура("Свойство", Реквизит.Свойство);
    МассивСтрок = ФормаПроцесса.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(СтруктураПоиска);
    Если МассивСтрок.Количество() > 0 Тогда
    ОписаниеДопРеквизитаНаФорме = МассивСтрок[0];
    Если ФормаПроцесса.Элементы[ОписаниеДопРеквизитаНаФорме.ИмяРеквизитаЗначение].ТолькоПросмотр И КопироватьВсеРеквизиты
    ИЛИ НЕ ФормаПроцесса.Элементы[ОписаниеДопРеквизитаНаФорме.ИмяРеквизитаЗначение].ТолькоПросмотр Тогда
    ФормаПроцесса[ОписаниеДопРеквизитаНаФорме.ИмяРеквизитаЗначение] = Реквизит.Значение;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    КонецПроцедуры
```

Запустил, но жалуется на

```1c
    МассивСтрок = ФормаПроцесса.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(СтруктураПоиска);
```

{ОбщийМодуль.РаботаСБизнесПроцессамиВызовСервера.Модуль(1409)}: Поле объекта не обнаружено (Свойства_ОписаниеДополнительныхРеквизитов)
  МассивСтрок = ФормаПроцесса.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(СтруктураПоиска);

Что это за "Свойства_ОписаниеДополнительныхРеквизитов" и почему не найдено?
---
Табличный реквизит формы.
---
Дак это про форму БП. Там, наверн, и есть эти Свойства_*
---
По идее, после копирования реквизитов нужно устанавливать флаг Модифицированность. Проверь состав реквизитов...

Мда, не записывает...