Имя: Пароль:
1C
1С v8
Обмен РИБ, как записать изменения конфигурации программно?
0 tixis
 
25.12.17
10:01
Кто писал сообщения для риб программно? В общем ситуация такая, есть риб, в некоторых случаях получается так, что в файл обмена сначала записывается например документ, а потом договор контрагента, из за этого при загрузке документа появляется ошибка, т.к. договора еще нет. Переписал на выгрузку программно, примерно как в той теме v8: Порядок выгрузки данных через план обмена, но у меня ошибки при выгрузке из центра и соответственно мне нужно контролировать изменения конфы и выгружать конфу в случае необходимости.
1 impulse9
 
25.12.17
10:08
В плане обмен апоставь галочку "Распределенная ИБ", система сама будет отслеживать изменения конфигурации
2 Serg_1960
 
25.12.17
10:21
(0) "... есть риб... в файл обмена сначала записывается например документ, а потом договор контрагента, из за этого при загрузке документа появляется ошибка" - у Вас одно из двух: или у Вас не РИБ, или Вы заблуждаетесь насчет причин возникновения ошибки. Для РИБ не имеет принципиального значения порядок изменений в сообщении обмена.
3 Serg_1960
 
25.12.17
10:26
Третий вариант возникновения ошибки (наиболее распространённый) - это внесение изменений в типовую конфигурацию, не учитывающих признак обработки сообщений обмена - пресловуто-знаменитое "Объект.ОбменДаннми.Загрузка = Истина".
4 tixis
 
25.12.17
10:50
Это РИБ. https://i.imgur.com/CchqBO6.png  
структура файла при выгрузке https://i.imgur.com/9PMO1tG.png
5 tixis
 
25.12.17
10:51
Ошибки такие начали встречаться, после конвертации базы с 8.1 на 8.3 (конвертировали из за того, что для 8.1 нет программных лицензий)
6 Фрэнки
 
25.12.17
11:01
а может быть вся проблема в том, что изменения конфигурации хоть и приняты в приемнике, но никто не догадался их применить к базе? Сидят себе полученные изменения, а некому перезапустить базу в конфигураторе и отжмакнуть F7
7 tixis
 
25.12.17
11:06
(6) нет, если программно формировать файл обмена , то изменения конфы и не записываются. Весь вопрос в том как определить что нужно выгрузить конфу и как собственно выгрузить саму конфу
8 Фрэнки
 
25.12.17
11:14
У меня нет под руками того примера, где самостоятельно было прописана вся кухня для РИБ. Там есть специально предопределенные процедуры в модуле Пална обмена, при прохождении которых изменения конфигурации в файл выгрузки попадают. Т.е. включил РИБ = включил использование предопределенных процедур

Сформировал желаемый файлик измененных данных "программно" = не использовал процедуры РИБ (грубо говоря, поломал, похе.р.ил)
9 Рэйв
 
25.12.17
11:27
(0)>>из за этого при загрузке документа появляется ошибка, т.к. договора еще нет.

Неправда.Все заполненные ссылки приходят вместе с документами.
Просто объекты приходят потом.
Ты бы хоть текст ошибки выложил.
10 tixis
 
25.12.17
11:36
(9) текст ошибки:
Проведение документа: Расходный кассовый ордер 00007939 от 15.12.2017 13:46:28 (Оплата поставщику)
Выбран договор контрагента, не соответствующий организации, указанной в документе!
Ошибка при чтении изменений при обмене РИБ:  Ошибка при вызове метода контекста (ПрочитатьИзменения): В данной транзакции уже происходили ошибки!

если смотреть в отладчике, то в договоре "ОбъектНенайден"
11 tixis
 
25.12.17
11:37
Если снять с регистрации данный документ, провести обмен, потом поставить на регистрацию данный документ, то все пройдет как надо, т.к. договор уже будет в базе применике
12 Фрэнки
 
25.12.17
11:48
(10) как-то странно, что принимаемый из обмена документ перепроводится. Это же ни фига не РИБ, а какая-то самодеятельность. Зачем такой обмен обзываете РИБ? Хотите мозги людям запудрить?
13 Serg_1960
 
25.12.17
11:49
Если мне память не изменяет, то я встречал темы про ошибки обновления платформы 8.3, когда механизм платформы переставал обрабатывать изменения конфигурации...
14 Рэйв
 
25.12.17
11:52
(10)Интересно, а строки в ПередЗаписью ты убрал чтоли?

Если ОбменДанными.Загрузка=Истина Тогда
    Возврат;
КонецЕсли;
15 Рэйв
 
25.12.17
11:53
(10)Не должно быть никаких проверок при загрузке РИБ
16 Фрэнки
 
25.12.17
11:56
(15) вангую, что он свою собственную загрузку данных из пакета сделал, в которой к объектам не приписывается Загрузка=Истина
17 Serg_1960
 
25.12.17
11:56
PS: "Третий вариант" как я и предупреждал в (3) :))
18 Serg_1960
 
25.12.17
11:58
(16) Вангую: скорее всего источник проблемы - "своя" подписка на событие.
19 Фрэнки
 
25.12.17
12:00
(18) но сообщение об ошибки типовое - не из самопальной подписки.
20 Serg_1960
 
25.12.17
12:04
(7) и (8) РИБ вообще и миграция изменений конфигурации в частности  - это внутриплатформенный механизм. Делаешь выгрузку по плану обмена РИБ ==> платформа вписывает зарегистрированное изменение конфигурации перед записью данных.
21 Serg_1960
 
25.12.17
12:06
+(13) Кстати, нашёл: риб не передает изменения конфигурации после обновления платформы. Но у автора, вероятно, не этот случай.
22 Фрэнки
 
25.12.17
12:06
(20) об том и речь, что он "ПРОГРАММНО" записал файл обмена. Не может платформа вписать изменение в формируемый пакет, т.к. не используется механизм платформы, реализованный во время вызова предопределенных процедур из модуля плана обмена.
23 Рэйв
 
25.12.17
12:08
(22)ЗаписатьИзменения от ПланаОбменаМенеджер вполне нормально записывает изменения конфы
24 Serg_1960
 
25.12.17
12:10
(22) Ооо... действительно "программно" - это ключевое слово темы :) Тут всяко может быть. Безграничный простор фантазии - от разумного до премии Дарвина :))
25 tixis
 
25.12.17
12:19
пока программно ничего не записывается, это только в процессе реализации, пока работают стандартные механизмы РИБ
26 tixis
 
25.12.17
12:20
это при стандартном обмене валятся такие ошики
Вот код выгрузки
Если ЭтоРИБ Тогда
                
                // Создаем новое сообщение
                ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

                ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);
                
                // для РИБ изменения в информационной базе
                ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, СтруктураНастроекОбменаДанными.КоличествоЭлементовВТранзакцииНаВыгрузкуДанных);
                
                // Завершаем запись сообщения
                ЗаписьСообщения.ЗакончитьЗапись();
                    
                ЗаписьXML.Закрыть();
                
                СтруктураНастроекОбменаДанными.РезультатЗаписиДанных = Истина;
27 tixis
 
25.12.17
12:21
это из модуля ПроцедурыОбменаДанными, на сколько я вижу, здесь ничего не комментровалось и не изменялось, работает стандартный механизм
28 catena
 
25.12.17
12:22
А в документе? ПередЗаписью?
29 tixis
 
25.12.17
12:22
(28)
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

    мУдалятьДвижения = НЕ ЭтоНовый();

    Если ОбменДанными.Загрузка  Тогда
        Возврат;
    КонецЕсли;

    СтруктураДействий = Новый Структура("УстановитьДоговор");
    УправлениеДенежнымиСредствами.ВыполнитьДействияПередЗаписьюПлатежногоДокумента(ЭтотОбъект, СтруктураДействий, Отказ, РежимЗаписи, РежимПроведения);

КонецПроцедуры // ПередЗаписью
30 Serg_1960
 
25.12.17
12:23
(23) В принципе, можно только читать зарегистрированные изменения по плану, а остальное формировать "вручную" как обычный файл XML. Можно даже сформировать любой заголовок, в том числе - якобы от имени плана обмена РИБ.

Кстати это дело неподсудное. Я так делал. Когда надо было передать данные любой ценой, а обмен блокировало по ошибкам типа "конфигурация не соответствует ожидаемой". Или когда возникала необходимость залить данные из архива с устаревшей конфигурацией...
31 Фрэнки
 
25.12.17
12:25
(29) скорее, в процедуре при получении данных
32 tixis
 
25.12.17
12:27
(16) не очень из тебя предсказатель, чтение проходит тоже стандартным механизмом
Процедура ЗагрузитьCообщениеСИзменениямиОтРИБУзла(СтруктураНастроекОбменаДанными, ЧтениеXML, КонфигурацияИзмененаПриОбменеРИБ = ЛОжь)
    
    СтруктураНастроекОбменаДанными.РезультатЧтенияДанных = Истина;
    КонфигурацияИзмененаПриОбменеРИБ = Ложь;

    // Загрузка из найденного файла
    ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
    ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

    Попытка
        ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения, СтруктураНастроекОбменаДанными.КоличествоЭлементовВТранзакцииНаЗагрузкуДанных);
        
        ЧтениеСообщения.ЗакончитьЧтение();
        ЧтениеXML.Закрыть();
33 Фрэнки
 
