|
Ожидание загрузки файла перед закрытием формы | ☑ | ||
---|---|---|---|---|
0
travelekb
21.10.24
✎
10:26
|
Добрый день.
Платформа 8.3.13, самописная клиент-сервер, без синхр, без модальности. В форме документа производится загрузка фотографий товара с локальной дисковой системы клиента. При проведении документа и закрытии формы, выполняется передача фотографий на сервер для дальнейшего там их сохранения с использованием НачатьПомещениеФайлов. Метод - асинхронный, соответственно форма закрывается быстрее, чем отрабатывает обратный вызов ОписанияОповещения и как результат файлы не успевают передаться на сервер. Как технически правильно организовать закрытие формы при проведении документа только после того, как файлы успешно были переданы на сервер (т.е. отработал обратный вызов НачатьПомещениеФайлов)? Причем не просто отказаться от закрытия выдав сообщение пользователю, а дождаться полной загрузки всех файлов и после этого закрыть форму. |
|||
1
Волшебник
21.10.24
✎
10:32
|
>> При проведении документа и закрытии формы, выполняется передача фотографий на сервер
Вот это зря... |
|||
2
travelekb
21.10.24
✎
10:45
|
(1) а как делать правильно при такой схеме работы?
Раньше было сделано, что при загрузке файла из локальной системы на клиенте, он сразу помещался во ВременноеХранилище, дальше уже на сервер при сохранении документа. Но из-за этого, при загрузке фото периодически подтормаживал клиент, как раз на время загрузки файла во Временное хранилище. Это раздражало пользователей, т.к. файлов иногда бывает 8-10 штук. Было решено переделать загрузку в момент закрытия формы, т.к. дальше уже идет работа с товаром (упаковать, положить на полку и т.д.), т.е. ожидание загрузки в этот момент уже не так критично, как в момент загрузки каждого файла в клиенте при работе с формой документа. |
|||
3
Волшебник
21.10.24
✎
10:47
|
(2) Проведение должно быть очень быстрое. Все операции с двоичными файлами надо выполнить заранее, до проведения, или уже после проведения.
|
|||
4
Мультук
гуру
21.10.24
✎
11:42
|
Вводим реквизит формы МожноПроводить : Булево
В ПередЗаписью, &НаКлиенте Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) если МожноПроводить = ЛОжь Тогда Отказ = Истина; КонецЕсли; КонецПроцедуры В (сори 8.3.13 нет, синтаксис НачатьПомещениеФайлов я не помню) Процедура ЗавершениеОбратныйВызов(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт После помещения файлов: 1) МожноПроводить = Истина 2) Или вызываем процедуру запись/проведение из формы Или выводим пользователю сообщение "Все поместилось можно проводить" |
|||
5
Fedor-1971
21.10.24
✎
10:56
|
(0) По уму, сделай кнопку на форме типа "Загрузить картинки ТМЦ", в при записи документа, просто проверь загружены картинки или нет
Но если хочешь извращений, то примерно так: 1. заводим реквизит формы ПоложилиВсеКартинки 2. в обработчике ПередЗакрытием: устанавливаем СтандартнаяОбработка = ПоложилиВсеКартинки Если НЕ ПоложилиВсеКартинки тогда АдресФайлаВоВременномХранилище = ""; обработано = новый ОписаниеОповещения("УспешноПоместили", ЭтотОбъект); НачатьПомещениеФайлаНаСервер(обработано,,,АдресФайлаВоВременномХранилище,ПутьКФайлу,УникальныйИдентификатор); Возврат; КонецЕсли; &НаКлиенте Процедура УспешноПоместили(Описание, допПараметры) экспорт Если НЕ Описание = Неопределено тогда ПоложилиВсеКартинки = Истина; . . . тут реализуешь алгоритм записи своих картинок в БД . . . КонецЕсли; КонецПроцедуры Повторюсь, так делать нехорошо |
|||
6
travelekb
21.10.24
✎
10:58
|
(3) ДО проведения, при работе с формой, это вызывает недовольство пользователей, из-за того, что при выборе и загрузке файла система "подвисает" на несколько секунд на момент передачи загруженного файла на сервер.
А вот вариант ПОСЛЕ попробую сейчас рассмотреть. Получается это ПослеЗаписи(Клиент) и ПослеЗаписиНаСервере, правильно? |
|||
7
Fedor-1971
21.10.24
✎
11:00
|
(4) тут главное, идея
А так-то при записи на сервер может и ошибка приключиться, и будет возможность у пользователя уточнить что делать, на крайний случай проинформировать об ошибке |
|||
8
Волшебник
21.10.24
✎
11:02
|
(6) Добавляй запись в регистр ОчередьЗагрузкиФайлов, которую обрабатывай регл.заданием. Файлы должны лежать на шаре
|
|||
9
travelekb
21.10.24
✎
11:01
|
(4) После помещения файлов: 1) МожноПроводить = ЛОжь тут наверное МожноПроводить = Истина |
|||
10
Fedor-1971
21.10.24
✎
11:04
|
(6) тогда нужно изменять логику прогрузки картинок
Как минимум, папка с оными должна быть видна для сервера, тогда регламентом можно подгрузить картинки под каждый документ |
|||
11
travelekb
21.10.24
✎
11:09
|
(10) так не получится сделать. Фото хранятся на клиенте (их несколько), во временных файлах, которые удаляются также после закрытия формы.
В любом случае их нужно сперва загрузить во ВременноеХранилище и получить адрес до закрытия формы. |
|||
12
sikuda
21.10.24
✎
11:22
|
(0) НачатьПомещениеФайлов
Не рекомендуется использовать, начиная с версии 8.3.15. |
|||
13
Мультук
гуру
21.10.24
✎
11:22
|
(12)
У автора 8.3.13 -- ему можно |
|||
14
travelekb
21.10.24
✎
11:24
|
(12) я бы рад использовать Ждать и механизм Обещаний. Но в 8.3.13 такого еще нет.
|
|||
15
travelekb
21.10.24
✎
11:27
|
(5) это хорошо "по уму", но не очень хорошо на практике.
Вот пользователь завершил работу с данными формы, наделал фотографий товара - ему нужно нажать "Провести" документ и уйти дальше за другим товаром. Вот в этот момент есть свободное время, когда можно/нужно грузить картинки на сервер. В случае с доп. кнопкой "Загрузить картинки ТМЦ", он нажимает ее и сидит ждет смотря в экран пока 10-15 фото не "доедут" на сервер. Это может занять до минуты. Только потом он сможет завершить документ и пойти дальше. |
|||
16
Волшебник
21.10.24
✎
11:29
|
(15) А если не загрузится, как пользователь об этом узнает?
|
|||
17
travelekb
21.10.24
✎
11:34
|
(16) когда он вернется со следующим товаром - увидит ошибку на экране и ему придется повторить загрузку. Но вероятность этого мала, по сравнению с вероятностью успешной загрузки файлов.
Это как в случае контроля остатков. Сперва проводим документ, а потом узнаем что товаров недостаточно и отменяем. |
|||
18
Мультук
гуру
21.10.24
✎
11:42
|
(9)
Исправил. |
|||
19
Fedor-1971
21.10.24
✎
11:51
|
(15) Добавь в обработчик "Загрузить картинки ТМЦ" ЭтаФорма.Записать(..) - и проводи документ, если ошибок нет, можешь следом закрыть форму
Нажал на кнопку и побежал за следующей партией, работы? Мне думается, что работник сильно странный, он 5 раз покурить сходит или 10 минут потратит на нужный ракурс съемки, а 1 минута на загрузку картинок так "Это долго" |
|||
20
travelekb
21.10.24
✎
12:06
|
(18) спасибо
(19) спасибо, думаю как раз то, что нужно. Вместо кнопки "ПроверитьЗакрыть" размещу на форме "ЗагрузитьФотоПровести". Загружу все фотографии, првоерю, а потом програмно закрою форму и проведу документ. Вариант с регистром ОчередьЗагрузкиФайлов тоже шибко понравился, но требует изменения логики хранения файлов на клиенте. Плюс клиенты в одном городе, сервер - в другом. Подумаю еще и в этом направлении. |
|||
21
maxab72
21.10.24
✎
12:26
|
(0) Записывайте картинки при проведении и закрытии в промежуточный регистр сведений - это будет быстро и можно делать синхронно. А на сервер их передавайте регламентным заданием пакетами, удаляя из промежуточного регистра.
|
|||
22
travelekb
21.10.24
✎
12:32
|
(21) Вы имеете ввиду на клиенте сохранять ФОТО в регистр(ХранилищеЗначений), а в регламентном задании сохранять их оттуда в файлы на сервере? Правильно понял?
|
|||
23
travelekb
21.10.24
✎
12:37
|
Разве это будет быстро? Ведь хранение происходит в самой базе данных. Получается также будет передача на сервер ,что и через ПоместитьВоВременноеХранилище.
|
|||
24
Мультук
гуру
21.10.24
✎
12:55
|
(21)
А можно перевод ? >> А на сервер их передавайте регламентным заданием пакетами, удаляя из промежуточного регистра. Регламентное задание (на сервере), берет что-то из регистра сведений (на сервере) и передаёт "на сервер". Хотя всё это уже на сервере, без вариантов |
|||
25
maxab72
21.10.24
✎
13:14
|
(24) Если автор понимает под словами "хранить на сервере" = хранить в БД, то это одно, а если "хранить на сервере" = хранить во внешних папках на сервере, то это другое.
|
|||
26
travelekb
21.10.24
✎
13:27
|
(25) вы считаете, что запись в ХранилищеЗначения будет происходить быстрее, чем запись во ВременноеХранилище?
Или тут главный плюс в том, что это можно сделать синхронно. |
|||
27
maxab72
21.10.24
✎
13:32
|
(26) Что вы подразумеваете под словами "выполняется передача фотографий на сервер для дальнейшего там их сохранения". Хранение в БД или хранение в "локальной дисковой системе"?
|
|||
28
travelekb
21.10.24
✎
13:33
|
(27) хранение в локальной дисковой системе на сервере
|
|||
29
Мультук
гуру
21.10.24
✎
13:33
|
(26)
Чтобы "это" сделать синхронно просто вместо НачатьПомещениеФайлов Используем ПоместитьВоВременноеХранилище в цикле далее массив данных "имя файла, адрес" отправляем на сервер, там раскладываем по полочкам, возвращаемся, проводим документ |
|||
30
maxab72
21.10.24
✎
13:36
|
(28) тогда разбиение на две задачи (отдельно и синхронно сохраняем файл во временном регистре и отдельно рег. заданием грузим их в папки на сервере) избавит от "Метод - асинхронный, соответственно форма закрывается быстрее, чем отрабатывает обратный вызов ОписанияОповещения и как результат файлы не успевают передаться на сервер".
|
|||
31
travelekb
21.10.24
✎
13:38
|
(29) (30) понял, благодарю. Попробую применить оба варианта.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |