Извещение о получении
Ниже описаны сценарии реализации работы с ИоП, в которые требуется внести изменения при переходе на работу с УС.
Для генерации файла извещения о получении используется прямой вызов методов API: GenerateReceiptXml(V2) или GenerateReceiptXml.
Предупреждение
Обращение к методам API из ПМ приводит к тому, что позже алгоритмы придётся переписывать. По окончании перехода методы API перестанут поддерживаться. Используйте публичные методы модуля.
Сценарий работы:
Для списка документов формируют файлы ИоП, которые сохраняются в информационную базу.
Сохраненные файлы подписывают либо средствами 1С, либо средствами модуля.
Файлы ИоП и файлы подписи отправляют в сервис Диадок.
Пример кода
Функция ВыполнитьРегламентныеДействия(Параметры)
// .......
СгенерироватьИзвещенияОПолучении();
ОтправитьИзвещенияОПолучении();
Возврат Истина;
КонецФункции
Процедура СгенерироватьИзвещенияОПолучении()
Выборка = ГенерацияТитулов_ВыборкаДанныеДокументов();
Пока Выборка.Следующий() Цикл
Подписант = Получить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, МассивИзвещенийОПолучении));
КонецЦикла;
ОсновнойМодуль.ЭДО_ОтправитьПодписанныеИзвещенияОПолучении(ИзвещенияОПолучении)
КонецПроцедуры
Что делать при перевнедрении
Во время переходного периода
Требуемые действия:
Обновите модуль до версии не ниже 4.53.
Замените код, связанный с прямым вызовом метода API, на вызов публичного метода модуля ЭДО_ПодготовитьИзвещенияОПолучении.
Получите из коллекции извещений двоичные данные файла ИоП по требуемому документу. Двоичные данные можно получить по ключу «InvoiceReceipt», проверив «BoxId» и «DocumentId» на соответствие идентификаторам требуемого документа.
Пример кода
Процедура СгенерироватьИзвещенияОПолучении()
Выборка = ГенерацияТитулов_ВыборкаДанныеДокументов();
РезультатПодготовкиИзвещений = ОсновнойМодуль.ЭДО_ПодготовитьИзвещенияОПолучении();
Пока Выборка.Следующий() Цикл
ИзвещенияПоОрганизации = НайтиИзвещенияПоОрганизации(РезультатПодготовкиИзвещений, Выборка.BoxId);
Для Каждого ЭлементКоллекции Из ИзвещенияПоОрганизации Цикл
Если ЭлементКоллекции.DocumentId = Выборка.DocumentId Тогда
InvoiceReceipt = ЭлементКоллекции.InvoiceReceipt;
ИмяФайла = КаталогВременныхФайлов() + "InvoiceReceipt.xml";
InvoiceReceipt.Записать(ИмяФайла);
ИзвещениеОПолучении_ИБ = РаботаСФайламиВнешнийВызов.СоздатьФайлНаОсновеФайлаНаДиске(Выборка.Документ1С, ИмяФайла);
УстановитьЗначениеДопРеквизита(ДаннВыборка.ДокументДД, "ФайлИзвещенияОПолучении", ИзвещениеОПолучении_ИБ);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция НайтиИзвещенияПоОрганизации(РезультатПодготовкиИзвещений, BoxId)
Результат = Неопределено;
Для Каждого ЭлементКоллекции Из РезультатПодготовкиИзвещений Цикл
Если ЭлементКоллекции.BoxId = BoxId Тогда
Результат = ЭлементКоллекции.ИзвещенияОПолучении;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
По окончании переходного периода
Требуемые действия:
Обновите модуль до версии 4.5X*.
Примечание
* Точная версия релиза будет определена ближе к окончанию переходного периода.
Определите, будете ли хранить файлы извещения в информационной базе.
Предупреждение
УС подписывать не нужно. Поэтому его можно не хранить.
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 Тогда
Результат = ЭлементКоллекции.ИзвещенияОПолучении;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Удалите код подписи файла УС.
Для генерации, подписания и отправки извещений о получении используются публичные методы коробки:
ЭДО_ПодготовитьИзвещенияОПолучении — возвращает коллекцию подлежащих подписанию ИоП.
ЭДО_ПодписатьИзвещенияОПолучении — добавляет двоичные данные подписи.
ЭДО_ОтправитьПодписанныеИзвещенияОПолучении — отправляет подписанные ИоП.
Что делать при перевнедрении
Во время переходного периода
Требуемые действия:
Обновите модуль до версии не ниже 4.53.
Оставьте все три метода в ПМ, т.к. текущий формат ИоП еще является действующим.
По окончании переходного периода
Требуемые действия:
Обновите модуль до версии 4.5X*.
Примечание
* Точная версия релиза будет определена ближе к окончанию переходного периода.
Удалите из ПМ вызов публичного метода ЭДО_ПодписатьИзвещенияОПолучении, т.к. данный метод в рамках УС не будет выполнять действий по подписанию служебного сообщения.
Предупреждение
Наличие в ПМ вызова публичного метода ЭДО_ПодписатьИзвещенияОПолучении по окончании переходного периода не должно привести к ошибкам при выполнении кода, реализующего бизнес процесс.
Тем не менее с целью поддержки кодовой базы ПМ в оптимальном состоянии рекомендуем вызов данного метода удалить.
Файл извещения о получении сгенерирован с помощью публичного метода коробки ЭДО_ПодготовитьИзвещенияОПолучении. В коде присутствует обращение к двоичным данным файла.
Пример кода
Процедура ОбработатьИзвещенияОПолучении(ДанныеДокумента)
РезультатПодготовкиИзвещений = ОсновнойМодуль.ЭДО_ПодготовитьИзвещенияОПолучении();
Для Каждого ЭлементКоллекции Из РезультатПодготовкиИзвещений Цикл
ИоП_BoxId = ЭлементКоллекции.BoxId;
ИоП_Коллекция = ЭлементКоллекции.ИзвещенияОПолучении;
Для Каждого СтруктураДанных Из ИоП_Коллекция Цикл
InvoiceReceipt = СтруктураДанных.InvoiceReceipt;
ИмяФайла = КаталогВременныхФайлов() + "InvoiceReceipt.xml";
InvoiceReceipt.Записать(ИмяФайла);
ИзвещениеОПолучении_ИБ = РаботаСФайламиВнешнийВызов.СоздатьФайлНаОсновеФайлаНаДиске(Документ1С, ИмяФайла);
УстановитьЗначениеДопРеквизита(ДанныеДокумента.ДокументДД, "ФайлИзвещенияОПолучении", ИзвещениеОПолучении_ИБ);
ПодписатьИоП(СтруктураДанных);
КонецЦикла;
КонецЦикла;
ОсновнойМодуль.ЭДО_ОтправитьПодписанныеИзвещенияОПолучении(РезультатПодготовкиИзвещений);
КонецПроцедуры
Что делать при перевнедрении
Во время переходного периода
Требуемые действия:
Обновите модуль до версии не ниже 4.53.
По окончании переходного периода
Требуемые действия:
Обновите модуль до версии 4.5X*.
Примечание
* Точная версия релиза будет определена ближе к окончанию переходного периода.
Определите, будете ли хранить файл извещения в информационной базе.
Предупреждение
УС подписывать не нужно. Поэтому его можно не хранить.
Если хранение файла УС в ИБ по каким-то причинам нужно, то замените обращение к ключу «InvoiceReceipt» на «UniversalMessage».
Пример кода
Процедура ОбработатьИзвещенияОПолучении(ДанныеДокумента)
РезультатПодготовкиИзвещений = ОсновнойМодуль.ЭДО_ПодготовитьИзвещенияОПолучении();
Для Каждого ЭлементКоллекции Из РезультатПодготовкиИзвещений Цикл
ИоП_BoxId = ЭлементКоллекции.BoxId;
ИоП_Коллекция = ЭлементКоллекции.ИзвещенияОПолучении;
Для Каждого СтруктураДанных Из ИоП_Коллекция Цикл
UniversalMessage = СтруктураДанных.UniversalMessage;
ИмяФайла = КаталогВременныхФайлов() + "UniversalMessage_InvoiceReceipt.xml";
UniversalMessage.Записать(ИмяФайла);
ИзвещениеОПолучении_ИБ = РаботаСФайламиВнешнийВызов.СоздатьФайлНаОсновеФайлаНаДиске(Документ1С, ИмяФайла);
УстановитьЗначениеДопРеквизита(ДанныеДокумента.ДокументДД, "ФайлИзвещенияОПолучении", ИзвещениеОПолучении_ИБ);
КонецЦикла;
КонецЦикла;
ОсновнойМодуль.ЭДО_ОтправитьПодписанныеИзвещенияОПолучении(РезультатПодготовкиИзвещений);
КонецПроцедуры
Если хранение файла УС в ИБ не требуется, то уберите код, связанный с обращением к двоичным данным файла извещения.
Пример кода
Процедура ОбработатьИзвещенияОПолучении()
РезультатПодготовкиИзвещений = ОсновнойМодуль.ЭДО_ПодготовитьИзвещенияОПолучении();
ОсновнойМодуль.ЭДО_ОтправитьПодписанныеИзвещенияОПолучении(РезультатПодготовкиИзвещений);
КонецПроцедуры
Удалите код подписи файла УС