Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Пауза перед фоновым заданием.

Пауза перед фоновым заданием.
Я
   picom
 
17.02.21 - 11:02
В УТ11.4 есть дописка.
Событие при записи заказа клиента выгружает файло на FTP.
Запуск кодом
ФоновыеЗадания.Выполнить("Облачка.ВыгружаемЗаказ", Параметры, Новый УникальныйИдентификатор, "Выгрузка заказ");
Но теперь у нас же все асинхронно и иногда:
1. Иногда эта строка срабатывает еще до того как документ записан в базу, не може получить реквизиты.
2. Если два раза записали то одновременное чтение одного документа и запись в один файл.
Видимо нужна какая-то пауза перед началом выгрузки, как ее лучше организовать одной строкой (без регистрации объектов для обмена)?
 
 Партнерская программа EFSOL Oblako
   DrShad
 
1 - 17.02.21 - 11:09
выгружать лучше после записи объекта с реквизитами
   picom
 
2 - 17.02.21 - 11:12
(1) это какой тип события?
   zuza
 
3 - 17.02.21 - 11:28
(2) ПослеЗаписи =)
   zuza
 
4 - 17.02.21 - 11:31
+(3) лучше использовать подписку, и ни при записи, а наверно при проведении.
   picom
 
5 - 17.02.21 - 11:34
(4) не существует такой подписки
   DrShad
 
6 - 17.02.21 - 11:36
(5) сделай
   acht
 
7 - 17.02.21 - 11:37
(4) > при проведении
Затягивать транзакцию на время обмена с неторопливым FTP-сервером так себе идея. И да, что делать, если FTP в процессе внезапно умер - откатывать транзакцию? =)

Сделайте регистрацию в каком-нибудь плане обмена и выгрузку регламентным заданием.
   rozer76
 
8 - 17.02.21 - 11:37
послезаписи это только в форме если что. Я бы делал так "ПриЗаписи" в модуле, если Проведен=Истина пишем в РС а потом скопом РЗ обрабатываем этот РС и рассылаем на фтп
   rozer76
 
9 - 17.02.21 - 11:38
(7) опередил )
   rozer76
 
10 - 17.02.21 - 11:40
(8) ПриЗаписи уже ссыль есть и флаг Проведен ну а если проведение не сработает или запись то неявная транзакция не запишет в РС ну или в планобмена как в (7)
   DrShad
 
11 - 17.02.21 - 11:41
(7) причем тут затягивание трнзакции? ведь будет запущено фоновое задание в отдельном процессе
   DrShad
 
12 - 17.02.21 - 11:42
(10) при записи объекта, еще может не быть всех его реквизитов - в сабже же описано
   rozer76
 
13 - 17.02.21 - 11:43
(11) угу и транзакции там не будет ибо это фоновое и вот представим что транзакция записи дока откатилась а мы уже в фоновом отправляем ...
   rozer76
 
14 - 17.02.21 - 11:44
(12) в событии ПриЗаписи каких реквизитов не будет ? Объекта ? Все будет )

>>без регистрации объектов для обмена

нормально без этого не сделать ИМХО
   Serg_1960
 
15 - 17.02.21 - 11:49
:) Подсказка: паузу можно сделать не перед вызовом фонового задания, а в самом фоновом задании.
   DrShad
 
16 - 17.02.21 - 11:50
(13) подписка срабатывает после ОбработкиПроведения - откуда откат?
   rozer76
 
17 - 17.02.21 - 11:51
(16) подписка на какое событие ?
   Serg_1960
 
18 - 17.02.21 - 11:52
(16) Не откат, а Отказ = Истина от последующей подписки.
   DrShad
 
19 - 17.02.21 - 11:54
(17) ОбработкаПроведения же
   rozer76
 
20 - 17.02.21 - 11:56
(19) и что ? если Отказ=Истина в самой ОбработкаПроведения или подписке на нее или транзакция сама умерла то все и откатывается.
   timurhv
 
21 - 17.02.21 - 11:57
(0) Пишите в дополнительный реквизит, а лучше в регистр сведений "ДополнительныеСведения" признак "Готов к отправке" вместо плана обмена. Вставьте дополнительную обработку и выполняйте ее по расписанию.
   rozer76
 
22 - 17.02.21 - 11:59
(21) допреквизит - не вариант, если документ не проведен то когда это писать а он хранится в тч дока. А вот "ДополнительныеСведения" - норм
   DrShad
 
23 - 17.02.21 - 12:00
(20) если будет отказ в самой ОбработкеПроведения, то подписка не сработает
   rozer76
 
24 - 17.02.21 - 12:03
(23) это да ))
   Serg_1960
 
25 - 17.02.21 - 12:05
Ну ёпрст, программисты-пограмисты, зачем так всё усложнять?

Короче, автор, Вам нужна была пауза перед началом выгрузки желательно одной строкой?

ФоновыеЗадания.ПолучитьФоновыеЗадания(Новый Структура("Наименование", "Выгрузка заказ"))[0].ОжидатьЗавершения(ХХХ);// где ХХХ - время в секундах
   picom
 
26 - 17.02.21 - 12:06
(15) как сделать паузу правильно?
   rozer76
 
27 - 17.02.21 - 12:08
(25) ну какая пауза? 3 секунды а может 2 часа если док на 9999 строк ? Ну делай те нормально чтобы работало в 100%. У всех тут свыше 10 лет стажа и как такое предлагать... Ндя
   picom
 
28 - 17.02.21 - 12:08
(25) интересно.... спасибо
   DrShad
 
29 - 17.02.21 - 12:09
я бы перед выгрузкой просто проверил наличие движений
   ИС-2
 
30 - 17.02.21 - 12:11
(0) в фоновом задании сделать проверку - если документ не записан, то фоновое задание должно породить само себя
 
 
   ИС-2
 
31 - 17.02.21 - 12:12
правда есть риск закцикливания. И вырастает нагрузка на систему из-за постоянного опроса БД на факт записи документа
   DrShad
 
32 - 17.02.21 - 12:13
(31) написано же, что записан может быть еще без всех реквизитов
   rozer76
 
33 - 17.02.21 - 12:19
(30) ок, парни, теперь представим что фоновое родилось и админ грохнул его на кластере...случайно... на фтп ничего не уйдет а док создан и проведен  - это fail.
А так в норм. решении если транзакция записи дока завершилась успешно - создается запись в РС. Далее регулярно РЗ бежит по РС и в отдельно транзакции обрабатывает каждую запись РС и если отправка на фтп ОК - удаляет запись или "отмечает" ее как выполненную. Все.
   DrShad
 
34 - 17.02.21 - 12:21
(33) согласен, но это уже тема другого топика
   Serg_1960
 
35 - 17.02.21 - 12:32
(27) Ндя... автору достаточно сделать цикличную проверку на готовность документа к выгрузке (наличие в базе, факт проведения, контрольное блокирование и прочая, о чём тут уже писали) - и если документ не готов - пауза с повторной проверкой. частота, количество попыток, записи в журнал регистрации и прочие бантики и рюшечки - увольте, это уж без меня.
   rozer76
 
36 - 17.02.21 - 12:49
(35) проверки всегда хорошо и полезно делать, но не в фоновом которое стартует ТОЛЬКО один раз при записи и если упадет  - файло клиент не увидит
   Serg_1960
 
37 - 17.02.21 - 14:52
(36) Если тут на ветке отказываются от использования плана обмена, то я отказываюсь от участия в изобретении велосипедов с квадратными колесами, а также от обсуждения иных вариантов, например, (33), но замечу: сформированный файл тоже может "упасть" по дороге к клиенту (нужно подтверждение о доставке). Автор спросил за паузу - я подсказал. Не менее и не более.
   H A D G E H O G s
 
38 - 17.02.21 - 14:57
Автор, держи, не благодари

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

                    Прервать;
                КонецЕсли;
                КоличествоПопыток=КоличествоПопыток+1;
                Если КоличествоПопыток>5 Тогда
                    Возврат;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;
   Вафель
 
39 - 17.02.21 - 15:21
стартуй задание со структурой документа, а не с ссылкой


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.