Как перевести обработку с обычных форм на управляемые: выводим макет в табличный документ и отображаем таблицу на форме

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

Переход с обычных форм (ОФ) на управляемые формы (УФ) — это не просто смена интерфейса, а полноценная смена парадигмы программирования в 1С. Главное отличие заключается в жестком разделении выполнения кода на клиентский и серверный контексты. В обычных формах разработчик мог свободно обращаться к элементам формы, макетам и методам объектов в едином контексте. В управляемом приложении попытка применить старые подходы приводит к ошибкам вроде «Метод недоступен на клиенте» или «Интерактивные операции недоступны».

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

---

Часть 1. Отображение таблицы данных на управляемой форме

В обычных формах было достаточно разместить на форме элемент управления «Табличное поле» и связать его с переменной типа ТаблицаЗначений. В управляемых формах визуальные элементы (Элементы) и сами данные (Реквизиты) строго разделены.

Проанализируем ситуацию: почему созданная в коде таблица не выводится на форму автоматически? Всё потому, что платформа управляемого приложения не может отобразить объект, которого нет в составе Реквизитов формы.

Разберем по шагам, как правильно вывести таблицу значений на управляемую форму:

  1. Откройте редактор управляемой формы обработки.
  2. Перейдите на вкладку «Реквизиты» (в правом верхнем углу окна редактора).
  3. Добавьте новый реквизит формы (например, с именем ТаблицаРезультат) и укажите для него тип данных «Таблица значений».
  4. Критически важный шаг: раскройте созданный реквизит и добавьте в него колонки. Каждая колонка должна иметь четко заданный тип (например, Номенклатура с типом СправочникСсылка.Номенклатура, Количество с типом Число). Без добавления колонок таблица на форме останется пустой, даже если вы свяжете элемент с реквизитом.
  5. Перетащите мышкой созданный реквизит ТаблицаРезультат из правого окна (Реквизиты) в левое окно (Элементы формы).
  6. Платформа автоматически создаст элемент формы типа «Таблица» и подчиненные ему поля колонок.

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


&НаСервере
Процедура ЗаполнитьТаблицуНаСервере()
    // Очищаем существующие строки в реквизите формы
    Объект.ТаблицаРезультат.Очистить(); 
    
    // Добавляем новую строку и заполняем данные
    НоваяСтрока = Объект.ТаблицаРезультат.Добавить();
    НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00000001");
    НоваяСтрока.Количество = 10;
КонецПроцедуры

---

Часть 2. Вывод макета в Табличный документ на управляемой форме

Второй классический вопрос при переходе на управляемые формы — как вывести печатную форму (макет) в поле на форме. В обычных формах мы использовали метод ПолучитьМакет() прямо в контексте формы и выводили результат в «Поле табличного документа». В УФ этот процесс требует строгого соблюдения правил клиент-серверного взаимодействия.

Выясним причину основных ошибок, с которыми сталкиваются разработчики:

Рассмотрим правильный алгоритм вывода макета:

  1. Создайте в реквизитах формы реквизит с типом «ТабличныйДокумент» (например, с именем РезультатТабличныйДокумент).
  2. Перетащите этот реквизит в элементы формы. Платформа создаст элемент с типом «Поле табличного документа».
  3. Напишите процедуру формирования, которая будет выполняться на сервере. Передавать туда нужно именно реквизит данных, а не элемент формы.

Посмотрим на пример правильной реализации кода в модуле управляемой формы:


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

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

---

Часть 3. Разбор типичных ошибок контекста

Рассмотрим подробнее ошибки, которые часто возникают при переносе кода из модулей обычных форм.

Ошибка 1: Ошибка при вызове метода контекста (ПолучитьФорму): Интерактивные операции недоступны

Эта ошибка возникает, когда разработчик пытается вызвать метод ПолучитьФорму() или ОткрытьФорму() внутри модуля объекта обработки (который в управляемом приложении всегда выполняется на сервере) или внутри процедуры с директивой &НаСервере в модуле формы.

Решение: Любое открытие форм, диалогов выбора файлов, предупреждений и вопросов пользователю должно происходить исключительно в клиентском контексте (в процедурах под директивой &НаКлиенте). Передавайте результаты выбора с клиента на сервер в качестве параметров.

Ошибка 2: Метод недоступен на клиенте (при вызове РеквизитФормыВЗначение)

Функция РеквизитФормыВЗначение() предназначена для того, чтобы преобразовать легкие данные управляемой формы (прикладной объект типа ДанныеФормыСтруктура) в полноценный тяжелый объект базы данных (например, СправочникОбъект, ДокументОбъект или ОбработкаОбъект). Этот метод работает исключительно на сервере.

Решение: Убедитесь, что процедура, в которой вызывается данный метод, помечена директивой &НаСервере или &НаСервереБезКонтекста.


&НаСервере
Процедура ВыполнитьДействиеНаСервере()
    // Преобразуем реквизит формы "Объект" в реальный объект обработки
    ОбъектОбработки = РеквизитФормыВЗначение("Объект");
    
    // Теперь нам доступны все экспортные методы модуля объекта обработки
    ОбъектОбработки.ВыполнитьСложныйРасчет();
    
    // Если объект был изменен и эти изменения нужно вернуть на форму:
    ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");
КонецПроцедуры

---

Рекомендации по оптимизации разработки на управляемых формах

Для того чтобы ваша переработанная обработка функционировала быстро и надежно, придерживайтесь следующих правил:

Используя предложенные методики разделения прав доступа и контекстов, вы сможете быстро и без ошибок адаптировать любые старые алгоритмы под стандарты современной платформы 1С:Предприятие 8.3.

← На главную