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