Как получить документы

Информацию о документах можно получить только в контексте организации.

Получение списка документов по фильтру

Для получения списка документов используется объект 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);
    КонецЦикла;

    КонецЧтения = ТекущаяДата();

    Сообщить("Лента прочитана за: " + Строка(КонецЧтения - НачалоЧтения));
    Сообщить("Прочитано чанков: " + КоличествоЧанков);
    Сообщить("Прочитано событий: " + КоличествоСобытий);
    Сообщить("Прочитано изменений: " + КоличествоИзменений);
КонецПроцедуры