1. Genda 09.10.19 11:48 Сейчас в теме

Долгий возврат с сервера на клиент

Всем доброго времени суток!
Есть обработка с ТЧ (колонок:90+; строк может быть: 30000+). ТЧ на форму обработки НЕ выведена, но ее данные используются для отрисовки в табдоке информации для пользователя + данные ТЧ используются в команде.
В процедуре выбора в табдоке происходит открытие другой формы (форма2), в которую из формы обработки (форма1) передаются некоторые данные (через Адрес в хранилище). Для того чтобы получить нужные данные для передачи в форму2 в процедуре события выбора табдока (НаКлиенте) вызывается серверная процедура, после чего происходит возврат на клиента (платформенный) и открытие формы2 с передачей в параметрах открытия Адреса с нужными данными.
Если ТЧ содержит большое количество строк, то платформенный возврат с сервера на клиент происходит очень долго: порядка 10-12 секунд!
Пыталась делать без контекста (варианты описаны ниже), но пока безуспешно.

Были уже испробованы следующие варианты:
Вариант 1:
- с клиента вызываем процедуру НаСервере
- в процедуре НаСервере получаем Объект через РеквизитФормыВЗначение и передаем в процедуру НаСервереБезКонтекста (в ней получаем нужные данные и помещаем в хранилище по адресу (ПоместитьВоВременноеХранилище))
- после возврата НаСервер сохраняем Адрес в реквизит Объекта
- происходит платформенный возврат НаКлиента для открытия формы2 - висит очень долго при большой ТЧ!

Вариант 2:
- на клиенте помещаем все данные (в том числе и Объект.ТЧ) в структуру параметров
- вызываем процедуру НаСервереБезКонтекста в которую передаем структуру параметров - начинает висеть уже на данном этапе, т.к. передается вся ТЧ (как я понимаю)

Вариант 3:
- на клиенте через Объект.ТЧ.НайтиСтроки() получаем Массив только нужных нам данных. Массив помещаем в структуру параметров
- вызываем процедуру НаСервереБезКонтекста в которую передаем структуру параметров - возникает ошибка "Ошибка отображения типов:
Отсутствует отображение для типа 'ДанныеФормыЭлементКоллекции'" - т.к. элементы массива это ДанныеФормыЭлементКоллекции

Моя фантазия на этом закончилась...
Подскажите, пожалуйста, как минимизировать это время возврата? Как вообще корректно работать с управляемыми формами с большими ТЧ?
Найденные решения
10. Sashares 18 09.10.19 14:26 Сейчас в теме
(1)Единственный вариант - не использовать ТЧ. Будь она табличной частью объекта или реквизитом формы - не важно.
То есть вся работа таблицей идет на сервере.
По завершению работы с таблицей она помещается во временное хранилище и вот адрес временного хранилища и хранится в реквизитах формы.
Когда надо еще что-то сделать - идем на сервер, достаем таблицу из адреса, правим ее, помещаем обратно.

Если же таблица есть в реквизитах объекта или формы, вне зависимости от того, выводите вы таблицу на форму или нет, при контекстных вызовах она будет передаваться на сервер и обратно.
Остальные ответы
Избранное Подписка Сортировка: Древо
10. Sashares 18 09.10.19 14:26 Сейчас в теме
(1)Единственный вариант - не использовать ТЧ. Будь она табличной частью объекта или реквизитом формы - не важно.
То есть вся работа таблицей идет на сервере.
По завершению работы с таблицей она помещается во временное хранилище и вот адрес временного хранилища и хранится в реквизитах формы.
Когда надо еще что-то сделать - идем на сервер, достаем таблицу из адреса, правим ее, помещаем обратно.

Если же таблица есть в реквизитах объекта или формы, вне зависимости от того, выводите вы таблицу на форму или нет, при контекстных вызовах она будет передаваться на сервер и обратно.
13. Genda 09.10.19 14:31 Сейчас в теме
(10) Вот это уже интереснее. Попробую, спасибо.
17. Sashares 18 09.10.19 14:47 Сейчас в теме
(13)Чтобы было повеселее работать с таблицей (поиск там, отбор) можно ей добавить индекс по полям поиска/отбора.
18. Genda 10.10.19 12:24 Сейчас в теме
(17) Перевела 3 ТЧ в программно создаваемые ТЗ во временном хранилище, в результате: если ранее форма2 открывалась ~1,5 минуты, то теперь за 1,25 секунды!
Правда пришлось изменить некоторые процедуры, т.к. ТЗ и ТЧ - это разные сущности.

Sashares, а не подскажете есть ли какие-то риски в использовании данного метода?
Почитала что если в методе ПоместитьВоВременноеХранилище в параметр адрес указать УИД формы обработки, то все данные будут "жить" пока "жива" форма. Также прочла что данные живут в рамках сеанса.
Есть вопрос: если обработка будет запущена у разных пользователей в одно время, конфликтов в данных при использовании ПоместитьВоВременноеХранилище /ПолучитьИзВременногоХранилища не возникнет? Не будет такого что пользователь1 перезапишет данные по адресу пользователя2?
Вроде как если данные по адресу хранятся в рамках сеанса, то такого быть недолжно, но хотелось бы услышать мнение тех, кто реально с этим работал.
19. Sashares 18 10.10.19 12:33 Сейчас в теме
(18)
Перевела 3 ТЧ во временное хранилище, в результате: если ранее форма2 открывалась ~14 секунд, то теперь за 1,25 секунды!


Круто =)

(18)
Есть вопрос: если обработка будет запущена у разных пользователей в одно время, конфликтов в данных при использовании ПоместитьВоВременноеХранилище /ПолучитьИзВременногоХранилища не возникнет? Не будет такого что пользователь1 перезапишет данные по адресу пользователя2?


Нет, таких проблем быть не должно.
Каждый работает с теми данными временного хранилища, которые есть в его сеансе.

Если у вас табличный документ в обработке большой, то можно еще оптимизировать работу с обработкой, используя вызов сервера без контекста, где это возможно, чтобы не тащить табличный документ в серверные вызовы в составе контекста формы.
22. Genda 10.10.19 15:44 Сейчас в теме
(19) Спасибо большое за советы!
По поводу ТабДока и безконтекстных вызовов подумаю, может на досуге переделаю тоже.
В предыдущем сообщении исправила - при заполнении по большому подразделению форма открывалась 1,5 минуты, а стала 1,25 секунд! Еще больше прирост!
23. Sashares 18 10.10.19 15:59 Сейчас в теме
(22)Вот она оптимизация, почти в 45 раз=)))
20. Sashares 18 10.10.19 12:43 Сейчас в теме
(18)
ПоместитьВоВременноеХранилище в параметр адрес указать УИД формы обработки

Дополню, второй параметр указывать обязательно, УИД обработки или уникальный идентификатор - решайте сами, в зависимости от необходимости.
Если не указывать, то данные во временном хранилище будут жить только до следующего серверного вызова (любого), а потом удаляются.
21. Genda 10.10.19 15:41 Сейчас в теме
(20) Да, я как раз указываю - УникальныйИдентификатор формы обработки
2. YannikAlx 28 09.10.19 12:11 Сейчас в теме
Если у вас есть Обработка с ТЧ, то просто выводите эту ТЧ на форму, и все манипуляции с данными делаете в модуле формы...
Все...
Никуда ничего специально не придется передавать дополнительно...

Про вторую форму нужна более подробная информация...
Зачем вам вообще 2 формы с одними данными?
3. Genda 09.10.19 13:05 Сейчас в теме
(2) Мне не нужна ТЧ на форме. Посмотрите как сделана альтернативная форма табеля в типовой ЗУП 3.1.
Это не 2 формы с одними данными, вторая форма для редактирования данных одного дня (опять же по аналогии с типовой ЗУП).
От типового отличается тем, что у меня строк в ТЧ получается в 2 раза больше, чем при заполнении в стандартном табеле. Поэтому процедура возврата с сервера на клиент происходит в разы дольше.
4. YannikAlx 28 09.10.19 13:27 Сейчас в теме
Я так понял, что вы привели механизм ЗУП только в качестве аналога?
А у вас другие данные?
И вопрос - тормоза при открытии первой формы или второй?
5. Genda 09.10.19 13:52 Сейчас в теме
(4) Да, все верно. Сделано по аналогии ЗУП, данные другие.
Тормоза при открытии второй формы, конкретно при неявном возврате с сервера обратно на клиент (с клиента вызываю серверную процедуру, по окончании серверной процедуры платформа автоматически возвращается на клиент - вот этот возврат при большой ТЧ отрабатывает очень долго. Если в ТЧ мало строк, то возврат происходит мгновенно).
6. YannikAlx 28 09.10.19 13:54 Сейчас в теме
(5) А зачем вы тащите на вторую форму ВСЕ данные из первой?
Если как вы указали вам нужно редактирование отдельной записи?
7. Genda 09.10.19 14:13 Сейчас в теме
(6) резонный вопрос) пыталась тащить НаСерверБезКонтекста не все данные, но возникла ошибка (см.вариант 3)
8. YannikAlx 28 09.10.19 14:17 Сейчас в теме
А почему используете БезКонтекста?
9. Genda 09.10.19 14:20 Сейчас в теме
Чтобы контекст (форму) не тащить...разве нет?
как я понимаю если я с клиента вызову процедуру "НаСервере", то в нее автоматом будет передан весь контекст (вся форма) (или не так?)
у меня это все в модуле формы обработки происходит (форма1)
11. YannikAlx 28 09.10.19 14:29 Сейчас в теме
(9) Вам что трудно попытаться &НаСервере и все увидите....
Или жажда ничто, имидж - все?
12. Genda 09.10.19 14:30 Сейчас в теме
(11) На сервер будет передан весь контекст формы, т.к. процедура в модуле формы находится
14. YannikAlx 28 09.10.19 14:34 Сейчас в теме
И что ?
Вы пытаетесь в форму свою притащить информации в миллион раз больше!
15. Genda 09.10.19 14:39 Сейчас в теме
(14) Вы не поняли сути. Я в форму2 ничего не тащу, в нее как раз всегда передается только то, что нужно - инфа за 1 день. А вот получаю/отбираю/фильтрую я эту инфу в форме1, которая принадлежит обработке в которой есть гигантская ТЧ.
16. YannikAlx 28 09.10.19 14:46 Сейчас в теме
(15) Вот и видно ваше слабое место...
Зачем вы отбираете , фильтруете данные в форме1 ?
Вы должны передать в форму 2 всего лишь параметры отбора или фильтр. А отбирать и фильтровать уже в самой форме2 и не будет тормозов
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Технический лидер, архитектор 1С, руководитель проектов
Санкт-Петербург
зарплата от 150 000 руб.
Полный день

Консультант-аналитик 1С
Набережные Челны
зарплата до 90 000 руб.
Полный день

Программист 1С
Набережные Челны
зарплата от 40 000 руб. до 110 000 руб.
Полный день

Программист 1С
Казань
зарплата от 40 000 руб. до 110 000 руб.
Полный день

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству