Имя: Пароль:
1C
1С v8
Загрузка файлов на сервер
0 osipovsa
 
27.10.24
12:22
Привет всем.
Изучаю УФ, задача следующая. На форме табличная часть. Есть 30000+ документов РТУ. К ним Формируем печатные формы на сервере по 2000 документов, пригоняем на клиент, подписываем клиентским(!) сертификатом с флешки. Далее задача - сформировать на сервере к каждой РТУ электронный документ (отдельный док в базе самописный) и эти файлы прицепить к документам ЭДО. Соответственно раз каталог клиентский, то нужно их передать на серевер. Передаю также блоками, через БСП загрузить файлы.
Но проблема в том, что когда я делаю загрузить файлы - эта процедура асинхронная и моя клиентская процедура на форме завершается. После чего форма становится доступной и пользователь может её закрыть, не дождавшись завершения.
Думал сделать через фоновые, но фоновое задание можно запустить только с сервера. А когда я передал файлы на сервер и там запускаю фоновое - форма уже разблокирована.

Подскажите кто сталкивался как сделать правильно.
1 SleepyHead
 
гуру
27.10.24
12:47
(0) Обработчик ожидания?
2 maxab72
 
27.10.24
15:39
(0) буквально на днях уже была подобная тема.
Возможные решения, это или не разблокировать форму до окончания операции (сделать какую-то проверку, что все выгрузилось), или фоновое задание, быстро но синхронно сохраняя файлы в каком-то промежуточном хранилище, и потом асинхронно пакетами записывая на сервере в папки на диске.
3 Смотрящий
 
27.10.24
15:43
Флешку пробросить, не ?
4 osipovsa
 
27.10.24
18:56
Фоновые задания я написал уже - запускаются в процедуре с директивой НаСервере. Это не подходит, т.к. файлы положить так не получится из фонового. Сертификаты на сервер пробросить никто не даст, т.к. филиалов много и у каждого свой руководитель со своим сертификатом. На сервер их устанавливать никто не даст. Единственное пока что вижу - дать пользователю выбирать серверный каталог, доступный с клиента и тогда можно подписанные файлы сразу брать на сервере (без помещения их на сервер). Но выглядит как костыль если честно.
5 osipovsa
 
27.10.24
18:57
(1) - можно подробнее про обработчик ожидания? Что мне это даст и как видите реализацию?
6 Garykom
 
гуру
27.10.24
19:01
Но проблема в том, что когда я делаю загрузить файлы - эта процедура асинхронная и моя клиентская процедура на форме завершается. После чего форма становится доступной и пользователь может её закрыть, не дождавшись завершения.

проблема высосана из пальца
7 osa1C
 
27.10.24
20:12
8 osipovsa
 
28.10.24
05:26
(6) - прекрасный ответ. Дай бог чтобы на ваши вопросы отвечали всегда также ясно и по теме.
9 Мультук
 
гуру
28.10.24
08:02
(8)

Объявляем реквизит формы Низзя Булево

При вызове "ЗагрузитьФайлы"
Низзя = Истина;


В "передЗакрытиемФормы" делаем проверку

Если Низзя = Истина Тогда
   Отказ = Истина;
   Сообщить("Пользователь, нельзя закрыть форму! ");
КонецЕсли;


Когда загрузка файлов завершится, то твой (ваш) алгоритм вызовет процедуру ОповещенияОЗавершении, которая сделает

Низзя = Ложь;



Синтаксис:
НачатьПомещениеФайлаНаСервер(<ОписаниеОповещенияОЗавершении>, <ОписаниеОповещенияОХодеВыполнения>, <ОписаниеОповещенияПередНачалом>, <Адрес>, <ПутьКФайлу>, <УникальныйИдентификаторФормы>)
10 osipovsa
 
28.10.24
08:49
(9) Спасибо. Это понял. Вопрос был в том что я в цикле выполняю НачатьПомещениеФайловНаСервер. А нужно было сделать очередь и процедуру обработки каждого блока (не в цикле)

Подскажите пожалуйста дальше кто понимает:
Есть у меня на форме теперь таблица, у которой 30000 строк, строки разбиты по блокам (в таблице колонка НомерБлока) по 2000 строк в блоке (тут неважно количество). Я пригнал документы на сервер, нужно эти 2000 обработать.
У Табчасти в УФ на сервере нет метода Найти. Есть только НайтиСтроки. А у меня есть массив со ссылками на документы РТУ, к которым нужно создать ЭДО и прикрепить эти файлы. Но  найтиСтроки для поиска уникального значения - это норм? Выглядит как-то не очень.
Я могу выгрузить весь блок по номеру блока из табличной части в таблицу значений (2000 строк условных наших), обработать его, но потом всё равно же придется искать каждую обработанную строку, чтобы вставить ссылку на созданный документ ЭДО в табличную часть.
Чет туплю, подскажите как правильно делается в УФ.
11 Мультук
 
гуру
28.10.24
09:25
(10)

>> Но  найтиСтроки для поиска уникального значения - это норм?
Нет слова "норм" и не "норм". Есть "устраивает по производительности" и "не устраивает".


&НаСервере
Функция ОбработатьБлок(НомерБлока, Табчасть)
     нс = ТабЧасть.НайтиСтроки(Новый Структура("НомерБлока", НомерБлока));

     Для каждого строка из нс Цикл
        
           строка.ссылкаЭДО = СоздатьЭДО(строка.СсылкаРТУ);
        
     КонецЦикла;

КонецФункции
12 Волшебник
 
28.10.24
09:25
(10) Блоки не нужны.
13 osipovsa
 
28.10.24
10:26
(11) - спасибо, сделал.
(12) - почему блоки не нужны? Мне как раз надо разбить на блоки, т.к. филиалы в разных городах. И например тащить на сервер 30000 файлов печ.форм с дальнего востока в москву - может быть очень долго по времени.
14 Волшебник
 
28.10.24
10:28
(13) Говорю же, блоки не нужны. Поставьте загрузку в фоновый режим, само докачается.
15 osipovsa
 
28.10.24
11:02
(14) А как это сделать? Есть пример такой работы?
Или вы под фоновым режимом имеете ввиду запустить одно фоновое задание на загрузку и просто подождать выполнения?
И всё же я пока не понимаю. 30000 файлов. По 100Кб каждый минимум (не забываем что у нас pdf, они тяжелые). Итого общий размер 3Гб примерно. Есть сомнения в использовании ФайловаяСистемаКлиент.ЗагрузитьФайлы сразу для всего объёма.
16 Волшебник
 
28.10.24
11:11
(15) Грузите по 1 файлу
17 osipovsa
 
28.10.24
11:24
(16) Я планирую вывести на форму параметр и в зависимости от количества документов и города выставлять значение сколько документов будет лететь в одном блоке по сети на сервер. По 1 точно не будет. Но я понял что вы имели в виду, спасибо, подумаю как вариант.
18 Волшебник
 
28.10.24
11:21
(17) Вот не надо заниматься хернёй и всё получится.
Кстати, пишется "иметь в виду"
19 osipovsa
 
28.10.24
11:25
(19) "иметь ввиду" - согласен, исправил.