Как обработать входящий пакет документов¶
Для сокращения времени сотрудников, потраченного на создание и контроль первичной документации, в подключаемом модуле существуют следующие механизмы:
- сопоставления полученных электронных документов с документами в базе 1С
- создания новых документов в 1С на основании полученных электронных документов
- дополнительный анализ входящих документов
Сопоставление документов¶
Для типовых конфигураций предусмотрено сопоставление входящих электронных документов в формате xml, установленном ФНС, с типовыми документами 1С.
Например, входящий документ формата «УПД» сопоставляется с документом «Счет-фактура полученный», для которого существует документ-основание «Поступление товаров и услуг». Параметрами для сопоставления являются следующие поля документа 1С:
- Организация
- Контрагент
- Дата входящего документа
- Номер входящего документа
Описание правил сопоставления электронных документов, в зависимости от их типа, происходит в процедуре НайтиСопоставлениеДокумента.
Вызов события происходит при нажатии на кнопку «Сопоставить» в карточке входящего документа или кнопки «Сопоставить документ» в меню основной формы «Действия».
Пример сопоставления с документом типа «СчетФактураПолученный»:
Если СтруктураДанных.ТипДокумента = "Invoice"
ИЛИ (СтруктураДанных.ТипДокумента = "UniversalTransferDocument" И СтруктураДанных.ФункцияДокумента = "Invoice") Тогда
Результат = ПолучитьДокументы1С(ПараметрыОтбора, "СчетФактураПолученный");
КонецЕсли;
Создание документов¶
Для возможности быстро формировать документы в 1С на основании полученного формализованного документа существует процедура ПолучитьЗаполненныйОбъектДокумента1С.
Полученные данные в формате XML преобразуются в XDTO структуру. Затем каждое поле в создаваемом документе 1С заполняется соответствующим реквизитом из получившейся стуркутуры XDTO.
Вызов события происходит при нажатии на кнопку «Создать» в карточке входящего документа или кнопки «Создать документ» в меню основной формы «Действия».
Если СтруктураДанных.ТипДокумента = "XmlTorg12"
ИЛИ СтруктураДанных.ТипДокумента = "XmlAcceptanceCertificate"
ИЛИ (СтруктураДанных.ТипДокумента = "UniversalTransferDocument" И СтруктураДанных.ФункцияДокумента <> "Invoice")
ИЛИ (СтруктураДанных.ТипДокумента = "UniversalCorrectionDocument" И СтруктураДанных.ФункцияДокумента <> "Invoice") Тогда
ЭтоКорректировка = (СтруктураДанных.ТипДокумента = "UniversalCorrectionDocument");
ТекстXML = ОсновнойМодуль.ДвоичныеДанные_В_Текст(ОсновнойМодуль.ЭДО_ПолучитьХранилищеКонтента(ДокументДД));
ДеревоКонтента = ОсновнойМодуль.XML_В_XDTO(ТекстXML);
ТабличнаяЧасть = ОсновнойМодуль.ЭДО_ПолучитьТабличнуюЧастьИзКонтентаXML(ДеревоКонтента, ЭтоКорректировка);
Если СтруктураДанных.ТипДокумента = "UniversalCorrectionDocument" Тогда
СоздатьДокументКорректировки(ДокументДД, ПакетДД, СтруктураДанных, ТабличнаяЧасть, ДеревоКонтента, Результат);
Иначе
СоздатьДокументПоступления(ДокументДД, ПакетДД, СтруктураДанных, ТабличнаяЧасть, ДеревоКонтента, Результат);
КонецЕсли;
КонецЕсли;
Сопоставление номенклатуры¶
При создании документа происходит поиск номенклатуры для сопоставления.
Логика поиска описана в служебной функции подключаемого модуля «НайтиНоменклатуруПоставщика». Типовые поля поиска: наименование и/или код из входящего документа.
Если найти подходящую номенклатуру не удалось, то происходит ручное сопоставление с помощью таблицы значений.
После окончания сопоставления происходит запись изменений в базу.
Определение места хранения и правил заполнения происходит в функции СопоставитьНоменклатуруПоставщика.
ДлинаНаименования = Метаданные.Справочники.НоменклатураПоставщиков.ДлинаНаименования;
Для каждого СтрокаТЗ Из ТаблицаНоменклатурыДляСопоставления Цикл
НовыйОбъект = Справочники.НоменклатураПоставщиков.СоздатьЭлемент();
НовыйОбъект.Владелец = СтрокаТЗ.Контрагент;
НовыйОбъект.Наименование = Прав(СтрокаТЗ.Наименование, ДлинаНаименования); // Как правило окончание наименования является уникальным, поэтому пишем последние символы.
НовыйОбъект.Идентификатор = СтрокаТЗ.Код;
НовыйОбъект.Артикул = СтрокаТЗ.Артикул;
НовыйОбъект.Номенклатура = СтрокаТЗ.Номенклатура;
НовыйОбъект.Записать();
КонецЦикла;
Анализ документов¶
Выполнение анализа вызывается при нажатии на кнопку Анализ выбранных документов в меню «Действия».
Для описания какого-либо процесса проверки входящих электронных документов используется процедура ПровестиАнализДокумента.
Например, можно проверить наличие сопоставленных документов 1С и получить массив выявленных ошибок.
Если ТипДокумента = "xmltorg12"
ИЛИ (ТипДокумента = "universaltransferdocument" И (ФункцияДокумента = "invoiceandbasic" ИЛИ ФункцияДокумента = "basic")) Тогда
Если НЕ ЗначениеЗаполнено(Документ1С) Тогда
Ошибки.Добавить("Не найдена накладная №: " + СтруктураДанных.НомерДокумента + " от " + Формат(СтруктураДанных.ДатаДокумента, "ДФ=dd.MM.yyyy") + " на сумму " + Формат(СтруктураДанных.СуммаДокумента, "ЧДЦ=2"));
КонецЕсли;
КонецЕсли;
После выполненного анализа каждого документа, в процедуре ПослеАнализаПакета выполняется основная логика обработки действий, определенных в предыдущей процедуре.
Вызов анализа по пакетам происходит при нажатии на кнопку Анализ выбранных пакетов в меню «Действия».
Например, заполнение структуры ответа на входящий документ в зависимости от определенного действия (подписать, отказать в подписи и т.п.).
Для Каждого ТекДокумент Из ДокументыПакета Цикл
ДанныеДокумента = ТекДокумент.ДанныеДокумента;
ДокументДД = ТекДокумент.Ссылка;
Документ1С = ДанныеДокумента.ДокументВ1С;
ТекстОшибки = ДанныеДокумента.ТекстОшибки;
РезультатАнализа = ОсновнойМодуль.ЭДО_НовыйРезультатАнализаВходящегоДокумента();
СписокДействийТекДокумента = ОсновнойМодуль.ЭДО_ВариантыОтветныхДействийПоДокументу(ДокументДД, ОшибокНет);
РезультатАнализа.ДействиеВДД = ?(СписокДействийТекДокумента.Количество()=0, "", СписокДействийТекДокумента[0].Значение);
Если ЗначениеЗаполнено(РезультатАнализа.ДействиеВДД) Тогда
РезультатАнализа.Вставить("КонтентОтвета", ПолучитьКонтентОтвета(ДокументДД, Документ1С, РезультатАнализа.ДействиеВДД, ТекстВсехОшибокПакета));
КонецЕсли;
РезультатАнализа.Вставить("ДокументДляСопоставления", Документ1С);
ОсновнойМодуль.СохранитьРезультатАнализа(ДокументДД, РезультатАнализа);
КонецЦикла;
Завершающий этап анализа - выполнение определенных действий по подготовленным данным, определяется в процедуре ВыполнитьТребуемоеДействие.
Например, проводим документ 1С, если требуемое действие, сохраненное в 1С в документе подсистемы Диадока, называется «ПровестиДокумент».
ДокументДД = Параметры.ДокументДД;
ПакетДД = Параметры.ПакетДД;
ДанныеДокумента = ОсновнойМодуль.ЭДО_ПолучитьРеквизитыДокумента(ДокументДД);
Если ДанныеДокумента.ТребуемоеДействиеВ1С = "ПровестиДокумент" И ЗначениеЗаполнено(ДанныеДокумента.ДокументВ1С) Тогда
Документ1СОбъект = ДанныеДокумента.ДокументВ1С.ПолучитьОбъект();
Документ1СОбъект.Записать(РежимЗаписиДокумента.Проведение);
ОсновнойМодуль.ЭДО_ЗаписатьРеквизитыДокумента(ДокументДД, Новый Структура("ТребуемоеДействиеВ1С", "")); // отработали действие
КонецЕсли;