Как обработать входящий пакет документов

Для сокращения времени сотрудников, потраченного на создание и контроль первичной документации, в подключаемом модуле существуют следующие механизмы:

  • сопоставления полученных электронных документов с документами в базе 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С", "")); // отработали действие

КонецЕсли;