С выходом версии платформы 1С:Предприятие 8.3.18 (а также в режимах совместимости с 8.3.17 и выше) разработчики внедрили существенные изменения в механизмы работы с интерфейсом. Одно из самых заметных нововведений — строгий контроль над состоянием элементов формы. Теперь, если таблица формы не отрисована на экране (скрыта программно, находится на неактивной вкладке или скрыта через права доступа), вызов таких методов, как Обновить(), ДобавитьСтроку() или ЗакончитьРедактированиеСтроки(), приводит к возникновению исключения.
В этой статье мы подробно разберем, почему это происходит, и проанализируем различные стратегии безопасной работы с таблицами в новых реалиях платформы.
Рассмотрим причину изменений. Ранее платформа позволяла выполнять программные действия с таблицами, даже если пользователь их не видел. Это приводило к лишним вычислениям на стороне клиента и сервера: система пыталась рассчитать видимые области, обновить данные и перерисовать элементы «в пустоту». Для оптимизации производительности разработчики платформы ограничили доступ к методам, требующим активного взаимодействия с визуальной частью, если элемент не отображается.
Важно понимать различие между свойствами Видимость и фактическим отображением. Элемент может иметь свойство Видимость = Истина, но быть скрытым, потому что:
Проанализируем наиболее «официальный», но неоднозначный способ проверки — использование метода таблицы формы ПроверитьСтроку(). Этот метод предназначен для проверки видимости конкретной строки с учетом отборов, но он обладает побочным эффектом, который мы можем использовать в своих целях.
Синтаксис метода: Результат = Элементы.ИмяТаблицы.ПроверитьСтроку(ИдентификаторСтроки).
Метод может возвращать три типа значений:
Разберем, как применить это на практике. Если мы передадим в метод заведомо некорректное значение или идентификатор несуществующей строки, мы получим либо Ложь, либо Неопределено. Если вернулось Ложь — значит, таблица на форме отрисована. Если Неопределено — таблица скрыта (или возникла иная ошибка данных).
// Пример проверки отрисовки таблицы
РезультатПроверки = Элементы.СписокТоваров.ПроверитьСтроку("Николаич");
Если РезультатПроверки = Ложь Или РезультатПроверки = Истина Тогда
// Таблица точно отображается на форме, можно вызывать Обновить()
Элементы.СписокТоваров.Обновить();
КонецЕсли;
Несмотря на то что многие разработчики стараются избегать пустых блоков Попытка, в данном конкретном случае это зачастую самый производительный и надежный способ. Выясним почему: проверка всей иерархии видимости родителей или вызов ПроверитьСтроку требует ресурсов. Если таблица скрыта редко, проще обработать ошибку «по факту».
Попытка
Элементы.ТаблицаДокументов.Обновить();
Исключение
// Если таблица не отображается, платформа выбросит исключение.
// Просто игнорируем его, так как обновление не требуется.
КонецПопытки;
Важно помнить: этот метод работает только на клиенте. Не стоит оборачивать в попытку серверные вызовы, если вы не уверены, что проблема именно в отрисовке таблицы формы.
Рассмотрим альтернативу методу ТаблицаФормы.Обновить(). У самого объекта формы существует метод ЭтаФорма.ОбновитьОтображениеДанных().
В чем его преимущество? В отличие от точечного обновления конкретной таблицы, этот метод формы не вызывает исключений, если какие-то элементы скрыты. Платформа самостоятельно анализирует, какие части интерфейса сейчас видны пользователю, и обновляет только их. Это более безопасный путь, если вам нужно синхронизировать данные формы с данными в памяти, не заботясь о том, на какой вкладке сейчас находится пользователь.
Ситуация с ДобавитьСтроку() сложнее, так как этот метод инициирует интерактивное редактирование. Если таблица скрыта, добавить в нее строку программно через элемент управления невозможно.
Посмотрим на правильный алгоритм действий:
Объект.Товары.Добавить()).
// Вместо этого (вызовет ошибку, если таблица скрыта):
// Элементы.Таблица.ДобавитьСтроку();
// Делаем так:
НоваяСтрока = Объект.Товары.Добавить();
// Если нужно обновить картинку, используем безопасный метод:
ЭтаФорма.ОбновитьОтображениеДанных();
Подводя итоги нашего анализа, выделим основные правила работы в 1С 8.3.18+:
Видимость: это свойство не гарантирует, что элемент реально отрисован.ПроверитьСтроку для быстрой проверки состояния элемента, если вам критически важно вызвать специфичный метод таблицы.ОбновитьОтображениеДанных() всей формы вместо Обновить() конкретной таблицы.Таким образом, изменения в платформе требуют от нас более аккуратного проектирования взаимодействия интерфейса и логики, но взамен мы получаем более отзывчивое приложение за счет экономии ресурсов на отрисовку скрытых элементов.