При работе с управляемыми формами в 1С у многих разработчиков возникает ситуация, когда необходимо вывести в табличную часть формы не всю таблицу значений целиком, а лишь конкретные строки, отобранные в массив. Напрямую метод Загрузить() при работе с элементами формы часто вызывает вопросы или ошибки. Давайте разберем, почему это происходит и как правильно решить данную задачу.
Первое, что важно уяснить: табличный элемент на управляемой форме — это не ТаблицаЗначений в серверном понимании. Это объект типа ДанныеФормыКоллекция. Между серверной ТаблицейЗначений и клиентской коллекцией на форме существует фундаментальное различие.
Когда вы пытаетесь использовать методы вроде Скопировать() с передачей массива строк, полученных из другой таблицы, 1С выдает ошибку. Это происходит потому, что массив содержит ссылки на строки исходной таблицы, а у целевой таблицы другие идентификаторы строк. Система не может «просто так» перенести строки из одного объекта в другой, если они не являются частью одного и того же набора данных.
Чтобы данные из вашего массива отобразились в таблице на форме, выполните следующие действия:
Рассмотрим, как правильно перенести отобранные строки в таблицу на форме с использованием метода ЗаполнитьЗначенияСвойств. Этот подход является самым надежным:
// Предположим, МассивВыбранныхСтрок — это массив отобранных строк,
// а Объект.ТЗ_НаФорме — это реквизит формы типа ДанныеФормыКоллекция
// 1. Очищаем текущую таблицу на форме, чтобы избежать дублей
Объект.ТЗ_НаФорме.Очистить();
// 2. Проходим циклом по массиву отобранных строк
Для Каждого СтрокаИсточник Из МассивВыбранныхСтрок Цикл
// Добавляем новую строку в коллекцию формы
НоваяСтрока = Объект.ТЗ_НаФорме.Добавить();
// Копируем значения колонок, у которых имена совпадают
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточник);
КонецЦикла;
Как мы выяснили ранее, метод Скопировать() у объекта ТаблицаЗначений ожидает на входе массив строк, принадлежащих именно этой же таблице. Если вы пытаетесь использовать массив строк от одной ТЗ для копирования данных из другой, вы получите исключение Недопустимое значение параметра.
Если вы хотите работать именно с методами ДанныеФормыВЗначение и ЗначениеВДанныеФормы, используйте такой алгоритм:
// На сервере преобразуем коллекцию формы в обычную ТЗ
ТЗ = ДанныеФормыВЗначение(Объект.ТЗ_НаФорме, Тип("ТаблицаЗначений"));
// Выполняем любые операции с ТЗ (добавление, удаление, отбор)
// ...
// Загружаем данные обратно в форму
ЗначениеВДанныеФормы(ТЗ, Объект.ТЗ_НаФорме);
При работе с таблицами на управляемых формах помните следующие правила:
ДанныеФормыКоллекция как с независимым объектом, если это возможно.ЗаполнитьЗначенияСвойств в цикле — это самый наглядный и менее подверженный ошибкам метод.ОбновитьОтображениеДанных() в 99% случаев не требуется: платформа 1С автоматически обновляет интерфейс при завершении работы кода на сервере, если вы изменили реквизиты формы.Следуя этим рекомендациям, вы сможете эффективно управлять отображением данных на форме и избежите классических ошибок с идентификаторами строк и несовпадением типов данных.