Имя: Пароль:
1C
1С v8
При ошибке обмена остаются непроведённые документы
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_Перемещение --&gt; УПП_Перемещение</Наименование>
    <ДатаВремяСоздания>2018-10-28T19:23:18</ДатаВремяСоздания>
    <Источник ВерсияПлатформы="8.0" ВерсияКонфигурации="1.2.1.2" СинонимКонфигурации="Оперативное управление производством, редакция 1.2">ОперативноеУправлениеПроизводством</Источник>
    <Приемник ВерсияПлатформы="8.0" ВерсияКонфигурации="1.3.110.3" СинонимКонфигурации="Управление производственным предприятием, редакция 1.3">УправлениеПроизводственнымПредприятием</Приемник>
    <ПослеВыгрузкиДанных>Если Параметры.Свойство("ЗаказыНаПроизводство") тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|    ДокументЗаказНаПроизводство.Ссылка,
|    ДокументЗаказНаПроизводство.ДатаЗапуска,
|    ДокументЗаказНаПроизводство.ДатаИсполнения,
|    ДокументЗаказНаПроизводство.КВИЛ_ПричинаЗадержки,
|    ДокументЗаказНаПроизводство.ИНТ_СтатусЗаказа КАК СБ_СтатусПроизводства
|ИЗ
|    Документ.ЗаказНаПроизводство КАК ДокументЗаказНаПроизводство
|ГДЕ
|    ДокументЗаказНаПроизводство.Ссылка В(&amp;ЗаказыНаПроизводство)";
Запрос.УстановитьПараметр("ЗаказыНаПроизводство",Параметры.ЗаказыНаПроизводство);
Выборка = Запрос.Выполнить().Выбрать();    
Пока Выборка.Следующий() Цикл
    ВыгрузитьПоПравилу(Выборка,,,,"ЗаказНаПроизводствоТолькоСтатус");
КонецЦикла;

Запрос.УстановитьПараметр("ЗаказыНаПроизводство",Параметры.ЗаказыНаПроизводство);
Выборка = Запрос.Выполнить().Выбрать();    
Пока Выборка.Следующий() Цикл
    ВыгрузитьПоПравилу(Выборка,,,,"ЗаказНаПроизводствоТолькоСтатус");
КонецЦикла;
КонецЕсли;</ПослеВыгрузкиДанных>
    <ПередЗагрузкойДанных>Параметры.Вставить("ДокументыДляПроведения", Новый Массив);</ПередЗагрузкойДанных>
    <ПослеЗагрузкиДанных>Выполнить(Алгоритмы.ВыполнитьПроведениеДокументов);</ПослеЗагрузкиДанных>
    <ПриПолученииИнформацииОбУдалении>МетаданныеОбъекта = Объект.Метаданные();

Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
    Отказ = Истина;
    
    УстановитьПометкуУдаленияУОбъекта(Объект, Истина, "Справочник");
    
ИначеЕсли Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
    Отказ = Истина;
    
    Если Объект.Проведен Тогда
        ОтменитьПроведениеОбъектаВИБ(Объект, ТипЗнч(Объект), Ложь);
    КонецЕсли;
    
    УстановитьПометкуУдаленияУОбъекта(Объект, Истина, "Документ");
    
ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеОбъекта) Тогда
    Отказ = Истина;
    
    УстановитьПометкуУдаленияУОбъекта(Объект, Истина, "ПланВидовХарактеристик");
    
КонецЕсли;</ПриПолученииИнформацииОбУдалении>
    <Параметры/>
    <Обработки/>
    <ПравилаКонвертацииОбъектов>
..."
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</Код><Наименование>Номер --&gt; СБ_СтатусПроизводства</Наименование><Порядок>50</Порядок><Источник Имя="Номер" Вид="Свойство" Тип="Строка" /><Приемник Имя="СБ_СтатусПроизводства" Вид="Реквизит" Тип="ПеречислениеСсылка.СБ_СтатусыЗаказовНаПроизводство" /><ПередВыгрузкой>Значение = Источник.СБ_СтатусПроизводства;</ПередВыгрузкой></Свойство><Свойство Отключить="true" Поиск="true"><Код>2</Код><Наименование>Номер --&gt; Номер</Наименование><Порядок>100</Порядок><Источник Имя="Номер" Вид="Свойство" Тип="Строка" /><Приемник Имя="Номер" Вид="Свойство" Тип="Строка" /></Свойство><Свойство Отключить="true" Поиск="true"><Код>3</Код><Наименование>Дата --&gt; Дата</Наименование><Порядок>150</Порядок><Источник Имя="Дата" Вид="Свойство" Тип="Дата" /><Приемник Имя="Дата" Вид="Свойство" Тип="Дата" /></Свойство><Свойство Отключить="true"><Код>4</Код><Наименование> --&gt; Комментарий</Наименование><Порядок>200</Порядок><Источник Имя="" Вид="" /><Приемник Имя="Комментарий" Вид="Реквизит" Тип="Строка" /></Свойство><Свойство><Код>5</Код><Наименование>ДатаЗапуска --&gt; ДатаЗапуска</Наименование><Порядок>250</Порядок><Источник Имя="ДатаЗапуска" Вид="Реквизит" Тип="Дата" /><Приемник Имя="ДатаЗапуска" Вид="Реквизит" Тип="Дата" /></Свойство><Свойство><Код>6</Код><Наименование>ДатаИсполнения --&gt; ДатаИсполнения</Наименование><Порядок>300</Порядок><Источник Имя="ДатаИсполнения" Вид="Реквизит" Тип="Дата" /><Приемник Имя="ДатаИсполнения" Вид="Реквизит" Тип="Дата" /></Свойство><Свойство><Код>7</Код><Наименование>КВИЛ_ПричинаЗадержки --&gt; КВИЛ_ПричинаЗадержки</Наименование><Порядок>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</Код><Наименование>Номер --&gt; СБ_СтатусПроизводства</Наименование><Порядок>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</Код><Наименование>Номер --&gt; СБ_СтатусПроизводства</Наименование><Порядок>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) Тяжело Вам без знаний то...Пригласите специалиста.Или пройдите курсы , но это не быстро.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан