Как правильно заполнить форму или передать таблицу значений в форму обработки в 1С 8.3?

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

В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда необходимо программно заполнить реквизиты или табличные части формы данными из объекта обработки. Основная сложность для начинающих разработчиков заключается в разграничении контекстов исполнения (сервер и клиент) и правильном определении приемника данных. В этой статье мы подробно разберем, как передать данные табличной части в управляемую форму, рассмотрим работу с коллекциями и выясним, какие методы платформы наиболее эффективны в различных сценариях.

Понятие контекста и роль реквизита Объект

Прежде чем переходить к коду, проанализируем структуру управляемой формы. В большинстве внешних обработок основным реквизитом формы является Объект, который имеет тип ДанныеФормыСтруктура. Этот реквизит является проекцией реального объекта обработки на форму. Когда мы говорим о «заполнении формы», мы чаще всего подразумеваем заполнение именно этого реквизита или связанных с ним коллекций.

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

Использование метода Загрузить() для табличных частей

Если ваша задача — быстро «засунуть» данные из таблицы значений в табличную часть, расположенную на форме, самым эффективным инструментом будет метод Загрузить(). Разберем по шагам, как это работает на сервере:

  1. Подготавливаем таблицу значений (источник данных).
  2. Находим целевой реквизит формы (коллекцию).
  3. Вызываем метод загрузки.

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


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

Важный нюанс: метод Загрузить() полностью очищает коллекцию-приемник перед добавлением новых строк. Это идеальный вариант для первоначального заполнения или полного обновления данных.

Применение метода ЗаполнитьЗначенияСвойств()

Рассмотрим случай, упомянутый в обсуждении, когда нужно заполнить реквизиты формы данными из конкретной строки таблицы. Метод ЗаполнитьЗначенияСвойств() незаменим, когда имена колонок источника и имена реквизитов приемника совпадают. Это избавляет нас от написания десятков строк кода вида Приемник.Поле1 = Источник.Поле1.

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


// Пример заполнения шапки формы из текущей строки таблицы
ТекущаяСтрока = Элементы.ТаблицаДанных.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
    ЗаполнитьЗначенияСвойств(Объект, ТекущаяСтрока);
КонецЕсли;

Метод ЗначениеВДанныеФормы и работа с коллекциями

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

Рассмотрим ситуацию: у вас есть программно сформированная ТаблицаЗначений, и вы хотите отобразить её в реквизите формы СписокПроверок, который имеет тип ДанныеФормыКоллекция. Выполним следующие действия:


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

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

Передача данных при открытии формы настройки

Часто вопрос «как заполнить форму» подразумевает передачу данных из одной формы в другую (например, из основной формы обработки в форму настройки). Правильным архитектурным решением здесь будет использование параметров формы.

Рассмотрим этот процесс подробнее:

  1. В вызывающей форме создаем структуру с данными.
  2. Передаем эту структуру в метод ОткрытьФорму().
  3. В вызываемой форме в обработчике ПриСозданииНаСервере принимаем эти данные.

Пример в вызывающем коде:


ПараметрыПерехода = Новый Структура;
ПараметрыПерехода.Вставить("ДанныеДляЗаполнения", ТаблицаСДанными.Выгрузить());
ОткрытьФорму("Обработка.ПериодичностьПроверок.Форма.ФормаНастройки", ПараметрыПерехода);

Пример в вызываемой форме (ФормаНастройки):


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

Использование временного хранилища

Если данных очень много (тысячи строк), передача их через параметры может привести к чрезмерному потреблению памяти и замедлению работы интерфейса. В таких случаях мы используем Временное хранилище. Схема работы выглядит так:

1. Помещаем таблицу во временное хранилище и получаем адрес (УИД).

2. Передаем этот адрес в параметрах формы.

3. В целевой форме извлекаем данные по адресу.


// В исходной форме
АдресХранилища = ПоместитьВоВременноеХранилище(ТЗ_Данные, ЭтаФорма.УникальныйИдентификатор);
ПараметрыФормы = Новый Структура("АдресДанных", АдресХранилища);
ОткрытьФорму("...", ПараметрыФормы);

// В целевой форме
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("АдресДанных") Тогда
        Данные = ПолучитьИзВременногоХранилища(Параметры.АдресДанных);
        Объект.Таблица.Загрузить(Данные);
    КонецЕсли;
КонецПроцедуры

Особенности описания Приемника

Вернемся к вопросу автора темы о «правильном описании ПРИЕМНИКА». В управляемом приложении приемником всегда выступает переменная, доступная в текущем контексте. Если вы находитесь в модуле формы, то приемником для данных самой формы будет ЭтаФорма или реквизит Объект.

Помните, что обращение к реквизитам «чужой» формы напрямую (через ФормаНастройки.Реквизит = Значение) является плохой практикой. Управляемые формы живут в изолированных контекстах. Всегда стремитесь передавать данные «внутрь» формы при её создании или через специализированные экспортные методы, которые работают на сервере этой формы.

Таким образом, мы проанализировали основные способы заполнения форм и коллекций. Выбор метода зависит от объема данных и момента, когда это заполнение должно произойти. Для одиночных полей идеально подходит ЗаполнитьЗначенияСвойств, для таблиц — Загрузить, а для обмена между формами — параметры и временное хранилище.

← На главную