Как правильно обращаться к табличной части документа в 1С 8.3: ЭтотОбъект, ТЧ или ЭлементыФормы?

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

При разработке в среде 1С:Предприятие 8.3 (особенно при работе с обычным приложением) начинающие разработчики часто сталкиваются с дилеммой: каким именно способом обратиться к табличной части документа? Кажется, что варианты ЭтотОбъект.ТЧ, просто ТЧ и ЭлементыФормы.ТЧ возвращают одно и то же, но это не так. Разберем детально механику работы платформы, чтобы расставить все точки над «i».

Понятие MVC: Разделение данных и их отображения

Для начала проанализируем ситуацию с точки зрения архитектуры. В 1С, как и во многих современных системах, реализован принцип разделения модели (данных) и представления (интерфейса). Рассмотрим, что это значит для нас:

  1. Модель (Данные) — это содержимое табличной части, которое находится в оперативной памяти после прочтения из базы или ввода пользователем. Это объект ТабличнаяЧасть.
  2. Представление (Интерфейс) — это то, что мы видим на экране. В обычных формах это элемент управления под названием ТабличноеПоле.

Когда вы пишете код, очень важно понимать, с чем именно вы взаимодействуете в данный момент — с «сырыми» данными в памяти или с визуальным объектом на форме.

Вариант 1: Обращение напрямую через ТЧ или ЭтотОбъект.ТЧ

В модуле формы документа обращение по имени табличной части (например, ТЧ1) или через префикс ЭтотОбъект.ТЧ1 — это обращение к данным объекта. Это наиболее распространенный и правильный способ, если ваша задача — программно изменить состав строк или значения реквизитов.

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


// Часть 1: Программное добавление строк в память объекта
Для Счетчик = 1 по 10 Цикл
    НоваяСтрока = ТЧ1.Добавить();
    НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("001");
    НоваяСтрока.Количество = Счетчик;
КонецЦикла;

// Часть 2: Редактирование уже существующих данных
Для Каждого ТекущаяСтрока Из ТЧ1 Цикл
    ТекущаяСтрока.Количество = ТекущаяСтрока.Количество * 2;
КонецЦикла;

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

Вариант 2: ЭлементыФормы.ТЧ — работа с интерфейсом

Когда мы обращаемся к ЭлементыФормы.ТЧ1, мы получаем доступ к Табличному полю. Это визуальный элемент, у которого есть свойства, не имеющие отношения к самим данным в базе. Выясним, когда это необходимо:

Посмотрим на пример работы с выделенной пользователем строкой:


ТекущаяСтрока = ЭлементыФормы.ТЧ1.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
    // Мы работаем с данными конкретной строки через интерфейсный объект
    ТекущаяСтрока.Цена = 100;
КонецЕсли;

Синхронизация между данными и формой

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

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

Данные «в памяти» против данных «в базе»

Проанализируем еще одну частую ошибку. Если вы открыли документ, изменили в нем строки, но еще не нажали кнопку «Записать», то:

  1. В ТЧ1 лежат новые, измененные вами данные (в оперативной памяти).
  2. В базе данных (на диске) все еще лежат старые данные.

Если вам в коде формы вдруг понадобилось сравнить текущие изменения с тем, что было записано изначально, вам нужно обращаться к ссылке документа:


// Это данные, которые уже записаны в БД
СтарыеДанные = Ссылка.Товары;
Для Каждого СтрокаБД Из СтарыеДанные Цикл
    // Сравниваем или анализируем
КонецЦикла;

Внимание: Обращение через Ссылка всегда инициирует запрос к базе данных. Не используйте этот метод внутри циклов без крайней необходимости, так как это серьезно снижает производительность системы.

Особенности событий при программном изменении

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

Если же вы написали в коде СтрокаТЧ.Количество = 10;, событие ПриИзменении в табличном поле не вызовется автоматически. Вам придется либо выносить логику пересчета в отдельную процедуру и вызывать ее вручную, либо дублировать расчеты в коде.

Подведем итог

Для эффективной работы в обычном приложении 1С 8.3 придерживайтесь следующих правил:

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

Разделяя в своем сознании объект данных и его визуальную оболочку, вы застрахуете себя от ошибок и сделаете свой код более предсказуемым и производительным.

← На главную