Как получить документы
Информацию о документах можно получить только в контексте организации.
Получение списка документов по фильтру
Для получения списка документов используется объект DocumentTask.
Будет возвращено актуальное состояние документа на момент поиска.
Функция ВходящиеДокументыЗаГод(dd_Box)
dd_SearchDocumentTask = dd_Box.GetDocumentsTask();
// Заполняем фильтр
SearchDocumentTask.FromSendDate = НачалоГода(ТекущаяДата());
SearchDocumentTask.ToSendDate = КонецГода(ТекущаяДата());
SearchDocumentTask.Category = "Any.Inbound";
Возврат SearchDocumentTask.GetDocuments();
КонецФункции
Получение документа по идентификатору
Если известен идентификатор документа, то можно получить только этот конкретный документ.
Функция ДокументПоИдентификатору(dd_Box, DocumentId)
Возврат dd_Box.GetDocumentById(DocumentId);
КонецФункции
Получение связанных документов
Документы могут быть связаны друг с другом двумя способами:
Документы отправлялись одновременно через один запрос.
Документы были связаны вместе после их отправки.
В первом случае у связанных документов будет совпадать MessageId, во втором — DocumentBase.PacketId.
Для первого случая у документов может также совпадать DocumentBase.PacketId, но гарантий на это нет — документы могут перепривязываться к разным пакетам документов.
Функция ПолучитьСвязанныеПакеты(dd_DocumentBase, ДокументыОднойОтправки = Истина)
Если ДокументыОднойОтправки Тогда
Возврат dd_DocumentBase.GetDocumentPackage(); // вернёт https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/DocumentPackage.html
Иначе
Возврат dd_DocumentBase.GetPackageDocuments(); // вернёт https://developer.kontur.ru/Docs/Diadoc/COM/ComObjects/ValueCollection.html
КонецЕсли;
КонецФункции
Получение ранее отправленных документов по идентификатору отправки
Может быть удобно запоминать не идентификаторы документов, и идентификаторы отправки, использованные в PackageSendTask2.OperationId.
Функция ПолучитьРезультатОтправки(dd_Box, OperationId)
dd_SendTask = dd_Box.CreatePackageSendTask2();
dd_SendTask.OperationId = OperationId;
Возврат dd_SendTask.Send();
КонецФункции
Процедура ОтправитьДокументы(dd_Box, OperationId)
dd_SendTask = dd_Box.CreatePackageSendTask2();
dd_SendTask.OperationId = OperationId;
// примеры отправки документов смотри в https://developer.kontur.ru/Docs/Diadoc/COM/HowTo/document/post.html
ДобавитьДокументыНаОТправку();
dd_SendTask.Send();
КонецПроцедуры
Процедура Пример()
dd_Box = ПолучитьКонтекстОрганизации();
ИдентификаторОтправки = Строка(Новый УникальныйИдентификатор());
ОтправитьДокументы(dd_Box, ИдентификаторОтправки);
dd_Documents_ValueCollection = ПолучитьРезультатОтправки(dd_Box, ИдентификаторОтправки);
КонецПроцедуры
Документы как события
Кроме получения списка документов может быть полезно получение событий по документам. Данный способ необходим, если важно получать только изменения по документам и реагировать на них, а не иметь полное актуальное состояние документов.
Перем КоличествоЧанков; Перем КоличествоСобытий; Перем КоличествоИзменений; Процедура АнализЧанкаСобытий(dd_Chunk) dd_Repflector = ПолучитьReflector(); // см. https://developer.kontur.ru/Docs/Diadoc/COM/HowTo/start/object_reflection.html КоличествоЧанков = КоличествоЧанков + 1; Для Каждого dd_Event Из dd_Chunk.Events Цикл КоличествоСобытий = КоличествоСобытий + 1; dd_TypeDesc_Event = dd_Reflector.Describe(dd_Event); Если "INewMessage" = dd_TypeDesc_Event.GetInterfaceName() Тогда Сообщить("Новые документы!"); КоличествоИзменений = КоличествоИзменений + 1; Иначе Для Каждого dd_EventItem Из dd_Event.Items Цикл dd_TypeDesc_EventDetails = dd_Reflector.Describe(dd_EventItem.Details); Сообщить(dd_TypeDesc_EventDetails.GetInterfaceName()); КоличествоИзменений = КоличествоИзменений + 1; КонецЦикла; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ЧитатьЛентуСобытий(dd_Box) dd_EventFactory = dd_Box.GetEventFactory; КоличествоЧанков = 0; КоличествоСобытий = 0; КоличествоИзменений = 0; dd_Filter = dd_EventFactory.CreateMessageEventFilter(); dd_Filter.AfterIndexKey = ПолучитьЗапомненныйIndexKey(); // предполагается, что пользователь где-то хранит последний полученный IndexKey dd_Filter.Directions.Inbound = True; НачалоЧтения = ТекущаяДата(); dd_Chunk = dd_EventFactory.GetEventsChunk(dd_Filter); АнализЧанкаСобытий(dd_Chunk); Пока Не dd_Chunk.IsLast Цикл LastIndexKey = dd_Chunk.IndexKey; dd_Chunk = dd_Chunk.Next(); АнализЧанкаСобытий(dd_Chunk); КонецЦикла; КонецЧтения = ТекущаяДата(); Сообщить("Лента прочитана за: " + Строка(КонецЧтения - НачалоЧтения)); Сообщить("Прочитано чанков: " + КоличествоЧанков); Сообщить("Прочитано событий: " + КоличествоСобытий); Сообщить("Прочитано изменений: " + КоличествоИзменений); КонецПроцедуры