Доступ к табличным частям в 1С способы и оптимизация

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

+7 (800) 301-07-30

Реклама jurik.ru

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

Содержание

  1. Что такое табличная часть?
  2. Прямой доступ через объект (через точку)
  3. Доступ через запрос (SQL‑подобный запрос)
  4. Оптимизация и кэширование
  5. Примеры кода
  6. Контакты для обращений

Что такое табличная часть?

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

Прямой доступ через объект (через точку)

Самый простой способ – обратиться к ТЧ через точку:

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

Однако такой подход имеет два важных нюанса:

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

Для реквизитов часто используют функцию ОбщегоНазначения.ЗначениеРеквизитаОбъекта, которая формирует запрос только к нужному полю. Для табличных частей аналогичного «тонкого» доступа нет, поэтому рекомендуется использовать запросы (см. раздел 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

Руководство:

  • Генеральный директор – Петров П.П;
  • Технический директор – Сидоров С.С.
  • Директор по клиентскому обслуживанию – Кузнецова К.К.

Отзывы клиентов:

  • «Отличная поддержка, быстро решают любые вопросы» – ООО «ТехноПартнер»
  • «Профессиональные консультации по оптимизации запросов к табличным частям» – АО «СтройИнвест»
  • «Сервис на высоте, рекомендую всем коллегам» – ИП «Смирнова Е.В.»