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

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

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

Где хранится табличная часть?

Табличная часть – это отдельный объект типа ТаблицаЗначений, который привязан к реквизиту‑табличной части. В базе данных она хранится в отдельной таблице, но в коде доступ к ней осуществляется через свойства объекта:

  • Объект.ТабличнаяЧасть – ссылка на таблицу значений.
  • Для документов – ДокументОбъект.ТабличнаяЧасть.
  • Для справочников – СправочникОбъект;ТабличнаяЧасть.

Прямой доступ из модуля объекта

Пример чтения данных

В модуле объекта (например, Документ.ПродажаТоваров) можно обратиться к ТЧ так:

Процедура ПриЗаписи(Отказ, СтандартнаяОбработка)
 // Объект – текущий документ
 Таблица = Объект.Товары; // ТЧ «Товары» объявлена в конфигурации
 Для Каждого Строка Из Таблица Цикл
 Сообщить("Товар: " + Строка.Номенклатура + ", Кол-во: " + Строка.Количество);
 КонецЦикла;
КонецПроцедуры

Запись новых строк
Процедура ДобавитьТовар(Номенклатура, Количество, Цена)
 НоваяСтрока = Объект.Товары.Добавить;
 НоваяСтрока.Номенклатура = Номенклатура;
 НоваяСтрока.Количество = Количество;
 НоваяСтрока.Цена = Цена;
КонецПроцедуры

Доступ к ТЧ из внешних обработок и серверных процедур

Если требуется вызвать серверную процедуру из внешней обработки (например, из внешней обработки табличных частей), необходимо:

  1. Зарегистрировать обработку с видом ЗаполнениеОбъекта и типом команды ЗаполнениеФормы. Это позволяет передать объект формы в серверный модуль.
  2. Сделать нужную процедуру экспортируемой (ключевое слово Экспорт), чтобы её можно было вызвать из другого модуля.

Пример регистрации:

&НаКлиенте
Процедура КомандаНаСервере
 ОбъектОбработка = Новый ВнешняяОбработкаТЧ;
 ОбъектОбработка.ПрочитатьТабЧастьВМодуле(Объект);
КонецПроцедуры

Работа с ТЧ в управляемых формах

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

&НаКлиенте
Процедура КнопкаЗаполнитьТЧ(Элемент)
 ОбъектДок = ФормаОбъект.Объект; // получаем объект документа
 ОбъектДок.ЗаполнитьТЧ(Параметры);
КонецПроцедуры

&НаСервере
Экспорт Процедура ЗаполнитьТЧ(Параметры)
 // Здесь уже работаем с ТаблицаЗначений
 Таблица = ЭтотОбъект.Товары;
 // ... заполнение
КонецПроцедуры

Часто встречающиеся ошибки
  • Пустая ТЧ – если в модуле объекта обращаемся к ТЧ, которой ещё не заполнена, будет получена пустая таблица. Убедитесь, что заполняете её до обращения.
  • Неправильный контекст – попытка получить Элементы.Товары.ТекущиеДанные из серверного кода невозможна, т.к. эти свойства существуют только на клиенте.
  • Отсутствие экспорта – без ключевого слова Экспорт процедура не будет доступна из других модулей.

Лучшие практики
  1. Разделяйте клиентскую и серверную логику: клиент – только UI, сервер – работа с ТЧ.
  2. Используйте Для Каждого … Цикл для обхода строк ТЧ; при необходимости – Для i = 0 По Таблица.Количество ─ 1 Цикл для более быстрого доступа.
  3. Сделайте процедуры, работающие с ТЧ, экспортируемыми и передавайте в них объект (или саму ТЧ) как параметр – так код будет переиспользуемым.
  4. При работе с внешними обработками регистрируйте их в конфигураторе, указывая правильный вид и тип команды.

Пример полной реализации

Допустим, нам нужно из модуля документа Документ.ОтчетПоПродажам вызвать внешнюю обработку, которая заполняет ТЧ «Товары» на основании выбранных параметров.

&НаСервере
Экспорт Процедура ЗаполнитьТЧ(ОбъектДок, Параметры)
 ТЧ = ОбъектДок.Товары;
 // Очистим старые строки
 ТЧ.Очистить;

 // Получим данные из справочника «Товары»
 Запрос = Новый Запрос;
 Запрос.Текст = 
 "ВЫБРАТЬ
 Товары.Ссылка КАК Товар,
 Товары.Наименование КАК Наименование,
 Товары.Цена КАК Цена
 ИЗ
 Справочник.Товары КАК Товары
 ГДЕ
 Товары.Тип = &ТипТовара";

 Запрос.УстановитьПараметр("ТипТовара", Параметры.Тип);
 Результат = Запрос.Выполнить;

 Для Каждого Строка Из Результат Выбрать Цикл
 НоваяСтрока = ТЧ.Добавить;
 НоваяСтрока.Товар = Строка.Товар;
 НоваяСтрока.Наименование = Строка.Наименование;
 НоваяСтрока.Цена = Строка.Цена;
 НоваяСтрока;Количество = 0; // пользователь заполнит позже
 КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура КнопкаЗаполнитьНажатие(Элемент)
 Параметры = Новый Структура;
 Параметры.Вставить("ТипТовара", "ТоварДляПродажи");
 // Передаём текущий объект документа в серверную процедуру
 ВнешняяОбработка = Новый ВнешняяОбработкаТЧ;
 ВнешняяОбработка.ЗаполнитьТЧ(ЭтотОбъект, Параметры);
КонецПроцедуры

Обращение к табличной части из модуля объекта – обычная задача в 1С. Главное помнить о разделении клиент‑сервер, о необходимости экспортировать процедуры и правильно регистрировать внешние обработки. При соблюдении этих правил код будет работать быстро, надёжно и будет легко поддерживаться.


Контакты для обращений

Официальный сайт: https://www.1c-company.ru

Горячая линия: +7 (495) -23‑45‑67 (круглосуточно)

Номера телефонов:

  • Техническая поддержка – +7 (495) -23‑45‑68
  • Отдел продаж – +7 (495) -23‑45‑69
  • Сервисный центр – +7 (495) -23‑45‑70

Электронный адрес: support@1c-company.ru

Личный кабинет: https://portal.1c-company.ru

Личный приём (офис): г. Москва, ул. Тверская, д. 7, офис 305

График приёма: Пн‑Пт 09:00‑18:00, обед 13:00‑14:00

Отделы
  • Отдел разработки
  • Отдел внедрения
  • Отдел обучения
  • Отдел поддержки клиентов

Руководство
  • Генеральный директор – Иванов И.И.
  • Технический директор – Петров П.П.
  • Директор по продажам – Сидорова А.А.

Отзывы

Мы ценим обратную связь! Оставьте свой отзыв на странице отзывов или отправьте письмо на feedback@1c-company.ru. Ваше мнение помогает нам становиться лучше.