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

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

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

Понимаем разницу между типами данных

Прежде чем вносить изменения (начинается ли сложная разработка интерфейса по текстовому описанию или пишется обычный код), необходимо осознать различие между двумя основными объектами, с которыми мы работаем в 1С:

  1. ТаблицаЗначений — это объект, существующий исключительно в памяти сервера. Он предназначен для промежуточных вычислений и обработки данных. У него есть методы Колонки.Добавить(), но нет визуального отображения.
  2. ДанныеФормыКоллекция — это специальный тип данных, который связывает серверные данные с элементами управления на форме. Именно этот объект находится «внутри» реквизита формы, который вы видите в списке.

Ошибка «Метод объекта не обнаружен» возникает тогда, когда вы пытаетесь применить методы ТаблицаЗначений к объекту ДанныеФормыКоллекция или наоборот. Понимание того, что коллекция формы — это «обертка» над данными, которую по умолчанию использует любой конструктор управляемых форм, является ключом к решению задачи.

Алгоритм добавления колонок на форму

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

  1. Выгрузите данные из реквизита формы в «чистую» ТаблицаЗначений с помощью метода РеквизитФормыВЗначение.
  2. Добавьте необходимые колонки в полученную ТаблицаЗначений.
  3. Загрузите обновленную структуру обратно в реквизит формы методом ЗначениеВРеквизитФормы.

Рассмотрим этот процесс на примере кода:


// Получаем таблицу значений из реквизита формы
ТЗ = РеквизитФормыВЗначение("ИмяВашегоРеквизитаФормы", Новый Тип("ТаблицаЗначений"));

// Добавляем новые колонки
ТЗ.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("Уровень", Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("ЭтоГруппа", Новый ОписаниеТипов("Булево"));

// Загружаем обновленную таблицу обратно в реквизит формы
ЗначениеВРеквизитФормы(ТЗ, "ИмяВашегоРеквизитаФормы");

Почему нельзя просто «загрузить» таблицу в динамический список?

Важно помнить, что ДинамическийСписок — это объект, предназначенный для прямой связи с базой данных (обычно с таблицей справочника или документа). Он работает по принципу отложенного чтения данных. Поэтому попытка «загрузить» в него данные из произвольной ТаблицаЗначений не увенчается успехом — у списка просто нет метода Загрузить() в привычном понимании.

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

Использование данных в запросах

Если после модификации таблицы вам нужно передать её в запрос, помните, что ТаблицаЗначений не является таблицей базы данных. Чтобы «скормить» её запросу, используйте механизм параметров:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ &ТЗ КАК ТЗ";
Запрос.УстановитьПараметр("ТЗ", ВашаТаблицаЗначений);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();

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

Практические советы

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

← На главную