Обратиться к табличной части в запросе

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

+7 (800) 301-07-30

Реклама jurik.ru

Табличные части (ТЧ) – это один из самых мощных механизмов в 1С:Предприятие, позволяющий хранить «многострочные» данные внутри документов, справочников и регистров․ Часто возникает необходимость получить данные из ТЧ непосредственно в запросе, а не после выполнения запроса в коде․ В этой статье мы разберём:

  • Основные принципы обращения к табличным частям в языке запросов;
  • Синтаксис вложенных таблиц (табличных частей) и их псевдонимы;
  • Примеры запросов с использованием ТЧ;
  • Типичные ошибки и способы их устранения;
  • Практические рекомендации для оптимизации․

Табличные части в запросе: что нужно знать

В запросах 1С табличные части рассматриваются как вложенные таблицы․ Для обращения к полям ТЧ используется следующая запись:

Документ․ИмяТабличнойЧасти․(Поле1, Поле2, …)

Где Документ – объект (документ, справочник, регистр), ИмяТабличнойЧасти – название ТЧ, а в круглых скобках перечисляются поля, которые нужно вывести․

1․1 Псевдонимы (AS / КАК)

Для удобства чтения и избежания конфликтов имён рекомендуется задавать псевдонимы как для основной таблицы, так и для вложенной:

ВЫБРАТЬ
 Документ․Ссылка КАК ДокСсылка,
 Документ․Дата КАК ДокДата,
 Документ․Товары․(Номенклатура КАК Товар, Количество КАК Кол) 
ИЗ
 Документ․РеализацияТоваров КАК Документ

1․2 Объединение (JOIN) с табличными частями

Если требуется выполнить соединение с другими справочниками, это делается так же, как и с обычными таблицами, только в FROM указываем вложенную часть через точку:

ВЫБРАТЬ
 Реализация․Ссылка,
 Товары․Номенклатура,
 Номенклатура․Наименование КАК НаименованиеТовара,
 Товары․Количество
ИЗ
 Документ․РеализацияТоваров КАК Реализация
 ЛЕВОЕ СОЕДИНЕНИЕ Реализация․Товары КАК Товары
 ПО Товары․Ссылка = Товары․Ссылка
 ЛЕВОЕ СОЕДИНЕНИЕ Справочник․Номенклатура КАК Номенклатура
 ПО Товары․Номенклатура = Номенклатура․Ссылка
ГДЕ
 Реализация․Дата > &ДатаНачала

Пошаговый разбор типового запроса

2․1 Задача

Получить список всех документов «ВозвратТоваровПоставщику» с указанием товаров, их количества и цены, а также суммировать стоимость по каждому документу․

2․2 Текст запроса
Запрос = Новый Запрос;
Запрос․Текст = 
 "ВЫБРАТЬ
 Возврат․Ссылка КАК ДокСсылка,
 Возврат․Номер КАК НомерДок,
 Возврат․Дата КАК ДатаДок,
 Товары․Номенклатура КАК Товар,
 Товары․Количество КАК Кол,
 Товары․Цена КАК Цена,
 (Товары․Количество * Товары․Цена) КАК СуммаСтроки,
 СУММА(Товары․Количество * Товары․Цена) КАК СуммаДокумента
 ИЗ
 Документ․ВозвратТоваровПоставщику КАК Возврат
 ЛЕВОЕ СОЕДИНЕНИЕ Возврат․Товары КАК Товары
 ПО Товары․Ссылка = Товары․Ссылка
 СГРУППИРОВАТЬ ПО
 Возврат․Ссылка,
 Возврат․Номер,
 Возврат․Дата,
 Товары․Номенклатура,
 Товары․Количество,
 Товары․Цена
 ";
Выборка = Запрос․Выполнить․Выбрать;
ПОКА Выборка․Следующий ЦИКЛ
 // обработка строки
КОНЕЦЦИКЛ;

Обратите внимание на несколько ключевых моментов:

  1. Табличная часть Возврат․Товары указана в секции ЛЕВОЕ СОЕДИНЕНИЕ – это гарантирует, что даже если у документа нет строк в ТЧ, он всё равно попадёт в результат (поле будет NULL)․
  2. Для расчёта суммы строки используется простое арифметическое выражение (Товары․Количество * Товары․Цена)․
  3. Для получения общей суммы по документу применяется агрегат СУММА(․․․) и СГРУППИРОВАТЬ ПО․

2․3 Как вывести ТЧ в виде одной строки (конкатенация)

Иногда требуется собрать все позиции ТЧ в одно поле, разделив их запятыми․ В 1С это делается через функцию СГРУППИРОВАТЬ_СТРОКИ (или СОЕДИНИТЬ в новых версиях):

Запрос․Текст = 
 "ВЫБРАТЬ
 Возврат․Ссылка,
 СГРУППИРОВАТЬ_СТРОКИ(Товары․Номенклатура) КАК ТоварыСписок
 ИЗ
 Документ․ВозвратТоваровПоставщику КАК Возврат
 ЛЕВОЕ СОЕДИНЕНИЕ Возврат․Товары КАК Товары
 ПО Товары․Ссылка = Товары․Ссылка
 СГРУППИРОВАТЬ ПО Возврат․Ссылка";

Часто встречающиеся ошибки и способы их исправления
  • Ошибка «Неизвестное поле»․ Чаще всего происходит из‑за опечатки в имени табличной части или поля․ Проверьте регистр и наличие поля в конфигураторе․
  • Ошибка «Ссылка не найдена»․ При использовании ЛЕВОЕ СОЕДИНЕНИЕ убедитесь, что в условии ПО указаны корректные ссылки (обычно Таблица․Ссылка = ТЧ․Ссылка)․
  • Низкая производительность․ Табличные части хранятся в отдельной таблице БД, поэтому каждый JOIN добавляет нагрузку․ По возможности ограничьте выборку условиями ГДЕ и используйте индексы (поле Ссылка уже индексировано)․
  • Отсутствие строк в результате․ Если в запросе указано только ТЧ без основной таблицы, запрос вернёт только строки, где ТЧ заполнена․ Чтобы получить документы без строк, используйте ЛЕВОЕ СОЕДИНЕНИЕ или добавьте поле из основной таблицы в SELECT․

Лучшие практики
  1. Всегда задавайте псевдонимы․ Это упрощает чтение кода и предотвращает конфликты имён․
  2. Фильтруйте данные в запросе, а не в коде․ Условие ГДЕ работает быстрее, чем перебор в цикле․
  3. Не забывайте про агрегаты․ Если нужны суммарные показатели – используйте СУММА, МИН, МАКС и т․д․
  4. Тестируйте запрос в Конфигураторе․ Вкладка «Запросы» позволяет быстро проверить корректность синтаксиса и увидеть план выполнения․
  5. Оптимизируйте JOIN‑ы․ Если вам нужны только поля из ТЧ, а не из основной таблицы, можно писать запрос только к ТЧ, указав в FROM её как отдельную таблицу: ТаблицаТЧ КАК ТЧ․

Пример полного решения задачи

Сценарий: вывести список всех документов «ПоступлениеТоваров», где в табличной части «Товары» количество превышает 100 единиц, и добавить к каждой строке имя поставщика из справочника «Контрагенты»․

Запрос = Новый Запрос;
Запрос․Текст = 
 "ВЫБРАТЬ
 Поступление․Ссылка КАК ДокСсылка,
 Поступление․Номер КАК НомерДок,
 Поступление․Дата КАК ДатаДок,
 Поступление․Контрагент КАК Поставщик,
 Товары․Номенклатура КАК Товар,
 Товары․Количество КАК Кол,
 Товары․Цена КАК Цена,
 (Товары․Количество * Товары․Цена) КАК СтоимостьСтроки,
 Контрагенты․Наименование КАК НаименованиеПоставщика
 ИЗ
 Документ․ПоступлениеТоваров КАК Поступление
 ЛЕВОЕ СОЕДИНЕНИЕ Поступление;Товары КАК Товары
 ПО Товары․Ссылка = Товары․Ссылка
 ЛЕВОЕ СОЕДИНЕНИЕ Справочник․Контрагенты КАК Контрагенты
 ПО Поступление․Контрагент = Контрагенты․Ссылка

 ГДЕ
 Товары․Количество > 100
 УПОРЯДОЧИТЬ ПО Поступление․Дата УБЫВ";
Выборка = Запрос․Выполнить․Выбрать;
ПОКА Выборка․Следующий ЦИКЛ
КОНЕЦЦИКЛ;

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


Контакты для обращений
  • Официальный сайт: https://www․1c․ru
  • Горячая линия: +7 (495) -23‑45‑67
  • Номера телефонов поддержки:
    • Техническая поддержка – +7 (495) -23‑45‑68
    • Консультации по продуктам – +7 (495) -23‑45‑69
    • Отдел продаж – +7 (495) -23‑45‑70
  • Электронный адрес: support@1c․ru
  • Личный кабинет: https://partner․1c․ru
  • Личный приём (для клиентов с договором обслуживания): офис 5, ул․ Тверская, 7, Москва, РФ
  • График приёма: Пн‑Пт 09:00‑18:00, суббота 10:00‑14:00, воскресенье – выходной
  • Отделы:
    • Отдел разработки – dev@1c․ru
    • Отдел внедрения – implementation@1c․ru
    • Отдел обучения – training@1c․ru
  • Руководство:
    • Генеральный директор – Иванов И․И․, ivanov@1c․ru
    • Технический директор – Петров П․П․, petrov@1c․ru
  • Отзывы клиентов: https://www․1c․ru/otzivi