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

Программист 1С v8.3 (Управляемые формы)
← К списку

При разработке конфигураций в 1С:Предприятие 8 мы часто сталкиваемся с задачами, требующими динамического изменения интерфейса. Одной из таких задач является программное добавление новых колонок в табличные части форм. Это бывает необходимо, когда состав колонок зависит от настроек пользователя, данных или бизнес-логики, и мы не можем жестко зафиксировать их в метаданных.

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

Подготовка: Добавление реквизита в метаданные

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

  1. Откройте конфигурацию в режиме "Конфигуратор".
  2. Найдите нужный объект (например, документ или справочник), в котором находится ваша табличная часть.
  3. Перейдите в ветку "Табличные части" -> "ВашаТабличнаяЧасть" -> "Реквизиты".
  4. Добавьте новый реквизит, укажите его имя, тип и другие необходимые свойства. Например, СкладОтгрузки с типом СправочникСсылка.Склады.

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

Программное добавление реквизитов формы

Теперь, когда мы определились с необходимостью реквизита в метаданных, перейдем к программному добавлению реквизита формы. Для этого мы будем использовать метод ИзменитьРеквизиты() объекта формы. Этот метод позволяет динамически добавлять или изменять реквизиты формы во время выполнения.

Обычно код для добавления реквизитов формы размещается в обработчике события ПриСозданииНаСервере формы. Это гарантирует, что реквизиты будут созданы до того, как форма отобразится пользователю.

Давайте рассмотрим подробный пример. Предположим, мы хотим добавить на форму новый реквизит с именем АВ_ДатаУведомления типа "Дата" и привязать его к существующей табличной части Объект.ТаблицаСуществующая.


#Область ДобавлениеРеквизитовФормы
    ДобавляемыеРеквизиты = Новый Массив;
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("АВ_ДатаУведомления", Новый ОписаниеТипов("Дата",,Новый КвалификаторыДаты(ЧастиДаты.Дата)), "Объект.ТаблицаСуществующая", "Дата уведомления заголовок"));
    ЭтотОбъект.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
#КонецОбласти

Разберем этот код по шагам:

  1. Мы создаем новый Массив для хранения описаний добавляемых реквизитов.
  2. С помощью ДобавляемыеРеквизиты.Добавить() мы добавляем описание нового реквизита.
    • Первый параметр: "АВ_ДатаУведомления" — это имя нового реквизита формы.
    • Второй параметр: Новый ОписаниеТипов("Дата",,Новый КвалификаторыДаты(ЧастиДаты.Дата)) — здесь мы динамически указываем тип данных для нашего реквизита. В данном случае это "Дата", с квалификатором, указывающим, что нам нужна только дата без времени. Для других типов, например, ссылки на справочник, мы могли бы написать Новый ОписаниеТипов("СправочникСсылка.Склады").
    • Третий параметр: "Объект.ТаблицаСуществующая" — это путь к данным, который указывает, к какой существующей табличной части объекта (или реквизиту формы) будет принадлежать наш новый реквизит. Это важно для правильной структуры данных формы.
    • Четвертый параметр: "Дата уведомления заголовок" — это заголовок, который будет использоваться для отображения реквизита.
  3. В конце мы вызываем ЭтотОбъект.ИзменитьРеквизиты(ДобавляемыеРеквизиты), чтобы применить изменения к форме.

Добавление элементов формы (колонок) в табличную часть

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

Продолжим наш пример и добавим элемент формы для реквизита АВ_ДатаУведомления:


#Область ДобавлениеЭлементовФормы
    ЭлементФормы = ЭтотОбъект.Элементы.Добавить("ДатаУведомления", Тип("ПолеФормы"), ЭтотОбъект.Элементы.ТаблицаСуществующая);
    ЭлементФормы.Вид = ВидПоляФормы.ПолеФлажка;
    ЭлементФормы.ПутьКДанным = "Объект.ТаблицаСуществующая.АВ_ДатаУведомления";
#КонецОбласти

Давайте проанализируем этот фрагмент кода:

  1. Мы вызываем ЭтотОбъект.Элементы.Добавить() для создания нового элемента формы.
    • Первый параметр: "ДатаУведомления" — это имя нового элемента формы. Оно должно быть уникальным в пределах родительского элемента.
    • Второй параметр: Тип("ПолеФормы") — указываем тип элемента формы. В данном случае это ПолеФормы, которое обычно используется для отображения данных в колонках табличных частей.
    • Третий параметр: ЭтотОбъект.Элементы.ТаблицаСуществующая — это родительский элемент, в который мы добавляем новую колонку. Здесь мы указываем существующую табличную часть на форме.
  2. Мы устанавливаем свойство ЭлементФормы.Вид = ВидПоляФормы.ПолеФлажка;. Это определяет, как будет выглядеть поле. В данном случае, хотя реквизит типа "Дата", в примере с форума было указано ПолеФлажка. Для даты, скорее всего, подошло бы просто ПолеВвода или оставить по умолчанию. Это демонстрирует гибкость в выборе вида поля.
  3. Ключевым моментом является установка пути к данным: ЭлементФормы.ПутьКДанным = "Объект.ТаблицаСуществующая.АВ_ДатаУведомления";. Здесь мы связываем наш новый элемент формы с ранее созданным реквизитом формы. Путь к данным должен точно указывать на реквизит, который мы хотим отображать в этой колонке.

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


// Предположим, у нас есть объект "Склад" с полем "Представление"
// и мы хотим добавить колонку, связанную с этой информацией в ТабличнуюЧастьСводная
НовыйЭлемент.ПутьКДанным = "Объект.ТабличнаяЧастьСводная." + Склад.Представление;

Здесь Склад.Представление будет формировать уникальное имя реквизита, например, "Объект.ТабличнаяЧастьСводная.СкладМосква" или "Объект.ТабличнаяЧастьСводная.СкладСПб". Важно, чтобы реквизиты с такими именами были предварительно добавлены через ИзменитьРеквизиты().

Важные нюансы и дополнительные рекомендации

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

  1. Место вызова кода:

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

  2. Связывание реквизита формы с данными объекта:

    Помните, что ПутьКДанным играет ключевую роль. Если вы добавляете реквизит, который должен отображать данные из метаданных (т.е. он был создан в конфигураторе), то путь будет выглядеть как "Объект.ИмяТабличнойЧасти.ИмяРеквизитаМетаданных". Если же реквизит существует только на форме, то его путь будет соответствовать пути, указанному при его создании через ИзменитьРеквизиты(), например, "Объект.ИмяТабличнойЧасти.ИмяРеквизитаФормы".

  3. Динамическое определение типа:

    Метод Новый ОписаниеТипов() позволяет нам гибко задавать тип данных для программно создаваемых реквизитов. Это может быть "Строка", "Число", "Булево", "Дата", а также ссылки на любые объекты конфигурации, например, "СправочникСсылка.Контрагенты" или "ДокументСсылка.РеализацияТоваровУслуг". Не забывайте про КвалификаторыСтроки, КвалификаторыЧисла, КвалификаторыДаты для точной настройки свойств типа.

  4. Особенности для управляемого приложения:

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

  5. Сохранение данных:

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

  6. Производительность и удобство:

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

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

← К списку