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

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

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

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

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

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

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