Как оптимизировать запрос к табличным частям документа в 1С?

Программист 1С v8.3 (Управляемые формы)
← На главную

При разработке отчетов или обработок в 1С часто возникает задача объединения данных из нескольких табличных частей документа с данными его шапки. Начинающие разработчики часто сталкиваются с падением производительности при использовании прямых обращений к реквизитам через точку (разыменование). Давайте разберемся, почему это происходит и как правильно организовать получение данных с помощью пакетных запросов.

Почему возникают проблемы с производительностью?

В исходном запросе автора активно применялись конструкции вида РеализацияТоваровУслугТовары.Ссылка.Контрагент или РеализацияТоваровУслугТовары.Ссылка.Проведен. В языке запросов 1С это называется «разыменованием полей».

Важно понимать: при каждом таком обращении платформа 1С выполняет скрытое левое соединение с основной таблицей документа. Если в табличной части документа 100 строк, а в запросе вы обращаетесь к пяти реквизитам шапки через точку, система фактически выполняет сотни лишних операций соединения. Это критически замедляет выполнение запроса, особенно в файловом варианте информационной базы.

Решение 1: Использование пакетного запроса с временными таблицами

Самый эффективный и современный способ избежать лишних соединений — это предварительная выгрузка «шапки» документа во временную таблицу. Временные таблицы позволяют платформе один раз считать данные из основной таблицы и использовать их для дальнейших соединений.

Рассмотрим, как реализовать этот подход на практике:


ВЫБРАТЬ
    РТУ.Ссылка КАК Ссылка,
    РТУ.Проведен КАК Проведен,
    РТУ.Контрагент КАК Контрагент,
    РТУ.Комментарий КАК Комментарий,
    РТУ.СведенияОТранспортировкеИГрузе КАК СведенияОТранспортировкеИГрузе
ПОМЕСТИТЬ втРТУ
ИЗ
    Документ.РеализацияТоваровУслуг КАК РТУ
ГДЕ
    РТУ.Ссылка = &Ссылка
    И НЕ РТУ.ПометкаУдаления;

После того как данные шапки помещены в таблицу втРТУ, мы можем объединять их с табличными частями товаров и услуг. Это делает код более читаемым и быстрым.

Решение 2: Соединение временной таблицы с табличными частями

Когда шапка документа подготовлена, мы можем соединить ее с данными табличных частей. Для обеспечения максимальной скорости выполнения и корректной работы оптимизатора СУБД рекомендуется использовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ, если вы уверены в наличии данных.


ВЫБРАТЬ
    втРТУ.Ссылка,
    втРТУ.Проведен,
    втРТУ.Контрагент,
    "Товар" КАК ВидНоменклатуры,
    Товары.Номенклатура,
    Товары.Сумма,
    Товары.Количество,
    втРТУ.Комментарий
ИЗ
    втРТУ КАК втРТУ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары
    ПО втРТУ.Ссылка = Товары.Ссылка

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    втРТУ.Ссылка,
    втРТУ.Проведен,
    втРТУ.Контрагент,
    "Услуга",
    Услуги.Номенклатура,
    Услуги.Сумма,
    Услуги.Количество,
    втРТУ.Комментарий
ИЗ
    втРТУ КАК втРТУ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Услуги КАК Услуги
    ПО втРТУ.Ссылка = Услуги.Ссылка;

Основные рекомендации по оптимизации

  1. Минимизируйте разыменование: Всегда старайтесь избегать обращений Ссылка.Реквизит непосредственно в списке выбора табличной части. Помещайте данные шапки во временную таблицу.
  2. Используйте пакетные запросы: Пакетные запросы позволяют разбивать сложную логику на этапы. Это упрощает отладку: вы можете проверить содержимое каждой временной таблицы на каждом этапе выполнения запроса.
  3. Применяйте внутреннее соединение (INNER JOIN): Там, где это уместно, используйте внутреннее соединение вместо левого. Это позволяет оптимизатору СУБД строить более эффективные планы выполнения запроса, так как он получает однозначную информацию о том, что данные должны существовать в обеих таблицах.
  4. Анализируйте план запроса: Если запрос все равно работает медленно, используйте инструмент «Технологический журнал» или встроенный в консоль запросов функционал «План запроса», чтобы увидеть, какие этапы занимают больше всего ресурсов.

Следуя этим правилам, вы добьетесь значительного прироста производительности даже на объемных данных. Использование временных таблиц — это стандарт индустрии при разработке профессиональных отчетов в 1С, который обеспечивает стабильность и масштабируемость вашего кода.

← На главную