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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Причины некорректного отображения группировок в веб-клиенте

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

  1. Ошибки релизов платформы 1С:Предприятие. В ряде сборок платформы (начиная с 8.3.4) присутствовали ошибки движка веб-клиента, связанные с асинхронной подгрузкой иерархических узлов таблицы через веб-сервер. В таких версиях клиентская часть не могла корректно обработать AJAX-ответ сервера при разворачивании узла.
  2. Повреждение или конфликт пользовательских настроек компоновки. Если пользователь открывал форму до изменения структуры списка или в другой версии платформы, в системном хранилище сохраняется структура настроек, которая в веб-клиенте не может корректно сопоставиться с текущей схемой.
  3. Отсутствие основной таблицы в произвольном запросе. Если динамический список формируется произвольным запросом без указания свойства Основная таблица, платформа не может однозначно идентифицировать ключ строки при постраничном динамическом считывании в браузере.
  4. Оптимизация передачи данных ссылочных полей. При передаче структуры таблицы веб-клиент может оптимизировать трафик и не передавать текстовые представления полей группировки, если они не включены в состав обязательных полей.

Способ 1. Обновление платформы 1С:Предприятие

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

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

Способ 2. Интерактивный и программный сброс настроек списка

Рассмотрим ситуацию, когда ошибка вызвана повреждением кэша настроек компоновщика у конкретного пользователя. В веб-клиенте выполнение интерактивной команды «Установить стандартные настройки» через меню «Еще» динамического списка восстанавливает правильное отображение иерархии.

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

Посмотрим на пример кода в обработчике события ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// Принудительно восстанавливаем настройки схемы компоновки по умолчанию
	Список.КомпоновщикНастроек.ЗагрузитьНастройки(Список.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
	
КонецПроцедуры

Также можно выполнить программную очистку сохраненных настроек формы из системного хранилища, если они вызывают конфликт:


&НаСервере
Процедура ОчиститьПользовательскиеНастройкиФормы()
	
	КлючОбъекта = "ОтчетИлиФорма/Настройки";
	ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, "", "");
	
КонецПроцедуры

Способ 3. Корректировка свойств динамического списка

Разберем по шагам правила конфигурирования динамического списка для стабильной работы в веб-клиенте:

  1. Откроем форму в конфигураторе и выделим реквизит формы Список с типом ДинамическийСписок.
  2. В палитре свойств обязательно проверим заполнение свойства Основная таблица. Если используется произвольный запрос, выберем главную таблицу сущности (например, Справочник.Контрагенты или Документ.РеализацияТоваровУслуг).
  3. Перейдем в настройку схемы динамического списка на закладку Настройки.
  4. Для полей, участвующих в группировке, а также для ключевых ссылочных реквизитов включим флаг Использовать всегда. Это гарантирует передачу необходимых идентификаторов и представлений в веб-клиент независимо от видимости колонок в таблице.
  5. Проверим свойство Динамическое считывание данных. В зависимости от объема таблицы его отключение или включение позволяет стабилизировать постраничную загрузку дочерних строк.

Способ 4. Альтернативные варианты реализации интерфейса

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

  1. Интерфейс «Мастер — Деталь» (два связанных списка). На форме размещаются две таблицы: левая таблица содержит уникальный список групп (значений группировочного реквизита), а правая — динамический список элементов. При изменении строки в левом списке в правом программно устанавливается отбор:
    
    &НаКлиенте
    Процедура ГруппыПриАктивизацииСтроки(Элемент)
    	
    	ТекущиеДанные = Элемент.ТекущиеДанные;
    	Если ТекущиеДанные <> Неопределено Тогда
    		УстановитьОтборПоГруппе(ТекущиеДанные.Ссылка);
    	КонецЕсли;
    	
    КонецПроцедуры
    
    Такой интерфейс работает стабильно во всех браузерах и на любых версиях веб-серверов (Apache, IIS).
  2. Использование реквизита формы с типом «ДеревоЗначений». Если объем данных невелик (до нескольких тысяч записей), данные можно сформировать запросом на сервере, выгрузить в ДеревоЗначений и передать на форму. Дерево значений в веб-клиенте обрабатывается стандартными средствами браузера без динамической дозагрузки по порциям.
← На главную