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