Всем привет!

Помогите, пожалуйста, разобраться:
нужно настроить автоматическую регистрацию служебки после положительного завершения процесса согласования.

Взяла (спасибо большое доброму человеку) код обработчика отсюда и пытаюсь переделать под завершение процесса согласования вместо завершения задачи утверждения
Вот что у меня получилось

```1c
    // Поиск объекта
    БизнесПроцесс = Событие.Источник;

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

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

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

Регистрации не происходит, помогите, пожалуйста, разобраться в чем проблема.

Прошу не сильно кидаться помидорами за глупые ошибки, так как не совсем понимаю, что пишу - в 1с-программировании полный ноль ))

Да, данный обработчик связан с подпиской "Завершение процесса".
---
Код можно сделать еще короче:

```1c
    БизнесПроцесс = Событие.Источник;

    Если ТипЗнч(БизнесПроцесс) = Тип("БизнесПроцессСсылка.Согласование")
    И БизнесПроцесс.РезультатСогласования = Перечисления.РезультатыСогласования.Согласовано Тогда

    ТипыДокументов = Новый Массив;
    ТипыДокументов.Добавить(Тип("СправочникСсылка.ВнутренниеДокументы"));

    ВидыДокументов = Новый Массив;
    ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка"));

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

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

    СообщениеОбОшибке = ";
    Если Делопроизводство.ЗарегистрироватьПредмет(Предмет, СообщениеОбОшибке) Тогда
    Делопроизводство.ЗаписатьСостояниеДокумента(
    Предмет,
    ТекущаяДатаСеанса(),
    Перечисления.СостоянияДокументов.Зарегистрирован,
    ПользователиКлиентСервер.ТекущийПользователь());
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
```

Вот здесь:

```1c
    ВидыДокументов = Новый Массив;
    ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка"));
```

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

Вот здесь:

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

идет отбор только по основным предметам, если нужны все, то последний параметр "Истина" убираем.
---
Попробуйте изменить подписку на "Выполнение задачи".
---
Процесс согласования содержит несколько задач (несколько сотрудников согласовывают), мне нужно регистрировать только в том случае, если согласовали все участники процесса. А если я завяжу обработчик на исполнение задачи, то регистрация будет выполняться, насколько я понимаю, после первого же согласования.
Или я неправа?
---
Да, я пожалуй тогда погорячился. Сейчас повнимательней посмотрю код.
---
А какая версия конфигурации у Вас (на всякий случай)?
---
Конфигурация Документооборот 8 ПРОФ, редакция 2.1 (2.1.11.5)
---
и спасибо за участие :)
---
попробуйте так:

```1c
    БизнесПроцесс = Событие.Источник;

    Если ТипЗнч(БизнесПроцесс) = Тип("БизнесПроцессСсылка.Согласование")
    И БизнесПроцесс.РезультатСогласования = Перечисления.РезультатыСогласования.Согласовано Тогда

    ТипыДокументов = Новый Массив;
    ТипыДокументов.Добавить(Тип("СправочникСсылка.ВнутренниеДокументы"));

    ВидыДокументов = Новый Массив;
    ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка"));

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

    КонецЕсли;
```
---
эхх... не регистрируется :(( а у вас данный код работает, да?

в чем же проблема... обработчик включен, подписка на завершение процесса стоит, регл. задания работают... но не регистрирует, зараза :(

в любом случае, большое спасибо...
---
Возможно проблема в том, что предмет не основной в процессе. Тогда надо исправить эту строку:

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

```1c
    КонецЕсли;
