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