Имя: Пароль:
1C
1С v8
Ошибка при выполнении подписки на события
,
0 Leo_Lito
 
10.05.23
10:05
Создал подписку на события при записи для выгрузки новых стран в справочнике страны мира. При добавлении из классификатора новой страны всплывает ошибка:
Невосстановимая ошибка
Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:по причине:
Ошибка SDBL:Открытых транзакций нет.
Выгрузки не происходит.
После перезапуска предприятия и повторения действий возникает такая же ошибка, но при этом предыдущая страна выгружается.
В чем может быть проблема?
1 Donkey_hot
 
10.05.23
10:08
(0) Страны мира - не такой уж динамично изменяющийся справочник. Почему бы не авторегистрацией?
2 Leo_Lito
 
10.05.23
11:54
(1) Я выбрал его случайно для отладки алгоритма. Я планирую вызывать подпиской на событие при записи процедуру, в которой работаю с обработкой Универсальный обмен данными в формате XML. Через регламентное задание все работает, а вот через подписку возникает ошибка, причину которой я не могу понять
3 Leo_Lito
 
10.05.23
11:57
(1) В обработке Универсальный обмен предусматривается авторегистрация изменений и работа с планами обмена, это я тоже использую. Но мою процедуру же нужно как-то вызывать. И, как я понимаю, тут два варианта: подписка/регламентное
4 RomanYS
 
10.05.23
12:00
Идея выгружать что-то в открытой транзакции - так себе
5 Leo_Lito
 
10.05.23
12:01
(4) А в чем проблема? Подскажите в какую сторону смотреть
6 Мультук
 
гуру
10.05.23
12:04
(5)

В сторону учебников, ИТС, курсов.

P.S.
Если пользователь обработкой поменяет 40 000 записей у вас 40 000 раз вызовется универсальный обмен ?
7 RomanYS
 
10.05.23
12:04
(5) Проблема в том, что общение с внешними системами (даже локальной файловой системой) может быть медленным и приводить к ошибкам... и это порушит транзакцию с данными.
8 Leo_Lito
 
10.05.23
12:06
(6) Вариант с обработкой не предусматривался, т.к. маловероятен
9 Leo_Lito
 
10.05.23
12:12
(7) Это можно как-то проверить или исправить?
10 Мультук
 
гуру
10.05.23
12:16
(9)

Чем не устраивает типовой механизм:
- регистрация нужных ссылок в плане обмена "через подписку/через авторегистрацию"
- выгрузка регламентным заданием по расписанию

?
11 Leo_Lito
 
10.05.23
12:24
(10) Это уже реализовал. Пробую другой подход
12 RomanYS
 
10.05.23
12:27
(9) журнал регистрации, отладчик...
(11)  этот путь неправильный в общем случае
13 Leo_Lito
 
10.05.23
12:29
(12) Так регламентное задание работает. Почему путь неправильный? Напишите, пожалуйста, подробнее
14 RomanYS
 
10.05.23
12:32
(13) так и оставь на регламентом задании. Почему неправильно наружу лезть в (7) написал.

Может ты в подписке умудрился зациклить запись?
15 Leo_Lito
 
10.05.23
12:41
(14) Идет спор: что из этого лучше. Сделать подписку, чтобы не тратить ресурсы регламентным заданием. Но с подпиской возникают такие вопросы.
16 Мультук
 
гуру
10.05.23
12:46
(15)

А в подписке расход ресурсов на вызов "Универсальный обмен" ради выгрузки одного элемента "по акции идёт со скидкой" ?

Может уже стоит показать код подписки в котором идёт работа с "Универсальный обмен" ?
17 Leo_Lito
 
10.05.23
12:53
(16)
Процедура ВыгрузкаВЕрпСтраныМира() Экспорт
    
    Узел = ПланыОбмена.ВыгрузкаВЕрпСтраныМира.НайтиПоКоду("ЕРП");
    Выборка = ПланыОбмена.ВыбратьИзменения(Узел, Узел.НомерОтправленного);
    
    Если Выборка.Следующий() Тогда
        
        ДатаОкончания = ТекущаяДата();
        ДатаВыгрузки  = Формат(ДатаОкончания, "ДФ=yyyy.MM.dd_hh.mm.ss");
        ПутьНаДиске   = "D:\Conversion\Черновики\Обмены\Страны мира\";    
        ФайлДанных    = ПутьНаДиске  + ДатаВыгрузки + "_From_ERP.xml";
        
        Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
        Обработка.РежимОбмена = "Выгрузка";    
        Обработка.ДатаНачала = НачалоДня(ДобавитьМесяц(ТекущаяДата(),-1));
        Обработка.ДатаОкончания   = КонецМесяца(ТекущаяДата());
        Обработка.ИмяФайлаОбмена  = ФайлДанных;
        Обработка.ИмяФайлаПравилОбмена  = ПутьНаДиске + "Правила\ПравилаОбменаДанными(СтраныМира).xml";
        Обработка.ЗагрузитьПравилаОбмена();
        Обработка.ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки=2;
        //ЕСЛИ НУЖНО ВЫГРУЖАТЬ ПО ПЛАНАМ ОБМЕНА, ТО ВКЛЮЧАЕМ ЭТОТ БЛОК И ПОДСТАВЛЯЕМ СВОЙ УЗЕЛ ПЛАНА ОБМЕНА
        Для Каждого Стр Из Обработка.ТаблицаПравилВыгрузки.Строки Цикл
            Стр.Включить=1;
            Для Каждого Стр1 Из Стр.Строки Цикл
                Стр1.Включить = 1;
                Стр1.СсылкаНаУзелОбмена = Узел;
            КонецЦикла;
        КонецЦикла;
        Обработка.ВыполнитьВыгрузку();
        
    КонецЕсли;
    
КонецПроцедуры
18 Leo_Lito
 
10.05.23
12:55
(16) Регламентное все равно планируется вызывать часто, т.к. данные желательно перебросить сразу, а не раз в день. Регламентное все равно будет скорее всего по одному гонять
19 RomanYS
 
10.05.23
13:02
(17) и на какое событие Вы это повесили? В ПриЗаписи изменения уже зарегистрированы?
20 Leo_Lito
 
10.05.23
14:01
(19) Вот и я к этому пришел. Нет, не зарегистрированы.
21 Мультук
 
гуру
10.05.23
14:25
(17)

1) А из какой конфы и какую информацию вы собираетесь "оперативно" грузить в ЕРП ?
Просто ЕРП, это "не просто" :-)

Странами мира ЕРП особо не испортишь, а вот всяким другим можно. И самое обидное сначала будет незаметно, а потом больно.

2) Сколько времени будет выполняться в вашей базе код
Обработка.ИмяФайлаПравилОбмена  = ПутьНаДиске + "КакиеНибудьВзрослыеПравилаСКучейОбъектов.xml";
Обработка.ЗагрузитьПравилаОбмена();

Лучше сразу замерить, чтобы потом не спрашивать себя "а что это у меня каждый объект по 5 минут пишется"

3) Лучше открыть новую тему и описать: что {объекты} откуда {имя конфигурации} и куда {ЕРП ?} вы собираетесь грузить
И почему это "срочно-важно"
22 Leo_Lito
 
10.05.23
14:40
(21) Может есть источник, где можно почитать об этих подводных камнях? Смотрел статьи на сайтах с замерами скорости передачи, сравнивал: всё нормально отрабатывает. Да и в любом случае, если вернуться к примеру на 40 000 объектов, то тут любой алгоритм будет их долго обрабатывать, а если бы переносимые данные были 1 к 1, то и смысла извращаться с КД не было бы.
23 Leo_Lito
 
10.05.23
14:50
(21) (14) А вообще спасибо за ответы. Изначальный вопрос я закрыл.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.