В процессе разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с задачей массового изменения данных в конкретной колонке табличной части (ТЧ). Обычный перебор строк в цикле кажется очевидным решением, однако при больших объемах данных или необходимости оптимизации серверных вызовов возникают вопросы о более эффективных методах, таких как ЗагрузитьКолонку. В этой статье мы разберем, почему некоторые методы недоступны в модуле формы, и рассмотрим четыре проверенных способа решения этой задачи.
Разберем типичную ситуацию: разработчик пытается вызвать метод ЗагрузитьКолонку для табличной части в модуле формы, но контекстная подсказка его не предлагает. Выясним причину этого поведения, проанализировав типы данных 1С. В управляемом приложении табличная часть, доступная через реквизит Объект, имеет тип ДанныеФормыКоллекция. Этот объект предназначен для отображения данных в интерфейсе и имеет ограниченный набор методов (например, Добавить, Удалить, НайтиСтроки).
Важный момент: метод ЗагрузитьКолонку является методом объекта типа ТабличнаяЧасть или ТаблицаЗначений. Чтобы воспользоваться этим методом, данные необходимо либо преобразовать в объектную сущность на сервере, либо выгрузить в промежуточную таблицу значений. Рассмотрим подробнее, как это реализовать на практике.
Этот метод является самым простым и рекомендуемым для небольших таблиц (до 500–1000 строк). Он не требует преобразования типов и работает напрямую с данными формы. Проанализируем пример кода, где мы копируем данные из одной колонки в другую при определенном условии:
Для Каждого СтрокаТЧ Из Объект.ТЧДанныеJS Цикл
Если СтрокаТЧ.БуферКоличество = 0 Тогда
СтрокаТЧ.БуферКоличество = СтрокаТЧ.СкладКоличество;
КонецЕсли;
КонецЦикла;
Преимущества: простота реализации, отсутствие необходимости вызова тяжелых процедур трансформации данных. Если код выполняется на клиенте, это обеспечивает мгновенный отклик интерфейса без задержек на передачу данных серверу.
Если таблица содержит значительное количество строк, работа напрямую с коллекцией формы может замедлиться. В этом случае эффективнее выгрузить данные в объект ТаблицаЗначений, обработать их и загрузить обратно. Посмотрим на алгоритм реализации в модуле формы:
// 1. Выгружаем ТЧ в Таблицу Значений
Таблица = Объект.ТЧДанныеJS.Выгрузить();
// 2. Получаем массив значений из колонки-источника
ЗначенияКолонки = Таблица.ВыгрузитьКолонку("СкладКоличество");
// 3. Загружаем этот массив в колонку-приемник
Таблица.ЗагрузитьКолонку(ЗначенияКолонки, "БуферКоличество");
// 4. Возвращаем измененную таблицу в реквизит формы
Объект.ТЧДанныеJS.Загрузить(Таблица);
Обратите внимание, что метод ЗагрузитьКолонку сопоставляет данные строго по индексам строк. Если вы предварительно отфильтровали или отсортировали таблицу значений, данные могут попасть не в те строки. Всегда проверяйте соответствие количества элементов в массиве количеству строк в таблице.
Этот способ позволяет получить доступ к полноценному объекту документа или справочника на стороне сервера. Мы используем метод РеквизитФормыВЗначение, чтобы превратить данные формы в объект, у которого ТЧ имеет тип ТабличнаяЧасть и поддерживает метод ЗагрузитьКолонку.
&НаСервере
Процедура ЗаполнитьКолонкуНаСервере()
// Преобразуем данные формы в объект метаданных
ДокументОбъект = РеквизитФормыВЗначение("Объект");
// Работаем напрямую с методами табличной части
ЗначенияКолонки = ДокументОбъект.ТЧДанныеJS.ВыгрузитьКолонку("СкладКоличество");
ДокументОбъект.ТЧДанныеJS.ЗагрузитьКолонку(ЗначенияКолонки, "БуферКоличество");
// Возвращаем изменения обратно в форму
ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
КонецПроцедуры
Важное предупреждение: метод РеквизитФормыВЗначение является ресурсоемким. Он полностью воссоздает объект в памяти сервера, включая выполнение кода в модуле объекта (секция инициализации). Если документ "тяжелый" и содержит много данных, этот способ может быть медленнее, чем прямая выгрузка в ТЗ.
Для соблюдения архитектурных стандартов 1С сложную логику заполнения лучше выносить в модуль объекта. Это позволяет переиспользовать код в разных формах или при программном создании документов. Разберем по шагам, как это выглядит:
В модуле объекта создаем экспортную процедуру:
Процедура ПерезаполнитьКолонкиБуфера() Экспорт
Значения = ТЧДанныеJS.ВыгрузитьКолонку("СкладКоличество");
ТЧДанныеJS.ЗагрузитьКолонку(Значения, "БуферКоличество");
КонецПроцедуры
Затем вызываем её из модуля формы:
&НаСервере
Процедура ВыполнитьОбновление()
ОбъектДок = РеквизитФормыВЗначение("Объект");
ОбъектДок.ПерезаполнитьКолонкиБуфера();
ЗначениеВРеквизитФормы(ОбъектДок, "Объект");
КонецПроцедуры
Выясним, какой метод выбрать в зависимости от условий задачи:
ЗагрузитьКолонку в ТаблицеЗначений на сервере отработает в разы быстрее, чем цикл.ЗагрузитьКолонку система пытается автоматически привести типы. Если в массиве строк окажется значение, не соответствующее типу колонки, может возникнуть ошибка или запись пустого значения.ТаблицейЗначений и РеквизитФормыВЗначение возможна только на сервере. Если ваша задача — мгновенное обновление при изменении поля пользователем, используйте цикл на клиенте.Если ваша цель — не скопировать данные из одной колонки в другую, а установить во всей колонке одно и то же значение (например, обнулить остатки или установить статус), рассмотрим метод ЗаполнитьЗначения объекта ТаблицаЗначений. Это самый быстрый способ массового изменения данных без явного цикла.
// Пример быстрой установки значения во всей колонке
ТЗ = Объект.ТЧДанныеJS.Выгрузить();
ТЗ.ЗаполнитьЗначения(0, "БуферКоличество");
Объект.ТЧДанныеJS.Загрузить(ТЗ);
Используя эти подходы, вы сможете выбрать оптимальный баланс между скоростью разработки и производительностью системы, обеспечивая корректную работу с табличными частями в любых конфигурациях 1С.