Имя: Пароль:
1C
 
Конвертация данных, как после загрузки провести загруженные документы по порядку?
,
0 Бешеный заяц
 
13.08.20
15:25
Бьюсь долгое время над проблемой не проведение документов после загрузки, проанализировав журнал понял что документы грузятся (проводятся) не по порядку в результате например перемещение может попытаться просветись до проведения (загрузки поступления).
соответственно предполагаю необходимо собрать в ней параметр документы, отсортировать по моменту времени и в цикле перепроверки, вопрос как? может есть способ более кошерный?
1 Aleksey
 
13.08.20
15:26
А чем указанный способ не кошерный?
2 Бешеный заяц
 
13.08.20
15:28
(1) возможно данный функционал уже есть в конвертации и подобное "мышкой" делается
3 Aleksey
 
13.08.20
15:28
в глобальнике после загрузки объекта

Если ИмяТипаОбъекта = "Документ" Тогда

    Если Объект.Проведен Тогда
        НоваяСтрока = Параметры.ТаблицаДокументов.Добавить();
        Если Объект.ЭтоНовый() Тогда
            Объект.Записать();
        КонецЕсли;    
        НоваяСтрока.Документ = Объект.Ссылка;        
        НоваяСтрока.ДатаВремя = Объект.Дата
    КонецЕсли;    
    Если ОбъектНайден Тогда
        РежимЗаписи = "ОтменаПроведения";
    КонецЕсли;    
КонецЕсли;
4 Бешеный заяц
 
13.08.20
15:35
(3) ок спасибо, только непонятно "Объект.Проведен" считывается после попытки провести? если да то в моём случае он будет в состоянии ложь так как при попытки провести он не проводит, или "Объект.Проведен" это то что пришло от источника?
5 Aleksey
 
13.08.20
16:10
Это то что пришло из источника. Если прилетел проведенный документ, то его нужно провести, вот и пишем в параметр ссылку на документ. Ну а если он уже есть в базе, то снимаем с проведения
6 Aleksey
 
13.08.20
16:11
И сам механизм проведения уже прописываем в глобалнике после загрузки данных

