1С подвисает при открытии большого списка

Работа с динамическими списками на примере конфигурации 1С.Управление торговлей. Разбираем сложные моменты, даем пошаговую инструкцию.

Таблицы формы

Для отображения несовместимых с клиентом типов (таблицы значений) используются реквизиты с типом значения Данные формы коллекция.

Ключевой особенностью данных реквизитов является то, что они получают данные с Сервера на Клиент порциями по 35 строк.

Например, если в таблице содержится 1000 строк, то при прокрутке таблицы, мы будем порционально получать каждые 35. А если мы обрабатываем сразу всю таблицу, например, добавляем «!» для значения колонки, то все строки будут прочитаны порциями по 35.

Порциональное получение данныхПорциональное получение данных

Порциональное получение данных

Как оптимизировать работу с программой?

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

Мы предлагаем услуги по сопровождению 1С, в рамках которого наши сотрудники смогут оперативно решать подобные и многие другие проблемы. Большой опыт работ и сертифицированные специалисты позволят обеспечить бесперебойную работу с программой, защиту информации и оптимизацию бизнес-процессов.

Вы еще не внедрили 1С или необходимо установить программу в новый филиал компании? Обратитесь за внедрением и настройкой к нам — вы сэкономите свое время и избежите возможных ошибок и проблем в дальнейшем.  

Позвоните по номеру телефона, указанному на сайте или заполните форму обратной связи, чтобы наши сотрудники сориентировали по стоимости работ, подобрали оптимальное решение и рассказали, как начать сотрудничество. Ждем вас!

Полезно знать

Списание долгов партнеров минуя последствия

На практике, в процессе ведения бизнеса у хозяйствующих субъектов случаются прецеденты с контрагентами, получившими статус несостоятельных или банкротов. Между тем,…

11 июня, 2021

Возможности динамических списков в 1С

Предназначение данного инструмента заключается в отображении информации из любых таблиц БД, независимо от ее типа. Механизм был создан на основе СКД и обладает аналогичными возможностями. Но это не означает, что обязательно придется писать запрос на языке 1С, хотя эта возможность есть и ею нужно пользоваться. Вы можете просто указать таблицу, информация из которой вас интересует, и 1С самостоятельно сформирует простейший запрос.

Чтобы посмотреть, как формируется динамический список и какие данные он показывает, необходимо открыть управляемые формы, где он расположен, в конфигураторе: в перечне реквизитов через контекстное меню открыть его свойства и обратить внимание на пункт «ПроизвольныйЗапрос». Если галка отсутствует, то параметр «Основная таблица» отражает таблицу БД, откуда берутся данные. В ином случае, динамический список отражает данные произвольного запроса, который можно увидеть, открыв настройку списка.

Рис.1 Возможности динамических списковРис.1 Возможности динамических списков

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

Еще одно полезное свойство динамического списка открывается при щелчке на надпись «Настройка списка». Это меню позволяет даже при использовании стандартного набора полей сделать информацию более доступной и понятной конечным пользователям. Вне зависимости от того, произвольный запрос или нет, вы увидите вкладку «Настройки», где сможете указать:

  • Отбор динамического списка;
  • Группировки;
  • Сортировку;
  • Оформление.

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

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

Создание формы выбора

За основу возьмем некую тестовую конфигурацию 1С:»Бухгалтерия предприятия 3.0″. Не будем сейчас делать подбор, просто в справочнике «Номенклатура» добавим еще одну форму выбора и сделаем ее временно основной:

создание нового динамического списка 1с 8.3

При создании система по умолчанию добавит на форму табличное поле с типом «Динамический список».

Зайдем в его свойства и посмотрим, что там.

В первую очередь нас интересует флажок «Произвольный запрос». Он-то и откроет нам все преимущества динамического списка. У нас появится возможность написать собственный запрос, причем с параметрами. Устанавливаем флажок и нажимаем ссылку «Открыть»:

настройки динамического списка

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания — попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

Откроется окно с уже готовым кодом на языке запросов. Пока что там просто перечислены все поля справочника «Номенклатура».

Как видим, имеется кнопка вызова «Конструктора запроса» и флажок, который дает возможность динамически изменять содержимое списка. То есть когда другой пользователь меняет что-то в справочнике, в нашем списке это тоже изменится. Кроме того, имеется закладка «Настройки», но ее мы коснемся позже.

Характеристики справочника

  • Более 1 млн элементов справочника
  • Полный список смотреть не надо, бессмысленно на таких объемах — возможна корректировка начального отображения  с последующей работой только через уточняющие запросы
  • До «разгруппировки» справочника требуется быстрая работа именно с ним, в дальнейшем — при наличии групп — предполагается что производительность должна нормализоваться

