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

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

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

Метод Вставить: создание колонки в нужной позиции

Если нам необходимо не просто создать колонку, а сразу определить ее местоположение среди существующих элементов, мы воспользуемся методом Вставить() коллекции Элементы. Рассмотрим этот механизм подробнее.

Синтаксис метода следующий: Элементы.Вставить(Имя, ТипЭлемента, Родитель, ПередКакимЭлементом). Проанализируем параметры:

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

Разберем практический пример. Предположим, у нас есть табличная часть Товары, и мы хотим вставить новую колонку Макет перед колонкой Количество. Программный код будет выглядеть так:


// Определяем родителя (таблицу) и целевой элемент, перед которым вставляем
ТаблицаТовары = ЭтаФорма.Элементы.Товары;
ЦелевойЭлемент = ЭтаФорма.Элементы.ТоварыКоличество; // Колонка, перед которой вставляем

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

Важно помнить: если в качестве четвертого параметра передать Неопределено, колонка будет добавлена в самый конец, аналогично методу Добавить.

Метод Переместить: изменение позиции существующих колонок

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

Проанализируем ситуацию: нам нужно переместить уже существующую колонку ТоварыМакет в самое начало таблицы. Выясним, как это сделать программно:


// Сдвигаем существующий элемент в начало коллекции
// Получаем первый элемент из подчиненных элементов таблицы
ПервыйЭлемент = ЭтаФорма.Элементы.Товары.ПодчиненныеЭлементы[0];

// Перемещаем нашу колонку перед первым элементом
ЭтаФорма.Элементы.Переместить(ЭтаФорма.Элементы.ТоварыМакет, ЭтаФорма.Элементы.Товары, ПервыйЭлемент);

Использование ПодчиненныеЭлементы[Индекс] позволяет обращаться к порядку колонок по их порядковому номеру, что удобно, если вы не знаете точных имен соседних колонок в конкретной конфигурации.

Работа с группами колонок

Зачастую в табличных частях используются группы (например, "ГруппаЦены" объединяет колонку "Цена" и "Валюта"). Если мы хотим вставить новую колонку внутрь такой группы, в качестве параметра Родитель необходимо передавать именно эту группу, а не саму таблицу.

Рассмотрим пример вставки колонки Скидка внутрь группы ГруппаИтогов:


ГруппаИтогов = ЭтаФорма.Элементы.ТоварыГруппаИтогов;
ЭлементПередКоторымСтавим = ЭтаФорма.Элементы.ТоварыВсего;

НовыйЭлемент = ЭтаФорма.Элементы.Вставить("ТоварыСкидка", Тип("ПолеФормы"), ГруппаИтогов, ЭлементПередКоторымСтавим);
НовыйЭлемент.ПутьКДанным = "Объект.Товары.Скидка";

Если мы ошибемся и укажем в качестве родителя таблицу Элементы.Товары, наша колонка Скидка отобразится вне группы, что нарушит логику интерфейса.

Влияние пользовательских настроек на порядок колонок

Одна из самых коварных проблем при программном управлении порядком колонок заключается в том, что 1С сохраняет пользовательские настройки формы. Если пользователь ранее заходил в меню "Изменить форму" и вручную менял порядок колонок, ваш программный код в процедуре ПриСозданииНаСервере может не возыметь эффекта.

Важные нюансы, которые следует учитывать:

Динамический поиск индекса для вставки

Использовать жесткую привязку к индексам (например, ПодчиненныеЭлементы[2]) — рискованно. Если в будущих обновлениях конфигурации разработчик добавит новую колонку в начало таблицы, ваш индекс "уплывет", и колонка окажется не там.

Посмотрим на более надежный способ определения позиции:


Функция НайтиЭлементДляВставки(ИмяЦелевойКолонки)
    Для Каждого Элемент Из ЭтаФорма.Элементы.Товары.ПодчиненныеЭлементы Цикл
        Если Элемент.Имя = ИмяЦелевойКолонки Тогда
            Возврат Элемент;
        КонецЕсли;
    КонецЦикла;
    Возврат Неопределено;
КонецФункции

// Применение
Сосед = НайтиЭлементДляВставки("ТоварыКоличество");
НоваяКолонка = ЭтаФорма.Элементы.Вставить("ТоварыМакет", Тип("ПолеФормы"), ЭтаФорма.Элементы.Товары, Сосед);

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

Заключение

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

← На главную