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

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

При работе с управляемыми формами в 1С:Предприятие 8.3 часто возникает необходимость программно добавить новый реквизит или элемент управления. Начинающие разработчики нередко сталкиваются с ошибкой «Метод объекта не обнаружен (ИзменитьРеквизиты)». В этой статье мы проанализируем причину возникновения данной ошибки и разберем правильный порядок программного создания реквизитов и динамических списков на форме.

Почему возникает ошибка «Метод объекта не обнаружен (ИзменитьРеквизиты)»

Рассмотрим главные причины, по которым платформа 1С выдает такую ошибку:

  1. Вызов метода на клиенте. Метод ИзменитьРеквизиты() доступен исключительно в серверном контексте (Сервер, Мобильное приложение (сервер)). Если вызвать его в клиентской процедуре, платформа не найдет этот метод.
  2. Обращение через ЭтаФорма. Метод ИзменитьРеквизиты() является методом самой формы в контексте сервера, а не методом объекта ЭтаФорма на клиенте. Конструкции вида ЭтаФорма.ИзменитьРеквизиты(...) приведут к ошибке обращения к несуществующему методу объекта.

Выясним правильный синтаксис: вызов должен происходить внутри процедуры с директивой компиляции &НаСервере прямо по имени метода.


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

Пошаговый порядок программного создания динамического списка

Создание динамического реквизита на форме состояит из двух основных шагов: программное добавление самого реквизита формы и создание визуального элемента управления (таблицы и её колонок) для его отображения.

Разберем весь процесс по шагам на примере создания динамического списка с произвольным запросом.

  1. Формирование массива реквизитов и применение изменений:

    В серверном обработчике (например, в ПриСозданииНаСервере) создаем новый объект РеквизитФормы и передаем его в метод ИзменитьРеквизиты().

  2. Настройка источника данных динамического списка:

    После вызова ИзменитьРеквизиты() реквизит появляется у формы. Обращение к свойствам динамического списка осуществляется непосредственно через имя реквизита как свойство формы (например, ЭтаФорма.СписокТаблица).

  3. Создание элемента формы и связывание с реквизитом:

    Чтобы пользователь увидел данные на форме, создаем элемент с типом ТаблицаФормы через коллекцию Элементы и настраиваем его путь к данным ПутьКДанным. Затем добавляем необходимые колонки (поля формы).

Пример программного создания реквизита и элементов формы

Посмотрим на практический пример программного создания динамического списка и его колонок в процедуре ПриСозданииНаСервере:


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

КонецПроцедуры

Важные особенности и рекомендации

Проанализируем ключевые моменты, о которых стоит помнить при динамическом изменении формы:

← На главную