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