```
 поэтому должно было упасть в ошибку.
А в конфигураторе в "Администрирование" - Настройка журнала регистрации" что у Вас стоит?
---
я проверяю сначала с помощью внешней обработки на синтаксис, поэтому КонецЕсли; проставила ))
ошибки регистрируются, с этим все в порядке
---
Я для интереса поставил себе сейчас демо-базу ПРОФ версии, правда 2.1.10.2
Зашел под Администратором, создал новый обработчик бизнес-события (туда скопировал последний код) с подпиской на "Завершение процесса".
Зашел во внутренние документы, в папке "Служебные записки" скопировал служебную записку от Северянинова Н.П. "О предоставлении служебного транспорта". Записал ее. Через Отправить - На согласование отправил на согласование на роль "Директор". Согласовал ее и закрыл карточку документа.
Вручную запустил рег.задание "Обработка произошедших бизнес-событий". Все отработало корректно, номер и дата регистрации у документа появились, состояние стало "Зарегистрирован".
---
сейчас выполнила в точности те же действия, что вы описали, на демо-базе (правда, у меня вообще версия 2.1.5.6)
при ручном запуске рег. задания "Обработка произошедших бизнес-событий" выскакивает окно с ошибкой "Значение не является значением объектного типа (Отключенные задания)"
---
попробуйте обновить демо-базу до вашей версии и попробуйте еще раз.
---
обновила демо-базу до версии 2.1.11.5
проделала ту же последовательность действий, ошибка больше не выскакивает, регламентное задание выполняется, в журнале регистрации по ошибкам пусто.
НО не регистрируется документ хоть ты тресни!.. не знаю уже, что и думать... (((
по-моему, 1с меня проклял ))
---
ну тут видимо - если только подключаться как-то удаленно и смотреть, почему не хочет идти регистрация.
---
сегодня попробую из дома на файловом варианте Ваш последний обработчик потестить таким же образом на демо-базе.
если я Вас в случае неудачи попрошу подключиться удаленно, это наверное будет уже совсем нахально, правда?...))
---
посмотрю конечно, уже самому интересно стало :)
---
спасибо Вам большое... ))
---
попробовала на файловом варианте - Ваш обработчик прекрасно работает :)
значит, проблема именно в нашей базе... буду завтра мучить ее снова ))
---
хотя... дело даже не в базе, ведь и на демо тоже не работает... может на сервере регл. задания как-то блокируются... но в "Регламентных и фоновых заданиях" отображается выполнение, и ошибок в журнале регистрации нет...
---
Получилось в клиент-серверном варианте?
---
Перезапустила службу 1с, попробовала на новом виде документа - и бинго! все отработало )
Но на старом виде док-та с настройками и шаблоном "Служебная записка" все равно не хочет работать %))
Когда локализую проблему - отпишусь обязательно )

Спасибо Вам еще раз огромное!!
---
Как вариант: запустить в режиме отладки (Сервис - Параметры - Параметр запуска: РежимОтладки) и отладить код, который предварительно можно вынести в какой-нибудь созданный общий модуль (свойство - сервер выставить), а в обработчике бизнес-события сделать вызов процедуры из этого общего модуля.
Регламентное задание "Обработка произошедших бизнес-событий" запустить вручную через "Выполнить не в фоновом режиме" (как-то так кнопка будет называться).
---
Посмотрите в журнале регистрации нет ли ошибок? Подозреваю, что не хватает прав для регистрации.
---
Здравствуйте. В журнале регистрации ошибок нет...
---
Посмотрите в регистре "произошедшие бизнес события" вообще обрабатывается подписка? Вообще, я сделал по-другому, я авторегистрацию сделал этапом в комплексном процессе. Задача направляется специальному пользователю "авторегистратор" и вот эта задача уже обрабатывается допобработчиком. У пользователя авторегистратор - все права, входа в систему у него нет.
---
посмотрела в регистр "Произошедшие бизнес-события", вроде все в порядке

Я к сожалению не могу поместить процесс регистрации в составной (у нас проф) после согласования, так как процесс согласования должен быть настраиваемым конкретным пользователем...
---
У вас несколько ошибок в коде (впрочем они есть в первоисточнике). Главная: Объект = Выборка.Предмет.ПолучитьОбъект(); - здесь используется в качестве имени переменной служебное слово "Объект", переименуйте на "пОбъект" например (везде по коду). И в запросе БизнесПроцесс.Предметы КАК Предметы нужно наверное БизнесПроцесс.Согласование.Предметы КАК Предметы. Попробуйте.

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

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

Вот что у меня сейчас в первом варианте обработчика:

```1c
    // Поиск объекта
    БизнесПроцесс = Событие.Источник;

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

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

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

```1c
    БизнесПроцесс = Событие.Источник;

    Если ТипЗнч(БизнесПроцесс) = Тип("БизнесПроцессСсылка.Согласование")
    И БизнесПроцесс.РезультатСогласования = Перечисления.РезультатыСогласования.Согласовано Тогда

    ТипыДокументов = Новый Массив;
    ТипыДокументов.Добавить(Тип("СправочникСсылка.ВнутренниеДокументы"));

    ВидыДокументов = Новый Массив;
    ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка"));

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

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

    СообщениеОбОшибке = ";
    Если Делопроизводство.ЗарегистрироватьПредмет(Предмет, СообщениеОбОшибке) Тогда
    Делопроизводство.ЗаписатьСостояниеДокумента(
    Предмет,
    ТекущаяДатаСеанса(),
    Перечисления.СостоянияДокументов.Зарегистрирован,
    ПользователиКлиентСервер.ТекущийПользователь());
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
```

Вот здесь:

```1c
    ВидыДокументов = Новый Массив;
    ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка"));
```

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

Вот здесь:

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

идет отбор только по основным предметам, если нужны все, то последний параметр "Истина" убираем.