Предисловие

Динамический список
Динамический список

Динамический список — это объект построения интерфейса, который предназначен для создания списка объектов или записей. Работа динамического списка основана на системе компоновке данных. Подробнее о нем вы можете

прочитать здесь

, мы же сегодня в статье разберем особенности его работы с базой данных.

В статье мы рассмотрим запросы к базе данных, которые формирует платформа при работе с динамическим списком. Определим, каким-образом его настройки влияют на работу платформы с SQL-базой.

Все примеры в статье сделаны на демонстрационной конфигурации, которую Вы можете скачать по ссылке в конце страницы.

Примечание: объект формы «Динамический список» появился в платформе 8.2. Его использование возможно только для управляемых форм.

Пример.

В динамическом списке документов-распоряжений на отгрузку нужно вывести состояние отгрузки. Состояние зависит от остатков регистра накопления, и статусов двух документов другого типа.

Работа с базой данных

При открытии списка

В тестовой конфигурации создан справочник «Товары», в котором добавлен реквизит «Артикул» типа «Строка». Для примеров справочник заполнен пятью тысячами элементов. Заполнение произведено специальной обработкой «ЗаполнениеСправочникаТоваров», которая также находится в составе демонстрационной конфигурации.

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

SQL-запрос при открытии динамического списка
SQL-запрос при открытии динамического списка

Опишем полученный запрос. Мы выбираем первые 42 записи из таблицы «_Reference7». Именно в этой таблице хранятся записи для всех элементов справочника «Товары». Почему выбирается именно 42 записи? Найти что-либо, что повлияет на эту цифру я не смог (ни размер экрана, ни общее количество записей в таблице). Делаю вывод, что платформа по умолчанию выбирает 42 записи при открытии динамического списка.

Предопределенный и помеченный на удаление

Поля выборки содержат те данные, которые будут отображаться непосредственно в динамическом списке. На рисунке подписано как каждое из полей отображается в режиме 1С:Предприятие. Может возникнуть логичный вопрос: «Для чего в выборке присутствует поле ‘Предопределенный’ и ‘Пометка удаления’?». Нужны эти поля для того, чтобы платформа соответствующими пиктограммами могла выделять помеченные на удаление и предопределенные элементы.

В разделе «ORDER BY» обозначены поля для сортировки результирующей выборки: «ЭтоГруппа», «Наименование», «Ссылка» (см. подписи полей выборки). В разделе наложения условий указывается отбор по родителю для выбираемых элементов. В нашем случае, поскольку динамический список был только открыт, отбираются записи без родительского элемента. В переменную условия «P1» передается пустое значение ссылки на элемент родителя.

В результате выполнения запроса мы увидим следующие данные в динамическом списке:

1.png

При раскрытии группы с элементами

Раскрывая группу элементов в динамическом списке, платформа 1С:Предприятие формирует следующий запрос:

%D0%A0%D0%B0%D1%81%D0%BA%D1%80%D1%8B%D1%82%D0%B8%D0%B5%D0%93%D1%80%D1%83%D0%BF%D0%BF%D1%8B%D0%A1%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BC%D0%B8.png

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

%D0%A0%D0%B0%D1%81%D0%BA%D1%80%D1%8B%D1%82%D0%B8%D0%B5%D0%93%D1%80%D1%83%D0%BF%D0%BF%D1%8B%D0%A1%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BC%D0%B8.png

Условие осталось прежним — выбираются записи только определенного родительского элемента, только в этом случае в параметр уже передается ссылка на открываемую группу элементов. На скриншоте вы видите ссылку на группу «Группа 1 — 1».

Примечание: подобный запрос формируется и в тех случаях, когда пользователь разворачивает группу, в состав которой входят другие группы справочника.

Пролистываем список элементов

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

Запрос для выборки следующей порции элементов
Запрос для выборки следующей порции элементов

Важным моментом в формировании данного запроса является условие выборки. В нем для тех полей, которые участвуют в сортировке результата запроса, накладываются дополнительные условия для получения последующих 22-х записей. В нашем случае это поля «_Foder», «_Description» и «_IDRRef». 

Примечание: поле «_Folder» указывает на принадлежность записи таблицы группе или элементу справочника. Если значение в поле равно «0x00», тогда это группа. Если же значение «0x01», тогда это элемент справочника. Для того, чтобы разработчику было удобно работать с данным полем, его преобразовывают обратным образом. В запросе имеется выражение: %D0%AD%D1%82%D0%BE%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0.png. То есть, если для платформы значение «0x00» (Ложь) указывает, что запись принадлежит группе, то для разработчика то же самое значение говорит, что запись принадлежит элементу.