25.12.17
12:28
(30) я стараюсь разделять обмены на системную часть (РИБ и самые нужные общие данные) и обмены по подсистемам, которые не имеют флага РИБ. На стороне получателя в перифрийной базе стоит опрос каталога на появление файла. Таким образом, если конфиг по РИБ прилетит, то его тоже обработает.
34 Serg_1960
 
25.12.17
12:29
tixis, фишка в том, что имея типовой функционал - при обмена данным невозможно нарваться на ошибки проведения - во время РИБ-обмена документы не проводятся. Максимум отложенное проведение. Но и оно после обмена.

Смотри свои изменения в конфигурации, проверяй подписки, регламентные и фоновые.
35 Фрэнки
 
25.12.17
12:30
(32)

// ПланыОбмена.ПрочитатьИзменения(

там цикл должен быть, в котором устанавливается в объекты Загрузка=Истина
36 tixis
 
25.12.17
12:30
(34) такие ошибки появились после конвертации на 8.3, раньше все штатно работало, решили перейти на лицензию и тут вылезли косяки
37 tixis
 
25.12.17
12:32
(35) не совсем понял, где должен быть цикл? это же платформенная процедура
38 tixis
 
25.12.17
12:47
Сейчас проверил в самом документе, действительно не у всех прилетевших документов флаг ОбменДанными.загрзука установлен. У каких то есть, у каких то нет.
39 Serg_1960
 
25.12.17
12:52
(36) Забудь про платформу, забудь про алгоритмы самого обмена - имхо, это всё не то, это всё не там.

Почему во время обмена вдруг возникает перепроведение расходного кассового ордера? Так не должно быть. Вот в чём ключевой вопрос.
40 Serg_1960
 
25.12.17
12:54
Кстати, а проверка платформы была сделана после обновления платформы? Ну, та которая "Конфигурация" - "Проверка конфигурации...".
41 Serg_1960
 
25.12.17
12:55
Тьфу, "проверка платформы" читать как "проверка конфигурации", естественно.
42 tixis
 
25.12.17
13:01
(41) проверка была после, ничего криминального нет, есть неиспользуемые функции (ну проверка выдавала что типа не обнаружено ссылок на функция или процедуру такую то)
43 Serg_1960
 
25.12.17
13:07
(38) А эти документы, те которые без флага обмена, - они точно с обменом прилетают, они точно в обмене есть? Может быть (не исключено) проведение кассового ордера "порождает" другой документ в обмене?
44 tixis
 
25.12.17
13:08
(43) я проверил, они присутсвуют в файле обмена
45 tixis
 
25.12.17
13:14
в самом плане обмена, есть процедура Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад), в нее уже прилетает  ЭлементДанных.ОбмеДнными.Загрузка = Ложь;

по поводу, почему проводятся документы, в этой же процедуре это все прописано, если тип документ такой то, тогда режимЗаписи.Провдение. хз зачем так сделано, но делалось это судя по комментариям 01.03.2013
46 Фрэнки
 
25.12.17
13:25
(45) ну вот это ЭлементДанных.ОбмеДанными.Загрузка = Ложь; и врубает проверку всех реквизитов в процедурах, где обычно указано Если ОбмеДанными.Загрузка = Истина Тогда Возврат; КонецЕсли;
47 Фрэнки
 
25.12.17
13:27
и скорей всего, когда РежимЗаписи.Проведение, тогда же и Загрузка = Ложь
48 Serg_1960
 
25.12.17
13:43
(45) "тогда РежимЗаписи.Проведение" - бинго :)
Сравни на всякий случай с конфигурацией поставщика на предмет типового функционала.
49 tixis
 
25.12.17
14:45
А как быть с документами. которые реально надо проводить? Ест в этой процедуре переопределение документа, т.е. прилетает реализация, если это реализация для данного филиала, то вместо реализации создается поступление и его надо провести. В этом документе может пристуствовать новая номенклатура, которая была только что создана, и вместо нее будет объект не найден и документ не проведется. Видать все таки придется программно формировать самому файл выгрузки
50 Фрэнки
 
25.12.17
16:15
(49) как быть, как быть... я писал выше - отделяйте котлеты от мух. Изменение конфигурации делать по одному плану обмена, а обмен, сопровождающийся конвертацией данных - по другому. Соответственно, либо при выгрузке (имхо, при выгрузке это проще сделать) сложить все объекты в файл обмена, либо при загрузке. Как адекватно сделать при загрузке даже затрудняюсь придумать.
51 Фрэнки
 
25.12.17
16:18
все объекты в начале выгрузки выбрать в список и отсортировать в нужной последовательности, т.е. назначить при первом проходе очередность записи в файл, затем повторно пробежать по этому же списку и сложить все в файл.
52 Serg_1960
 
25.12.17
20:53
"А как быть с документами. которые реально надо проводить?" - изучить и творчески :) применить типовой функционал "отложенное проведение" (допроведение). Погугли.
AdBlock убивает бесплатный контент. 1Сергей