Помогите, пожалуйста, разобраться:
нужно настроить автоматическую регистрацию служебки после положительного завершения процесса согласования.
Взяла (спасибо большое доброму человеку) код обработчика отсюда и пытаюсь переделать под завершение процесса согласования вместо завершения задачи утверждения
Вот что у меня получилось
// Поиск объекта
БизнесПроцесс = Событие.Источник;
Выполнять = Ложь;
Если ТипЗнч(БизнесПроцесс) = Тип("БизнесПроцессСсылка.Согласование") Тогда
Если БизнесПроцесс.РезультатСогласования = Перечисления.РезультатыСогласования.Согласовано Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Предметы.РольПредмета,
| Предметы.Предмет
|ИЗ
| БизнесПроцесс.Предметы КАК Предметы
|ГДЕ
| Предметы.Ссылка = &БизнесПроцессСсылка";
Запрос.УстановитьПараметр("БизнесПроцессСсылка",БизнесПроцесс);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Предмет.ПолучитьОбъект();
Если ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.ВнутренниеДокументы") Тогда
Если (СокрЛП(Объект.ВидДокумента) = "Служебная записка") Тогда
Выполнять = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Выполнять Тогда
// Регистрация
Нумератор = Нумерация.ПолучитьНумераторДокумента(Объект);
Если ЗначениеЗаполнено(Нумератор) Тогда // автоматическая нумерация
ДатаРегистрации = ТекущаяДата();
ТекущийПользователь = Пользователи.ТекущийПользователь();
Объект.ДатаРегистрации = ДатаРегистрации;
// сформируем текущий номер
СтруктураПараметров = НумерацияКлиентСервер.ПолучитьПараметрыНумерации(Объект);
Нумерация.СформироватьЧисловойНомерДокумента(СтруктураПараметров, Объект.ЧисловойНомер);
ОписанияОшибок = Новый СписокЗначений;
СтруктураПараметров = НумерацияКлиентСервер.ПолучитьПараметрыНумерации(Объект);
Нумерация.СформироватьСтроковыйНомерДокумента(СтруктураПараметров, Объект.РегистрационныйНомер, ОписанияОшибок);
Объект.Зарегистрировал = ТекущийПользователь;
Объект.Записать();
Делопроизводство.ЗаписатьСостояниеДокумента(
Объект.Ссылка,
ДатаРегистрации,
Перечисления.СостоянияДокументов.Зарегистрирован, ТекущийПользователь);
КонецЕсли;
КонецЕсли;
Показать
Регистрации не происходит, помогите, пожалуйста, разобраться в чем проблема.
Прошу не сильно кидаться помидорами за глупые ошибки, так как не совсем понимаю, что пишу - в 1с-программировании полный ноль ))
Да, данный обработчик связан с подпиской "Завершение процесса".
БизнесПроцесс = Событие.Источник;
Если ТипЗнч(БизнесПроцесс) = Тип("БизнесПроцессСсылка.Согласование")
И БизнесПроцесс.РезультатСогласования = Перечисления.РезультатыСогласования.Согласовано Тогда
ТипыДокументов = Новый Массив;
ТипыДокументов.Добавить(Тип("СправочникСсылка.ВнутренниеДокументы"));
ВидыДокументов = Новый Массив;
ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка"));
ОсновныеПредметы = МультипредметностьКлиентСервер.ПолучитьМассивПредметовОбъекта(БизнесПроцесс, ТипыДокументов, Истина);
Для Каждого Предмет ИЗ ОсновныеПредметы Цикл
Если ВидыДокументов.Найти(Предмет.ВидДокумента) <> Неопределено Тогда
// Проверим, что документ еще не зарегистрирован.
Если ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Предмет, "РегистрационныйНомер") <> "" Тогда
Продолжить;
КонецЕсли;
СообщениеОбОшибке = "";
Если Делопроизводство.ЗарегистрироватьПредмет(Предмет, СообщениеОбОшибке) Тогда
Делопроизводство.ЗаписатьСостояниеДокумента(
Предмет,
ТекущаяДатаСеанса(),
Перечисления.СостоянияДокументов.Зарегистрирован,
ПользователиКлиентСервер.ТекущийПользователь());
КонецЕсли;
КонецЕсли;
КонецЦикла;
Показать
Вот здесь:
ВидыДокументов = Новый Массив;
ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка"));
Вы должны указать те виды документов, для которых нужна автоматическая регистрация, т.е. их может быть несколько.
(2) Процесс согласования содержит несколько задач (несколько сотрудников согласовывают), мне нужно регистрировать только в том случае, если согласовали все участники процесса. А если я завяжу обработчик на исполнение задачи, то регистрация будет выполняться, насколько я понимаю, после первого же согласования.
Или я неправа?
БизнесПроцесс = Событие.Источник;
Если ТипЗнч(БизнесПроцесс) = Тип("БизнесПроцессСсылка.Согласование")
И БизнесПроцесс.РезультатСогласования = Перечисления.РезультатыСогласования.Согласовано Тогда
ТипыДокументов = Новый Массив;
ТипыДокументов.Добавить(Тип("СправочникСсылка.ВнутренниеДокументы"));
ВидыДокументов = Новый Массив;
ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка"));
ОсновныеПредметы = МультипредметностьКлиентСервер.ПолучитьМассивПредметовОбъекта(БизнесПроцесс, ТипыДокументов, Истина);
Для Каждого Предмет ИЗ ОсновныеПредметы Цикл
Если ВидыДокументов.Найти(Предмет.ВидДокумента)<>Неопределено Тогда
Объект = Предмет.ПолучитьОбъект();
Нумератор = Нумерация.ПолучитьНумераторДокумента(Объект);
Если Не ЗначениеЗаполнено(Объект.РегистрационныйНомер) И ЗначениеЗаполнено(Нумератор) Тогда
//Атоматическая регистрация возможна и документ еще не зарегистрирован
ДатаРегистрации = ТекущаяДатаСеанса();
ТекущийПользователь = Пользователи.ТекущийПользователь();
Объект.ДатаРегистрации = ДатаРегистрации;
// формируем числовой номер
СтруктураПараметров = НумерацияКлиентСервер.ПолучитьПараметрыНумерации(Объект);
Нумерация.СформироватьЧисловойНомерДокумента(СтруктураПараметров, Объект.ЧисловойНомер);
// формируем строковый номер
СтруктураПараметров = НумерацияКлиентСервер.ПолучитьПараметрыНумерации(Объект);
ОписанияОшибок = Новый СписокЗначений;
Нумерация.СформироватьСтроковыйНомерДокумента(СтруктураПараметров, Объект.РегистрационныйНомер, ОписанияОшибок);
Для Каждого ОписаниеОшибки Из ОписанияОшибок Цикл
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки.Представление,, ОписаниеОшибки.Значение, "Объект");
КонецЦикла;
Если ЗначениеЗаполнено(Объект.РегистрационныйНомер) Тогда // успешно сформирован номер
Объект.Зарегистрировал = ТекущийПользователь;
КонецЕсли;
Делопроизводство.ЗаписатьСостояниеДокумента(Объект.Ссылка, ДатаРегистрации, Перечисления.СостоянияДокументов.Зарегистрирован, ТекущийПользователь);
Объект.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
(12)так... подождите... у Вас же вид документа насколько я понимаю "Проект документа", а не "Служебная записка". Поправьте тогда строку, где виды документов собираются в массив.
(26) Я для интереса поставил себе сейчас демо-базу ПРОФ версии, правда 2.1.10.2
Зашел под Администратором, создал новый обработчик бизнес-события (туда скопировал последний код) с подпиской на "Завершение процесса".
Зашел во внутренние документы, в папке "Служебные записки" скопировал служебную записку от Северянинова Н.П. "О предоставлении служебного транспорта". Записал ее. Через Отправить - На согласование отправил на согласование на роль "Директор". Согласовал ее и закрыл карточку документа.
Вручную запустил рег.задание "Обработка произошедших бизнес-событий". Все отработало корректно, номер и дата регистрации у документа появились, состояние стало "Зарегистрирован".
(28) сейчас выполнила в точности те же действия, что вы описали, на демо-базе (правда, у меня вообще версия 2.1.5.6)
при ручном запуске рег. задания "Обработка произошедших бизнес-событий" выскакивает окно с ошибкой "Значение не является значением объектного типа (Отключенные задания)"
(30) обновила демо-базу до версии 2.1.11.5
проделала ту же последовательность действий, ошибка больше не выскакивает, регламентное задание выполняется, в журнале регистрации по ошибкам пусто.
НО не регистрируется документ хоть ты тресни!.. не знаю уже, что и думать... (((
по-моему, 1с меня проклял ))
(32) сегодня попробую из дома на файловом варианте Ваш последний обработчик потестить таким же образом на демо-базе.
если я Вас в случае неудачи попрошу подключиться удаленно, это наверное будет уже совсем нахально, правда?...))
(36) хотя... дело даже не в базе, ведь и на демо тоже не работает... может на сервере регл. задания как-то блокируются... но в "Регламентных и фоновых заданиях" отображается выполнение, и ошибок в журнале регистрации нет...
(38) Перезапустила службу 1с, попробовала на новом виде документа - и бинго! все отработало )
Но на старом виде док-та с настройками и шаблоном "Служебная записка" все равно не хочет работать %))
Когда локализую проблему - отпишусь обязательно )
(39) Как вариант: запустить в режиме отладки (Сервис - Параметры - Параметр запуска: РежимОтладки) и отладить код, который предварительно можно вынести в какой-нибудь созданный общий модуль (свойство - сервер выставить), а в обработчике бизнес-события сделать вызов процедуры из этого общего модуля.
Регламентное задание "Обработка произошедших бизнес-событий" запустить вручную через "Выполнить не в фоновом режиме" (как-то так кнопка будет называться).
Посмотрите в регистре "произошедшие бизнес события" вообще обрабатывается подписка? Вообще, я сделал по-другому, я авторегистрацию сделал этапом в комплексном процессе. Задача направляется специальному пользователю "авторегистратор" и вот эта задача уже обрабатывается допобработчиком. У пользователя авторегистратор - все права, входа в систему у него нет.
(14) посмотрела в регистр "Произошедшие бизнес-события", вроде все в порядке
Я к сожалению не могу поместить процесс регистрации в составной (у нас проф) после согласования, так как процесс согласования должен быть настраиваемым конкретным пользователем...
У вас несколько ошибок в коде (впрочем они есть в первоисточнике). Главная: Объект = Выборка.Предмет.ПолучитьОбъект(); - здесь используется в качестве имени переменной служебное слово "Объект", переименуйте на "пОбъект" например (везде по коду). И в запросе БизнесПроцесс.Предметы КАК Предметы нужно наверное БизнесПроцесс.Согласование.Предметы КАК Предметы. Попробуйте.
(16) Внесла указанные Вами изменения в исходный код, теперь при завершении процесса выходит ошибка:
{ОбщийМодуль.Нумерация.Модуль(705)}: Ошибка при вызове метода контекста (ЗначениеЗаполнено)
Если ЗначениеЗаполнено(ВидДокумента) И ВидДокумента.СпособНумерации = Перечисления.СпособыНумерации.Автоматически Тогда
по причине:
Проверка мутабельных значений на заполненность не поддерживается . Обработчик: Регистрация после согласования __
(16) что-то не могу понять, где этот метод с видом документа в обработчике вызывается... вроде нет такого "Если ЗначениеЗаполнено(ВидДокумента) ..."
Вот что у меня сейчас в первом варианте обработчика:
// Поиск объекта
БизнесПроцесс = Событие.Источник;
Выполнять = Ложь;
Если ТипЗнч(БизнесПроцесс) = Тип("БизнесПроцессСсылка.Согласование") Тогда
Если БизнесПроцесс.РезультатСогласования = Перечисления.РезультатыСогласования.Согласовано Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Предметы.РольПредмета,
| Предметы.Предмет
|ИЗ
| БизнесПроцесс.Согласование.Предметы КАК Предметы
|ГДЕ
| Предметы.Ссылка = &БизнесПроцессСсылка";
Запрос.УстановитьПараметр("БизнесПроцессСсылка",БизнесПроцесс);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
пОбъект = Выборка.Предмет.ПолучитьОбъект();
Если ТипЗнч(пОбъект.Ссылка) = Тип("СправочникСсылка.ВнутренниеДокументы") Тогда
Если (СокрЛП(пОбъект.ВидДокумента) = "Служебная записка") Тогда
Выполнять = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Выполнять Тогда
// Регистрация
Нумератор = Нумерация.ПолучитьНумераторДокумента(пОбъект);
Если ЗначениеЗаполнено(Нумератор) Тогда // автоматическая нумерация
ДатаРегистрации = ТекущаяДата();
ТекущийПользователь = Пользователи.ТекущийПользователь();
пОбъект.ДатаРегистрации = ДатаРегистрации;
// сформируем текущий номер
СтруктураПараметров = НумерацияКлиентСервер.ПолучитьПараметрыНумерации(пОбъект);
Нумерация.СформироватьЧисловойНомерДокумента(СтруктураПараметров, пОбъект.ЧисловойНомер);
ОписанияОшибок = Новый СписокЗначений;
СтруктураПараметров = НумерацияКлиентСервер.ПолучитьПараметрыНумерации(пОбъект);
Нумерация.СформироватьСтроковыйНомерДокумента(СтруктураПараметров, пОбъект.РегистрационныйНомер, ОписанияОшибок);
пОбъект.Зарегистрировал = ТекущийПользователь;
пОбъект.Записать();
Делопроизводство.ЗаписатьСостояниеДокумента(
пОбъект.Ссылка,
ДатаРегистрации,
Перечисления.СостоянияДокументов.Зарегистрирован, ТекущийПользователь);
КонецЕсли;
КонецЕсли;
БизнесПроцесс = Событие.Источник;
Если ТипЗнч(БизнесПроцесс) = Тип("БизнесПроцессСсылка.Согласование")
И БизнесПроцесс.РезультатСогласования = Перечисления.РезультатыСогласования.Согласовано Тогда
ТипыДокументов = Новый Массив;
ТипыДокументов.Добавить(Тип("СправочникСсылка.ВнутренниеДокументы"));
ВидыДокументов = Новый Массив;
ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка"));
ОсновныеПредметы = МультипредметностьКлиентСервер.ПолучитьМассивПредметовОбъекта(БизнесПроцесс, ТипыДокументов, Истина);
Для Каждого Предмет ИЗ ОсновныеПредметы Цикл
Если ВидыДокументов.Найти(Предмет.ВидДокумента) <> Неопределено Тогда
// Проверим, что документ еще не зарегистрирован.
Если ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Предмет, "РегистрационныйНомер") <> "" Тогда
Продолжить;
КонецЕсли;
СообщениеОбОшибке = "";
Если Делопроизводство.ЗарегистрироватьПредмет(Предмет, СообщениеОбОшибке) Тогда
Делопроизводство.ЗаписатьСостояниеДокумента(
Предмет,
ТекущаяДатаСеанса(),
Перечисления.СостоянияДокументов.Зарегистрирован,
ПользователиКлиентСервер.ТекущийПользователь());
КонецЕсли;
КонецЕсли;
КонецЦикла;
Показать
Вот здесь:
ВидыДокументов = Новый Массив;
ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка"));
Вы должны указать те виды документов, для которых нужна автоматическая регистрация, т.е. их может быть несколько.