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

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

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

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

Особенности работы с таблицами значений на управляемой форме

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

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

Вариант 1. Заполнение строк в цикле

Если имена колонок источника и реквизита формы отличаются, наиболее простым и понятным решением является перебор строк таблицы в цикле с явным сопоставлением полей.

Рассмотрим пример кода, в котором выполняется явное присвоение значений колонок с разными именами и использование функции ЗаполнитьЗначенияСвойств для совпадающих колонок:


// Очищаем реквизит формы перед заполнением
Объект.ТаблицаНаФорме.Очистить();

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

Этот вариант универсален, так как позволяет произвольно сопоставлять поля и при необходимости выполнять дополнительную обработку данных прямо в цикле.

Вариант 2. Копирование ТЗ, переименование колонок и вызов метода Загрузить()

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

Проанализируем алгоритм реализации этого способа:

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

Посмотрим на пример кода:


// Создаем копию исходной таблицы значений
ТЗКопия = ИсходнаяТЗ.Скопировать();

// Изменяем имя колонки в копии под имя колонки на форме
ТЗКопия.Колонки.ИмяКолонкиИсточника.Имя = "ИмяКолонкиНаФорме";

// Загружаем подготовленную таблицу в реквизит формы
Объект.ТаблицаНаФорме.Загрузить(ТЗКопия);

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

Вариант 3. Использование функций преобразования контекста формы

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

Рассмотрим пример этого подхода:


// Преобразуем реквизит формы в объектную ТаблицуЗначений
ТЗФормы = РеквизитФормыВЗначение("Объект.ТаблицаНаФорме");

// Переносим данные из источника
Для Каждого СтрИз ИсточникТЗ Цикл
    НоваяСтрока = ТЗФормы.Добавить();
    НоваяСтрока.ИмяКолонкиНаФорме = СтрИз.ИмяКолонкиИсточника;
КонецЦикла;

// Возвращаем результат в реквизит формы
ЗначениеВРеквизитФормы(ТЗФормы, "Объект.ТаблицаНаФорме");

Важный момент: при использовании ЗначениеВРеквизитФормы структура колонок в преобразованной таблице значений должна соответствовать объявленной структуре реквизита формы, иначе данные отсутствующих колонок на форме будут сброшены.

← На главную