Разберем распространенную проблему, с которой часто сталкиваются разработчики при адаптации типовых конфигураций (таких как «1С:Комплексная автоматизация 2» или «1С:ERP Управление предприятием») под нужды бизнеса. Представим ситуацию: в конфигураторе к существующей табличной части документа (например, «Товары») добавлен новый реквизит. Перед нами стоит задача — программно вывести этот реквизит на управляемую форму в виде колонки (например, из общего модуля или через расширение).
Мы пишем корректный код добавления элемента, связываем его с путем к данным, отладчик на сервере показывает, что элемент успешно создан, однако при открытии формы пользователем в режиме «1С:Предприятие» новая колонка на форме просто отсутствует. Давайте детально проанализируем причины такого поведения платформы 1С, исправим ошибки в коде и разберем работающие механизмы решения этой проблемы.
Для начала рассмотрим код, который часто пытаются использовать разработчики на практике:
// ОШИБОЧНЫЙ ПОДХОД: Избыточное добавление реквизитов формы
ДобавляемыеРеквизиты = Новый Массив;
Номенклатура = Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"), "Объект.Товары", "Номенклатура");
Характеристика = Новый РеквизитФормы("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"), "Объект.Товары", "Характеристика");
ДобавляемыеРеквизиты.Добавить(Номенклатура);
ДобавляемыеРеквизиты.Добавить(Характеристика);
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
Ошибка №1: Избыточное создание реквизитов формы через ИзменитьРеквизиты. Если реквизит табличной части (например, «НаправлениеДеятельности» или «Характеристика») уже физически добавлен в метаданные документа в конфигураторе, то он автоматически присутствует в структуре реквизита формы Объект.Товары. Попытка повторно объявить его через Новый РеквизитФормы и метод ИзменитьРеквизиты является грубой ошибкой. В лучшем случае платформа проигнорирует это действие, в худшем — вызовет конфликт имен или исключение. Нам достаточно программно создать только элемент формы (визуальное поле) и связать его с уже существующими данными.
Для вывода существующего реквизита табличной части на форму нам необходимо выполнить только создание элемента формы. Рассмотрим, как выглядит правильный и лаконичный код добавления полей ввода в процедуре, выполняемой на сервере:
// Создаем элемент формы для колонки "Характеристика"
НовыйЭлементХарактеристика = Форма.Элементы.Добавить("ТоварыХарактеристика", Тип("ПолеФормы"), Форма.Элементы.Товары);
НовыйЭлементХарактеристика.ПутьКДанным = "Объект.Товары.Характеристика";
НовыйЭлементХарактеристика.Вид = ВидПоляФормы.ПолеВвода;
// Создаем элемент формы для колонки "Направление деятельности"
НовыйЭлементНаправление = Форма.Элементы.Добавить("ТоварыНаправлениеДеятельности", Тип("ПолеФормы"), Форма.Элементы.Товары);
НовыйЭлементНаправление.ПутьКДанным = "Объект.Товары.НаправлениеДеятельности";
НовыйЭлементНаправление.Вид = ВидПоляФормы.ПолеВвода;
Этот код абсолютно верен с точки зрения синтаксиса платформы «1С:Предприятие 8.3». Но что делать, если после запуска один реквизит («Характеристика») отображается на форме, а второй («НаправлениеДеятельности») — нет?
В современных типовых конфигурациях 1С логика интерфейса тесно связана с бизнес-настройками системы. Если элемент формы привязан к данным (через свойство ПутьКДанным), которые в свою очередь управляются какой-либо функциональной опцией, платформа осуществляет автоматический контроль видимости.
Проанализируем эту ситуацию по шагам:
НаправлениеДеятельности в конфигурации связан с функциональной опцией, отвечающей за ведение учета по направлениям деятельности (например, константа ФормироватьФинансовыйРезультат).Объект.Товары.НаправлениеДеятельности, платформа принудительно устанавливает свойство видимости этого элемента в значение Ложь.Форма.Элементы, но на клиенте пользователь его не увидит.Решение проблемы: Чтобы колонка появилась на форме, необходимо зайти под учетной записью администратора в настройки системы и включить соответствующую функциональную опцию. Для нашего примера в «1С:Комплексная автоматизация» путь будет следующим: НСИ и администрирование -> Финансовый результат и контроллинг -> Финансовый результат -> Учет по направлениям деятельности (установить флаг).
Чтобы код был профессиональным, стабильным и удобным для пользователей, разберем несколько важных улучшений.
Вместо того чтобы безусловно создавать элемент формы и позволять платформе скрывать его, хорошей практикой является предварительная проверка функциональной опции в коде. Это сбережет ресурсы сервера при отрисовке интерфейса:
Если ПолучитьФункциональнуюОпцию("ИспользоватьНаправленияДеятельности") Тогда
НовыйЭлементНаправление = Форма.Элементы.Добавить("ТоварыНаправлениеДеятельности", Тип("ПолеФормы"), Форма.Элементы.Товары);
НовыйЭлементНаправление.ПутьКДанным = "Объект.Товары.НаправлениеДеятельности";
НовыйЭлементНаправление.Вид = ВидПоляФормы.ПолеВвода;
КонецЕсли;
Метод Элементы.Добавить() всегда помещает новую колонку в самый конец табличной части (после сумм, ставок НДС и итогов), что визуально неудобно. Чтобы вставить колонку в конкретное место (например, сразу после номенклатуры), используйте метод Элементы.Вставить():
// Вставляем колонку "Направление деятельности" перед колонкой "Количество"
ЭлементПередКоторымВставляем = Форма.Элементы.ТоварыКоличество;
НовыйЭлемент = Форма.Элементы.Вставить(
"ТоварыНаправлениеДеятельности",
Тип("ПолеФормы"),
Форма.Элементы.Товары,
ЭлементПередКоторымВставляем
);
НовыйЭлемент.ПутьКДанным = "Объект.Товары.НаправлениеДеятельности";
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
Часто требуется, чтобы при изменении значения в новой колонке происходил перерасчет или заполнение других полей. Для этого программно созданному элементу необходимо назначить обработчик события с помощью метода УстановитьДействие:
НовыйЭлемент.УстановитьДействие("ПриИзменении", "Подключаемый_ТоварыНаправлениеДеятельностиПриИзменении");
Обратите внимание, что процедура Подключаемый_ТоварыНаправлениеДеятельностиПриИзменении должна быть объявлена в модуле формы с ключевым словом &НаКлиенте.
Применяя данные правила и понимая механизмы работы функциональных опций платформы 1С, вы сможете корректно управлять интерфейсом управляемых форм любой сложности.