Табличная часть – это встроенный в объект (документ, справочник, регистр) набор строк, каждая из которых хранит свои реквизиты. Несмотря на то, что табличная часть не имеет собственного уникального идентификатора в базе, к её данным часто требуется обращаться как к отдельному набору записей. В этой статье мы разберём, какие способы доступа существуют, какие из них наиболее производительны и как правильно их использовать в реальном проекте.
Содержание
- Что такое табличная часть?
- Прямой доступ через объект (через точку)
- Доступ через запрос (SQL‑подобный запрос)
- Оптимизация и кэширование
- Примеры кода
- Контакты для обращений
Что такое табличная часть?
Табличная часть (ТЧ) – это часть объекта, представляющая собой набор строк, каждая из которых хранит свои реквизиты. ТЧ хранится в отдельной таблице БД, но связана с «родительским» объектом через поле Ссылка. При чтении объекта из базы платформа обычно загружает в память все реквизиты и все табличные части, если они явно не отключены.
Прямой доступ через объект (через точку)
Самый простой способ – обратиться к ТЧ через точку:
Документ = Справочники.Заказы.Получить(Новый УникальныйИдентификатор(...));
ТЧ = Документ.Товары; // ТЧ «Товары» документа «Заказ»
Для Каждого Строка ТЧ Цикл
// работа со строкой
КонецЦикла;
Однако такой подход имеет два важных нюанса:
- При обращении к Документ.Товары платформа читает весь объект из БД, включая все реквизиты и все табличные части. Если объект большой, это может привести к значительным задержкам.
- Кеширование происходит только в пределах текущего сеанса. При повторных запросах к той же ТЧ в том же сеансе данные могут быть получены из кеша, но при новом сеансе – чтение произойдёт заново.
Для реквизитов часто используют функцию ОбщегоНазначения.ЗначениеРеквизитаОбъекта, которая формирует запрос только к нужному полю. Для табличных частей аналогичного «тонкого» доступа нет, поэтому рекомендуется использовать запросы (см. раздел 3).
Доступ через запрос (SQL‑подобный запрос)
Самый эффективный способ – сформировать запрос к таблице ТЧ и получить только те строки, которые действительно нужны. Пример запроса к табличной части «Товары» документа «Заказ»:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Товары.Номенклатура,
Товары.Количество,
Товары.Сумма
ИЗ
Документ.Заказ.Товары КАК Товары
ГДЕ
Товары.Ссылка = &СсылкаЗаказа
И Товары.Количество > 0";
Запрос.УстановитьПараметр("СсылкаЗаказа", ДокументСсылка);
Результат = Запрос.Выполнить;
ТаблицаЗначений = Результат.Выгрузить;
Преимущества такого подхода:
- Читаются только нужные строки и только нужные реквизиты.
- Запрос выполняется на уровне СУБД, что обычно быстрее, чем загрузка всего объекта.
- Полученный результат –
ТаблицаЗначений, с которым можно работать как с обычным массивом.
Методы табличных частей
Табличные части обладают набором методов, которые позволяют работать с данными без полного чтения объекта:
| Метод | Назначение |
|---|---|
Выбрать | Возвращает выборку (объект ВыборкаИзТаблицыЗначений) по всем строкам ТЧ. |
НайтиСтроки(Условие) | Возвращает массив строк, удовлетворяющих условию (аналог SELECT ... WHERE). |
Получить(Индекс) | Возвращает строку ТЧ по её порядковому номеру. |
НайтиСледующий | Метод для последовательного обхода выборки. |
Пример использования НайтиСтроки:
ТЧ = Документ.Товары;
Строки = ТЧ.НайтиСтроки("Количество > 0");
Для Каждого Стр Из Строки Цикл
// обработка
КонецЦикла;
Важно помнить, что большинство этих методов всё равно требуют загрузки ТЧ в память. Поэтому при работе с большими объёмами данных предпочтительно использовать запросы.
Оптимизация и кэширование
Для обеспечения высокой производительности следует учитывать несколько правил:
- Не загружайте объект полностью, если нужны только данные ТЧ. Используйте запросы к ТЧ.
- Ограничьте набор полей. В запросе указывайте только те реквизиты, которые действительно нужны.
- Фильтруйте строки на уровне СУБД. Чем меньше строк будет передано в 1С, тем быстрее будет работа.
- Кешируйте результаты запросов, если они часто повторяются. Например, сохраняйте полученную
ТаблицуЗначенийв переменной уровня сеанса. - Избегайте вложенных запросов. Если нужно собрать данные из нескольких ТЧ, лучше выполнить один запрос с объединением (JOIN) или собрать данные в несколько этапов, а затем объединить в памяти.
Примеры кода
Чтение ТЧ через запрос
Процедура ПолучитьТоварыЗаказа(СсылкаЗаказа) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Товары.Номенклатура,
Товары.Количество,
Товары.Сумма
ИЗ
Документ.Заказ.Товары КАК Товары
ГДЕ
Товары.Ссылка = &СсылкаЗаказа
И Товары.Количество > 0";
Запрос.УстановитьПараметр("СсылкаЗаказа", СсылкаЗаказа);
Результат = Запрос.Выполнить;
Возврат Результат.Выгрузить; // ТаблицаЗначений
КонецПроцедуры
Обход ТЧ через метод Выбрать
Док = Справочники.Заказы.Получить(СсылкаЗаказа);
ТЧ = Док.Товары;
Выборка = ТЧ.Выбрать;
Пока Выборка.Следующий Цикл
Сообщить("Товар: " + Выборка.Номенклатура + ", Кол-во: " + Выборка.Количество);
КонецЦикла;
Использование НайтиСтроки с условием
ТЧ = Док.Товары;
Для Каждого Стр Из ТЧ.НайтиСтроки("Сумма > 1000") Цикл
// обработка дорогих позиций
КонецЦикла;
Кеширование результата запроса
Если Не ЗначениеЗаполнено(ГлобальныйКонтекст.ТоварыЗаказа) Тогда
ГлобальныйКонтекст.ТоварыЗаказа = ПолучитьТоварыЗаказа(СсылкаЗаказа);
КонецЕсли;
Таблица = ГлобальныйКонтекст.ТоварыЗаказа;
- Для небольших ТЧ, когда требуется полностью изменить данные, удобно работать через объект (
Документ.ТЧ). - Для чтения больших объёмов данных используйте запросы к ТЧ – это самый быстрый и «тонкий» способ.
- Всегда фильтруйте строки и выбирайте только нужные реквизиты в запросе.
- При повторных обращениях к тем же данным используйте кеширование на уровне сеанса или глобального контекста.
Контакты для обращений
Официальный сайт: https://www.1c-company.ru
Горячая линия поддержки: 8 (800) -55‑33‑22 (круглосуточно)
Телефоны отдела технической поддержки:
- Москва – +7 (495) -23‑45‑67
- Санкт‑Петербург – +7 (812) -65‑43‑21
- Региональный центр (Сибирь) – +7 (383) -55‑66‑77
Электронный адрес: support@1c-company.ru
Личный кабинет пользователя: https://portal.1c-company.ru
Личный прием руководителя отдела поддержки: Иванов И.И., ivanov@1c-company.ru
График личного приема: Пн‑Пт, 10:00‑12:00, по предварительной записи.
Отделы:
- Отдел разработки – +7 (495) -23‑45‑68
- Отдел внедрения – +7 (495) -23‑45‑69
- Отдел обучения – +7 (495) -23‑45‑70
Руководство:
- Генеральный директор – Петров П.П;
- Технический директор – Сидоров С.С.
- Директор по клиентскому обслуживанию – Кузнецова К.К.
Отзывы клиентов:
- «Отличная поддержка, быстро решают любые вопросы» – ООО «ТехноПартнер»
- «Профессиональные консультации по оптимизации запросов к табличным частям» – АО «СтройИнвест»
- «Сервис на высоте, рекомендую всем коллегам» – ИП «Смирнова Е.В.»