Если Параметры.ТаблицаДокументов.Количество() > 0 Тогда
    Параметры.ТаблицаДокументов.Сортировать("ДатаВремя Возр");
    Ин = 0;
    Для каждого Строка из Параметры.ТаблицаДокументов Цикл
        Попытка
            Объект = Строка.Документ.ПолучитьОбъект();
        Исключение
            Сообщить("Ошибка получения документа "+Строка.Документ);
            Сообщить("Ошибка получения документа "+Строка.ДатаВремя);
            Продолжить;
        КонецПопытки;    
        Попытка
            Объект.Записать(РежимЗаписиДокумента.Проведение);
            Состояние("Документ проведен : "+ СокрЛП(Объект));
            Ин = Ин + 1;
        Исключение
            Сообщить("ДОКУМЕНТ НЕ ПРОВЕДЕН : "+ ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
            Сообщить(" "+СокрЛП(Объект));
            ЗаписатьВПротоколВыполнения("ДОКУМЕНТ НЕ ПРОВЕДЕН : "+ ОписаниеОшибки());
            ЗаписатьВПротоколВыполнения(" "+СокрЛП(Объект));
        КонецПопытки;
    КонецЦикла;
    Сообщить("Из "+СокрЛП(Параметры.ТаблицаДокументов.Количество())+" документов проведено " + СокрЛП(Ин) +" объектов");
    Если Параметры.ТаблицаДокументов.Количество() <> Ин тогда
        ЗаписатьВПротоколВыполнения("Из "+СокрЛП(Параметры.ТаблицаДокументов.Количество())+" документов проведено " + СокрЛП(Ин) +" объектов")
    КонецЕсли;    
Иначе
    Сообщить("Из "+СокрЛП(Параметры.ТаблицаДокументов.Количество())+" документов проведено 0 объектов");
КонецЕсли;
7 Aleksey
 
13.08.20
16:12
Осталось только прописать в параметрах "ТаблицаДокументов" с галкой при загрузки

И в глобальнке перед загрузкой данных

ТаблицаДокументов = Новый ТаблицаЗначений;
ТаблицаДокументов.Колонки.Добавить("Документ");
ТаблицаДокументов.Колонки.Добавить("ДатаВремя");

Параметры.ТаблицаДокументов = ТаблицаДокументов;
8 Aleksey
 
13.08.20
16:17
правда это работает только при полном обмене. так как при частичной выгрузке те документы которые не попали в обмен не будут проведены в приемнике (ну есть еще вариант, что в источнике физически грохнули и тогда в приемнике будет проведенный документ которого нет в источнике.)
9 Бешеный заяц
 
13.08.20
16:17
а параметр ТаблицаДокументов по умолчанию существует? (у меня онлайн обмен)
В перед загрузкой данных сделал так

ТабДок =  Новый ТаблицаЗначений;
ТабДок.Колонки.Добавить("Документ");
ТабДок.Колонки.Добавить("ДатаВремя");
Параметры.Вставить("ЗаписиРеестрДокументов",ТабДок);

После загрузки объекта так

Если ОбщегоНазначения.ЭтоДокумент(Объект.Метаданные()) Тогда

    Если Объект.Проведен Тогда
        НоваяСтрока = Параметры.ТаблицаДокументов.Добавить();
        Если Объект.ЭтоНовый() Тогда
            Объект.Записать();
        КонецЕсли;    
        НоваяСтрока.Документ = Объект.Ссылка;        
        НоваяСтрока.ДатаВремя = Объект.Дата
    КонецЕсли;      
КонецЕсли;


После загрузки данных

Параметры.ТаблицаДокументов.Сортировать("ДатаВремя Возр");
Для каждого стр из Параметры.ТаблицаДокументов Цикл
    ДокОбъект =    стр.Документ.ПолучитьОбъект();
    Попытка
        ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
    Исключение
    КонецПопытки;
КонецЦикла;    


еще правда не успел протестировать
10 Бешеный заяц
 
13.08.20
16:19
правда в начале в параметре ошибся. только что заметил нужно ТаблицаДокументов конечно
11 Aleksey
 
13.08.20
16:38
Обработчики "Правила конвертации объектов"

После загрузки

Условия возникновения события

Только для платформы V8.
Событие выполняется после прочтения и установки атрибутов объекта из файла, но до его записи в информационную базу. Возможна модификация загруженного объекта.

Параметры:

ИмяТипаОбъекта – Строка. Имя типа загруженного объекта, например, «СправочникСсылка.Номенклатура».

чтобы методанные не дергать (ОбщегоНазначения.ЭтоДокумент(Объект.Метаданные())) можно просто взять ИмяТипаОбъекта
12 Aleksey
 
13.08.20
16:40
и если документ у тебя был проведен, а при повторной загрузки он уже НЕ проведен, то такой документ будет без галки проведен, но с проводками, т..е. нужно

Если ОбъектНайден Тогда
    РежимЗаписи = "ОтменаПроведения";
КонецЕсли;
13 Aleksey
 
13.08.20
16:42
плюс желательно отработать ситуацию когда документ не проводиться (нет товара на складе например, или еще какая беда), хотя бы в лог об этом написать
14 Бешеный заяц
 
13.08.20
16:53
какая реакция будет на  "Если Объект.Проведен Тогда" если объект уже записан в базу (в прошлые обмены) но не проведен? или не имеет значения? значение "Объект.Проведен" из источника берется при всех раскладах?
15 Aleksey
 
13.08.20
16:55
(14) см (11)
Событие выполняется после прочтения и установки атрибутов объекта из файла, но до его записи в информационную базу
Это то что прилетело из фала
16 Бешеный заяц
 
13.08.20
16:56
(15) ок спасибо
17 Вафель
 
13.08.20
17:00
раньше при обмене писалось в регистр, а потом проводилось по нему
18 Aleksey
 
13.08.20
17:01
(17) отложенное проведение... а смысл мучить базу?
19 Вафель
 
13.08.20
17:04
(18) а если ошибка при проведении? как выявлять. исправлять? все перегружать заново?
20 Aleksey
 
13.08.20
19:48
(19) Небывает золотого решения на все случае жизни. Мне достаточно лога. дальше разбор полета. У меня таких случаев 1 раз в месяц. ОТложенное проведения нужно когда нужно разделить загрузку и проведение с разбором полетов (типа в ручную попробовать провести, подвигать документы). Мне проще запустить повторно
21 d4rkmesa
 
13.08.20
21:22
(19) Обработка универсального обмена на УФ вывалит в конце кучу сообщений, из которых можно будет открыть документы, например. Но вообще да, для онлайн обменов лучше отложенное проведение использовать.