Имя: Пароль:
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) Обработка универсального обмена на УФ вывалит в конце кучу сообщений, из которых можно будет открыть документы, например. Но вообще да, для онлайн обменов лучше отложенное проведение использовать.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн