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