Автоматическое создание входящего документа из исходящего в 1С Документооборот

Автоматическое создание входящего документа из исходящего в 1С Документооборот

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

  • Как запрограммировать и настроить дополнительные обработчики бизнес-событий?
  • Как автоматизировать взаимодействие двух организаций в 1С Документооборот при обмене корреспонденцией?
  • Как программно создавать входящие документы?
  • Как копировать файлы из одного документа в другой?
  • Как программно регистрировать документы?

Цель – исключить ручное заведение входящих документов при отправке исходящего документа между организациями, работающими в системе.

Для создания нового обработчика необходимо войти в меню Настройка и администрирование – Дополнительные обработчики, создать новый дополнительный обработчик бизнес-события и назвать его «автосоздание_входящих». Далее необходимо заполнить код обработчика и выбрать ответственного.

форма дополнительного обработчика бизнес-события

// ИНН первой организации (организация 1)
ИНН1 = "1111111111";
// ИНН второй организации (организация 2)
ИНН2 = "2222222222";
// Предполагается, что для каждой организации используется свой вид входящего документа
// Название вида входящего документа для Организации 1
НазваниеВидаВходящего1="Входящий Организация 1";
// Название вида входящего документа для Организации 2
НазваниеВидаВходящего2="Входящий Организация 2";

// проверка исходящего на предмет взаимодействия Организации 1 и Организации 2
ПроверкаПрошла = Истина;
Исходящий = Событие.Источник;
Если Не (Исходящий.Организация.ИНН = ИНН1 Или Исходящий.Организация.ИНН = ИНН2) Тогда
	ПроверкаПрошла = Ложь;
КонецЕсли;
Если Не (Исходящий.Получатели[0].Получатель.ИНН = ИНН1 Или 
	Исходящий.Получатели[0].Получатель.ИНН = ИНН2) Тогда
	ПроверкаПрошла = Ложь;
КонецЕсли;

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

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

	// автоматическая регистрация входящего документа
	Нумератор = Нумерация.ПолучитьНумераторДокумента(входящий); 
	ВыполнятьРегистрацию = Ложь;
	Если ЗначениеЗаполнено(Нумератор) Тогда        
		//Автоматическая регистрация возможна, входящий документ ещё не зарегистрирован.
		ВыполнятьРегистрацию = Истина;
	КонецЕсли;

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

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

После создания обработчика на вкладке «Подписки» формы обработчика добавляем подписку на событие «Регистрация исходящего документа». Подписка предназначена для связи вида бизнес-события и обработчика. В данном случае выбран предопределенный вид события.

форма привязки подписки к обработчику

После настройки остаётся установить флаг «Обработчик влючен» на форме обработчика.

Первичный анализ событий и результатов работы обработчика можно производить с использованием регистра сведений «Произошедшие бизнес-события» (меню Все функции - регистры сведений). Для каждого зарегистрированного события после его обработки дополнительным обработчиком бизнес-событий устанавливается либо флаг «Обработано», либо флаг «Не удалось обработать».

регистр сведений Произошедшие бизнес-события

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

Тэги: