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

Программист 1С v8.3 (Обычные формы) Управленческий учет
← На главную

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

Различие между данными и элементами формы

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

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

Неправильно:

Таб = ЭлементыФормы.Товары.Данные; // Ошибка или пустой результат

Правильно:

Таб = Товары.Выгрузить(); // Получаем объект типа ТаблицаЗначений

Методы копирования данных: Выгрузить и Загрузить

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

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

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


// Выгружаем данные из основной ТЧ документа
ПромежуточнаяТаблица = Товары.Выгрузить();

// Загружаем данные в другую табличную часть или реквизит формы
ДругаяТабЧасть.Загрузить(ПромежуточнаяТаблица);

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

Построчное копирование с помощью ЗаполнитьЗначенияСвойств

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


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

Функция ЗаполнитьЗначенияСвойств() — это мощный инструмент, который автоматически сопоставляет имена свойств (колонок) источника и приемника и копирует значения только там, где имена совпадают. Это избавляет нас от написания десятков строк кода вида Приемник.Номенклатура = Источник.Номенклатура.

Передача таблицы в другую форму

Проанализируем задачу передачи данных в общую форму. Часто разработчики пытаются использовать экспортные переменные, но сталкиваются с тем, что тип данных определяется как Неопределено. Разберем правильный алгоритм передачи данных при открытии формы:

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

Пример реализации в модуле документа:


Процедура ОткрытьФормуИзменения()
    ТаблицаДляПередачи = Товары.Выгрузить();
    
    // Получаем форму по полному имени
    ФормаПодбора = ПолучитьФорму("ОбщаяФорма.ФормаИзмененияКоличества");
    
    // Передаем данные в реквизит формы (он должен быть создан в метаданных формы)
    ФормаПодбора.ТабТовары = ТаблицаДляПередачи;
    
    // Если нужно программно обновить визуальное отображение
    ФормаПодбора.ЭлементыФормы.ТабТовары.СоздатьКолонки();
    
    ФормаПодбора.Открыть();
КонецПроцедуры

Программное создание колонок и настройка типов

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

Рассмотрим ситуацию добавления колонки для выбора причины изменения:


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

// Теперь обновляем визуальный элемент (ТабличноеПоле)
ЭлементыФормы.ТабТовары.СоздатьКолонки();

// Чтобы колонка была доступна для выбора, проверяем свойства элемента
КолонкаВизуальная = ЭлементыФормы.ТабТовары.Колонки.ПричинаИзменения;
КолонкаВизуальная.КнопкаВыбора = Истина;
КолонкаВизуальная.ТолькоПросмотр = Ложь;

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

Итоги

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

← На главную