Почему программно добавленная колонка табличной части не отображается на управляемой форме 1С?

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

Разберем распространенную проблему, с которой часто сталкиваются разработчики при адаптации типовых конфигураций (таких как «1С:Комплексная автоматизация 2» или «1С:ERP Управление предприятием») под нужды бизнеса. Представим ситуацию: в конфигураторе к существующей табличной части документа (например, «Товары») добавлен новый реквизит. Перед нами стоит задача — программно вывести этот реквизит на управляемую форму в виде колонки (например, из общего модуля или через расширение).

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

Анализ исходных ошибок в коде

Для начала рассмотрим код, который часто пытаются использовать разработчики на практике:


// ОШИБОЧНЫЙ ПОДХОД: Избыточное добавление реквизитов формы
ДобавляемыеРеквизиты = Новый Массив;

Номенклатура = Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"), "Объект.Товары", "Номенклатура");
Характеристика = Новый РеквизитФормы("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"), "Объект.Товары", "Характеристика");

ДобавляемыеРеквизиты.Добавить(Номенклатура);
ДобавляемыеРеквизиты.Добавить(Характеристика);

Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

Ошибка №1: Избыточное создание реквизитов формы через ИзменитьРеквизиты. Если реквизит табличной части (например, «НаправлениеДеятельности» или «Характеристика») уже физически добавлен в метаданные документа в конфигураторе, то он автоматически присутствует в структуре реквизита формы Объект.Товары. Попытка повторно объявить его через Новый РеквизитФормы и метод ИзменитьРеквизиты является грубой ошибкой. В лучшем случае платформа проигнорирует это действие, в худшем — вызовет конфликт имен или исключение. Нам достаточно программно создать только элемент формы (визуальное поле) и связать его с уже существующими данными.

Правильный алгоритм программного добавления колонки

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


// Создаем элемент формы для колонки "Характеристика"
НовыйЭлементХарактеристика = Форма.Элементы.Добавить("ТоварыХарактеристика", Тип("ПолеФормы"), Форма.Элементы.Товары);
НовыйЭлементХарактеристика.ПутьКДанным = "Объект.Товары.Характеристика";
НовыйЭлементХарактеристика.Вид = ВидПоляФормы.ПолеВвода;

// Создаем элемент формы для колонки "Направление деятельности"
НовыйЭлементНаправление = Форма.Элементы.Добавить("ТоварыНаправлениеДеятельности", Тип("ПолеФормы"), Форма.Элементы.Товары);
НовыйЭлементНаправление.ПутьКДанным = "Объект.Товары.НаправлениеДеятельности";
НовыйЭлементНаправление.Вид = ВидПоляФормы.ПолеВвода;

Этот код абсолютно верен с точки зрения синтаксиса платформы «1С:Предприятие 8.3». Но что делать, если после запуска один реквизит («Характеристика») отображается на форме, а второй («НаправлениеДеятельности») — нет?

Главная причина проблемы: Влияние Функциональных Опций (ФО)

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

Проанализируем эту ситуацию по шагам:

  1. Реквизит метаданных НаправлениеДеятельности в конфигурации связан с функциональной опцией, отвечающей за ведение учета по направлениям деятельности (например, константа ФормироватьФинансовыйРезультат).
  2. Если в пользовательском режиме (в настройках программы) данная опция **отключена**, то платформа 1С считает использование этого реквизита нецелесообразным для текущего сеанса.
  3. В момент инициализации формы и связывания программного элемента с путем к данным Объект.Товары.НаправлениеДеятельности, платформа принудительно устанавливает свойство видимости этого элемента в значение Ложь.
  4. При этом в отладчике на сервере элемент будет числиться в коллекции Форма.Элементы, но на клиенте пользователь его не увидит.

Решение проблемы: Чтобы колонка появилась на форме, необходимо зайти под учетной записью администратора в настройки системы и включить соответствующую функциональную опцию. Для нашего примера в «1С:Комплексная автоматизация» путь будет следующим: НСИ и администрирование -> Финансовый результат и контроллинг -> Финансовый результат -> Учет по направлениям деятельности (установить флаг).

Рекомендации по оптимизации программного кода

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

1. Проверка функциональной опции в коде

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


Если ПолучитьФункциональнуюОпцию("ИспользоватьНаправленияДеятельности") Тогда
    НовыйЭлементНаправление = Форма.Элементы.Добавить("ТоварыНаправлениеДеятельности", Тип("ПолеФормы"), Форма.Элементы.Товары);
    НовыйЭлементНаправление.ПутьКДанным = "Объект.Товары.НаправлениеДеятельности";
    НовыйЭлементНаправление.Вид = ВидПоляФормы.ПолеВвода;
КонецЕсли;

2. Правильное позиционирование колонок

Метод Элементы.Добавить() всегда помещает новую колонку в самый конец табличной части (после сумм, ставок НДС и итогов), что визуально неудобно. Чтобы вставить колонку в конкретное место (например, сразу после номенклатуры), используйте метод Элементы.Вставить():


// Вставляем колонку "Направление деятельности" перед колонкой "Количество"
ЭлементПередКоторымВставляем = Форма.Элементы.ТоварыКоличество;
НовыйЭлемент = Форма.Элементы.Вставить(
    "ТоварыНаправлениеДеятельности", 
    Тип("ПолеФормы"), 
    Форма.Элементы.Товары, 
    ЭлементПередКоторымВставляем
);
НовыйЭлемент.ПутьКДанным = "Объект.Товары.НаправлениеДеятельности";
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;

3. Назначение обработчиков событий

Часто требуется, чтобы при изменении значения в новой колонке происходил перерасчет или заполнение других полей. Для этого программно созданному элементу необходимо назначить обработчик события с помощью метода УстановитьДействие:


НовыйЭлемент.УстановитьДействие("ПриИзменении", "Подключаемый_ТоварыНаправлениеДеятельностиПриИзменении");

Обратите внимание, что процедура Подключаемый_ТоварыНаправлениеДеятельностиПриИзменении должна быть объявлена в модуле формы с ключевым словом &НаКлиенте.

Применяя данные правила и понимая механизмы работы функциональных опций платформы 1С, вы сможете корректно управлять интерфейсом управляемых форм любой сложности.

← На главную