gifts2017

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

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

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

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

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

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

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

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

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

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



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

 

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

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

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

 

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. dpagon (dpagon) 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) 29.09.13 21:36
(1) dpagon,
Надо посмотреть права к папке с файлом и еще уточнить где работает автозаполнение файла (за константа отвечающая за это). Хотя сам 1.3.1.5. пока не обновлялся.
3. Olga Karaeva (fifka555) 29.10.13 07:09
4. uri1978 uri1978 (uri1978) 22.11.13 11:58
Спасибо за
Задача = Событие.Источник;
Не знал как достучаться до объекта.

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

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

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