%D0%9F%D1%80%D0%BE%D0%BB%D0%B8%D1%81%D1%82%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA.png

Для всех полей, кроме ссылки, условие имеет вид «больше или равно». Для ссылки оно всегда «больше». В параметры передаются данные от последней выбранной записи в динамическом списке. Например, когда мы разворачивали группу элементов «Группа — 1 — 1», то последний из 22-х отобранных элементов был «Элемент — 1 — 1 — 118». В параметры запроса передается ссылка на родителя, флаг «ЭтоГруппа», наименование и ссылка на элемент «Элемент — 1 — 1 — 118» для, соответственно, «P1», «P2», «P3» и «P4». 

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

Получение данных по последней выбранной записи
Получение данных по последней выбранной записи

Передав ссылку на последний элемент, запрос получает все данные для передачи параметров в запрос для выборки следующей порции элементов (предыдущий запрос выше).

Собственный запрос в динамическом списке

Сначала создадим нужный нам запрос с остатками и ценами. Примерно так:

запрос в динамическом списке 1с 8.3

Анализ возможных причин

  • реально большой размер списка (с этим ничего не поделать)
  • некорректная работа платформы 8.3.8 (добавились кнопки листания, допускаем, что в начале производится какие-то промежуточные расчеты)
  • наличие сортировки (при установке сортировка, форма запоминает настройки пользователя и восстанавливает при открытии) — отмена сортировки через свойства формы не решила проблему
  • работа на файловом варианте базы данных (на первых этапах добиваемся оптимальности в этом режиме, далее оттестируем в sql)
  • отборы (отсутствуют), но будут по проиндексированным полям
  • наличие событий обработчиков активизации по строке (отсутствуют)
  • медленная работа с диском (пока отметаем такой вариант, диск ssd)

Настройка отображения списка

%D0%9E%D1%82%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png

Для динамического списка возможны три варианта просмотра: иерархия, список, дерево. Для просмотра в виде дерева и иерархии запросы к базе данных практически одинаковые и соответствуют тем примерам, которые мы рассматривали выше.

В нашем примере мы работали с иерархическим справочником. Но какие запросы будут для справочника без иерархии, если режим просмотра для него установлен «списком»? Все просто. Запросы будут аналогичными, с учетом того, что поле «родитель» будет всегда пустым. Запросы, которые будет формировать платформа, походят на SQL-запросы при раскрытии группы с элементами и при прокрутке списка. 

Закладка «Настройки»

И вот теперь самое вкусное! Переходим на закладку «Настройки». И сразу видим, что на первой вкладке мы можем делать любые отборы по любому полю в запросе:

настройка динамического списка 1с 8.3

Варианты решения

  1. Пробуем вариант с использованием команды «ПЕРВЫЕ 1000», но она вызывает ошибку в том, что запрос динамического списка не должен ее содержать. Перенос «ПЕРВЫЕ» во вложенный запрос решает проблему. Дальше, наблюдается медленная работа полнотекстового поиска (поиск альтернативными средствами, достаточно не комфортно и это не позволит оперативно работать с таким большим списком на этапе его разгруппировки).
  2. Следующей итерацией будет внутреннее соединение двух таблиц одного справочника (второй будет формироваться с командой ПЕРВЫЕ).Цель  — вернуться к основной таблице с полнотекстовым поиском.

Результаты проверки

  • поиск восстановился
  • отборы и поиск идет не по всему списку а по 1000 (указанной в директиве, это плохой вариант)
  • поднятие выборки до 100000 дает допустимую скорость выборки и поиска (но все равно не полную)
  • отключение динамического считывания — не ускоряет начальное получение данных, но ускоряет листание — происходит без задержек
  • начальное формирование 2-3 секунды (при 100000) — быстрее примерно во столько же на сколько уменьшилась выборка
  • при вводе длинных фраз в полнотекстовом поиске наблюдаются тормоза — необходимо запрещать поиск до 3 символов (если внести фразу сразу из буфера обмена — поиск моментальный)

3. Останавливаемся на варианте, когда полнотекстовый поиск вызывается не стандартным диалогом, а более управляемым, после этого полученный список передается как параметры отбора для динамического списка.

  • При этом работа замедляется только при размере таких отборов более 10000 позиций.
  • Также остается минусом — зависимость от наличия и актуальности индекса полнотекстового поиска.

Реклама нужна товарам, так как они:
— мало чем отличаются друг от друга;
— большинству людей не нужны.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: