Извещение о получении

Ниже описаны сценарии реализации работы с ИоП, в которые требуется внести изменения при переходе на работу с УС.

Для генерации файла извещения о получении используется прямой вызов методов API: GenerateReceiptXml(V2) или GenerateReceiptXml.

Предупреждение

Обращение к методам API из ПМ приводит к тому, что позже алгоритмы придётся переписывать. По окончании перехода методы API перестанут поддерживаться. Используйте публичные методы модуля.

Сценарий работы:

  1. Для списка документов формируют файлы ИоП, которые сохраняются в информационную базу.

  2. Сохраненные файлы подписывают либо средствами 1С, либо средствами модуля.

  3. Файлы ИоП и файлы подписи отправляют в сервис Диадок.

Пример кода
Функция ВыполнитьРегламентныеДействия(Параметры)

    // .......

    СгенерироватьИзвещенияОПолучении();

    ОтправитьИзвещенияОПолучении();

    Возврат Истина;

КонецФункции

Процедура СгенерироватьИзвещенияОПолучении()

    Выборка = ГенерацияТитулов_ВыборкаДанныеДокументов();

    Пока Выборка.Следующий() Цикл

        Подписант = ПолучитьXML_УниверсальныйПодписант();

        // .......

        ReceiptGenerationRequest = DD_API_DS_ReceiptGenerationRequestV2(Выборка.messageId, Выборка.AttachmentId, Подписант);

        InvoiceReceipt = АПИ_GenerateReceiptXml(Выборка.BoxId, ReceiptGenerationRequest);

        ИмяФайла = КаталогВременныхФайлов() + "InvoiceReceipt.xml";
        InvoiceReceipt.Записать(ИмяФайла);

        ИзвещениеОПолучении_ИБ = РаботаСФайламиВнешнийВызов.СоздатьФайлНаОсновеФайлаНаДиске(Выборка.Документ1С, ИмяФайла);

        УстановитьЗначениеДопРеквизита(ДаннВыборка.ДокументДД, "ФайлИзвещенияОПолучении", ИзвещениеОПолучении_ИБ);

    КонецЦикла;

КонецПроцедуры

Процедура ОтправитьИзвещенияОПолучении()

    ИзвещенияОПолучении = Новый Массив;

    ВыборкаПоBoxId = ГенерацияТитулов_ДокументыСПодписаннымиИоП();

    Пока ВыборкаПоBoxId.Следующий() Цикл

        ВыборкаИзвещений = ВыборкаПоBoxId.Выбрать();

        МассивИзвещенийОПолучении = Новый Массив;

        Пока ВыборкаИзвещений.Следующий() Цикл

            ДвоичныеДанныеПодписи = ВыборкаИзвещений.ПодписьИзвещения.Получить();

            ДвоичныеДанныеИзвещения = РаботаСФайлами.ДвоичныеДанныеФайла(ВыборкаИзвещений.ФайлИзвещения);

            СтруктураДанных = Новый Структура("MessageId, ParentEntityId, DocumentId, InvoiceReceipt, Signature");

            СтруктураДанных.MessageId = ВыборкаИзвещений.LetterId;
            СтруктураДанных.DocumentId = ВыборкаИзвещений.DocumentId;
            СтруктураДанных.ParentEntityId = ВыборкаИзвещений.DocumentId;
            СтруктураДанных.InvoiceReceipt = ДвоичныеДанныеИзвещения;
            СтруктураДанных.Signature = ДвоичныеДанныеПодписи;

            МассивИзвещенийОПолучении.Добавить(СтруктураДанных);

        КонецЦикла;

        ИзвещенияОПолучении.Добавить(Новый Структура("BoxId, ИзвещенияОПолучении", ВыборкаПоBoxId.BoxId, МассивИзвещенийОПолучении));

    КонецЦикла;

    ОсновнойМодуль.ЭДО_ОтправитьПодписанныеИзвещенияОПолучении(ИзвещенияОПолучении)

КонецПроцедуры

Что делать при перевнедрении

Во время переходного периода

Требуемые действия:

  1. Обновите модуль до версии не ниже 4.53.

  2. Замените код, связанный с прямым вызовом метода API, на вызов публичного метода модуля ЭДО_ПодготовитьИзвещенияОПолучении.

  3. Получите из коллекции извещений двоичные данные файла ИоП по требуемому документу. Двоичные данные можно получить по ключу «InvoiceReceipt», проверив «BoxId» и «DocumentId» на соответствие идентификаторам требуемого документа.

Пример кода
Процедура СгенерироватьИзвещенияОПолучении()

    Выборка = ГенерацияТитулов_ВыборкаДанныеДокументов();
    РезультатПодготовкиИзвещений = ОсновнойМодуль.ЭДО_ПодготовитьИзвещенияОПолучении();

    Пока Выборка.Следующий() Цикл

        ИзвещенияПоОрганизации = НайтиИзвещенияПоОрганизации(РезультатПодготовкиИзвещений, Выборка.BoxId);

        Для Каждого ЭлементКоллекции Из ИзвещенияПоОрганизации Цикл

            Если ЭлементКоллекции.DocumentId = Выборка.DocumentId Тогда

                InvoiceReceipt = ЭлементКоллекции.InvoiceReceipt;

                ИмяФайла = КаталогВременныхФайлов() + "InvoiceReceipt.xml";
                InvoiceReceipt.Записать(ИмяФайла);

                ИзвещениеОПолучении_ИБ = РаботаСФайламиВнешнийВызов.СоздатьФайлНаОсновеФайлаНаДиске(Выборка.Документ1С, ИмяФайла);

                УстановитьЗначениеДопРеквизита(ДаннВыборка.ДокументДД, "ФайлИзвещенияОПолучении", ИзвещениеОПолучении_ИБ);

            КонецЕсли;

        КонецЦикла;

    КонецЦикла;

КонецПроцедуры

Функция НайтиИзвещенияПоОрганизации(РезультатПодготовкиИзвещений, BoxId)

    Результат = Неопределено;

    Для Каждого ЭлементКоллекции Из РезультатПодготовкиИзвещений Цикл

        Если ЭлементКоллекции.BoxId = BoxId Тогда
            Результат = ЭлементКоллекции.ИзвещенияОПолучении;
            Прервать;
        КонецЕсли;

    КонецЦикла;

    Возврат Результат;

КонецФункции

По окончании переходного периода

Требуемые действия:

  1. Обновите модуль до версии 4.5X*.

Примечание

* Точная версия релиза будет определена ближе к окончанию переходного периода.

  1. Определите, будете ли хранить файлы извещения в информационной базе.

Предупреждение

УС подписывать не нужно. Поэтому его можно не хранить.

3. Если хранение файла УС в ИБ по каким-то причинам нужно, то замените обращение к ключу «InvoiceReceipt» на «UniversalMessage».

Пример кода
Процедура СгенерироватьИзвещенияОПолучении()

    Выборка = ГенерацияТитулов_ВыборкаДанныеДокументов();
    РезультатПодготовкиИзвещений = ОсновнойМодуль.ЭДО_ПодготовитьИзвещенияОПолучении();

    Пока Выборка.Следующий() Цикл

        ИзвещенияПоОрганизации = НайтиИзвещенияПоОрганизации(РезультатПодготовкиИзвещений, Выборка.BoxId);

        Для Каждого ЭлементКоллекции Из ИзвещенияПоОрганизации Цикл

            Если ЭлементКоллекции.DocumentId = Выборка.DocumentId Тогда

                UniversalMessage = ЭлементКоллекции.UniversalMessage;

                ИмяФайла = КаталогВременныхФайлов() + "UniversalMessage_InvoiceReceipt.xml";
                UniversalMessage.Записать(ИмяФайла);

                ИзвещениеОПолучении_ИБ = РаботаСФайламиВнешнийВызов.СоздатьФайлНаОсновеФайлаНаДиске(Выборка.Документ1С, ИмяФайла);

                УстановитьЗначениеДопРеквизита(ДаннВыборка.ДокументДД, "ФайлИзвещенияОПолучении", ИзвещениеОПолучении_ИБ);

            КонецЕсли;

        КонецЦикла;

    КонецЦикла;

КонецПроцедуры

Функция НайтиИзвещенияПоОрганизации(РезультатПодготовкиИзвещений, BoxId)

    Результат = Неопределено;

    Для Каждого ЭлементКоллекции Из РезультатПодготовкиИзвещений Цикл

        Если ЭлементКоллекции.BoxId = BoxId Тогда
        Результат = ЭлементКоллекции.ИзвещенияОПолучении;
            Прервать;
        КонецЕсли;

    КонецЦикла;

    Возврат Результат;

КонецФункции

4. Если хранение УС в ИБ не требуется, то уберите код, связанный с сохранением файла. Так как подписывать УС не требуется, то генерацию и отправку данных можно выполнить последовательно.

Пример кода
Функция ВыполнитьРегламентныеДействия(Параметры)

    // .......

    СгенерироватьИОтправитьИзвещенияОПолучении();

    Возврат Истина;

КонецФункции

Процедура СгенерироватьИОтправитьИзвещенияОПолучении()

    Выборка = ГенерацияТитулов_ВыборкаДанныеДокументов();
    РезультатПодготовкиИзвещений = ОсновнойМодуль.ЭДО_ПодготовитьИзвещенияОПолучении();

    МассивИзвещений = Новый Массив;

    Пока Выборка.Следующий() Цикл

        ИзвещенияПоОрганизации = НайтиИзвещенияПоОрганизации(РезультатПодготовкиИзвещений, Выборка.BoxId);

        МассивВложенный = Новый Массив;

        Для Каждого ЭлементКоллекции Из ИзвещенияПоОрганизации Цикл

            Если ЭлементКоллекции.DocumentId = Выборка.DocumentId Тогда

                СтруктураИзвещения =  Новый Структура("DocumentId, MessageId, ParentEntityId, InvoiceReceipt, UniversalMessage");
                ЗаполнитьЗначенияСвойств(СтруктураИзвещения, ЭлементКоллекции);
                МассивВложенный.Добавить(СтруктураИзвещения);

            КонецЕсли;

        КонецЦикла;

        МассивИзвещений.Добавить(Новый Структура("BoxId, ИзвещенияОПолучении", Выборка.BoxId, МассивВложенный));

    КонецЦикла;

    ОсновнойМодуль.ЭДО_ОтправитьПодписанныеИзвещенияОПолучении(МассивИзвещений);

КонецПроцедуры

Функция НайтиИзвещенияПоОрганизации(РезультатПодготовкиИзвещений, BoxId)

    Результат = Неопределено;

    Для Каждого ЭлементКоллекции Из РезультатПодготовкиИзвещений Цикл

        Если ЭлементКоллекции.BoxId = BoxId Тогда
            Результат = ЭлементКоллекции.ИзвещенияОПолучении;
            Прервать;
        КонецЕсли;

    КонецЦикла;

    Возврат Результат;

КонецФункции
  1. Удалите код подписи файла УС.