Обработчик автоматической регистрации документа 1С:Документооборот после утверждения и автозаполнения файла по шаблону

Опубликовал Илья Милованов (Killgur) в раздел Управление - Бизнес-процессы

Дополнительный обрабочик для 1С:Документооборот, позволяющий выполнять автоматическую регистрацию внутреннего документа после его утверждения и автоматическое заполнение прикрепленного шаблонного файла.

Обработчик позволяет без изменения конфигурации дополнить функционал по регистрации и автозаполнению файла по шаблону.

Может рассматриваться вообще как пример использования функционала бизнес-событий 1С:Документооборота.

1. Создаем дополнительный обработчик "Автоматическая регистрация при утверждении"

// Регистрация
Задача = Событие.Источник;

Выполнять = Ложь;

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

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



Дорабатываем код согласно используемым Вами документам.

 

2. На вкладке подписки добавляем новую подписку с видом события "Задача выполнена" и этим обработчиком.

3. Включаем обработчик и проверяем по справочнику Произошедшие бизнес-события, документам, отсутствию ошибок.

Фоновое задание "Обработка произошедших бизнес-событий" должна работать.

 

Работает на Документооборот 1.2.8.1 Корп. Думаю должно работать и на других версиях.

Скачать файлы

Наименование Файл Версия Размер
Автоматическая регистрация при утверждении
.txt 6,57Kb
29.05.13
16
.txt 6,57Kb 16 Скачать

См. также

Комментарии
1. dpagon (dpagon) 6 12.09.13 16:51 Сейчас в теме
Регистрация работает, а вот с заполнение файлов беда. Релиз 1.3.1.5. При вызове функции АвтозаполнениеШаблоновФайловКлиентСервер.ЗаполнитьПоляФайлаДаннымиВладельца возникает ошибка:
{ОбщийМодуль.АвтозаполнениеШаблоновФайловКлиентСервер.Модуль(60)}: Ошибка при вызове метода контекста (Add)
Док = WordApp.Documents.Add(ПутьКФайлуНаДиске);
по причине:
Произошла исключительная ситуация (Microsoft Word): Недостаточно памяти. Немедленно сохраните документ.
Насколько я понимаю проблема в том что нет доступа к каталогу ПутьКФайлуНаДиск, по факту C:\Users\USR1CV82\AppData\Local\Temp\v8_923E_1a2.doc. Копал по настройкам DCOM, но пока бесполезно.
2. Илья Милованов (Killgur) 27 29.09.13 21:36 Сейчас в теме
(1) dpagon,
Надо посмотреть права к папке с файлом и еще уточнить где работает автозаполнение файла (за константа отвечающая за это). Хотя сам 1.3.1.5. пока не обновлялся.
3. Olga Karaeva (fifka555) 29.10.13 07:09 Сейчас в теме
4. uri1978 uri1978 (uri1978) 104 22.11.13 11:58 Сейчас в теме
Спасибо за
Задача = Событие.Источник;
Не знал как достучаться до объекта.

А вот процедуру регистрации документа взял с конфигурации:
Если Выполнять Тогда    
			
			Нумератор = Нумерация.ПолучитьНумераторДокумента(ДокументОбъект);
			
			Если ЗначениеЗаполнено(Нумератор) Тогда // автоматическая нумерация
				
				ДатаРегистрации = ТекущаяДата();
				ТекущийПользователь = ОбщегоНазначения.ТекущийПользователь();
				
				ДокументОбъект.ДатаРегистрации = ДатаРегистрации;
				
				// сформируем текущий номер
				СтруктураПараметров = НумерацияКлиентСервер.ПолучитьПараметрыНумерации(ДокументОбъект);
				Нумерация.СформироватьЧисловойНомерДокумента(СтруктураПараметров, ДокументОбъект.ЧисловойНомер);
				
				ОписанияОшибок = Новый СписокЗначений;
				СтруктураПараметров = НумерацияКлиентСервер.ПолучитьПараметрыНумерации(ДокументОбъект);
				Нумерация.СформироватьСтроковыйНомерДокумента(СтруктураПараметров, ДокументОбъект.РегистрационныйНомер, ОписанияОшибок);
				
				ДокументОбъект.Зарегистрировал = ТекущийПользователь;
				ДокументОбъект.Записать();
				
				Делопроизводство.ЗаписатьСостояниеДокумента(
					ДокументОбъект.Ссылка, 
					ДатаРегистрации, 
					Перечисления.СостоянияДокументов.Зарегистрирован, 
					ТекущийПользователь);
					
			КонецЕсли;	
			
		КонецЕсли;
...Показать Скрыть
5. h h (luda33) 04.12.13 15:23 Сейчас в теме
А в документообороте есть автоматическая регистрация при создании внутреннего документа?
6. uri1978 uri1978 (uri1978) 104 04.12.13 16:10 Сейчас в теме
(5) luda33,
По-умолчанию нет, эта статья как раз и показывает как это реализовать. Хотя я столкнулся с проблемами. Например, пользователь записывает внутренний документ и продолжает его редактирование. При этом через минуту происходит автоматическая регистрация и пользователь уже не может сохранить изменения которые он вносил.
7. h h (luda33) 04.12.13 19:46 Сейчас в теме
(6) uri1978, как так получается?
у нас тоже - пользователи не регистрируют ничего, им это не надо - а доки оказываются зарегистрированными
как так не знаю
уже отключили запрет менять документы после регистрации

а сейчас возникла необходимость регистрировать при создании документа, - что бы номер сразу при заполнении попадал в файл (из шаблона)
видимо придется воспользоваться этим обработчиком, только не при утверждении
8. Илья Милованов (Killgur) 27 06.12.13 00:20 Сейчас в теме
(6) uri1978,
Регистрация происходит отдельным обработчиком с записью документа, а в этот момент документ оказывается открытым и данные на форме не соответствуют записанным и естественно документ не сохраняется.
Мое применение как раз и было нацелено, что регистрация происходит когда изменения уже не нужны.

(7) luda33,
Посмотрите изменение состояний документа. Там есть информация о том кто и когда зарегистрировал.
Регистрация при создании документа - скорее всего без изменения конфигурации не получится.
9. uri1978 uri1978 (uri1978) 104 06.12.13 12:33 Сейчас в теме
(8) Killgur,
У меня внутренний документ, который должен быть зарегистрирован, не проходит бизнес процессов. Т.е. по нему нет утверждений или согласований. Соответственно я его могу регистрировать только при записи. И по этой причине и происходит "коллизия".
10. Сергей Грачев (graser) 1 22.07.14 12:15 Сейчас в теме
на 8.3 не работает, затыкается вот здесь Объект = Задача.Предмет.ПолучитьОбъект();
У задачи предмет описан как Список
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа