Имя: Пароль:
1C
 
Как лучше передать большую таблицу значений с формы в фоновое задание?
0 toypaul
 
гуру
30.03.26
13:09
Можно сказать первый раз пришлось столкнуться с загрузкой больших объемов на постоянной основе. Соот-но делаю через ФЗ.
Таблица значений (большая) на форме, в которой пользователь будет заполнять какие-то поля по умолчанию.

Далее эту таблицу можно передать
- Т.Выгрузить() напрямую параметров в ФЗ
- РеквизитФормыВЗначение тоже напрямую (так, например, делается в типовой загрузке из файла)
- Положить ТЗ во временное хранилище

Есть также таблица, которую не нужно показывать пользователю. Ее сразу планирую положить в ХЗ и передавать адресом.
1 Chai Nic
 
30.03.26
13:16
А что вам даст помещение таблицы во временное хранилище в плане её обработки фоновым заданием? Как ФЗ её вытащит?
2 toypaul
 
гуру
30.03.26
13:20
(2) я почем знаю? я ж не разработчик платформы. методы передачи разные. потому и спрашиваю какой из них предпочтительней.
3 toypaul
 
гуру
30.03.26
13:24
Насчет "большого" размер. Сейчас максимально файл экселя 400 тыс строк. Размер самого файла 88 Мб.

Не все из этого попадает в таблицу на форму - только новые артикулы. Но может быть тоже несколько сотен тысяч.

Вот и вопрос РеквизитФормыВЗначение как делается в типовых это быстро, но может быть затратно по памяти?

А через хранилище, например, может быть медленней, но менее затратно по памяти. Никуда гонять эту таблицу больше не нужно будет. Обработка в одном ФЗ. Ну может несколько потоков (и то не факт).

Может не загоняться и сделать как в типовой через РеквизитФормыВЗначение?
4 Мультук
 
гуру
30.03.26
13:35
(0)

А зачем здесь РеквизитФормыВЗначение ?

&НаСервере

Процедура ПослатьНаТаблицуЗначений()

    тз = ОченьБольшаяТаблицаНаформе;

    //Что-то делаем  

КонецПроцедуры

5 toypaul
 
гуру
30.03.26
13:38
(4) потому что таблица на форме. коллекцию я же не могу передать в ФЗ
6 Мультук
 
гуру
30.03.26
14:05
(5)
&НаСервере

Процедура ПослатьДалекоТаблицуЗначений()
    //Затупил немного
    //!тзКакОбычнаяТаблицаЗначений = ОченьБольшаяТаблицаНаформеКотораяКакКоллекция.Скопировать();
    тзКакОбычнаяТаблицаЗначений = ОченьБольшаяТаблицаНаформеКотораяКакКоллекция.Выгрузить();

    //Лень смотреть
    Сообщить(Строка(типЗнч(ОченьБольшаяТаблицаНаформеКотораяКакКоллекция)));
    Сообщить(Строка(типЗнч(тзКакОбычнаяТаблицаЗначений )));

    //Что-то делаем  

КонецПроцедуры
7 Garykom
 
гуру
30.03.26
13:53
(0) Если таблицы очень большие - лучше хранить в БД
Если с БД никак (нельзя РС или еще что добавить) можно в СУБД во временных таблицах (в фоновом крутится на МВТ)
Передавать только изменения чтобы не таскать все
8 RomanYS
 
30.03.26
13:58
(6) скорее всего ошибка будет)
Выгрузить() - чтобы получить ТЗ
9 toypaul
 
гуру
30.03.26
14:00
(7) не. это изврат какой-то. не для этой задачи.
10 Garykom
 
гуру
30.03.26
14:04
(9) Тогда передавать через .Выгрузить() и смириться с тормозами
11 H A D G E H O G s
 
30.03.26
14:14
1. Потестировать ТЗ.
2. Если чет подозрительно - писать в РС с отбором по первому Измерению - УникальномуИдентификатору, которое генерится под каждую ТЗ и потом по нему считывать ТЗ в Фоновом и чистишь. Еще в РС можно писать Дату и иногда удалять записи, у которых дата прошлая, так как это мертвые фз.
12 toypaul
 
гуру
30.03.26
14:25
(11) Понял. Находил какую-то древнюю тему 14го года с обсуждением этой темы. Там было про 12 млн строк.

Тут гораздо меньше. Я думаю остановится передачу ТЗ параметром. Тут же нет сериализации? А при помещении во врем. хранилище как я понял есть?

Получается плохо помещать большие ТЗ во врем. хранилище что ли? У меня там вторая таблица еще больше. Она не для пользователя и чтобы при переходах туда-сюда ее не гонять (а там интерфейс с переходом Вперед-Назад) я ее помещаю.
13 SleepyHead
 
гуру
30.03.26
14:30
(0) Помести исходный файл на сервер и работай с ним оттуда.
14 toypaul
 
гуру
30.03.26
14:33
(13) Так я вроде объяснил что есть часть файла, с которой пользователь должен работать. И вообще сначала анализируем файл (для чего его приходится целиком читать на клиенте), потом пользователь на этом основании производит настройки. И только потом загрузка. Нет автономности. Иначе не было бы таких вопросов.
15 Fish
 
гуру
30.03.26
14:33
(13) Всё равно надо на клиент передавать и обратно, чтобы пользователи могли с ней работать.
16 Garykom
 
гуру
30.03.26
15:15
Иногда хочется чтобы реквизиты и ТЧ обработок были доступны на сервере через язык запросов
Теоретически такое в платформе можно реализовать, как раз через временные таблицы в СУБД
Живущие пока открыта обработка и сеанс
17 AlexKimp
 
30.03.26
15:21
(16) Хм. Зачем тогда всю таблицу отправлять в ФЗ? Почему не отправить деревом структур только отредактированные строки? "400 тыс." Ну, допустим. Навряд ли пользователь за раз тыщ 100 обработает (это если я правильно проэкстрасенсил, чего там происходит с этими строками). Почему не организовать постраничную передачу данных на клиента? Странная история. Ресурсы надо экономить и грамотно балансировать между рантаймом и БД
18 Мультук
 
гуру
30.03.26
15:45
(17)

Объясните пожалуйста, зачем в этой задаче дерево ?
Зачем в этой задаче массив структур ?

И главное, зачем таблицу значений из (допустим) 100 тыс строк
превращать в массив структур ?

Какова цель и в каком месте будет экономия (и на чём) ?
19 AlexKimp
 
30.03.26
15:48
(18) Так и не надо 100 тыс. Я пытаюсь понять, зачем вообще всё это нужно. Мне стало очень нехорошо уже на стадии ответа про 400 тыс строк. Каков смысл задачи? Если пазл в моей голове сошелся верно, то предлагается загрузить на форму файл экселя с диким количеством строк, пользователь чего-то там тыкает, вся таблица отправляется на сервер для помещения в ФЗ для обработки.
20 Fedor-1971
 
30.03.26
15:51
(14) Тогда нет смысла использовать фоновое задание.
Пользователь вчитал файлик, проанализировал и задал некие настройки - посидит 5 минут пока грузится файл (чаю успеет попить).
Если очень надо - запустит параллельно ещё одну 1С и будет работать
21 Fedor-1971
 
30.03.26
15:56
20+ А так, то для ФЗ (7) прав, загоняем в менеджер временных таблиц нужные строки и отправляем его в ФЗ
Получим, временную таблицу SQL и работаем в фоне с оной

На запись в РС время нужно, но если строк замного, тогда имеет смысл поработать с ним
22 ДенисСмирнов
 
30.03.26
15:55
(19) что там за оператор, который работает с ТЧ в "несколько сот тысяч строк". не просто жмет "ок, отправь всю эту хрень дальше", а что-то смотрит и видит
23 Fedor-1971
 
30.03.26
15:57
(22) Например, отбирает пустое подразделение и заполняет оное в строках
24 maxab72
 
30.03.26
15:59
(23) одно для всех пустых или вдумчиво изучат каждую строку?
25 Мультук
 
гуру
30.03.26
16:03
P.S.
Я в детстве ненавидел игру "испорченный телефон".
А похоже зря
26 toypaul
 
гуру
30.03.26
16:27
(19) Поскольку доступ к телу заказчика ограничен, то тут смысла я не вижу всю чепуху рассказывать которую придумали. Тут аналитики еще не с такой дичью приходят. А выпендриваться и учить уму разуму чужих аналитиков - время не то.

Пытаемся найти компромисс. Пользователи еще не с такой дичью приходят. Например, им файл этот в 400 тыс. ни жить ни быть нужен обратной с колонокой с результатами обработки. Никого не интересует, что смотреть это вряд ли кто-то будет. Надо и все тут.

Я же написал, что это будет файл с новыми артикулами. Там будет присваиваться обязательно вид номенклатуры, и еще пара необязательных. Как они это собираются делать - мне не докладывали и не собираются. Поэтому моя задача - сделать, аналитика - запустить, пользователя в случае чего придти и попросить переделать. Или оставить как есть.
27 Конструктор1С
 
30.03.26
19:33
(0) а зачем нужно ФЗ? Если не веб-клиент, то можно и так сделать. Ну покурят десять секунд, вместо двадцати секунд наблюденмя длительного кота
28 Garykom
 
гуру
30.03.26
19:58
(27) ФЗ нужно для параллельной обработки в несколько потоков
29 craxx
 
30.03.26
20:04
(20) "запустит параллельно ещё одну 1С и будет работать"
А лицензии на это ты ему купишь?
30 ЕRPe
 
30.03.26
20:40
(0) Для начала пристрелите разработчиков, которые заставляют пользователей работать с очень большой таблицей напрямую. Дальше полюбому фиксация введенных данных (запись или проведение) и только после этого запуск нужного количества фоновых. Зы. Если смотреть типовые то еще перед фоновым запись в регистр "Задания для...""
31 Garykom
 
гуру
30.03.26
21:22
(30) С большими данными как раз приходится бывает работать
Понятно через отборы

Имхо на месте ТС можно рассмотреть вариант отдельной конфы с нужными метаданными, которая запускается из основной как форма
После завершения в ней работы, данные забираются в основную конфу
Дополнительный обмен данными можно через http-сервисы

Или работы с внешней СУБД (где нужные большие таблички) через ВИД из 1С
Тут все просто, обычный ДинСписок на форме с запросами
32 Garykom
 
гуру
30.03.26
21:23
(31)+ Эмм а можно ведь уже полностью программно Внешние Источники Данных создавать?
Так банально базу на sqlite поднимаем и крутим в ней что надо
33 ЕRPe
 
30.03.26
21:46
(31) Да можно проще за счет проработки архитектуры:
Ну допустим парсим валбериз/озон или другую мусорную гору.
Везде есть категории/подкатегрии, Созданием предварительный документ на каждую категорию, а лучше категорию + подкатегорию со статусом "разобрать ховно" (уже будет не 400000 строк). Пользователь проходит и ставит галочки где нужно - документ получает статус "разобранное ховно" и делает задание "переработать в золото". Старые документы можно просто чистить.
34 Garykom
 
гуру
30.03.26
21:54
(33) Как понял ТС очень хочет простой внешней обработкой обойтись
Без записи всех этих 400 тыщ строк из файла экселя в базу

Вот и предлагаю писать их не в основную базу 1С а в нечто внешнее
И работать так же в этом внешнем
Или же обрабатывать данные по сути там, а выборками отображать в интерфейсе

Сразу при загрузке выбрать только нужную(ые) категории из файла экселя тоже вполне вариант
Грузить и работать только с ними да
Затем следующие
35 timurhv
 
30.03.26
22:47
(12) Добавьте регистр сведений и не мучайтесь. Помещение в хранилище и тп - затратно по ресурсам, есть ограничения по размеру. Плюс это все сжирает ОЗУ на сервере.

Сейчас можно довольно быстро это все писать \ удалять.
https://infostart.ru/1c/articles/2508120/

Но если у вас 12 млн строк запись и еще больше во вспомогательной, то будьте готовы к блокировкам (если несколько пользователей будут писать туда). Отборы и тп не помогут, т.к. свыше 50к записей заблокируется весь регистр сведений на период записи \ удаления.
36 toypaul
 
гуру
31.03.26
08:05
(34) Тут грузится прайс запчастей. Все 400 тыс. грузятся. Обновляются как минимум цены. Могу обновляться какие-то реквизиты. Должны создаваться новые позиции (по новым артикулам).

Старые позиции не проблема грузить без взаимодействия с человеком. Новые позициям должны взаимодействовать с человеком, чтобы заполнить обязательные поля. Я конечно преувеличил, что новых может быть 400. По идее должно быть сильно меньше.

(35) Ради этого какие-то регистры создавать - фигня какая-то. (27) Поскольку обработка по времени будет грузить где-то (думаю) от 30 мин до пары часов и запускать ее будет человек, то блокировать интерфейс неправильно. Поэтому работать будет в фоновом задании. Возможно в несколько потоков (тестирование покажет).

Проверил на 8 тыс строк. Передача и просто обход всей таблицы занимает 3 сек. Это просто передача ТЗ как параметра в ФЗ. Так и оставлю - лишь бы не упало по памяти на 400 тыс строк.
37 toypaul
 
гуру
31.03.26
08:09
И еще раз - я тут не на фикси, где каждую строчку кода можно вылизывать и доводить до ума. Тут проект. У проекта время, бюджет. Сопротивление аналитиков и пользователей (покалеченных САПом). Мне оно надо все эти квесты проходить?

Да я работал на фикси довольно долго. Еще на 7ке. Непосредственный доступ к заказчику (зам. директора), начальнику ИТ и пара-тройка исполнителей. Вот там можно было любую красоту реализовать.
38 Fish
 
гуру
31.03.26
09:23
(36) "лишь бы не упало по памяти на 400 тыс строк." - А это уже не твои проблемы. Так и скажешь: хотите обрабатывать большие объёмы, докупите ещё памяти.
39 Fedor-1971
 
31.03.26
10:22
(29) Поставь лицензию локально и запускай сколько тебе вздумается 1С без раздачи оных с сервера
Таки, фоновое - откусит лицензию для себя, не?
40 ProxyInspector
 
31.03.26
11:00
(38) Помнится ты мне рекомендовал разбивать большую таблицу на таблице по 1000 строк :)
41 ProxyInspector
 
31.03.26
11:05
У меня реально Exell файл на 1 млн строк. И с ним надо работать.
  Я использую ТабличнуюЧасть обработки для передачи данных с Клиента на Сервер.
  Памяти конечно все это жрет немерено. Если Exell файл в бинарном формате имеет размер 10 мб. Открывается за 10 сек. В 1С ТаблицаЗначений из этого файла имеет размер 10 гБ и открывается за пару минут
42 Fedor-1971
 
31.03.26
11:06
(40) это если процесс обработки валится по памяти, например, на стареньких компахх
43 Fedor-1971
 
31.03.26
11:11
(41) А заполняешь таблицу на Сервере или на Клиенте?
Тут момент - при загрузке наКлиенте будут проходить неявные вызовы сервера и включаться тормоза по мере увеличения таблицы
44 Fish
 
гуру
31.03.26
11:16
(40) Ну так разные ситуации - если идёт некая автоматическая обработка таблицы, то разбивка и, в некоторых случаях распараллеливание, имеет смысл.
А когда речь идет тупо о передаче с клиента на сервер - то тут, имхо, смысла разбивать никакого нет.
45 Garykom
 
гуру
31.03.26
11:55
(44) А не надо такие массивы данных с клиента на сервер гонять
Смысла обычно нету
46 Garykom
 
гуру
31.03.26
11:56
Если в ТЗ миллионы строк - их явно надо хранить в некой базе
Внутри 1С или снаружи уже отдельный вопрос
47 ProxyInspector
 
31.03.26
16:06
(43) Можно и на сервере и на клиенте заполнять. Благо в Exell реквизиты либо число либо строка.
   Заполняются данные из Файла EXELL. Потом идем НаСервер и там уже обрабатываем данные
48 ProxyInspector
 
31.03.26
16:07
(46) Так это и есть некая база. В которой уже наверно под 1 млрд строк.
49 timurhv
 
31.03.26
16:15
(41) Потому что Excel вас обманывает.

Вставьте в каждую ячейку большой текст в миллион ячеек. Удивитесь, но текст будет фигурировать только 1 раз в sharedStrings.xml
А в ячейках на листах будет только на порядковый номер записи из sharedStrings.xml (притом нумерация там не с 0, а с 1 начинается).
50 H A D G E H O G s
 
31.03.26
16:15
(47) ПолеТабличногоДокумента, в нее загружаем Excel файл на клиенте, в процессе редактирования и обработки обходимся без контекстных серверных вызовов, нажимаем кнопку "Обработать", на клиенте записываем ТабДок в ПотокВПамяти, отправляем поток во внеконтекстный серверный вызов, там восстанавливаем в ТабДок на сервере, обрабатываем его.

ПередЗакрытием очищаем ТабДок на клиенте.
51 timurhv
 
31.03.26
16:19
(50) Не надо) Лучше уж в JSON прогнать с табличного документа и передать на сервер.
52 ProxyInspector
 
31.03.26
16:54
(50) На сколько я понимаю при чтении Exell файла НаКлиенте в ТабличнуюЧасть не происходит Серверных вызовов. Когда ты переходишь на сервер, то идет всего один серверный  вызов. где передается вся ТабличнаяЧасть
53 ProxyInspector
 
31.03.26
16:56
(51) JSON c ТабличногоДокумента в 100 тыс. строк. Это серьезно
54 craxx
 
31.03.26
17:12
(53) если сжать предварительно - не так уж и много. JSON хорошо сжимается zip-ом
55 timurhv
 
31.03.26
17:45
(53) Ну хотя да, долго сохраняет ТабДок в JSON.
Можно как вариант ТабДокумент сохранить в Excel и потом на сервере прочитать сразу в ТаблицуЗначений:
https://infostart.ru/1c/articles/225624/
56 Garykom
 
гуру
31.03.26
18:11
(50) Интересная идея
Причем данные для выбора/заполнения прочитанного ТабДок можно &НаСервереБезКонтекста дернуть с сервера разом или в процессе

Да и обрабатывать перебором строки можно прямо на клиенте, не нагружая сервер
Но код на клиенте будет выглядеть странно, сплошная работа и поиск по массивам/структурам/соответствиям
57 timurhv
 
31.03.26
23:44
(56) Так проблема в 1С то что ТабличныйДокумент даже если он пустой, сожрет неглядя 90Гб ОЗУ.
Неоптимальная работа с ним, могу даже примеры обработки скинуть на 1 млн строк, просто выводишь ТабличныйДокумент и гоняешь с клиента на сервер - полная жопа. Данных нет, ОЗУ сожрано на сервере в ноль, все пользователи стоят раком.
58 timurhv
 
31.03.26
23:49
(41) Примерно вот такая ситуация. Я хз что там в 1С курят, могли бы уже этот момент оптимизировать и не выделять ОЗУ под пустые ячейки. Все-таки ТабличныйДокумент по-сути Отче наш, на нем все крутится. Весь учет по-сути это вывод печатных формы на выходе или выгрузка в АПИ, налоговую, ФСС и тд.
Притом с выгрузками и АПИ все в целом чет движется, а ТабличныйДокумент извините положили разрабы платформы большой и жирный Х...Й
59 Garykom
 
гуру
01.04.26
09:09
(57) Пофиг на ТабДок
Суть в идее
Можно ПолеHTML использовать вместо ТабДок

Или если большой ТабДок жрет много RAM то использовать маленький по размеру экрана
И данные обновлять из массивов при "прокрутке" ))
60 Fynjy
 
01.04.26
09:20
БСП ТаблицаЗначенийВМассив и передать массив. Было?
61 Fish
 
гуру
01.04.26
10:17
(57) Не используй табдокумент. Используй таблицу. Так-то табдокумент в первую очередь предназначен для вывода на печать, а не для редактирования таблиц.
62 Мультук
 
гуру
01.04.26
10:22
(60)

Кусок ОЗУ нарежется как-то более по другому ? (таки да)
Байты скукожатся или что ?
63 timurhv
 
01.04.26
10:49
(61) Так это были этикетки для печати по товарам  с 60 тыс. марками ЧЗ. Искал причину, в итоге даже пустой ТабДок столько ОЗУ и съедало плюс-минус.
В итоге сделал вывод таких больших заказов в pdf файлы + склейка в единый файл.
64 Fynjy
 
01.04.26
17:44
(62) разные объекты, разная работа с памятью. Из-за ТЗ утечки памяти есть, из-за массивов нет. Но у тебя скукожился это да.
65 Chai Nic
 
02.04.26
08:09
(55) А если применить нерекомендуемое ЗначениеВСтрокуВнутр для сериализации при передаче? Оно должно быть быстрее JSON.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс