К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как обратиться к табличной части обработки в 1С

Как обратиться к табличной части внешней обработки в 1С: обращение через объект и форму, перебор строк, поиск, добавление и очистка данных с примерами кода.

Табличная часть внешней обработки в 1С — это реквизит типа «ТаблицаЗначений», который хранится в объекте обработки и отображается на форме. Главная сложность для начинающего разработчика в том, что обращение к ней различается в зависимости от контекста: из модуля объекта, из модуля формы обычного приложения или из управляемой формы. Неправильный контекст — самая частая причина ошибки «Поле объекта не обнаружено».

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

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

Обращение к табличной части из модуля объекта обработки

Самый простой контекст — модуль объекта внешней обработки. Здесь табличная часть доступна как обычный реквизит по её имени, указанному в конфигураторе. Например, если табличная часть называется Товары, то код обращения выглядит так:

// Добавление строки

НоваяСтрока = Товары.Добавить();

НоваяСтрока.Номенклатура = ТекущаяНоменклатура;

НоваяСтрока.Количество = 1;

// Количество строк

ЧислоСтрок = Товары.Количество();

// Очистка табличной части

Товары.Очистить();

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

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

Обращение из управляемой формы обработки

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

&НаКлиенте

Процедура ЗаполнитьНажатие(Команда)

Для Каждого Строка Из Объект.Товары Цикл

Строка.Сумма = Строка.Цена * Строка.Количество;

КонецЦикла;

КонецПроцедуры

Если табличная часть выведена на форму как элемент «Таблица формы», то для работы с текущей (выделенной) строкой используйте свойство ТекущиеДанные элемента формы:

&НаКлиенте

Процедура ТоварыПриИзменении(Элемент)

ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;

Если ТекущаяСтрока <> Неопределено Тогда

ТекущаяСтрока.Сумма = ТекущаяСтрока.Цена * ТекущаяСтрока.Количество;

КонецЕсли;

КонецПроцедуры

Обращение к объекту обработки на сервере

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

&НаСервере

Процедура ВыполнитьНаСервере()

ОбъектОбработки = РеквизитФормыВЗначение("Объект");

ОбъектОбработки.ЗаполнитьТовары(); // метод модуля объекта

ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");

КонецПроцедуры

Обращение из обычной формы

В обычном приложении (толстый клиент) форма обработки имеет прямой доступ к объекту. Если форма — основная форма обработки, табличная часть доступна напрямую по имени, как в модуле объекта:

// Обычная форма обработки

Процедура КнопкаЗаполнитьНажатие(Кнопка)

Товары.Очистить();

НоваяСтрока = Товары.Добавить();

НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("000001");

КонецПроцедуры

Если обработка открыта из другого объекта и нужно обратиться к ней извне, используйте свойство формы ОбработкаОбъект или получайте объект через Форма.Объект в зависимости от способа открытия. Внешний доступ к чужой форме — хрупкий механизм; надёжнее передавать данные через параметры при открытии или через оповещения.

Перебор, поиск и отбор строк табличной части

Табличная часть обработки поддерживает те же методы, что и таблица значений: перебор в цикле, поиск по значению, построение индексированного отбора. Основные приёмы:

// Перебор с условием

Для Каждого Строка Из Объект.Товары Цикл

Если Строка.Количество = 0 Тогда

Сообщить("Нулевое количество в строке " + Строка.НомерСтроки);

КонецЕсли;

КонецЦикла;

// Поиск первой подходящей строки

НайденнаяСтрока = Объект.Товары.Найти(ИскомаяНоменклатура, "Номенклатура");

// Поиск всех подходящих строк

ПараметрыОтбора = Новый Структура("Склад", ВыбранныйСклад);

НайденныеСтроки = Объект.Товары.НайтиСтроки(ПараметрыОтбора);

// Итог по числовой колонке

ОбщееКоличество = Объект.Товары.Итог("Количество");

Метод НайтиСтроки возвращает массив строк — удобно для массовой обработки или удаления. При удалении строк в цикле перебирайте коллекцию с конца (Количество() - 1 до 0 с шагом -1) или удаляйте по найденному массиву, иначе индексы сместятся и часть строк будет пропущена.

Порядок действий при добавлении строки
  1. 1
    Определите контекст: модуль объекта, управляемая или обычная форма
  2. 2
    В управляемой форме используйте Объект.ИмяТЧ, в модуле объекта — просто имя
  3. 3
    Вызовите метод Добавить() и заполните колонки новой строки
  4. 4
    При серверном вызове верните данные через ЗначениеВРеквизитФормы
  5. 5
    Проверьте результат: строка видна в таблице на форме, НомерСтроки присвоен автоматически

Загрузка данных из табличного документа или таблицы значений

Частая задача — заполнить табличную часть обработки из внешнего источника: файла Excel, табличного документа или результата запроса. Метод Загрузить копирует данные из таблицы значений с совпадающими именами колонок:

Запрос = Новый Запрос("ВЫБРАТЬ Номенклатура, Количество ИЗ ...");

Объект.Товары.Загрузить(Запрос.Выполнить().Выгрузить());

Имена колонок в источнике должны совпадать с именами колонок табличной части, иначе данные по несовпадающим колонкам будут потеряны без предупреждения. Если имена различаются, перебирайте строки источника в цикле и заполняйте строки табличной части вручную — это длиннее, но прозрачнее и безопаснее.

Типичные ошибки и их диагностика

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

Вторая частая ситуация — изменения «пропадают» после серверного вызова. Причина в том, что данные изменили в копии объекта, полученной через РеквизитФормыВЗначение, но не вернули обратно в форму. Проверяйте наличие парного вызова ЗначениеВРеквизитФормы.

Третья группа ошибок связана с контекстом выполнения: попытка обратиться к элементам формы (Элементы.Товары) в серверной процедуре без контекста формы или в модуле объекта. Элементы формы существуют только в модуле формы; в модуле объекта доступны только данные.

Типичные ошибки
01
Обращение к табличной части по имени в управляемой форме без префикса Объект — ошибка «Поле объекта не обнаружено»
02
Забытый ЗначениеВРеквизитФормы после серверной обработки — изменения не отображаются на форме
03
Удаление строк в прямом цикле перебора — часть строк пропускается из-за смещения индексов
04
Использование Загрузить() при несовпадающих именах колонок — данные молча теряются
05
Обращение к Элементы.Товары.ТекущиеДанные на сервере без проверки — ТекущиеДанные доступны только на клиенте
Контрольные точки

Как проверить результат

Отображение строки на форме
Норма

После Добавить() строка видна в таблице, номер строки проставлен

Тревожный признак

Строка добавлена в объект, но на форме пусто — нет ЗначениеВРеквизитФормы

Количество строк
Норма

Объект.Товары.Количество() соответствует ожиданиям после загрузки

Тревожный признак

Количество 0 — проверьте, в тот ли реквизит формы загружены данные

Текущая строка
Норма

Элементы.Товары.ТекущиеДанные возвращает структуру строки

Тревожный признак

ТекущиеДанные = Неопределено — таблица пуста или нет активной строки

Часто задаваемые вопросы

Чем табличная часть обработки отличается от реквизита формы типа «ТаблицаЗначений»?

Табличная часть хранится в объекте обработки и доступна в её модуле объекта, а реквизит формы существует только внутри формы. Если данные нужны только для отображения и промежуточных расчётов, достаточно реквизита формы; если их обрабатывает модуль объекта — используйте табличную часть.

Как обратиться к табличной части обработки из другой формы или документа?

Напрямую — никак: объект обработки существует только внутри её экземпляра. Передавайте данные через параметры при открытии формы, через временное хранилище (ПоместитьВоВременноеХранилище) или через оповещения Оповестить/ОбработкаОповещения.

Почему в тонком клиенте не работает код, который работал в толстом?

В управляемом приложении действует разделение контекста на клиент и сервер. Методы, требующие объекта обработки или запросов к базе, должны выполняться в серверных процедурах с директивой &НаСервере, а клиентский код может работать только с данными формы.

Как получить номер текущей строки табличной части?

На клиенте: Элементы.Товары.ТекущиеДанные.НомерСтроки. Можно также взять индекс через Элементы.Товары.ТекущаяСтрока — это идентификатор строки коллекции, по которому строку получают методом НайтиПоИдентификатору.

Можно ли отсортировать табличную часть обработки?

Да, метод Сортировать("Колонка Возр, Колонка2 Убыв") доступен, так как табличная часть поддерживает интерфейс таблицы значений. После сортировки на форме порядок строк обновится автоматически.

Итог

Что важно запомнить

Контекст определяет синтаксис: в модуле объекта — имя табличной части напрямую, в управляемой форме — Объект.ИмяТЧ, текущая строка — через Элементы.ИмяТЧ.ТекущиеДанные. После серверной обработки через РеквизитФормыВЗначение не забывайте вернуть данные вызовом ЗначениеВРеквизитФормы.