• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Как Быстро Загрузить Большой Списоквыбора?

  • Автор темы Olgir
  • Дата начала
O

Olgir

Здравствуйте, я, можно сказать, новичок в программировании на 1С. Не так давно столкнулся с такой штукой, как КЛАДР. Вобщем, суть такова - я создал форму с полями для ввода адреса (регион, район, город и т.п.). Данные для этой формы берутся с помощью запроса из регистра сведений (который был скопирован из другой конфигурации). Так вот, при выборе города из списка загружается список улиц в соответствующий СписокВыбора текстового поля на форме, и в случае с некоторыми городами (например, Москва), количество улиц весьма велико. В итоге, загрузка списка улиц по Москве занимает 16 секунд, что неприемлимо.
Процесс происходит так: сначала функция возвращает мне с сервера массив структур, в которых содержится все что мне необходимо, включая названия улиц, после этого циклом загружаются названия из массива в СписокВыбора. Выглядит это вот так:

Код:
гМассивУлиц = ВыбратьУлицыНаСервере(КодРегиона,0,0,0);
КоличествоУлиц = гМассивУлиц.Количество();

Для Счетчик=0 По КоличествоУлиц-1 Цикл		
Элементы.Улица.СписокВыбора.Добавить(СокрЛП(гМассивУлиц[Счетчик].Наименование+" "+гМассивУлиц[Счетчик].Сокращение));
КонецЦикла;

Запрос выполняется очень быстро, но вот цикл с загрузкой данных в список занимает очень много времени.
Я пробовал формировать СписокЗначений на сервере, потом передавать его на клиент, время загрузки осталось прежним, выходит метод ЗагрузитьЗначения так же использует цикл. Убирание СокрЛП из кода тоже не дает никакого результата, значит, дело не в ней.
Как можно оптимизировать загрузку данных в СписокВыбора? Что я делаю не так?
 
D

Darlock

Мой вам совет, не изобретайте велосипед. Посмотрите в типовых конфигурациях как там реализовано. Там все в регистре сведений, и отбор делается средствами платформы, а не запросом.
 
Д

Дайнеко

Darlock, Не понял такой вещи: да чем бы не отбирался список улиц, запросом или отбором, он Большой и все равно будет торомозить.
Думаете легко в типовой что-то найти?
Olgir, нужно докопаться, в чем тормоза. 1) Сама выборка данных долго идет 2) Передача на клиента 3) Цикл по массиву.
 
D

Darlock

Дайнеко, особенность платформы в том, что устанавливая отбор в регистре (без запросов и т.п.) работает платформа. Что в любом случае будет быстрее, чем отработает запрос написаный девелопером. Что-то в типовой найти трудно, но реально. А разобрав как оно сделано там, можно все лишнее выбросить и сделать свое так как надо.


Добавлено: Olgir, исключите цикл. Из результата запроса выгрузите колонку с данными. А в список выбора загрузите полученный массив. Может станет шустрее.
 
O

Olgir

Дело в том, что в типовых конфигурациях используется отдельная форма для выбора каждого элемента адреса. У меня же все элементы находятся на одной форме и мне хотелось бы их там же и оставить. Просто как-то не верится, что нельзя ускорить загрузку элементов в СписокВыбора.

Далее - что именно торомозит. Выборка происходит мгновенно. Тормозит именно цикл. Если выгрузить значения в колонку, отправить на клиент и потом использовать метод ЗагрузитьЗначения, ничего не меняется, метод выполняется 16 секунд. Выглядит так:
Элементы.Улица.СписокВыбора.ЗагрузитьЗначения(КолонкаУлиц); - вот это 16 секунд занимает. Есть способ сделать быстрее?
На С++ я просто запихал бы данные "КолонкаУлиц" по адресу Элементы.Улица.СписокВыбора и дело с концом, тип данных то один и тот же. Есть вообще способ скопировать область памяти в 1С?
 
U

unknown181538

Дело в том, что в типовых конфигурациях используется отдельная форма для выбора каждого элемента адреса. У меня же все элементы находятся на одной форме и мне хотелось бы их там же и оставить.
в чем принципиальное отличие в плане формирования списка?
 
O

Olgir

в чем принципиальное отличие в плане формирования списка?
Я так понимаю, в типовой конфигурации используется встроенный механизм фильтрования данных (на объектной основе), а я делаю все вручную. По крайней мере, припоминаю, что именно так. Сегодня попробую расковырять бухгалтерию, посмотрю как сделано там.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!