|
При ошибке обмена остаются непроведённые документы | ☑ | ||
---|---|---|---|---|
0
laby1
13.03.19
✎
08:12
|
Здравствуйте.
Из одной базы посредством COM-соединения идёт обмен с другой. По плану обмена, по расписанию. Документ судя по журналу регистрации при обмене, уже проведённый, имеет 4 события: три раза изменяется и проводится. Но в момент какого-то сбоя видимо, два события только - изменения. А после этого так и остаётся непроведённым. И при последующих обменах эти документы не проводится. Почему - непонятно, куда копать? |
|||
1
seevkik
13.03.19
✎
08:34
|
Копать в отладчик
|
|||
2
Cyberhawk
13.03.19
✎
08:59
|
В анализ применяемого в обмене механизма работы с ошибочными объектами
|
|||
3
Serg_1960
13.03.19
✎
10:36
|
"... имеет 4 события: три раза изменяется и проводится." - Ахтунг, говнокод! Найдите автора и прибейте :) Так не должно быть.
"... Но в момент какого-то сбоя видимо..." - разбирайтесь, отлавливайте событие и аварийно завершайте сеанс обмена. Должно работать золотое правило сеанса обмена: всё или ничего! |
|||
4
Cyberhawk
13.03.19
✎
12:51
|
(3) "золотое правило сеанса обмена: всё или ничего" // Это не золотое правило, а повод ничего не делать для ленивых)
|
|||
5
Пробел
13.03.19
✎
13:00
|
это, случайно, не обмен между УТ10 и БП2? У меня на типовом обмене была ситуация, когда после обмена все зарегистрированные к обмену реализации ТиУ оказывались непроведенными в БП.
Сбой в моем случае вызывался бухгалтером, которому мозолили глаза помеченные на удаление документы в УТ10. он их по тихому переносил из закрытого периода в рабочий и там правил, УТ добросовестно регистрировала документ к обмену, БП добросовестно пыталась изменить документ в закрытом периоде и обмен падал с ошибкой. Разбираться мне было лень, и я решил проблему внушением бухгалтеру. |
|||
6
laby1
14.03.19
✎
08:03
|
(5) Нет, обмен между УПП и MES
|
|||
7
laby1
14.03.19
✎
08:05
|
(4) : "всё или ничего" наверное имелось ввиду, что если сбой, то всё должно оставаться так как было, тогда в следующем обмене бы всё сработало
|
|||
8
laby1
14.03.19
✎
08:19
|
(3) А как же ты его отловишь - это же регламентное задание через COM-соединение MES меняет документ в УПП
|
|||
9
Serg_1960
14.03.19
✎
09:43
|
(8) А при чём тут регламентное задание и COM? Это всего лишь транспорт обмена. Это же обмен данными, так? При этом используются правила конвертации, так? Вот в правила и нужно внести изменения, чтобы отлавливать ошибку проведения документа на стороне УПП.
|
|||
10
laby1
14.03.19
✎
14:22
|
(9) Наверное, только непонятно пока мне, какого рода изменения в правила конвертации нужно внести, чтоб они помогли отлавливать ошибку.
|
|||
11
laby1
18.03.19
✎
10:33
|
(9) Я правильно понял, что нужно менять в файле .xml ?
Это оно: " <ПравилаОбмена> <ВерсияФормата РежимСовместимости="РежимСовместимостиСБСП20">2.01</ВерсияФормата> <Ид>6ba0e1cf-c4fd-4ef7-be31-af95adae906b </Ид> <Наименование>MES_Перемещение --> УПП_Перемещение</Наименование> <ДатаВремяСоздания>2018-10-28T19:23:18</ДатаВремяСоздания> <Источник ВерсияПлатформы="8.0" ВерсияКонфигурации="1.2.1.2" СинонимКонфигурации="Оперативное управление производством, редакция 1.2">ОперативноеУправлениеПроизводством</Источник> <Приемник ВерсияПлатформы="8.0" ВерсияКонфигурации="1.3.110.3" СинонимКонфигурации="Управление производственным предприятием, редакция 1.3">УправлениеПроизводственнымПредприятием</Приемник> <ПослеВыгрузкиДанных>Если Параметры.Свойство("ЗаказыНаПроизводство") тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДокументЗаказНаПроизводство.Ссылка, | ДокументЗаказНаПроизводство.ДатаЗапуска, | ДокументЗаказНаПроизводство.ДатаИсполнения, | ДокументЗаказНаПроизводство.КВИЛ_ПричинаЗадержки, | ДокументЗаказНаПроизводство.ИНТ_СтатусЗаказа КАК СБ_СтатусПроизводства |ИЗ | Документ.ЗаказНаПроизводство КАК ДокументЗаказНаПроизводство |ГДЕ | ДокументЗаказНаПроизводство.Ссылка В(&ЗаказыНаПроизводство)"; Запрос.УстановитьПараметр("ЗаказыНаПроизводство",Параметры.ЗаказыНаПроизводство); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ВыгрузитьПоПравилу(Выборка,,,,"ЗаказНаПроизводствоТолькоСтатус"); КонецЦикла; Запрос.УстановитьПараметр("ЗаказыНаПроизводство",Параметры.ЗаказыНаПроизводство); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ВыгрузитьПоПравилу(Выборка,,,,"ЗаказНаПроизводствоТолькоСтатус"); КонецЦикла; КонецЕсли;</ПослеВыгрузкиДанных> <ПередЗагрузкойДанных>Параметры.Вставить("ДокументыДляПроведения", Новый Массив);</ПередЗагрузкойДанных> <ПослеЗагрузкиДанных>Выполнить(Алгоритмы.ВыполнитьПроведениеДокументов);</ПослеЗагрузкиДанных> <ПриПолученииИнформацииОбУдалении>МетаданныеОбъекта = Объект.Метаданные(); Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда Отказ = Истина; УстановитьПометкуУдаленияУОбъекта(Объект, Истина, "Справочник"); ИначеЕсли Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда Отказ = Истина; Если Объект.Проведен Тогда ОтменитьПроведениеОбъектаВИБ(Объект, ТипЗнч(Объект), Ложь); КонецЕсли; УстановитьПометкуУдаленияУОбъекта(Объект, Истина, "Документ"); ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеОбъекта) Тогда Отказ = Истина; УстановитьПометкуУдаленияУОбъекта(Объект, Истина, "ПланВидовХарактеристик"); КонецЕсли;</ПриПолученииИнформацииОбУдалении> <Параметры/> <Обработки/> <ПравилаКонвертацииОбъектов> ..." |
|||
12
laby1
18.03.19
✎
10:55
|
И там строчек видимо-невидимо ...
|
|||
13
laby1
18.03.19
✎
11:05
|
(9) А как такого рода ошибки вообще отлавливаются с помощью изменения правил обмена, можете подсказать?
|
|||
14
laby1
18.03.19
✎
13:10
|
Итак, что я накопал:
Есть обработка в конфигурации называется "Универсальный обмен данными в формате XML" Имя файла правил на сервере - туда прописываю свой файл xml правил обмена. Жму кнопку "Прочитать правила обмена" - таблица "Выгружаемые данные" заполняется видами объектов, которые участвуют в правилах. Выгрузка в план обмена - пишу туда название файла выгрузки. Жму "Выгрузить" - в файл выгрузки - создался новый xml документ. Что это за документ и с чем его едят - пока не понятно. |
|||
15
laby1
18.03.19
✎
13:34
|
Долго как-то грузится, до того грузил только с нужным мне Документом ЗаказНаПроизводство - быстро, но не понял, что там в нём такого. Там ещё какая-то штуковина есть с отладкой - формирует что-ли отладочную обработку, но пока не догнал, жду, пока сформирует файл...
|
|||
16
Serg_1960
18.03.19
✎
13:45
|
(11) В принципе там и так всё понятно - русским же языком написано :) Например, "<ПослеЗагрузкиДанных>Выполнить(Алгоритмы.ВыполнитьПроведениеДокументов);</ПослеЗагрузкиДанных>" - после загрузки документов вызвать ВыполнитьПроведениеДокументов(). Но лучше (легче) правила редактировать в "Конвертация данных".
Я понятия не имею об чём тут именно идёт речь :) но я бы на Вашем месте посмотрел бы "Алгоритмы.ВыполнитьПроведениеДокументов". Вероятно там проведение через попытку без анализа и обработки ошибок. Как мне кажется. |
|||
17
laby1
18.03.19
✎
13:51
|
Сформировал обработку отладки выгрузки - алгоритмы в виде отдельных процедур.
... //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ КОНВЕРТАЦИИ (ГЛОБАЛЬНЫЕ) Процедура Конвертация_ПослеВыгрузкиДанных(ФайлОбмена) Экспорт Если Параметры.Свойство("ЗаказыНаПроизводство") тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДокументЗаказНаПроизводство.Ссылка, | ДокументЗаказНаПроизводство.ДатаЗапуска, | ДокументЗаказНаПроизводство.ДатаИсполнения, | ДокументЗаказНаПроизводство.КВИЛ_ПричинаЗадержки, | ДокументЗаказНаПроизводство.ИНТ_СтатусЗаказа КАК СБ_СтатусПроизводства |ИЗ | Документ.ЗаказНаПроизводство КАК ДокументЗаказНаПроизводство |ГДЕ | ДокументЗаказНаПроизводство.Ссылка В(&ЗаказыНаПроизводство)"; Запрос.УстановитьПараметр("ЗаказыНаПроизводство",Параметры.ЗаказыНаПроизводство); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ВыгрузитьПоПравилу(Выборка,,,,"ЗаказНаПроизводствоТолькоСтатус"); КонецЦикла; Запрос.УстановитьПараметр("ЗаказыНаПроизводство",Параметры.ЗаказыНаПроизводство); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ВыгрузитьПоПравилу(Выборка,,,,"ЗаказНаПроизводствоТолькоСтатус"); КонецЦикла; КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ ВЫГРУЗКИ ДАННЫХ //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ КОНВЕРТАЦИИ ОБЪЕКТОВ Процедура ПКО_ПередВыгрузкой_ЗаказНаПроизводствоТолькоСсылка(ФайлОбмена, Источник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО, ПКО, ВыгруженныеОбъекты, Отказ, КлючВыгружаемыхДанных, ЗапоминатьВыгруженные, НеЗамещатьОбъектПриЗагрузке, ВсеОбъектыВыгружены, ТолькоПолучитьУзелСсылки, Приемник, РежимЗаписи, РежимПроведения, НеСоздаватьЕслиНеНайден) Экспорт Если НЕ Параметры.Свойство("ЗаказыНаПроизводство") тогда Параметры.Вставить("ЗаказыНаПроизводство", Новый Массив); КонецЕсли; Если Параметры.ЗаказыНаПроизводство.Найти(Источник.Ссылка) = Неопределено И ЗначениеЗаполнено(Источник.Ссылка) Тогда Параметры.ЗаказыНаПроизводство.Добавить(Источник.Ссылка); КонецЕсли; Отказ = Истина; КонецПроцедуры ... |
|||
18
laby1
18.03.19
✎
14:03
|
(16) что значит в "конвертация данных" - это где?
|
|||
19
laby1
18.03.19
✎
14:06
|
(16) "Алгоритмы.ВыполнитьПроведениеДокументов". - где мне искать эту процедуру. В обработке отладки (17) этого нету почему-то.
|
|||
20
laby1
18.03.19
✎
14:06
|
(19) Может в xml-файле посмотреть, сейчас ...
|
|||
21
laby1
18.03.19
✎
14:09
|
Алгоритмы - может это общий модуль, так нет такого общего модуля ...
|
|||
22
laby1
18.03.19
✎
14:14
|
Да, в xml есть такое
Для Каждого Документ Из Параметры.ДокументыДляПроведения Цикл Если Не Документ.ЭтоНовый() Тогда // Переполучаем объект, т.к. он мог быть изменен ДокументОбъект = Документ.Ссылка.ПолучитьОбъект(); УстановитьОбменДаннымиЗагрузка(ДокументОбъект, Ложь); Попытка Если ДокументОбъект.ПроверитьЗаполнение() Тогда //ИЛИ Документ.РазделУчета = Перечисления.РазделыУчетаДляВводаОстатков.РасчетыСПерсоналомПоОплатеТрудаИДепонентам ДокументОбъект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина); ДокументОбъект.ДополнительныеСвойства.Вставить("НеПроверятьДатыЗапретаИзмененияДанных"); // выполняем попытку проведения документа ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); КонецЕсли; Исключение КонецПопытки; КонецЕсли; КонецЦикла; |
|||
23
Smile 8D
18.03.19
✎
14:14
|
Алгоритмы находятся там же в правилах обмена, ищите по названию. В правилах обмена БП-УТ, например, так:
<Алгоритм Имя="ОбработатьЗаписьДокументаПослеЗагрузки" ИспользуетсяПриЗагрузке="true"> <Текст>// Параметры: // - Объект ПроведенОбъект = Объект.Проведен; // Если установлена опция не проводить документы загружаем все документы как непроведенные Если Объект.ЭтоНовый() Тогда Объект.Проведен = Объект.Проведен И Параметры.РазрешитьПроведениеДокументовПриЗагрузке; Иначе ПроведенСсылка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Ссылка, "Проведен"); Объект.Проведен = ПроведенОбъект И (Параметры.РазрешитьПроведениеДокументовПриЗагрузке ИЛИ ПроведенСсылка); КонецЕсли; И т.д. |
|||
24
Smile 8D
18.03.19
✎
14:17
|
(22) А документ руками проводится? Судя по коду, может не проходить проверка заполнения, поэтому и не проводит.
(17) А почему одно и то же 2 раза выгружается? Запрос.УстановитьПараметр("ЗаказыНаПроизводство",Параметры.ЗаказыНаПроизводство); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ВыгрузитьПоПравилу(Выборка,,,,"ЗаказНаПроизводствоТолькоСтатус"); КонецЦикла; Запрос.УстановитьПараметр("ЗаказыНаПроизводство",Параметры.ЗаказыНаПроизводство); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ВыгрузитьПоПравилу(Выборка,,,,"ЗаказНаПроизводствоТолькоСтатус"); КонецЦикла; |
|||
25
laby1
18.03.19
✎
14:23
|
(24) Документ руками проводится в МЕС, а потом конвертируется в УПП. Ошибка возникает, когда он очередной раз из МЕС конвертируется в УПП проведённый. И в УПП он его редактирует, но не проводит. То есть по факту распроводит. И получается, что как-будто бы продукция не произведена и система потом делает новые заказы, чтобы произвести продукцию, которую уже продали давно.
|
|||
26
laby1
18.03.19
✎
14:24
|
(24) А почему одно и то же 2 раза выгружается? - Откуда Вы видите, что два раза?
|
|||
27
laby1
18.03.19
✎
14:31
|
(26) А, точно, два раза - почему - большой вопрос ...
|
|||
28
Smile 8D
18.03.19
✎
14:33
|
(25) В приведенных вами кусках правил ничего про снятие с проведения нет, надо смотреть подробнее правила выгрузки документа и ПКО "ЗаказНаПроизводствоТолькоСтатус".
(26) Я же скопировал кусок кода вашего выше, два раза в цикле происходит выгрузка, я отличий между этими циклами не вижу, те же параметры, те же аргументы. |
|||
29
laby1
18.03.19
✎
14:38
|
(28) она до проведения просто не доходит из-за какого-то сбоя.
Да, два раза... Почему - я не знаю, я на новом месте работы - всё до меня делали, вот разгребаю... |
|||
30
laby1
18.03.19
✎
14:44
|
Самое интересное, что она изменяет документ аж целых четыре раза за выгрузку, если выгрузка вся проходит
|
|||
31
Smile 8D
18.03.19
✎
15:14
|
(30) Выше уже написали, что это неправильно. Скорее всего выгрузка криво написана.
Соответственно и механизм проведения может быть обработан некорректно, нужно изучать правила. Если до этого не работали с Конвертацией данных, то лучше поставьте эту конфигурацию, загрузите туда свои правила и поизучайте. Механизм довольно сложный, поэтому сходу разобраться не факт что получится. Возможно, потребуется почитать какие-то статьи, посмотреть курсы. Но в любом случае это полезно. |
|||
32
laby1
18.03.19
✎
15:48
|
Нет, получается, что изменений всё же три. Просто последнее изменение получается двумя событиями. Изменение + Проведение. Первое изменение - это изменение в процессе обмена. Второе - это первый цикл. А третье изменение и четвертое проведение - это получается второй цикл выгрузки по правилу "только статус". То есть дважды выгрузка по правилу получается потому, что первый раз она не проводит, а второй раз проводит документ.
|
|||
33
laby1
18.03.19
✎
15:51
|
Хотя проведение у нас получается в Алгоритмы.ВыполнитьПроведениеДокументов ... ничего не понимаю
|
|||
34
laby1
18.03.19
✎
15:53
|
А, нет, всё правильно. Алгоритм выполнить проведение документов это у нас при загрузке, а ошибки у нас при выгрузке.
|
|||
35
laby1
18.03.19
✎
15:53
|
И значит проведением занимается УПП
|
|||
36
laby1
18.03.19
✎
15:57
|
Сделал, что протокол загрузки пишется в файл, не знаю, чем поможет.
Такого плана: ВЫГРУЗКА ОБЪЕКТА: Заказ на производство УПЗКК00000042107 от 15.03.2019 9:39:15 (Документ объект: Заказ на производство) Конвертация объекта: Заказ на производство УПЗКК00000042107 от 15.03.2019 9:39:15 (Документ объект: Заказ на производство) ПКО: ЗаказНаПроизводствоТолькоСсылка (Документ: Заказ на производство) ВЫГРУЗКА ОБЪЕКТА: Отчет мастера смены ОУ-00004784 от 18.03.2019 13:10:19 (Документ объект: Отчет мастера смены) Конвертация объекта: Отчет мастера смены ОУ-00004784 от 18.03.2019 13:10:19 (Документ объект: Отчет мастера смены) ПКО: ОтчетМастераСмены (Документ: Отчет мастера смены) Конвертация ссылки на объект: ................................ |
|||
37
laby1
18.03.19
✎
15:59
|
Странный однако протокол, без даты-времени событий.
|
|||
38
laby1
19.03.19
✎
09:17
|
Итак, что мы имеем:
1. В программе в настройке плана обмена я выгрузил правила конвертации данных в xml-файл. 2. Сформировал и подключил внешнюю обработку "ОтладкаОбмена" для отладки выгрузки. (Код для обработки "ОтладкаОбмена" получил с помощью обработки "УниверсальныйОбменДаннымиXML"). 3. Включил режим протоколирования в текстовый файл - похоже там только результат последнего обмена пишется (обмен идёт по расписанию). 4. Посмотрим на текст обработки "ОтладкаОбмена": //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ КОНВЕРТАЦИИ ОБЪЕКТОВ Процедура ПКО_ПередВыгрузкой_ЗаказНаПроизводствоТолькоСсылка(ФайлОбмена, Источник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО, ПКО, ВыгруженныеОбъекты, Отказ, КлючВыгружаемыхДанных, ЗапоминатьВыгруженные, НеЗамещатьОбъектПриЗагрузке, ВсеОбъектыВыгружены, ТолькоПолучитьУзелСсылки, Приемник, РежимЗаписи, РежимПроведения, НеСоздаватьЕслиНеНайден) Экспорт Если НЕ Параметры.Свойство("ЗаказыНаПроизводство") тогда Параметры.Вставить("ЗаказыНаПроизводство", Новый Массив); КонецЕсли; Если Параметры.ЗаказыНаПроизводство.Найти(Источник.Ссылка) = Неопределено И ЗначениеЗаполнено(Источник.Ссылка) Тогда Параметры.ЗаказыНаПроизводство.Добавить(Источник.Ссылка); КонецЕсли; Отказ = Истина; КонецПроцедуры Процедура ПКО_ПередВыгрузкой_КорректировкаЗаказаНаПроизводство(ФайлОбмена, Источник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО, ПКО, ВыгруженныеОбъекты, Отказ, КлючВыгружаемыхДанных, ЗапоминатьВыгруженные, НеЗамещатьОбъектПриЗагрузке, ВсеОбъектыВыгружены, ТолькоПолучитьУзелСсылки, Приемник, РежимЗаписи, РежимПроведения, НеСоздаватьЕслиНеНайден) Экспорт Если НЕ Параметры.Свойство("ЗаказыНаПроизводство") Тогда Параметры.Вставить("ЗаказыНаПроизводство", Новый Массив); КонецЕсли; Если Параметры.ЗаказыНаПроизводство.Найти(Источник.ЗаказНаПроизводство) = Неопределено И ЗначениеЗаполнено(Источник.ЗаказНаПроизводство) Тогда Параметры.ЗаказыНаПроизводство.Добавить(Источник.ЗаказНаПроизводство); КонецЕсли; КонецПроцедуры Процедура ПКО_ПередВыгрузкой_ОтчетМастераСмены(ФайлОбмена, Источник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО, ПКО, ВыгруженныеОбъекты, Отказ, КлючВыгружаемыхДанных, ЗапоминатьВыгруженные, НеЗамещатьОбъектПриЗагрузке, ВсеОбъектыВыгружены, ТолькоПолучитьУзелСсылки, Приемник, РежимЗаписи, РежимПроведения, НеСоздаватьЕслиНеНайден) Экспорт Если //Источник.Подразделение.Код = "000000136" И Источник.Статус = Перечисления.СтатусОПЗС.Черновик Тогда Отказ = Истина; КонецЕсли; Если НЕ Параметры.Свойство("ЗаказыНаПроизводство") тогда Параметры.Вставить("ЗаказыНаПроизводство", Новый Массив); КонецЕсли; Если Параметры.ЗаказыНаПроизводство.Найти(Источник.Заказ) = Неопределено И ЗначениеЗаполнено(Источник.Заказ) Тогда Параметры.ЗаказыНаПроизводство.Добавить(Источник.Заказ); КонецЕсли; Источник.Выпуск.Свернуть("Номенклатура, ЕдиницаИзмерения, Коэффициент, СерияНоменклатуры, НомерПартии, Спецификация","Количество"); КонецПроцедуры И другие подобные процедуры. Тут наблюдается следующее: Определяется свойство "ЗаказыНаПроизводство" в виде массива и идёт добавление в этот массив всех Заказов на производство, по которым идёт обмен. Везде один и тот же код, вот он: Если НЕ Параметры.Свойство("ЗаказыНаПроизводство") тогда Параметры.Вставить("ЗаказыНаПроизводство", Новый Массив); КонецЕсли; Если Параметры.ЗаказыНаПроизводство.Найти(Источник.Ссылка) = Неопределено И ЗначениеЗаполнено(Источник.Ссылка) Тогда Параметры.ЗаказыНаПроизводство.Добавить(Источник.Ссылка); КонецЕсли; Это всё делается для того, чтобы уже после обмена Все эти заказы пройти и сделать в них что-то, а потом провести. Как я предполагаю, при конвертации заказа в УПП в журнале событий появляется событие об изменении данного заказа. При этом изменении, или позже наш заказ распроводится, этой тонкости я ещё не знаю. Может кто знает? И, насколько я понял из того, что два изменения в лог пишется, то на данном этапе не происходит сбоя. Теперь самое интересное. После обмена у нас накопился массив изменённых заказов. Передаём этот массив в запрос и формируем и проходим дважды выборку: //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ КОНВЕРТАЦИИ (ГЛОБАЛЬНЫЕ) Процедура Конвертация_ПослеВыгрузкиДанных(ФайлОбмена) Экспорт Если Параметры.Свойство("ЗаказыНаПроизводство") тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДокументЗаказНаПроизводство.Ссылка, | ДокументЗаказНаПроизводство.ДатаЗапуска, | ДокументЗаказНаПроизводство.ДатаИсполнения, | ДокументЗаказНаПроизводство.КВИЛ_ПричинаЗадержки, | ДокументЗаказНаПроизводство.ИНТ_СтатусЗаказа КАК СБ_СтатусПроизводства |ИЗ | Документ.ЗаказНаПроизводство КАК ДокументЗаказНаПроизводство |ГДЕ | ДокументЗаказНаПроизводство.Ссылка В(&ЗаказыНаПроизводство)"; Запрос.УстановитьПараметр("ЗаказыНаПроизводство",Параметры.ЗаказыНаПроизводство); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ВыгрузитьПоПравилу(Выборка,,,,"ЗаказНаПроизводствоТолькоСтатус"); КонецЦикла; Запрос.УстановитьПараметр("ЗаказыНаПроизводство",Параметры.ЗаказыНаПроизводство); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ВыгрузитьПоПравилу(Выборка,,,,"ЗаказНаПроизводствоТолькоСтатус"); КонецЦикла; КонецЕсли; КонецПроцедуры Насколько такая практика правильная, я не знаю. Может подскажет кто? Итак, в нашем логе в УПП при нормальном обмене 4 записи. 3 изменения и 1 проведение. Последнее Изменение и Проведение в одной транзакции. Первая запись собственно обмен. Вторая - результат первого цикла: Запрос.УстановитьПараметр("ЗаказыНаПроизводство",Параметры.ЗаказыНаПроизводство); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ВыгрузитьПоПравилу(Выборка,,,,"ЗаказНаПроизводствоТолькоСтатус"); КонецЦикла; Третья и четвертая записи (Изменение и Проведение) - результат второго такого же цикла. Причём не ту же выборку проходим, а выполняем запрос заново. Может быть, данные изменятся после первого прохода. Это всё конечно мои предположения, но похоже на правду. Так вот, именно в этом уже глобальном событии - после основного обмена по плану, происходит между первым и вторым циклом сбой и второй цикл не выполняется, а соответственно, документ остаётся непроведённым. Что мне непонятно ещё, так это каким образом выполняется ВыгрузитьПоПравилу(Выборка,,,,"ЗаказНаПроизводствоТолькоСтатус"); // Производит выгрузку объекта в соответствии с указанным правилом конвертации // // Параметры: // Источник - произвольный источник данных // Приемник - xml-узел объекта приемника // ВходящиеДанные - произвольные вспомогательные данные, передаваемые правилу // для выполнения конвертации // ИсходящиеДанные - произвольные вспомогательные данные, передаваемые правилам // конвертации свойств // ИмяПКО - имя правила конвертации, согласно которому осуществляется выгрузка // УзелСсылки - xml-узел ссылки объекта приемника // ТолькоПолучитьУзелСсылки - если Истина, то выгрузка объекта не производится, только формируется // xml-узел ссылки // ПКО - ссылка на правило конвертации // // Возвращаемое значение: // xml-узел ссылки или значение приемника // Функция ВыгрузитьПоПравилу(Источник = Неопределено, Приемник = Неопределено, ВходящиеДанные = Неопределено, ИсходящиеДанные = Неопределено, ИмяПКО = "") Возврат ОбщиеПроцедурыФункции.ВыгрузитьПоПравилу(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО); КонецФункции ОбщиеПроцедурыФункции в данном случае - не пойму что. Смотрим в конструктор: Процедура Конструктор(Владелец) Экспорт Параметры = Владелец.Параметры; ОбщиеПроцедурыФункции = Владелец; ... Владелец. Кто в данном случае Владелец? Ладно, поищем в конфигурации ... Поиск строки "Функция ВыгрузитьПоПравилу("... Основная конфигурация Обработка.aps_ОбменДаннымиXML.Модуль объекта(9706, 1) : Функция ВыгрузитьПоПравилу(Источник = Неопределено, Основная конфигурация Обработка.КонвертацияОбъектовИнформационныхБаз.Модуль объекта(1568, 1) : Функция ВыгрузитьПоПравилу(Источник = Неопределено, Основная конфигурация Обработка.УниверсальныйОбменДаннымиXML.Модуль объекта(9216, 1) : Функция ВыгрузитьПоПравилу(Источник = Неопределено, Найдено вхождений: 3 Хорошо, посмотрим внутрь: Обработка КонвертацияОбъектовИнформационныхБаз // Производит выгрузку объекта в соответствии с указанным правилом конвертации // // Параметры: // Источник - произвольный источник данных // Приемник - xml-узел объекта приемника // ВходящиеДанные - произвольные вспомогательные данные, передаваемые правилу // для выполнения конвертации // ИсходящиеДанные - произвольные вспомогательные данные, передаваемые правилам // конвертации свойств // ИмяПКО - имя правила конвертации, согласно которому осуществляется выгрузка // УзелСсылки - xml-узел ссылки объекта приемника // ТолькоПолучитьУзелСсылки - если Истина, то выгрузка объекта не производится, только формируется // xml-узел ссылки // ПКО - ссылка на правило конвертации // // Возвращаемое значение: // xml-узел ссылки или значение приемника // // Функция ВыгрузитьПоПравилу(Источник = Неопределено, Приемник = Неопределено, ВходящиеДанные = Неопределено, ИсходящиеДанные = Неопределено, ИмяПКО = "", УзелСсылки = Неопределено, ТолькоПолучитьУзелСсылки = Ложь, ПКО = Неопределено, ВыгружатьСсылкиУПодчиненныхОбъектов = Истина, ВыгрузкаСтрокиНабораЗаписейРегистра = Ложь, УзелПредка = Неопределено, ИмяКонстантыДляВыгрузки = "", ЭтоВыгружаетсяОбъект = Неопределено, ЭтоПравилоСГлобальнойВыгрузкойОбъектов = Ложь, НеИспользоватьПравилоСГлобальнойВыгрузкойИНеЗапоминатьВыгруженные = Ложь) Экспорт // ОпределитьПКОПоПараметрам(ПКО, Источник, ИмяПКО); Если ПКО = Неопределено Тогда ЗП = ПолучитьСтруктуруЗаписиПротокола(45); ЗП.Объект = Источник; Попытка ЗП.ТипОбъекта = ТипЗнч(Источник); Исключение КонецПопытки; ЗаписатьВПротоколВыполнения(45, ЗП, Истина); // Не найдено ПКО Возврат Неопределено; КонецЕсли; .................................................... Процедура ОпределитьПКОПоПараметрам(ПКО, Источник, ИмяПКО) // Поиск ПКО Если ПКО = Неопределено Тогда ПКО = НайтиПравило(Источник, ИмяПКО); ИначеЕсли (Не ПустаяСтрока(ИмяПКО)) И ПКО.Имя <> ИмяПКО Тогда ПКО = НайтиПравило(Источник, ИмяПКО); КонецЕсли; КонецПроцедуры В обработке УниверсальныйОбменДаннымиXML: // Производит выгрузку объекта в соответствии с указанным правилом конвертации // // Параметры: // Источник - произвольный источник данных // Приемник - xml-узел объекта приемника // ВходящиеДанные - произвольные вспомогательные данные, передаваемые правилу // для выполнения конвертации // ИсходящиеДанные - произвольные вспомогательные данные, передаваемые правилам // конвертации свойств // ИмяПКО - имя правила конвертации, согласно которому осуществляется выгрузка // УзелСсылки - xml-узел ссылки объекта приемника // ТолькоПолучитьУзелСсылки - если Истина, то выгрузка объекта не производится, только формируется // xml-узел ссылки // ПКО - ссылка на правило конвертации // // Возвращаемое значение: // xml-узел ссылки или значение приемника // Функция ВыгрузитьПоПравилу(Источник = Неопределено, Приемник = Неопределено, ВходящиеДанные = Неопределено, ИсходящиеДанные = Неопределено, ИмяПКО = "", УзелСсылки = Неопределено, ТолькоПолучитьУзелСсылки = Ложь, ПКО = Неопределено, ЭтоПравилоСГлобальнойВыгрузкойОбъектов = Ложь, ВыборкаДляВыгрузкиДанных = Неопределено) Экспорт #Если Клиент Тогда ОбработкаПрерыванияПользователя(); #КонецЕсли // Поиск ПКО Если ПКО = Неопределено Тогда ПКО = НайтиПравило(Источник, ИмяПКО); ИначеЕсли (Не ПустаяСтрока(ИмяПКО)) И ПКО.Имя <> ИмяПКО Тогда ПКО = НайтиПравило(Источник, ИмяПКО); КонецЕсли; Если ПКО = Неопределено Тогда ЗП = ПолучитьСтруктуруЗаписиПротокола(45); ЗП.Объект = Источник; Попытка ЗП.ТипОбъекта = ТипЗнч(Источник); Исключение КонецПопытки; ЗаписатьВПротоколВыполнения(45, ЗП, Истина); // Не найдено ПКО Возврат Неопределено; КонецЕсли; .............................................. В обработке aps_ОбменДаннымиXML похожая картина. Нас интересует наше правило "ЗаказНаПроизводствоТолькоСтатус" - поиск по конфигурации ничего не дал. В приведенных выше листингах: ПКО = НайтиПравило(Источник, ИмяПКО); ИмяПКО = "ЗаказНаПроизводствоТолькоСтатус" Смотрим функцию НайтиПравило: Функция НайтиПравило(Объект, ИмяПравила="") Если Не ПустаяСтрока(ИмяПравила) Тогда Правило = Правила[ИмяПравила]; Иначе Правило = Менеджеры[ТипЗнч(Объект)]; Если Правило <> Неопределено Тогда Правило = Правило.ПКО; Если Правило <> Неопределено Тогда ИмяПравила = Правило.Имя; КонецЕсли; КонецЕсли; КонецЕсли; Возврат Правило; КонецФункции То есть правила задаются где-то в нашем плане обмена, только где? Будем искать ... |
|||
39
laby1
19.03.19
✎
09:56
|
Вот собственно это правило, только что оно мне даёт такого, чтобы решить проблему ...
<Правило><Код>ЗаказНаПроизводствоТолькоСтатус</Код><Наименование>Документ: Заказ на производство</Наименование><Порядок>1650</Порядок><СинхронизироватьПоИдентификатору>true</СинхронизироватьПоИдентификатору><ПриоритетОбъектовОбмена>Ниже</ПриоритетОбъектовОбмена><Источник>ДокументСсылка.ЗаказНаПроизводство</Источник><Приемник>ДокументСсылка.ЗаказНаПроизводство</Приемник><Свойства><Свойство><Код>1</Код><Наименование>Номер --> СБ_СтатусПроизводства</Наименование><Порядок>50</Порядок><Источник Имя="Номер" Вид="Свойство" Тип="Строка" /><Приемник Имя="СБ_СтатусПроизводства" Вид="Реквизит" Тип="ПеречислениеСсылка.СБ_СтатусыЗаказовНаПроизводство" /><ПередВыгрузкой>Значение = Источник.СБ_СтатусПроизводства;</ПередВыгрузкой></Свойство><Свойство Отключить="true" Поиск="true"><Код>2</Код><Наименование>Номер --> Номер</Наименование><Порядок>100</Порядок><Источник Имя="Номер" Вид="Свойство" Тип="Строка" /><Приемник Имя="Номер" Вид="Свойство" Тип="Строка" /></Свойство><Свойство Отключить="true" Поиск="true"><Код>3</Код><Наименование>Дата --> Дата</Наименование><Порядок>150</Порядок><Источник Имя="Дата" Вид="Свойство" Тип="Дата" /><Приемник Имя="Дата" Вид="Свойство" Тип="Дата" /></Свойство><Свойство Отключить="true"><Код>4</Код><Наименование> --> Комментарий</Наименование><Порядок>200</Порядок><Источник Имя="" Вид="" /><Приемник Имя="Комментарий" Вид="Реквизит" Тип="Строка" /></Свойство><Свойство><Код>5</Код><Наименование>ДатаЗапуска --> ДатаЗапуска</Наименование><Порядок>250</Порядок><Источник Имя="ДатаЗапуска" Вид="Реквизит" Тип="Дата" /><Приемник Имя="ДатаЗапуска" Вид="Реквизит" Тип="Дата" /></Свойство><Свойство><Код>6</Код><Наименование>ДатаИсполнения --> ДатаИсполнения</Наименование><Порядок>300</Порядок><Источник Имя="ДатаИсполнения" Вид="Реквизит" Тип="Дата" /><Приемник Имя="ДатаИсполнения" Вид="Реквизит" Тип="Дата" /></Свойство><Свойство><Код>7</Код><Наименование>КВИЛ_ПричинаЗадержки --> КВИЛ_ПричинаЗадержки</Наименование><Порядок>350</Порядок><Источник Имя="КВИЛ_ПричинаЗадержки" Вид="Реквизит" Тип="СправочникСсылка.КВИЛ_ПричиныЗадержкиВыполненияПартии" /><Приемник Имя="КВИЛ_ПричинаЗадержки" Вид="Реквизит" Тип="СправочникСсылка.КВИЛ_ПричиныЗадержкиВыполненияПартии" /><КодПравилаКонвертации>КВИЛ_ПричиныЗадержкиВыполненияПартии </КодПравилаКонвертации></Свойство></Свойства><Значения /></Правило> |
|||
40
laby1
19.03.19
✎
10:06
|
Мне бы понять такой момент - при обмене - когда идёт изменение уже проведённого документа, он, этот документ вообще когда распроводится, когда у него наступает отмена проведения и почему. То есть если у нас идёт обмен стандартный. Изменили мы в МЕС заказ, проведённый. Он в УПП также проведённый. Происходит обмен. В УПП документ почему распроводится то? Где искать это? То ли сам УПП его по каким-то причинам распроводит, либо это свойство обмена, что он распроводит документы?
|
|||
41
Cyberhawk
19.03.19
✎
10:16
|
Это поведение по умолчанию, когда включено отложенное проведение: могущий проводиться документ всегда записывается в режиме отмены проведения, а не могущий - в режиме записи.
|
|||
42
Cyberhawk
19.03.19
✎
10:17
|
При неудачной попытке проведения документ также записывается в режиме записи, т.е. остается непроведенным.
|
|||
43
laby1
19.03.19
✎
10:20
|
(41) что такое "могущий"?
|
|||
44
laby1
19.03.19
✎
10:24
|
Мне непонятно в правиле (39):
<Свойство><Код>1</Код><Наименование>Номер --> СБ_СтатусПроизводства</Наименование><Порядок>50</Порядок><Источник Имя="Номер" Вид="Свойство" Тип="Строка" /><Приемник Имя="СБ_СтатусПроизводства" Вид="Реквизит" Тип="ПеречислениеСсылка.СБ_СтатусыЗаказовНаПроизводство" /><ПередВыгрузкой>Значение = Источник.СБ_СтатусПроизводства;</ПередВыгрузкой></Свойство> Источник Номер, приемник СБ_СтатусПроизводства - почему тут номер. Потом перед выгрузкой всё же ставится СБ_СтатусПроизводства в значение. И почему СБ_СтатусПроизводства приемник? Если в УПП вообще такого поля нет. Как понять, может это при загрузке? Источник я то думал это МЕС ... |
|||
45
laby1
19.03.19
✎
10:25
|
(41) То есть документ в любом случае распроводится, если он был проведён? А если не проведён и не может быть проведён, он просто и не проводится?
|
|||
46
laby1
19.03.19
✎
10:34
|
Не пойму я в этом xml правила обмена - какая баз источник, а какая приёмник, как понять?
|
|||
47
Smile 8D
19.03.19
✎
11:04
|
(46) <Источник ВерсияПлатформы="8.0" ВерсияКонфигурации="1.2.1.2" СинонимКонфигурации="Оперативное управление производством, редакция 1.2">ОперативноеУправлениеПроизводством</Источник>
<Приемник ВерсияПлатформы="8.0" ВерсияКонфигурации="1.3.110.3" СинонимКонфигурации="Управление производственным предприятием, редакция 1.3">УправлениеПроизводственнымПредприятием</Приемник> |
|||
48
laby1
19.03.19
✎
11:08
|
Хотя в файле задано конкретно
<Источник ВерсияПлатформы="8.0" ВерсияКонфигурации="1.2.1.2" СинонимКонфигурации="Оперативное управление производством, редакция 1.2">ОперативноеУправлениеПроизводством</Источник><Приемник ВерсияПлатформы="8.0" ВерсияКонфигурации="1.3.110.3" СинонимКонфигурации="Управление производственным предприятием, редакция 1.3">УправлениеПроизводственнымПредприятием</Приемник> Источник МЕС, приемник УПП Тогда Что это за <Приемник Имя="СБ_СтатусПроизводства" Вид="Реквизит" Тип="ПеречислениеСсылка.СБ_СтатусыЗаказовНаПроизводство" /> Если в приемнике (УПП) такого реквизита нету. Но тогда непонятно, почему оно обычно работает, а иногда нет. И вообще не работает похоже, когда обмен запускают, когда он уже идёт регламентным заданием... |
|||
49
Smile 8D
19.03.19
✎
11:11
|
(48) Доступа к тому, кто писал правила вообще нет? Потому что тяжко вам разбираться в странно написанных правилах, не имея опыта работы с КД. Круто, конечно, что вы не сдаетесь и постепенно вникаете в суть происходящего.
|
|||
50
laby1
19.03.19
✎
11:14
|
А где и как посмотреть эти правила, их же наверняка конструируют где-то не в xml-файле.
В обработке "Универсальный обмен данными xml" я могу прочитать файл по кнопке "Прочитать правила обмена", она мне просто в таблице указывает галочками все метаданные. И всё. Я слышал, есть какая-то специальная конфигурация, но не понимаю ... |
|||
51
laby1
19.03.19
✎
11:14
|
(49) Да, телефоны заблокированы.
|
|||
52
laby1
19.03.19
✎
11:17
|
(49) А что делать, пробую разобраться :)
|
|||
53
Smile 8D
19.03.19
✎
11:43
|
(50) Я же выше уже расписывал в (31):
"Если до этого не работали с Конвертацией данных, то лучше поставьте эту конфигурацию, загрузите туда свои правила и поизучайте. Механизм довольно сложный, поэтому сходу разобраться не факт что получится. Возможно, потребуется почитать какие-то статьи, посмотреть курсы. Но в любом случае это полезно." В данном случае вас интересует "1С:Конвертация данных 2.0, версия 2.1.8.2" https://releases.1c.ru/version_files?nick=Conversion&ver=2.1.8.2 |
|||
54
Cyberhawk
19.03.19
✎
13:15
|
(43) Причастие настоящего времени от глагола "мочь"
|
|||
55
Cyberhawk
19.03.19
✎
13:16
|
(45) "документ в любом случае распроводится, если он был проведён?" // В обработке универсального обмена ХМЛ - да. Какая конкретно у тебя обработка для загрузки используется отсюда не видно, отладка в помощь.
|
|||
56
Cyberhawk
19.03.19
✎
13:17
|
Релиз КД, который тебе сватает товарищ из (53), тебе особо не поможет в понимании вопроса, как оно там работает при загрузке, т.к. это реализовано не в КД, а в обработке обмена.
|
|||
57
Smile 8D
19.03.19
✎
14:09
|
(56) Товарищ ответил на конкретный вопрос "А где и как посмотреть эти правила, их же наверняка конструируют где-то не в xml-файле.", посему вашу претензию считаю странной и нелогичной :)
|
|||
58
Cyberhawk
19.03.19
✎
14:19
|
(57) Хз о какой ты претензии
|
|||
59
laby1
20.03.19
✎
08:15
|
(57) Спасибо, Александр, конфигурация полезна, почитал про неё, правда пока не скачал, там, где Вы дали ссылку, требует пароль, на ИТС тоже почему-то пока не нашёл. Спасибо, Cyberhawk.
Вернёмся к нашим баранам. Я ошибся, сказав, что в УПП нет реквизита СБ_СтатусПроизводства, такой реквизит есть, я видимо не туда посмотрел. Так вот, в правиле (39) мне всё же непонятно в этом ПКО: <Свойство><Код>1</Код><Наименование>Номер --> СБ_СтатусПроизводства</Наименование><Порядок>50</Порядок><Источник Имя="Номер" Вид="Свойство" Тип="Строка" /><Приемник Имя="СБ_СтатусПроизводства" Вид="Реквизит" Тип="ПеречислениеСсылка.СБ_СтатусыЗаказовНаПроизводство" /><ПередВыгрузкой>Значение = Источник.СБ_СтатусПроизводства;</ПередВыгрузкой></Свойство> , зачем такая манипуляция а именно: Номер --> СБ_СтатусПроизводства, перед выгрузкой Значение = Источник.СБ_СтатусПроизводства почему нельзя было сделать так: СБ_СтатусПроизводства --> СБ_СтатусПроизводства В чём здесь сакральный смысл? |
|||
60
laby1
20.03.19
✎
08:54
|
Родилась такая мысль, а почему бы не во временную структуру параметров выгружать список заказов, а, например в некий регистр.
И при следующем обмене, если не прошёл в прошлый раз обмен, то подгрузить в список заказов и старые. А если заказ нормально провёлся, то и в регистре помечать, чтоб в следующий раз снова не проводить. Можно сразу в основном обмене писать, надежнее конечно, но затратно к базе обращаться, а можно и в постобработке (17). Как думаете? |
|||
61
laby1
20.03.19
✎
08:54
|
Или там в обмене запрещено писать в регистры?
|
|||
62
laby1
20.03.19
✎
11:03
|
Может кто знает что, напишите.
|
|||
63
Cyberhawk
20.03.19
✎
11:35
|
Не теми вопросами ты задаешься, не теми
|
|||
64
laby1
20.03.19
✎
11:50
|
(63) Я понимаю, о чём ты.
|
|||
65
Вафель
20.03.19
✎
11:54
|
загружать и проводить документы разными заданиями уже предлагали?
|
|||
66
Smile 8D
20.03.19
✎
11:59
|
Если механизм работает, но в каких-то ситуациях дает сбои, то правильнее разобраться в том как работает механизм и найти причину сбоев. А вы почему-то пытаетесь навесить новых костылей, не разобравшись до конца в работе механизма.
|
|||
67
laby1
25.03.19
✎
08:10
|
(65) Провести документы нужно как можно быстрее. К тому же список документов, которые необходимо перепровести формируется при этом обмене.
|
|||
68
laby1
25.03.19
✎
08:10
|
(66) Подозрение на то, что когда обмен запускается одновременно вручную пользователем и автоматически по расписанию.
|
|||
69
bolder
25.03.19
✎
08:33
|
(0) Тяжело Вам без знаний то...Пригласите специалиста.Или пройдите курсы , но это не быстро.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |