При разработке конфигураций в 1С:Предприятие 8 мы часто сталкиваемся с задачами, требующими динамического изменения интерфейса. Одной из таких задач является программное добавление новых колонок в табличные части форм. Это бывает необходимо, когда состав колонок зависит от настроек пользователя, данных или бизнес-логики, и мы не можем жестко зафиксировать их в метаданных. При этом важно помнить, что существуют различные способы модификации интерфейса: от правок в дизайнере до динамического создания реквизитов и элементов в расширениях.
В этой статье мы подробно рассмотрим, как добавить новый реквизит формы, затем создать соответствующий элемент формы (колонку) в табличной части и правильно связать его с данными. Мы пройдем весь процесс по шагам, используя методы и объекты платформы 1С. Для профессиональной разработки часто удобно использовать общие модули для программного изменения форм, которые позволяют стандартизировать этот процесс.
Прежде чем мы начнем программно работать с формой, давайте выясним важный момент: нужен ли нам новый реквизит для сохранения данных в базе или это будет временная колонка только для отображения? Если данные должны сохраняться, то первым делом необходимо добавить реквизит в метаданные конфигурации.
СкладОтгрузки с типом СправочникСсылка.Склады.Если же колонка нужна только для временного отображения информации, которая не хранится в базе данных, то этот шаг можно пропустить, и мы будем добавлять только реквизит формы, который существует только во время работы формы.
Теперь, когда мы определились с необходимостью реквизита в метаданных, перейдем к программному добавлению реквизита формы. Для этого мы будем использовать метод ИзменитьРеквизиты() объекта формы. Этот метод позволяет динамически добавлять или изменять реквизиты формы во время выполнения.
Обычно код для добавления реквизитов формы размещается в обработчике события ПриСозданииНаСервере формы. Это гарантирует, что реквизиты будут созданы до того, как форма отобразится пользователю. Чтобы ускорить процесс написания подобного кода, разработчики часто применяют библиотечные функции программного изменения форм.
Давайте рассмотрим подробный пример. Предположим, мы хотим добавить на форму новый реквизит с именем АВ_ДатаУведомления типа "Дата" и привязать его к существующей табличной части Объект.ТаблицаСуществующая.
#Область ДобавлениеРеквизитовФормы
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("АВ_ДатаУведомления", Новый ОписаниеТипов("Дата",,Новый КвалификаторыДаты(ЧастиДаты.Дата)), "Объект.ТаблицаСуществующая", "Дата уведомления заголовок"));
ЭтотОбъект.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
#КонецОбласти
Разберем этот код по шагам:
Массив для хранения описаний добавляемых реквизитов.ДобавляемыеРеквизиты.Добавить() мы добавляем описание нового реквизита.
Новый ОписаниеТипов("СправочникСсылка.Склады").ЭтотОбъект.ИзменитьРеквизиты(ДобавляемыеРеквизиты), чтобы применить изменения к форме.После того как мы добавили реквизит формы, нам необходимо создать соответствующий визуальный элемент формы, который будет отображаться как колонка в табличной части. Для этого мы используем метод Элементы.Добавить().
Продолжим наш пример и добавим элемент формы для реквизита АВ_ДатаУведомления:
#Область ДобавлениеЭлементовФормы
ЭлементФормы = ЭтотОбъект.Элементы.Добавить("ДатаУведомления", Тип("ПолеФормы"), ЭтотОбъект.Элементы.ТаблицаСуществующая);
ЭлементФормы.Вид = ВидПоляФормы.ПолеФлажка;
ЭлементФормы.ПутьКДанным = "Объект.ТаблицаСуществующая.АВ_ДатаУведомления";
#КонецОбласти
Давайте проанализируем этот фрагмент кода:
ЭтотОбъект.Элементы.Добавить() для создания нового элемента формы.
ПолеФормы, которое обычно используется для отображения данных в колонках табличных частей.ЭлементФормы.Вид = ВидПоляФормы.ПолеФлажка;. Это определяет, как будет выглядеть поле. Если ваша задача связана с отображением признаков в списках, рекомендуем изучить, как реализуется флажок в динамическом списке.ЭлементФормы.ПутьКДанным = "Объект.ТаблицаСуществующая.АВ_ДатаУведомления";. Здесь мы связываем наш новый элемент формы с ранее созданным реквизитом формы.В некоторых случаях нам может потребоваться динамически определять имя реквизита или его часть. Например, если мы добавляем колонки для каждого склада из справочника. В этом случае путь к данным может быть сформирован программно:
// Предположим, у нас есть объект "Склад" с полем "Представление"
// и мы хотим добавить колонку, связанную с этой информацией в ТабличнуюЧастьСводная
НовыйЭлемент.ПутьКДанным = "Объект.ТабличнаяЧастьСводная." + Склад.Представление;
Здесь Склад.Представление будет формировать уникальное имя реквизита. Если вы работаете с Таблицей Значений на форме и хотите быстро получить структуру ее колонок в коде, можно использовать инструмент для создания кода новой таблицы значений из реквизита.
При работе с динамическим добавлением реквизитов и элементов формы мы должны учитывать несколько важных аспектов:
Основной код следует размещать в ПриСозданииНаСервере. Однако, если вам нужно менять свойства уже созданных элементов "на лету" без программирования, может пригодиться редактор форм в режиме предприятия.
Помните, что ПутьКДанным играет ключевую роль. Если вы добавляете реквизит, который должен отображать данные из метаданных, то путь будет выглядеть как "Объект.ИмяТабличнойЧасти.ИмяРеквизитаМетаданных".
Метод Новый ОписаниеТипов() позволяет нам гибко задавать тип данных (Строка, Число, Ссылка). Не забывайте про квалификаторы для точной настройки.
В управляемом приложении все операции по изменению структуры формы должны выполняться на сервере.
Важно различать реквизиты формы и реквизиты метаданных. Только последние сохраняются в базе данных.
Динамическое добавление влияет на производительность. Также иногда требуется не только создать, но и выполнить программное перемещение колонки, чтобы интерфейс оставался удобным для пользователя.
Используя эти методы и рекомендации, мы можем эффективно управлять структурой форм в 1С:Предприятие 8, делая наши решения более гибкими и адаптивными к меняющимся требованиям.