При работе с управляемыми формами в 1С:Предприятии 8.3 разработчики часто сталкиваются с ситуацией, когда стандартные методы обращения к колонкам таблицы, привычные по версии 7.7 или обычным формам, не работают. Попытки вызвать методы вроде ВидимостьКолонки() или обратиться к коллекции Колонки напрямую через объект таблицы приводят к ошибкам "Метод объекта не обнаружен" или "Поле объекта не обнаружено".
В этой статье мы подробно разберем, как правильно управлять видимостью колонок, почему возникают ошибки и какие нюансы стоит учитывать при работе с различными типами данных (Таблицы значений, Табличные части, Динамические списки).
Прежде всего, нам необходимо уяснить ключевой принцип управляемого приложения: данные отделены от представления. То, что вы видите на экране (таблица), является совокупностью элементов формы, которые лишь отображают данные реквизита. Каждая колонка в таблице на форме — это самостоятельный объект типа ПолеФормы. Именно поэтому мы не можем управлять видимостью через реквизит данных (например, через объект ТаблицаЗначений), нам нужно обращаться напрямую к Элементам формы.
Рассмотрим по шагам, как реализовать скрытие колонки правильно.
Это самый простой и распространенный способ. Если вы знаете имя элемента (колонки), которое задано в конфигураторе, вы можете обратиться к нему напрямую. Важно помнить, что имя элемента колонки часто совпадает с именем реквизита, но это не всегда так. Всегда проверяйте свойство "Имя" в палитре свойств элемента формы.
Проанализируем пример кода:
// Скрываем колонку по её имени в коллекции элементов формы
Элементы.МояТаблицаИмяКолонки.Видимость = Ложь;
// Включаем видимость обратно
Элементы.МояТаблицаИмяКолонки.Видимость = Истина;
Обратите внимание: если ваша колонка называется Цена, а таблица — Товары, 1С при автоматической генерации часто называет элемент ТоварыЦена. Используйте именно это имя.
В сложных формах, где элементов очень много, или когда имена элементов генерируются динамически, более грамотным подходом будет обращение к колонке как к подчиненному элементу конкретной таблицы. Это позволяет избежать путаницы, если на форме есть несколько таблиц с похожими названиями колонок.
Выясним, как это выглядит в коде:
// Обращаемся к колонке через коллекцию ПодчиненныеЭлементы конкретной таблицы
Элементы.МояТаблица.ПодчиненныеЭлементы.ИмяКолонки.Видимость = Ложь;
Этот метод считается более "чистым" с точки зрения структуры кода, так как он явно указывает иерархию объектов на форме, а проверить свойства объектов в реальном времени поможет редактор форм в режиме предприятия.
При настройке интерфейса важно понимать разницу между двумя свойствами, которые отвечают за отображение элементов. Рассмотрим их подробнее:
Элементы.ИмяКолонки.Видимость = Ложь;, колонка исчезает с экрана полностью. Пользователь не сможет включить её обратно через меню "Изменить форму". Это "жесткое" скрытие, которое обычно используется для ограничения доступа к данным или реализации сложной логики интерфейса.Элементы.ИмяКолонки.ПользовательскаяВидимость = Ложь;, колонка будет скрыта по умолчанию, но останется доступной в настройках формы. Пользователь сможет при желании зайти в настройки и поставить галочку, чтобы увидеть эти данные.Хотя принцип обращения через Элементы универсален, контекст использования может отличаться в зависимости от того, что является источником данных для таблицы на форме.
Если вы программно создаете таблицу значений и добавляете колонки через ИзменитьРеквизиты, помните, что элементы формы (колонки) должны быть созданы отдельно. Скрытие будет работать только после того, как вы добавите элемент типа ПолеФормы в таблицу.
Для табличных частей часто требуется скрывать колонки в зависимости от прав доступа или значения других реквизитов (например, скрывать колонку "Склад", если учет по складам отключен в настройках). В этом случае код лучше размещать в процедуре ПриСозданииНаСервере.
В динамических списках (например, в списках документов) скрытие колонки через Элементы.Имя.Видимость = Ложь работает корректно, однако данные для этой колонки все равно могут запрашиваться из базы данных. Если вы хотите оптимизировать производительность и колонка не нужна пользователю совсем, рассмотрите возможность программного изменения состава выбранных полей через компоновку данных динамического списка.
Проанализируем ситуацию: вы написали код, но система выдает ошибку. Чтобы избежать подобных проблем, используйте статический анализатор кода. Разберем основные причины:
Видимость.Рассмотрим ситуацию, когда нам нужно скрыть колонку "СпецЦена" в таблице товаров, если текущий пользователь не обладает правами администратора. Реализуем это в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем роль пользователя
Если НЕ РольДоступна("ПолныеПрава") Тогда
// Скрываем колонку для всех, кроме администраторов
Элементы.ТоварыСпецЦена.Видимость = Ложь;
// Дополнительно можно запретить пользователю самому её включать
Элементы.ТоварыСпецЦена.ПользовательскаяВидимость = Ложь;
КонецЕсли;
КонецПроцедуры
Важный совет: Массовое изменение видимости колонок (например, в цикле) лучше производить на стороне сервера. Это снижает нагрузку на клиентскую часть и предотвращает "мерцание" интерфейса при отрисовке формы.
Используя данные подходы, вы сможете гибко управлять интерфейсом ваших решений на платформе 1С 8.3, делая их более удобными и безопасными для конечного пользователя.