Как программно управлять видимостью дополнительных реквизитов в форме списка 1С

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

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

Разберем причину возникновения проблемы

Когда мы добавляем стандартный реквизит на форму в конфигураторе, мы сами задаем ему Имя. С дополнительными реквизитами ситуация сложнее: они хранятся в табличных частях или отдельных регистрах, а на форму списка попадают динамически. Если пользователь добавляет их через команду "Еще — Изменить форму", система генерирует программное имя элемента автоматически. Попытка обратиться к такому элементу напрямую через точку, как мы привыкли (например, Элементы.МойРеквизит), часто приводит к ошибке "Поле объекта не обнаружено" или "Ожидается идентификатор".

Анализируем синтаксическую ошибку "Ожидается идентификатор"

Рассмотрим ситуацию, когда разработчик пытается использовать путь, подсмотренный в отладчике. Часто это выглядит так: Элементы.ИмяСписка.[ИмяРеквизита]. В коде 1С использование квадратных скобок сразу после точки является синтаксической ошибкой. Проанализируем правильный подход к обращению к коллекции элементов:

  1. Если имя элемента содержит пробелы, спецсимволы или начинается с цифр, обращение должно идти через коллекцию Элементы и квадратные скобки.
  2. Пример правильного обращения: Элементы["ДополнительныйРеквизит_Идентификатор"].

Для того чтобы узнать точное имя элемента, которое присвоила система, выполним небольшой отладочный цикл в процедуре ПриСозданииНаСервере:


Для Каждого ЭлементФормы Из Элементы Цикл
    Если СтрНайти(ЭлементФормы.Имя, "ДополнительныйРеквизит") > 0 Тогда
        Сообщить("Найден элемент: " + ЭлементФормы.Имя);
    КонецЕсли;
КонецЦикла;

Способ 1: Использование механизмов БСП (Библиотека стандартных подсистем)

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

Разберем, как получить имя элемента с помощью общего модуля:


// В управляемых формах часто используется функция получения имени
ИмяЭлемента = УправлениеСвойствами.ИмяРеквизитаФормы(СсылкаНаДопРеквизит);
Если Элементы.Найти(ИмяЭлемента) <> Неопределено Тогда
    Элементы[ИмяЭлемента].Видимость = Ложь;
КонецЕсли;

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

Способ 2: Настройка Условного оформления (рекомендуемый метод)

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

Рассмотрим, как программно настроить Условное оформление для динамического списка. Этот метод работает быстрее и корректнее с точки зрения клиент-серверного взаимодействия:


// Программное добавление условия оформления
ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();

// Устанавливаем, что именно мы меняем (видимость)
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ИмяПоляДопРеквизита");

// Описываем условие: ВидДокумента <> НужныйВид
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВидДокумента");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ЭлементУсловия.ПравоеЗначение = НужнаяСсылкаНаВид;

// Устанавливаем само оформление
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);

Способ 3: Изменение запроса динамического списка

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

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

Теперь в коде формы мы можем обращаться к элементу без риска ошибиться в динамическом идентификаторе:


// Теперь обращение прозрачно и понятно
Элементы.МойРеквизит_СрокИсполнения.Видимость = (Объект.ВидДокумента = Справочники.ВидыВнутреннихДокументов.Договор);

Особенности работы в "1С:Документооборот"

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

Поэтому, прежде чем управлять видимостью, выясним ссылку на конкретный доп. реквизит:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка
    |ИЗ
    |	ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
    |ГДЕ
    |	ДополнительныеРеквизитыИСведения.Имя = &ИмяРеквизита";

Запрос.УстановитьПараметр("ИмяРеквизита", "Срочность_Входящий");
Результат = Запрос.Выполнить();
// Далее используем полученную ссылку для поиска имени элемента через БСП

Подведем итоги

Для эффективного управления видимостью дополнительных реквизитов на форме списка следует придерживаться следующих правил:

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

← На главную