Здравствуйте. Есть форма справочника и кнопка "Выполнить задание".

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

Типа:
```1c
    ФоновыеЗадания.Выполнить(...)
```

Подскажите, как лучше реализовать, чтобы при открытии формы этого элемента справочника другим пользователем,
сделать проверку на то, что по элементу справочника выполняется вышеуказанное фоновое задание, и только когда задание выполнится,
сделать кнопку доступной.
Желательно, чтобы при открытой форме этого элемента справочника, кнопка автоматически стала доступной, и пользователь оперативно увидел это.
---
Если Ваша задача заключается исключительно в том, чтобы не допустить запуск задания обработки над одним и тем же объектом, то достаточно при запуске фонового задания указать Ключ (третий параметр), однозначно характеризующий обрабатываемый объект. Например, строковое представление уникального идентификатора от ссылки:

```1c
    КлючЗадания = Строка(Ссылка.УникальныйИдентификатор());
```
В этом случае при попытке запустить это же задние с таким же ключом повторно платформой будет сгенерировано сообщение об ошибке.

Если же Вы преследуете в том числе и эстетические цели, т.е. пользователь должен видеть красивое включение и отключение кнопки, то придется использовать обработчик ожидания для отслеживания наличия фонового задания и его статуса.

Предлагаю примерно такой код модуля формы элемента справочника:

```1c
    &НаКлиенте
    Перем ИдентификаторЗадания; // для отслеживания длительной операции

    &НаКлиенте
    Процедура ВыполнитьДлительнуюОперацию(Команда)

    Если Объект.Ссылка.Пустая() Или ЭтотОбъект.Модифицированность Тогда
    ПоказатьПредупреждение(,НСтр("ru = 'Объект не записан!'"));
    Возврат;
    КонецЕсли;

    ИдентификаторЗадания = ВыполнитьДлительнуюОперациюНаСервере();

    НастроитьКнопкуДлительнойОперации();

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

    &НаСервере
    Функция ВыполнитьДлительнуюОперациюНаСервере()

    ИмяЗадания = "МойОбщийМодуль.ДлительнаяОперацияНадЭлементом";

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

    КлючЗадания = Строка(Объект.Ссылка.УникальныйИдентификатор());

    Задание = ФоновыеЗадания.Выполнить(ИмяЗадания, ПараметрыЗадания, КлючЗадания);

    Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда

    Возврат Задание.УникальныйИдентификатор;

    Иначе

    Возврат Неопределено;

    КонецЕсли;

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

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)

    Если Не Объект.Ссылка.Пустая() Тогда

    ИдентификаторЗадания = НайтиВыполняющуюсяДлительнуюОперацию(Объект.Ссылка);

    КонецЕсли;

    НастроитьКнопкуДлительнойОперации();

    // Отслеживаем состояние задание на протяжении всей жизни формы.
    ПодключитьОбработчикОжидания("ПроверитьСтатусВыполненияЗадания", 2, Ложь);

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

    &НаСервереБезКонтекста
    Функция НайтиВыполняющуюсяДлительнуюОперацию(Знач Ссылка)

    КлючЗадания = Строка(Ссылка.УникальныйИдентификатор());

    ОтборЗаданий = Новый Структура;
    ОтборЗаданий.Вставить("Ключ", КлючЗадания);
    ОтборЗаданий.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);

    Задания = ФоновыеЗадания.ПолучитьФоновыеЗадания(ОтборЗаданий);

    Возврат ?(Задания.Количество(), Задания[0].УникальныйИдентификатор, Неопределено);

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

    &НаСервереБезКонтекста
    Функция ДлительнаяОперацияВыполняется(Знач ИдентификаторЗадания)

    Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);

    Возврат Задание <> Неопределено И Задание.Состояние = СостояниеФоновогоЗадания.Активно;

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

    &НаКлиенте
    Процедура ПроверитьСтатусВыполненияЗадания()

    Если Не Объект.Ссылка.Пустая() Тогда

    Если ИдентификаторЗадания = Неопределено Тогда

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

    ИначеЕсли Не ДлительнаяОперацияВыполняется(ИдентификаторЗадания) Тогда

    // Отслеживаемое задание завершилось.
    ИдентификаторЗадания = Неопределено;

    КонецЕсли;

    КонецЕсли;

    НастроитьКнопкуДлительнойОперации();

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

    &НаКлиенте
    Процедура НастроитьКнопкуДлительнойОперации()

    // Кнопка блокируется, если есть выполняющееся задание.
    Элементы.ВыполнитьДлительнуюОперацию.Доступность = (ИдентификаторЗадания = Неопределено);

    КонецПроцедуры
```
---
используйте МенеджерФоновыхЗаданий

