При разработке интерфейсов для мобильной платформы 1С часто возникает задача оптимизации экранного пространства. На небольшом экране смартфона неудобно отображать широкую таблицу со множеством колонок. Естественное желание разработчика — показать сначала только основные поля (например, две колонки), а при выборе строки или входе в режим редактирования развернуть дополнительные реквизиты. Однако попытка динамически управлять свойством Видимость элементов таблицы в мобильном клиенте нередко приводит к аварийному завершению работы приложения. Разберем причины такого поведения и рассмотрим надежные архитектурные решения этой задачи.
Выясним причину сбоя:
В мобильной платформе 1С отрисовка табличных частей и таблиц значений выполняется через нативные виртуализированные списки операционной системы. Когда мы программно меняем видимость колонок или групп колонок непосредственно в событиях таблицы (например, ПриАктивизацииСтроки, Выбор или ПередНачаломИзменения), происходит конфликт: нативный движок пересчитывает геометрию экрана и анимацию фокуса в момент перестроения структуры списка. Сброс кэша макета таблицы на лету вызывает критическую ошибку в нативном слое платформы.
Кроме того, важно помнить базовое ограничение платформы 1С: свойство Видимость у колонки таблицы применяется глобально ко всей колонке, а не к конкретной активной строке. Поэтому для реализации подобного интерфейса следует использовать обходные шаблоны проектирования.
Проанализируем классический подход Master-Detail в рамках одной управляемой формы. Вместо динамического скрытия колонок разместим на форме группу элементов вида Страницы с режимом отображения Страницы (без отображения закладок):
Выбор или ПередНачаломИзменения переносим данные текущей строки в реквизиты формы и переключаем страницу.Посмотрим на пример программного переключения страниц:
&НаКлиенте
Процедура ТаблицаДанныхВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элементы.ТаблицаДанных.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Заполняем реквизиты формы для детального просмотра/редактирования
РеквизитКолонка1 = ТекущиеДанные.Колонка1;
РеквизитКолонка2 = ТекущиеДанные.Колонка2;
РеквизитКолонка3 = ТекущиеДанные.Колонка3;
РеквизитКолонка4 = ТекущиеДанные.Колонка4;
// Переключаем интерфейс на детальный просмотр
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаДетали;
КонецПроцедуры
&НаКлиенте
Процедура КомандаГотово(Команда)
ТекущиеДанные = Элементы.ТаблицаДанных.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
ТекущиеДанные.Колонка1 = РеквизитКолонка1;
ТекущиеДанные.Колонка2 = РеквизитКолонка2;
ТекущиеДанные.Колонка3 = РеквизитКолонка3;
ТекущиеДанные.Колонка4 = РеквизитКолонка4;
КонецЕсли;
// Возвращаемся к общему списку
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаСписок;
КонецПроцедуры
Рассмотрим вариант, при котором информация формируется динамически в виде карточек. Если объем строк фиксирован и невелик (например, расписание, список предметов или чек-лист), вместо классической таблицы формы можно сгенерировать структуру из обычных групп:
ОбычнаяГруппа и свойством Поведение = Сворачиваемая.При таком подходе пользователь нажимает на заголовок группы, разворачивает подробности по конкретной позиции, а остальные данные остаются компактно свернутыми. Это полностью исключает программное манипулирование видимостью колонок в таблицах и работает стабильно на любых версиях мобильной платформы.
Если данные логически делятся на «заголовок» и «детализацию», разберем использование объекта ДеревоЗначений вместо плоской таблицы. В мобильном интерфейсе строки дерева нативно поддерживают раскрытие и сворачивание вложенных узлов:
Если по бизнес-требованиям необходимо именно скрывать или показывать колонки на форме, проанализируем, как безопасно выполнить эту операцию. Главная проблема — вызов изменения видимости внутри активного события таблицы. Чтобы обойти конфликт, операцию перерисовки нужно отложить до момента, пока платформа завершит обработку нажатия:
&НаКлиенте
Процедура ТаблицаДанныхПриАктивизацииСтроки(Элемент)
// Подключаем однократный обработчик с минимальным интервалом
ПодключитьОбработчикОжидания("ПрименитьВидимостьКолонок", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПрименитьВидимостьКолонок()
// Изменяем видимость колонок после завершения нативных событий клика
ЕстьВыбор = (Элементы.ТаблицаДанных.ТекущиеДанные <> Неопределено);
Элементы.ТаблицаДанныхКолонка3.Видимость = ЕстьВыбор;
Элементы.ТаблицаДанныхКолонка4.Видимость = ЕстьВыбор;
КонецПроцедуры
Разберем стандартный паттерн мобильных интерфейсов 1С: в основном списке отображаются только ключевые реквизиты, а просмотр и редактирование выполняются в отдельной форме:
Выбор блокируем стандартную обработку (СтандартнаяОбработка = Ложь).ОткрытьФорму, передавая параметры текущей строки.Рекомендация: Для мобильных приложений наиболее надежным и эргономичным решением является переключение страниц или открытие отдельной формы элемента (Master-Detail). Это обеспечивает максимальную стабильность приложения и комфорт пользователя при работе на экранах с разным разрешением.