Как правильно обращаться к табличной части и элементам формы в 1С 8.3

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

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

1. Обращение к табличной части в управляемой форме

В управляемой форме данные документа находятся в основном реквизите формы — обычно он называется Объект. Сама табличная часть на форме представлена типом ДанныеФормыКоллекция, а не объектом прикладного типа. Поэтому прямое обращение по имени таблицы не сработает — необходимо обращаться через реквизит формы Объект.ИмяТабличнойЧасти.

Рассмотрим пример полного обхода строк таблицы в цикле:


Для Каждого Стр Из Объект.ТабЧасть Цикл
    Стр.КолонкаЦ = Стр.КолонкаА + Стр.КолонкаБ;
КонецЦикла;

Такой цикл успешно выполняется как в клиентских процедурах с директивой &НаКлиенте, так и в серверных &НаСервере. Однако при работе на клиенте действуют строгие ограничения платформы.

2. Особенности работы с реквизитами на клиенте и сервере

Проанализируем ключевое различие между контекстом клиента и сервера при работе со ссылочными данными:

  1. На клиенте: доступны только простые типы и отображаемые строковые представления. Обратиться к реквизитам через точку от ссылки (например, Стр.Товар.Артикул или Стр.Товар.СтавкаНДС) нельзя — это вызовет ошибку выполнения.
  2. На сервере: доступны полные ссылочные типы, чтение любых реквизитов через точку, работа с запросами и блокировками.

Если для расчета строки требуются дополнительные данные из связанных справочников, необходимо вызывать серверную процедуру или функцию. Рассмотрим пример передачи управления с клиента на сервер:


&НаКлиенте
Процедура ПересчитатьТабличнуюЧасть(Команда)
    ПересчитатьТабличнуюЧастьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПересчитатьТабличнуюЧастьНаСервере()
    Для Каждого Стр Из Объект.ТабЧасть Цикл
        // На сервере можно безопасно обращаться к реквизитам ссылок через точку
        Если ЗначениеЗаполнено(Стр.Товар) Тогда
            Стр.КолонкаЦ = Стр.КолонкаА * Стр.Товар.Коэффициент;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

3. Работа с активной строкой таблицы без обхода всей коллекции

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

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


&НаКлиенте
Процедура ТабЧастьКолонкаАПриИзменении(Элемент)
    ТекущаяСтрока = Элементы.ТабЧасть.ТекущиеДанные;
    Если ТекущаяСтрока <> Неопределено Тогда
        ТекущаяСтрока.КолонкаЦ = ТекущаяСтрока.КолонкаА + ТекущаяСтрока.КолонкаБ;
    КонецЕсли;
КонецПроцедуры

Такой подход обеспечивает мгновенный отклик пользовательского интерфейса без лишних серверных вызовов.

4. Создание кнопок и назначение обработчиков в управляемых формах

В управляемых формах кнопка не может ссылаться на процедуру напрямую. Связующим звеном выступает Команда формы. Разберем по шагам алгоритм создания кнопки:

  1. Откроем форму в конфигураторе и перейдем на вкладку Команды (раздел «Команды формы»).
  2. Нажмем кнопку Добавить и укажем понятное имя команды (например, РассчитатьИтоги).
  3. В палитре свойств созданной команды найдем свойство Действие и нажмем на кнопку с лупой для генерации обработчика в модуле формы (создается процедура с директивой &НаКлиенте).
  4. Перейдем обратно на вкладку Элементы и перетащим созданную команду в нужную командную панель формы или командную панель таблицы. Платформа автоматически создаст связанную кнопку.

5. Разделение бизнес-логики: форма или модуль объекта

При проектировании расчетов важно разделять логику отображения и целостность данных:

  1. В модуле формы выполняются оперативные визуальные расчеты для пользователя (при вводе данных в строку, при нажатии специализированных кнопок заполнения).
  2. В модуле объекта (документа) в обработчике ПередЗаписью размещается обязательный алгоритм проверки и итогового расчета сумм. Это гарантирует, что данные запишутся корректно даже при программном создании или загрузке документа из внешних систем без открытия формы.
← На главную