Permalink
Branch: master
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
169 lines (102 sloc) 13.6 KB

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

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

  • сопоставления полученных электронных документов с документами в базе 1С
  • создания новых документов в 1С на основании полученных электронных документов
  • дополнительный анализ входящих документов

Сопоставление документов

Для типовых конфигураций предусмотрено сопоставление входящих электронных документов в формате xml, установленном ФНС, с типовыми документами 1С.

Например, входящий документ формата "УПД" сопоставляется с документом "Счет-фактура полученный", для которого существует документ-основание "Поступление товаров и услуг". Параметрами для сопоставления являются следующие поля документа 1С:

  • Организация
  • Контрагент
  • Дата входящего документа
  • Номер входящего документа

Описание правил сопоставления электронных документов, в зависимости от их типа, происходит в процедуре :doc:`НайтиСопоставлениеДокумента <../../func/pm/Nayti_Sopostavleniye_Dokumenta>`.

Вызов события происходит при нажатии на кнопку "Сопоставить" в карточке входящего документа или кнопки "Сопоставить документ" в меню основной формы "Действия".

Пример сопоставления с документом типа "СчетФактураПолученный":

Если СтруктураДанных.ТипДокумента = "Invoice"
                ИЛИ (СтруктураДанных.ТипДокумента = "UniversalTransferDocument" И СтруктураДанных.ФункцияДокумента = "Invoice") Тогда

    Результат = ПолучитьДокументы1С(ПараметрыОтбора, "СчетФактураПолученный");

КонецЕсли;

Создание документов

Для возможности быстро формировать документы в 1С на основании полученного формализованного документа существует процедура :doc:`ПолучитьЗаполненныйОбъектДокумента1С <../../func/pm/Poluchit'_Zapolnennyy_Obyekt_Dokumenta_1S>`.

Полученные данные в формате XML преобразуются в XDTO структуру. Затем каждое поле в создаваемом документе 1С заполняется соответствующим реквизитом из получившейся стуркутуры XDTO.

Вызов события происходит при нажатии на кнопку "Создать" в карточке входящего документа или кнопки "Создать документ" в меню основной формы "Действия".

Если СтруктураДанных.ТипДокумента = "XmlTorg12"
    ИЛИ СтруктураДанных.ТипДокумента = "XmlAcceptanceCertificate"
    ИЛИ (СтруктураДанных.ТипДокумента = "UniversalTransferDocument" И СтруктураДанных.ФункцияДокумента <> "Invoice")
    ИЛИ (СтруктураДанных.ТипДокумента = "UniversalCorrectionDocument" И СтруктураДанных.ФункцияДокумента <> "Invoice") Тогда

    ЭтоКорректировка = (СтруктураДанных.ТипДокумента = "UniversalCorrectionDocument");

    ТекстXML = ОсновнойМодуль.ДвоичныеДанные_В_Текст(ОсновнойМодуль.ЭДО_ПолучитьХранилищеКонтента(ДокументДД));
    ДеревоКонтента = ОсновнойМодуль.XML_В_XDTO(ТекстXML);
    ТабличнаяЧасть = ОсновнойМодуль.ЭДО_ПолучитьТабличнуюЧастьИзКонтентаXML(ДеревоКонтента, ЭтоКорректировка);

    Если СтруктураДанных.ТипДокумента = "UniversalCorrectionDocument" Тогда
        СоздатьДокументКорректировки(ДокументДД, ПакетДД, СтруктураДанных, ТабличнаяЧасть, ДеревоКонтента, Результат);
    Иначе
        СоздатьДокументПоступления(ДокументДД, ПакетДД, СтруктураДанных, ТабличнаяЧасть, ДеревоКонтента, Результат);
    КонецЕсли;

КонецЕсли;

Сопоставление номенклатуры

При создании документа происходит поиск номенклатуры для сопоставления.

Логика поиска описана в служебной функции подключаемого модуля "НайтиНоменклатуруПоставщика". Типовые поля поиска: наименование и/или код из входящего документа.

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

После окончания сопоставления происходит запись изменений в базу.

Определение места хранения и правил заполнения происходит в функции :doc:`СопоставитьНоменклатуруПоставщика <../../func/pm/Sopostavit'_Nomenklaturu_Postavshchika>`.

ДлинаНаименования = Метаданные.Справочники.НоменклатураПоставщиков.ДлинаНаименования;

Для каждого СтрокаТЗ Из ТаблицаНоменклатурыДляСопоставления Цикл

    НовыйОбъект = Справочники.НоменклатураПоставщиков.СоздатьЭлемент();

    НовыйОбъект.Владелец    = СтрокаТЗ.Контрагент;
    НовыйОбъект.Наименование  = Прав(СтрокаТЗ.Наименование, ДлинаНаименования); // Как правило окончание наименования является уникальным, поэтому пишем последние символы.
    НовыйОбъект.Идентификатор = СтрокаТЗ.Код;
    НовыйОбъект.Артикул             = СтрокаТЗ.Артикул;
    НовыйОбъект.Номенклатура  = СтрокаТЗ.Номенклатура;

    НовыйОбъект.Записать();

КонецЦикла;

Анализ документов

Выполнение анализа вызывается при нажатии на кнопку Анализ выбранных документов в меню "Действия".

Для описания какого-либо процесса проверки входящих электронных документов используется процедура :doc:`ПровестиАнализДокумента <../../func/pm/Provesti_Analiz_Dokumenta>`.

Например, можно проверить наличие сопоставленных документов 1С и получить массив выявленных ошибок.

Если ТипДокумента = "xmltorg12"
    ИЛИ (ТипДокумента = "universaltransferdocument" И (ФункцияДокумента = "invoiceandbasic" ИЛИ ФункцияДокумента = "basic")) Тогда

    Если НЕ ЗначениеЗаполнено(Документ1С) Тогда
        Ошибки.Добавить("Не найдена накладная №: " + СтруктураДанных.НомерДокумента + " от " + Формат(СтруктураДанных.ДатаДокумента, "ДФ=dd.MM.yyyy") + " на сумму " + Формат(СтруктураДанных.СуммаДокумента, "ЧДЦ=2"));
    КонецЕсли;

КонецЕсли;

После выполненного анализа каждого документа, в процедуре :doc:`ПослеАнализаПакета <../../func/pm/Posle_Analiza_Paketa>` выполняется основная логика обработки действий, определенных в предыдущей процедуре.

Вызов анализа по пакетам происходит при нажатии на кнопку Анализ выбранных пакетов в меню "Действия".

Например, заполнение структуры ответа на входящий документ в зависимости от определенного действия (подписать, отказать в подписи и т.п.).

Для Каждого ТекДокумент Из ДокументыПакета Цикл

    ДанныеДокумента = ТекДокумент.ДанныеДокумента;

    ДокументДД  = ТекДокумент.Ссылка;
    Документ1С  = ДанныеДокумента.ДокументВ1С;
    ТекстОшибки = ДанныеДокумента.ТекстОшибки;

    РезультатАнализа = ОсновнойМодуль.ЭДО_НовыйРезультатАнализаВходящегоДокумента();

    СписокДействийТекДокумента = ОсновнойМодуль.ЭДО_ВариантыОтветныхДействийПоДокументу(ДокументДД, ОшибокНет);
    РезультатАнализа.ДействиеВДД = ?(СписокДействийТекДокумента.Количество()=0, "", СписокДействийТекДокумента[0].Значение);

    Если ЗначениеЗаполнено(РезультатАнализа.ДействиеВДД) Тогда
        РезультатАнализа.Вставить("КонтентОтвета", ПолучитьКонтентОтвета(ДокументДД, Документ1С, РезультатАнализа.ДействиеВДД, ТекстВсехОшибокПакета));
    КонецЕсли;

    РезультатАнализа.Вставить("ДокументДляСопоставления", Документ1С);
    ОсновнойМодуль.СохранитьРезультатАнализа(ДокументДД, РезультатАнализа);

КонецЦикла;

Завершающий этап анализа - выполнение определенных действий по подготовленным данным, определяется в процедуре :doc:`ВыполнитьТребуемоеДействие <../../func/pm/Vypolnit'_Trebuyemoye_Deystviye>`.

Например, проводим документ 1С, если требуемое действие, сохраненное в 1С в документе подсистемы Диадока, называется "ПровестиДокумент".

ДокументДД = Параметры.ДокументДД;
ПакетДД    = Параметры.ПакетДД;

ДанныеДокумента = ОсновнойМодуль.ЭДО_ПолучитьРеквизитыДокумента(ДокументДД);

Если ДанныеДокумента.ТребуемоеДействиеВ1С = "ПровестиДокумент" И ЗначениеЗаполнено(ДанныеДокумента.ДокументВ1С) Тогда

    Документ1СОбъект = ДанныеДокумента.ДокументВ1С.ПолучитьОбъект();
    Документ1СОбъект.Записать(РежимЗаписиДокумента.Проведение);

    ОсновнойМодуль.ЭДО_ЗаписатьРеквизитыДокумента(ДокументДД, Новый Структура("ТребуемоеДействиеВ1С", "")); // отработали действие

КонецЕсли;