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