Автоматическое создание входящего документа из исходящего в 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 Тогда
РаботаСФайламиВызовСервера.СкопироватьФайлы(МассивФайлов, входящий.Ссылка);
КонецЕсли;
КонецЕсли;
После создания обработчика на вкладке «Подписки» формы обработчика добавляем подписку на событие «Регистрация исходящего документа». Подписка предназначена для связи вида бизнес-события и обработчика. В данном случае выбран предопределенный вид события.
После настройки остаётся установить флаг «Обработчик влючен» на форме обработчика.
Первичный анализ событий и результатов работы обработчика можно производить с использованием регистра сведений «Произошедшие бизнес-события» (меню Все функции - регистры сведений). Для каждого зарегистрированного события после его обработки дополнительным обработчиком бизнес-событий устанавливается либо флаг «Обработано», либо флаг «Не удалось обработать».
Дополнительный анализ при неудачной обработке можно производить с использованием журнала регистрации изменений.