При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с задачей динамического управления интерфейсом. Одной из специфических проблем является управление видимостью дополнительных реквизитов, которые были выведены на форму списка пользователем или программно. В этой статье мы подробно разберем, как правильно обращаться к таким полям, почему возникают ошибки синтаксиса и какие методы (включая механизмы БСП) являются наиболее эффективными.
Когда мы добавляем стандартный реквизит на форму в конфигураторе, мы сами задаем ему Имя. С дополнительными реквизитами ситуация сложнее: они хранятся в табличных частях или отдельных регистрах, а на форму списка попадают динамически. Если пользователь добавляет их через команду "Еще — Изменить форму", система генерирует программное имя элемента автоматически. Попытка обратиться к такому элементу напрямую через точку, как мы привыкли (например, Элементы.МойРеквизит), часто приводит к ошибке "Поле объекта не обнаружено" или "Ожидается идентификатор".
Рассмотрим ситуацию, когда разработчик пытается использовать путь, подсмотренный в отладчике. Часто это выглядит так: Элементы.ИмяСписка.[ИмяРеквизита]. В коде 1С использование квадратных скобок сразу после точки является синтаксической ошибкой. Проанализируем правильный подход к обращению к коллекции элементов:
Элементы и квадратные скобки.Элементы["ДополнительныйРеквизит_Идентификатор"].Для того чтобы узнать точное имя элемента, которое присвоила система, выполним небольшой отладочный цикл в процедуре ПриСозданииНаСервере:
Для Каждого ЭлементФормы Из Элементы Цикл
Если СтрНайти(ЭлементФормы.Имя, "ДополнительныйРеквизит") > 0 Тогда
Сообщить("Найден элемент: " + ЭлементФормы.Имя);
КонецЕсли;
КонецЦикла;
В современных конфигурациях, таких как 1С:Документооборот, дополнительные реквизиты управляются подсистемой "Свойства". Это самый надежный способ, так как БСП предоставляет готовые функции для формирования имен элементов.
Разберем, как получить имя элемента с помощью общего модуля:
// В управляемых формах часто используется функция получения имени
ИмяЭлемента = УправлениеСвойствами.ИмяРеквизитаФормы(СсылкаНаДопРеквизит);
Если Элементы.Найти(ИмяЭлемента) <> Неопределено Тогда
Элементы[ИмяЭлемента].Видимость = Ложь;
КонецЕсли;
Этот метод позволяет избежать "гадания" имен и жесткого кодирования строк, которые могут измениться при обновлении версии платформы или конфигурации.
Если ваша задача — скрывать или показывать данные в колонке в зависимости от условий (например, в зависимости от Вида документа), то использование свойства Видимость самого элемента формы может быть не лучшим решением. Управление видимостью колонки целиком — это одно, а управление отображением данных в строках — другое.
Рассмотрим, как программно настроить Условное оформление для динамического списка. Этот метод работает быстрее и корректнее с точки зрения клиент-серверного взаимодействия:
// Программное добавление условия оформления
ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
// Устанавливаем, что именно мы меняем (видимость)
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ИмяПоляДопРеквизита");
// Описываем условие: ВидДокумента <> НужныйВид
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВидДокумента");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ЭлементУсловия.ПравоеЗначение = НужнаяСсылкаНаВид;
// Устанавливаем само оформление
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
Чтобы иметь полный контроль над дополнительным реквизитом и обращаться к нему по понятному имени, мы можем модифицировать запрос динамического списка. Посмотрим на этот процесс пошагово:
ЛЕВОЕ СОЕДИНЕНИЕ с таблицей дополнительных реквизитов (или используем механизм расширения свойств, если конфигурация позволяет).МойРеквизит_СрокИсполнения.Теперь в коде формы мы можем обращаться к элементу без риска ошибиться в динамическом идентификаторе:
// Теперь обращение прозрачно и понятно
Элементы.МойРеквизит_СрокИсполнения.Видимость = (Объект.ВидДокумента = Справочники.ВидыВнутреннихДокументов.Договор);
В конфигурации "1С:Документооборот" дополнительные реквизиты жестко привязаны к справочнику ВидыДокументов. Проанализируем ситуацию: у вас могут быть два реквизита с одинаковым заголовком "Срочность", но один относится к "Входящим", а другой — к "Внутренним" документам. В базе это две разные записи в Плане видов характеристик.
Поэтому, прежде чем управлять видимостью, выясним ссылку на конкретный доп. реквизит:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка
|ИЗ
| ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
|ГДЕ
| ДополнительныеРеквизитыИСведения.Имя = &ИмяРеквизита";
Запрос.УстановитьПараметр("ИмяРеквизита", "Срочность_Входящий");
Результат = Запрос.Выполнить();
// Далее используем полученную ссылку для поиска имени элемента через БСП
Для эффективного управления видимостью дополнительных реквизитов на форме списка следует придерживаться следующих правил:
[Текст в скобках]. Это внутреннее представление ячеек, а не имя программного объекта.Элементы["Имя"] для обращения к динамическим колонкам.УправлениеСвойствами.Применяя эти подходы, вы сделаете код более надежным, а интерфейс программы — отзывчивым и удобным для конечного пользователя.