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

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

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

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


&НаСервере
Процедура Расш_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    МассивРеквизитов = Новый Массив;
    МассивРеквизитов.Добавить(Новый РеквизитФормы("Поле1", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)), "Объект.Запасы", "Поле1", Ложь));
    ИзменитьРеквизиты(МассивРеквизитов);
    
    Эл = Элементы.Добавить("Поле1", Тип("ПолеФормы"), Элементы.Запасы);
    Эл.Вид = ВидПоляФормы.ПолеВвода;
    Эл.ПутьКДанным = "Объект.Запасы.Поле1";    
КонецПроцедуры

В таком варианте колонка неизбежно оказывается в самом конце таблицы Запасы. Выясним причину такого поведения и изучим два способа размещения колонки в произвольном месте формы.

Способ 1. Создание колонки сразу в нужной позиции с помощью метода Вставить

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

Посмотрим на пример реализации:


&НаСервере
Процедура ВставитьКолонкуВТаблицу()
    // Создаем программный реквизит формы
    МассивРеквизитов = Новый Массив;
    МассивРеквизитов.Добавить(Новый РеквизитФормы("Поле1", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)), "Объект.Запасы", "Поле1", Ложь));
    ИзменитьРеквизиты(МассивРеквизитов);
    
    // Вставляем элемент управления перед целевой колонкой
    ЦелевойЭлемент = Элементы.ЗапасыНоменклатура; // Имя элемента, перед которым встанет новая колонка
    Эл = Элементы.Вставить("Поле1", Тип("ПолеФормы"), Элементы.Запасы, ЦелевойЭлемент);
    Эл.Вид = ВидПоляФормы.ПолеВвода;
    Эл.ПутьКДанным = "Объект.Запасы.Поле1";
КонецПроцедуры

Разберем по шагам параметры метода Вставить:

  1. Имя — уникальное имя нового элемента ("Поле1").
  2. ТипЭлемента — тип создаваемого интерфейсного объекта (Тип("ПолеФормы")).
  3. Родитель — родительский элемент (таблица формы Элементы.Запасы или группа колонок).
  4. ПередЭлементом — ссылка на элемент управления, перед которым платформа должна отобразить новую колонку.

Способ 2. Перемещение уже созданной колонки с помощью метода Переместить

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

Рассмотрим синтаксис и пример вызова:


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

// Перемещаем элемент на нужную позицию
ЭлементОриентир = Элементы.ЗапасыКоличество; // Колонка, место которой хотим занять
Элементы.Переместить(Эл, Эл.Родитель, ЭлементОриентир);

Параметры метода Переместить:

  1. Элемент — перемещаемый объект интерфейса.
  2. НовыйРодитель — новый контейнер для элемента (в нашем случае совпадает с текущим: Эл.Родитель).
  3. ПередЭлементом — элемент формы, перед которым будет расположено перемещаемое поле.

Важные технические нюансы при работе с программными колонками

Рассмотрим подробнее тонкости, с которыми можно столкнуться при позиционировании и использовании программных полей:

  1. Иерархия и группы колонок: Если элемент-ориентир расположен внутри группы (элемент ГруппаФормы с видом ГруппаКолонок), параметр Родитель должен указывать именно на эту группу, а не на корень таблицы. Несовпадение родителей перемещаемого элемента и элемента-ориентира вызовет исключение при выполнении кода.
  2. Пользовательские настройки формы: Если пользователь ранее настраивал порядок колонок через системное меню «Еще — Изменить форму», сохраненные настройки могут переопределить программную позицию. В таких ситуациях может потребоваться сброс формы к типовым настройкам с помощью метода СброситьНастройки().
  3. Сохранение данных: Реквизиты, объявленные через метод ИзменитьРеквизиты(), являются исключительно реквизитами управляемой формы. Даже если путь к данным указывает на Объект.Запасы.Поле1, при записи документа введенные значения не запишутся в базу данных, если реквизита физически нет в метаданных конфигурации или расширения.
  4. Интерактивные события: Для добавленной колонки типовые пересчеты (например, цены и суммы) не сработают автоматически. Необходимо явно подключить обработчик события с помощью метода Эл.УстановитьДействие("ПриИзменении", "ИмяКлиентскойПроцедуры").
  5. Альтернатива через расширение конфигурации: Если доработка выполняется в расширении, часто эффективнее не писать программное создание в коде, а заимствовать документ и форму в расширение, добавить реквизит в структуру метаданных и визуально разместить колонку в конфигураторе. Это избавит от накладных расходов метода ИзменитьРеквизиты() и обеспечит автоматическое сохранение данных в информационной базе.
← На главную