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