там есть ПолучитьФоновыеЗадания
---
Если Ваша задача заключается исключительно в том, чтобы не допустить запуск задания обработки над одним и тем же объектом, то достаточно при запуске фонового задания указать Ключ (третий параметр), однозначно характеризующий обрабатываемый объект. Например, строковое представление уникального идентификатора от ссылки:

```1c
    КлючЗадания = Строка(Ссылка.УникальныйИдентификатор());
```
В этом случае при попытке запустить это же задние с таким же ключом повторно платформой будет сгенерировано сообщение об ошибке.

Если же Вы преследуете в том числе и эстетические цели, т.е. пользователь должен видеть красивое включение и отключение кнопки, то придется использовать обработчик ожидания для отслеживания наличия фонового задания и его статуса.

Предлагаю примерно такой код модуля формы элемента справочника:

```1c
    &НаКлиенте
    Перем ИдентификаторЗадания; // для отслеживания длительной операции

    &НаКлиенте
    Процедура ВыполнитьДлительнуюОперацию(Команда)

    Если Объект.Ссылка.Пустая() Или ЭтотОбъект.Модифицированность Тогда
    ПоказатьПредупреждение(,НСтр("ru = 'Объект не записан!'"));
    Возврат;
    КонецЕсли;

    ИдентификаторЗадания = ВыполнитьДлительнуюОперациюНаСервере();

    НастроитьКнопкуДлительнойОперации();

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

    &НаСервере
    Функция ВыполнитьДлительнуюОперациюНаСервере()

    ИмяЗадания = "МойОбщийМодуль.ДлительнаяОперацияНадЭлементом";

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

    КлючЗадания = Строка(Объект.Ссылка.УникальныйИдентификатор());

    Задание = ФоновыеЗадания.Выполнить(ИмяЗадания, ПараметрыЗадания, КлючЗадания);

    Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда

    Возврат Задание.УникальныйИдентификатор;

    Иначе

    Возврат Неопределено;

    КонецЕсли;

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

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)

    Если Не Объект.Ссылка.Пустая() Тогда

    ИдентификаторЗадания = НайтиВыполняющуюсяДлительнуюОперацию(Объект.Ссылка);

    КонецЕсли;

    НастроитьКнопкуДлительнойОперации();

    // Отслеживаем состояние задание на протяжении всей жизни формы.
    ПодключитьОбработчикОжидания("ПроверитьСтатусВыполненияЗадания", 2, Ложь);

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

    &НаСервереБезКонтекста
    Функция НайтиВыполняющуюсяДлительнуюОперацию(Знач Ссылка)

    КлючЗадания = Строка(Ссылка.УникальныйИдентификатор());

    ОтборЗаданий = Новый Структура;
    ОтборЗаданий.Вставить("Ключ", КлючЗадания);
    ОтборЗаданий.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);

    Задания = ФоновыеЗадания.ПолучитьФоновыеЗадания(ОтборЗаданий);

    Возврат ?(Задания.Количество(), Задания[0].УникальныйИдентификатор, Неопределено);

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

    &НаСервереБезКонтекста
    Функция ДлительнаяОперацияВыполняется(Знач ИдентификаторЗадания)

    Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);

    Возврат Задание <> Неопределено И Задание.Состояние = СостояниеФоновогоЗадания.Активно;

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

    &НаКлиенте
    Процедура ПроверитьСтатусВыполненияЗадания()

    Если Не Объект.Ссылка.Пустая() Тогда

    Если ИдентификаторЗадания = Неопределено Тогда

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

    ИначеЕсли Не ДлительнаяОперацияВыполняется(ИдентификаторЗадания) Тогда

    // Отслеживаемое задание завершилось.
    ИдентификаторЗадания = Неопределено;

    КонецЕсли;

    КонецЕсли;

    НастроитьКнопкуДлительнойОперации();

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

    &НаКлиенте
    Процедура НастроитьКнопкуДлительнойОперации()

    // Кнопка блокируется, если есть выполняющееся задание.
    Элементы.ВыполнитьДлительнуюОперацию.Доступность = (ИдентификаторЗадания = Неопределено);

    КонецПроцедуры
```
---
Спасибо. Буду разбираться в примере.