Как изменить данные только в одной колонке табличной части?

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

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

Почему метод ЗагрузитьКолонку не виден в модуле формы?

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

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

Способ №1. Прямой обход строк в модуле формы

Этот метод является самым простым и рекомендуемым для небольших таблиц (до 500–1000 строк). Он не требует преобразования типов и работает напрямую с данными формы. Проанализируем пример кода, где мы копируем данные из одной колонки в другую при определенном условии:


Для Каждого СтрокаТЧ Из Объект.ТЧДанныеJS Цикл
    Если СтрокаТЧ.БуферКоличество = 0 Тогда
        СтрокаТЧ.БуферКоличество = СтрокаТЧ.СкладКоличество;
    КонецЕсли;
КонецЦикла;

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

Способ №2. Использование промежуточной Таблицы Значений

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


// 1. Выгружаем ТЧ в Таблицу Значений
Таблица = Объект.ТЧДанныеJS.Выгрузить();

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

// 3. Загружаем этот массив в колонку-приемник
Таблица.ЗагрузитьКолонку(ЗначенияКолонки, "БуферКоличество");

// 4. Возвращаем измененную таблицу в реквизит формы
Объект.ТЧДанныеJS.Загрузить(Таблица);

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

Способ №3. Преобразование реквизита формы в значение (Объект)

Этот способ позволяет получить доступ к полноценному объекту документа или справочника на стороне сервера. Мы используем метод РеквизитФормыВЗначение, чтобы превратить данные формы в объект, у которого ТЧ имеет тип ТабличнаяЧасть и поддерживает метод ЗагрузитьКолонку.


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

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

Способ №4. Вынос логики в модуль объекта

Для соблюдения архитектурных стандартов 1С сложную логику заполнения лучше выносить в модуль объекта. Это позволяет переиспользовать код в разных формах или при программном создании документов. Разберем по шагам, как это выглядит:

В модуле объекта создаем экспортную процедуру:


Процедура ПерезаполнитьКолонкиБуфера() Экспорт
    Значения = ТЧДанныеJS.ВыгрузитьКолонку("СкладКоличество");
    ТЧДанныеJS.ЗагрузитьКолонку(Значения, "БуферКоличество");
КонецПроцедуры

Затем вызываем её из модуля формы:


&НаСервере
Процедура ВыполнитьОбновление()
    ОбъектДок = РеквизитФормыВЗначение("Объект");
    ОбъектДок.ПерезаполнитьКолонкиБуфера();
    ЗначениеВРеквизитФормы(ОбъектДок, "Объект");
КонецПроцедуры

Проанализируем производительность и нюансы

Выясним, какой метод выбрать в зависимости от условий задачи:

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

Дополнительные возможности: метод ЗаполнитьЗначения

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


// Пример быстрой установки значения во всей колонке
ТЗ = Объект.ТЧДанныеJS.Выгрузить();
ТЗ.ЗаполнитьЗначения(0, "БуферКоличество");
Объект.ТЧДанныеJS.Загрузить(ТЗ);

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

← На главную