Как реализовать просмотр и скрытие дополнительных колонок таблицы в мобильном приложении 1С без сбоев платформы?

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

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

Выясним причину сбоя:

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

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

Решение 1. Разделение интерфейса на страницы (вкладки «Список» и «Детали»)

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

  1. На первой странице располагаем компактную таблицу только с ключевыми колонками для быстрого обзора.
  2. На второй странице размещаем отдельные поля ввода для всех реквизитов выбранной строки и командную панель с кнопкой сохранения/возврата.
  3. В событии таблицы Выбор или ПередНачаломИзменения переносим данные текущей строки в реквизиты формы и переключаем страницу.

Посмотрим на пример программного переключения страниц:


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

&НаКлиенте
Процедура КомандаГотово(Команда)
    ТекущиеДанные = Элементы.ТаблицаДанных.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        ТекущиеДанные.Колонка1 = РеквизитКолонка1;
        ТекущиеДанные.Колонка2 = РеквизитКолонка2;
        ТекущиеДанные.Колонка3 = РеквизитКолонка3;
        ТекущиеДанные.Колонка4 = РеквизитКолонка4;
    КонецЕсли;
    
    // Возвращаемся к общему списку
    Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаСписок;
КонецПроцедуры

Решение 2. Использование сворачиваемых групп элементов

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

  1. Для каждого логического блока создаем группу с видом ОбычнаяГруппа и свойством Поведение = Сворачиваемая.
  2. В заголовке группы выводим основные показатели строки.
  3. Внутри группы размещаем подробные поля или компактную подчиненную таблицу.

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

Решение 3. Использование иерархического дерева значений

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

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

Решение 4. Отложенное изменение видимости через обработчик ожидания

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


&НаКлиенте
Процедура ТаблицаДанныхПриАктивизацииСтроки(Элемент)
    // Подключаем однократный обработчик с минимальным интервалом
    ПодключитьОбработчикОжидания("ПрименитьВидимостьКолонок", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПрименитьВидимостьКолонок()
    // Изменяем видимость колонок после завершения нативных событий клика
    ЕстьВыбор = (Элементы.ТаблицаДанных.ТекущиеДанные <> Неопределено);
    Элементы.ТаблицаДанныхКолонка3.Видимость = ЕстьВыбор;
    Элементы.ТаблицаДанныхКолонка4.Видимость = ЕстьВыбор;
КонецПроцедуры

Решение 5. Открытие отдельной формы для редактирования строки

Разберем стандартный паттерн мобильных интерфейсов 1С: в основном списке отображаются только ключевые реквизиты, а просмотр и редактирование выполняются в отдельной форме:

  1. В обработчике события Выбор блокируем стандартную обработку (СтандартнаяОбработка = Ложь).
  2. Вызываем метод ОткрытьФорму, передавая параметры текущей строки.
  3. В отдельной форме размещаем все необходимые поля ввода, обеспечивая удобный ввод длинных текстов и дополнительных реквизитов на мобильном экране.

Рекомендация: Для мобильных приложений наиболее надежным и эргономичным решением является переключение страниц или открытие отдельной формы элемента (Master-Detail). Это обеспечивает максимальную стабильность приложения и комфорт пользователя при работе на экранах с разным разрешением.

← На главную