Регистрация доп обработчиком после завершения процесса согласования в ДО

1. blandinko 21.12.17 11:20 Сейчас в теме
Всем привет!

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

Взяла (спасибо большое доброму человеку) код обработчика отсюда и пытаюсь переделать под завершение процесса согласования вместо завершения задачи утверждения
Вот что у меня получилось
// Поиск объекта
БизнесПроцесс = Событие.Источник;

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


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


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

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

Да, данный обработчик связан с подпиской "Завершение процесса".
По теме из базы знаний
Найденные решения
18. Skromnyi 13 25.12.17 10:58 Сейчас в теме
Код можно сделать еще короче:

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

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


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

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

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

идет отбор только по основным предметам, если нужны все, то последний параметр "Истина" убираем.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Skromnyi 13 21.12.17 12:02 Сейчас в теме
Попробуйте изменить подписку на "Выполнение задачи".
3. blandinko 21.12.17 13:08 Сейчас в теме
(2) Процесс согласования содержит несколько задач (несколько сотрудников согласовывают), мне нужно регистрировать только в том случае, если согласовали все участники процесса. А если я завяжу обработчик на исполнение задачи, то регистрация будет выполняться, насколько я понимаю, после первого же согласования.
Или я неправа?
4. Skromnyi 13 21.12.17 13:24 Сейчас в теме
(3) Да, я пожалуй тогда погорячился. Сейчас повнимательней посмотрю код.
5. Skromnyi 13 21.12.17 13:25 Сейчас в теме
(3) А какая версия конфигурации у Вас (на всякий случай)?
6. blandinko 21.12.17 13:55 Сейчас в теме
(5) Конфигурация Документооборот 8 ПРОФ, редакция 2.1 (2.1.11.5)
7. blandinko 21.12.17 16:31 Сейчас в теме
(5) и спасибо за участие :)
8. Skromnyi 13 22.12.17 12:44 Сейчас в теме
(7) попробуйте так:

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

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

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

в любом случае, большое спасибо...
10. Skromnyi 13 24.12.17 19:51 Сейчас в теме
(9) Возможно проблема в том, что предмет не основной в процессе. Тогда надо исправить эту строку:
ОсновныеПредметы = МультипредметностьКлиентСервер.ПолучитьМассивПредметовОбъекта(БизнесПроцесс, ТипыДокументов, Истина);
12. blandinko 25.12.17 08:36 Сейчас в теме
(10) Предмет основной в процессе... но док не регистрируется :((
Прикрепленные файлы:
17. Skromnyi 13 25.12.17 10:53 Сейчас в теме
(12)так... подождите... у Вас же вид документа насколько я понимаю "Проект документа", а не "Служебная записка". Поправьте тогда строку, где виды документов собираются в массив.
19. blandinko 25.12.17 13:16 Сейчас в теме
(17) Нет-нет, вид документа "Служебная записка", "Проект документа" - это название предмета процесса
20. Skromnyi 13 25.12.17 13:43 Сейчас в теме
(19) Запутали Вы меня. Можно вот такой скрин сделать в том документе, что отправлен на согласование:
Прикрепленные файлы:
21. blandinko 25.12.17 13:53 Сейчас в теме
(20) Да, вот, пожалуйста
Прикрепленные файлы:
22. Skromnyi 13 25.12.17 14:09 Сейчас в теме
(21) Последний вариант кода, что я выкладывал, тоже не работает?
23. blandinko 25.12.17 14:37 Сейчас в теме
(22) нет :((( бизнес-событие отрабатывает, ошибок никаких не падает, но док не регистрируется...
24. Skromnyi 13 25.12.17 14:44 Сейчас в теме
(23) Странно, в том коде не хватает одной строчки в конце:
КонецЕсли;	
поэтому должно было упасть в ошибку.
А в конфигураторе в "Администрирование" - Настройка журнала регистрации" что у Вас стоит?
26. blandinko 25.12.17 14:53 Сейчас в теме
(24) я проверяю сначала с помощью внешней обработки на синтаксис, поэтому КонецЕсли; проставила ))
ошибки регистрируются, с этим все в порядке
28. Skromnyi 13 25.12.17 15:03 Сейчас в теме
(26) Я для интереса поставил себе сейчас демо-базу ПРОФ версии, правда 2.1.10.2
Зашел под Администратором, создал новый обработчик бизнес-события (туда скопировал последний код) с подпиской на "Завершение процесса".
Зашел во внутренние документы, в папке "Служебные записки" скопировал служебную записку от Северянинова Н.П. "О предоставлении служебного транспорта". Записал ее. Через Отправить - На согласование отправил на согласование на роль "Директор". Согласовал ее и закрыл карточку документа.
Вручную запустил рег.задание "Обработка произошедших бизнес-событий". Все отработало корректно, номер и дата регистрации у документа появились, состояние стало "Зарегистрирован".
29. blandinko 25.12.17 15:24 Сейчас в теме
(28) сейчас выполнила в точности те же действия, что вы описали, на демо-базе (правда, у меня вообще версия 2.1.5.6)
при ручном запуске рег. задания "Обработка произошедших бизнес-событий" выскакивает окно с ошибкой "Значение не является значением объектного типа (Отключенные задания)"
Прикрепленные файлы:
30. Skromnyi 13 25.12.17 15:36 Сейчас в теме
(29) попробуйте обновить демо-базу до вашей версии и попробуйте еще раз.
31. blandinko 25.12.17 16:07 Сейчас в теме
(30) обновила демо-базу до версии 2.1.11.5
проделала ту же последовательность действий, ошибка больше не выскакивает, регламентное задание выполняется, в журнале регистрации по ошибкам пусто.
НО не регистрируется документ хоть ты тресни!.. не знаю уже, что и думать... (((
по-моему, 1с меня проклял ))
32. Skromnyi 13 25.12.17 16:12 Сейчас в теме
(31) ну тут видимо - если только подключаться как-то удаленно и смотреть, почему не хочет идти регистрация.
33. blandinko 25.12.17 16:30 Сейчас в теме
(32) сегодня попробую из дома на файловом варианте Ваш последний обработчик потестить таким же образом на демо-базе.
если я Вас в случае неудачи попрошу подключиться удаленно, это наверное будет уже совсем нахально, правда?...))
34. Skromnyi 13 25.12.17 16:37 Сейчас в теме
(33) посмотрю конечно, уже самому интересно стало :)
35. blandinko 25.12.17 18:09 Сейчас в теме
(34) спасибо Вам большое... ))
36. blandinko 25.12.17 20:51 Сейчас в теме
(34) попробовала на файловом варианте - Ваш обработчик прекрасно работает :)
значит, проблема именно в нашей базе... буду завтра мучить ее снова ))
37. blandinko 25.12.17 21:07 Сейчас в теме
(36) хотя... дело даже не в базе, ведь и на демо тоже не работает... может на сервере регл. задания как-то блокируются... но в "Регламентных и фоновых заданиях" отображается выполнение, и ошибок в журнале регистрации нет...
38. Skromnyi 13 26.12.17 14:33 Сейчас в теме
(37) Получилось в клиент-серверном варианте?
39. blandinko 26.12.17 19:37 Сейчас в теме
(38) Перезапустила службу 1с, попробовала на новом виде документа - и бинго! все отработало )
Но на старом виде док-та с настройками и шаблоном "Служебная записка" все равно не хочет работать %))
Когда локализую проблему - отпишусь обязательно )

Спасибо Вам еще раз огромное!!
40. Skromnyi 13 26.12.17 20:54 Сейчас в теме
(39) Как вариант: запустить в режиме отладки (Сервис - Параметры - Параметр запуска: РежимОтладки) и отладить код, который предварительно можно вынести в какой-нибудь созданный общий модуль (свойство - сервер выставить), а в обработчике бизнес-события сделать вызов процедуры из этого общего модуля.
Регламентное задание "Обработка произошедших бизнес-событий" запустить вручную через "Выполнить не в фоновом режиме" (как-то так кнопка будет называться).
11. CyberBob 4 25.12.17 04:35 Сейчас в теме
Посмотрите в журнале регистрации нет ли ошибок? Подозреваю, что не хватает прав для регистрации.
13. blandinko 25.12.17 08:40 Сейчас в теме
(11) Здравствуйте. В журнале регистрации ошибок нет...
14. CyberBob 4 25.12.17 09:27 Сейчас в теме
Посмотрите в регистре "произошедшие бизнес события" вообще обрабатывается подписка? Вообще, я сделал по-другому, я авторегистрацию сделал этапом в комплексном процессе. Задача направляется специальному пользователю "авторегистратор" и вот эта задача уже обрабатывается допобработчиком. У пользователя авторегистратор - все права, входа в систему у него нет.
15. blandinko 25.12.17 09:49 Сейчас в теме
(14) посмотрела в регистр "Произошедшие бизнес-события", вроде все в порядке

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

upd: у меня заработал.
25. blandinko 25.12.17 14:51 Сейчас в теме
(16) Внесла указанные Вами изменения в исходный код, теперь при завершении процесса выходит ошибка:

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

Вот что у меня сейчас в первом варианте обработчика:
// Поиск объекта
БизнесПроцесс = Событие.Источник;

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


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

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

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


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

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

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

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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот