|
Конвертация данных, как после загрузки провести загруженные документы по порядку? | ☑ | ||
---|---|---|---|---|
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) Обработка универсального обмена на УФ вывалит в конце кучу сообщений, из которых можно будет открыть документы, например. Но вообще да, для онлайн обменов лучше отложенное проведение использовать.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |