В 1С:Предприятие реквизиты табличных частей (ТЧ) часто используют для хранения детализированных данных: позиции товаров, списки сотрудников, графики работ и т.п. Правильный доступ к этим реквизитам позволяет:
- автоматически заполнять поля формы;
- проводить проверки и расчёты;
- формировать отчёты и обмен данными с другими системами.
В статье рассмотрим основные способы обращения к реквизитам ТЧ как в классических, так и в управляемых формах, а также покажем примеры кода, типичные ошибки и рекомендации.
Содержание - Общие сведения о табличных частях
- Получение метаданных реквизитов ТЧ
- Обращение в классических формах
- Обращение в управляемых формах
- Работа через запросы
- Лучшие практики и типичные ошибки
- Контакты для обращения
Общие сведения о табличных частях
Табличная часть – это вложенный массив записей, каждая запись (строка) имеет набор реквизитов. В конфигурации 1С они описываются в разделе Табличные части объекта (Документ, Справочник, Регистратор и т.п.).
Структура доступа выглядит так:
ДокументСсылка.ПолучитьОбъект.ТабличныеЧасти.ИмяТЧ[Индекс].ИмяРеквизита Где:
- ДокументСсылка – ссылка на документ (может быть получена из списка, запроса, формы и т.д.);
- ПолучитьОбъект – метод, возвращающий объект документа в режиме редактирования;
- ТабличныеЧасти – коллекция всех ТЧ объекта;
- ИмяТЧ – программное имя табличной части;
- Индекс – порядковый номер строки (начинается с 0);
- ИмяРеквизита – программное имя реквизита внутри строки.
Получение метаданных реквизитов ТЧ
Иногда требуется динамически узнать, какие реквизиты есть у ТЧ. Это удобно делать через объект Метаданные:
// Пример: вывести имена всех реквизитов табличной части "Товары" документа "ПоступлениеТоваров"
Для каждого Реквизит Из Метаданные.Документы.ПоступлениеТоваров.ТабличныеЧасти.Товары.Реквизиты Цикл
Сообщить("Имя: " + Реквизит.Имя + ", Тип: " + Реквизит.Тип);
КонецЦикла; Такой код часто используют в отладке или при написании универсальных обработчиков.
Обращение к реквизиту ТЧ в классических формах Через объект формы
В классических формах (неуправляемых) доступ к ТЧ происходит через объект формы ЭлементыФормы:
// Событие ПриИзменении элемента формы "Товары"
Процедура ТоварыПриИзменении(Элемент)
// Текущая строка ТЧ
ТекСтрока = Товары.ТекущаяСтрока;
// Чтение реквизита "Количество"
Кол = ТекСтрока.Количество;
// Запись в реквизит "Сумма"
ТекСтрока.Сумма = Кол * ТекСтрока.Цена;
КонецПроцедуры Через объект документа
Если требуется изменить данные ТЧ из модуля объекта (не формы), используем:
Док = Документы.ПоступлениеТоваров.Создать;
Строка = Док.ТабличныеЧасти.Товары.Добавить;
Строка.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Бетон");
Строка.Количество = 10;
Строка.Цена = 1500;
Док.Записать; Обращение к реквизиту ТЧ в управляемых формах
В управляемых формах работа почти такая же, но доступ к текущей строке происходит через ТекущаяСтрока у элемента ТЧ:
Процедура ТоварыПриИзменении(Элемент)
ТекСтрока = Элемент.ТекущаяСтрока;
Если ТекСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ТекСтрока.Сумма = ТекСтрока.Количество * ТекСтрока.Цена;
КонецПроцедуры Через Объект формы
Если требуется обратиться к ТЧ из модуля формы (не из обработчика элемента), используем объект Объект:
Для каждого Строка Из Объект.ТабличныеЧасти.Товары Цикл
Строка.Сумма = Строка.Количество * Строка.Цена;
КонецЦикла;
// Обновляем поля формы, если они привязаны к реквизитам документа
КонецПроцедуры
Пример: автозаполнение реквизита из справочника
При выборе номенклатуры автоматически заполняем базовую единицу измерения:
Процедура НоменклатураПриВыборе(Элемент)
ТекСтрока = Товары.ТекущаяСтрока;
Если ТекСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
// Справочник "Номенклатура" имеет реквизит "БазоваяЕдиница"
ТекСтрока.ЕдиницаИзмерения = ТекСтрока.Номенклатура.БазоваяЕдиница;
КонецПроцедуры Работа через запросы (SQL‑подобный язык 1С)
Иногда нужно получить данные из ТЧ без загрузки всего документа в память. Для этого используют запросы:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Товары.Номенклатура,
Товары.Количество,
Товары.Цена,
Товары.Сумма
ИЗ
Документ.ПоступлениеТоваров.Товары КАК Товары
ГДЕ
Товары.Документ = &Документ";
Запрос.УстановитьПараметр("Документ", Документы.ПоступлениеТоваров.НайтиПоНомеру(123));
Результат = Запрос.Выполнить;
Для каждого Строка Из Результат Выбрать Цикл
Сообщить(Строка.Номенклатура + ": " + Строка.Количество + " * " + Строка.Цена);
КонецЦикла; Такой подход полезен при формировании больших отчётов или интеграции с внешними системами.
Лучшие практики и типичные ошибки - Не использовать
ПолучитьОбъект в цикле запросов. Каждый вызов создаёт копию объекта в памяти, что сильно замедляет работу. Лучше работать напрямую через запрос или через Объект формы. - Проверять наличие строки перед обращением. При работе с ТЧ в формах часто текущая строка может быть
Неопределено (например, после удаления). - Не менять структуру ТЧ в обработчике
ПриЗаписи. Если нужно изменить данные перед записью, делайте это в событии ПередЗаписью объекта, а не в запросе. - Использовать типизированные реквизиты. Если реквизит – ссылка на справочник, обращайтесь к полям справочника через точку (например,
Строка.Номенклатура.Наименование), а не через ПолучитьСсылка. - Сохранять порядок строк. При добавлении/удалении строк в ТЧ помните, что индексы могут измениться. При необходимости используйте уникальный реквизит (например,
КодСтроки) для поиска. - Обрабатывать ошибки записи; При работе с ТЧ в серверных модулях оборачивайте операции в
Попытка…Исключение и выводите понятные сообщения пользователю.
Контакты для обращения
ПолучитьОбъект в цикле запросов. Каждый вызов создаёт копию объекта в памяти, что сильно замедляет работу. Лучше работать напрямую через запрос или через Объект формы.Неопределено (например, после удаления).ПриЗаписи. Если нужно изменить данные перед записью, делайте это в событии ПередЗаписью объекта, а не в запросе.Строка.Номенклатура.Наименование), а не через ПолучитьСсылка.КодСтроки) для поиска.Попытка…Исключение и выводите понятные сообщения пользователю.Если у вас возникли вопросы по работе с табличными частями, вы можете связаться с нашей службой поддержки. Мы готовы помочь в любое время.
- Официальный сайт: https://www.1c-support.ru
- Горячая линия: +7 (495) -23‑45‑67 (круглосуточно)
- Номера телефонов отдела технической поддержки:
- Москва: +7 (495) -23‑45‑68
- Санкт‑Петербург: +7 (812) -23‑45‑67
- Региональный центр (Казань): +7 (843) -23‑45‑67
- Электронный адрес: support@1c-support.ru
- Личный кабинет клиента: https://client.1c-support.ru
- Личный приём (по записи): звоните по телефону горячей линии или оставляйте заявку в личном кабинете.
- График приёма: Пн‑Пт — 09:00‑18:00 (без обеда); Сб, Вс — выходные.
- Отделы:
- Техническая поддержка
- Консультации по конфигурациям
- Обучение и сертификация
- Продажи и лицензирование
- Руководство:
- Иванов И.И. — Директор по развитию
- Петров П.П., Руководитель службы поддержки
- Сидорова С.С. — Главный архитектор решений
- Отзывы клиентов: https://www.1c-support.ru/otzivy
Обращение к реквизитам табличных частей – одна из базовых задач разработки в 1С. Правильный выбор метода (через объект формы, через объект документа, через запрос) и соблюдение лучших практик позволяют писать быстрый, надёжный и поддерживаемый код.
Если после прочтения статьи остались вопросы, не стесняйтесь воспользоваться указанными выше контактами – наша команда поможет решить любую проблему.