Табличные части (ТЧ) – это один из самых мощных механизмов в 1С:Предприятие, позволяющий хранить «многострочные» данные внутри документов, справочников и регистров․ Часто возникает необходимость получить данные из ТЧ непосредственно в запросе, а не после выполнения запроса в коде․ В этой статье мы разберём:
- Основные принципы обращения к табличным частям в языке запросов;
- Синтаксис вложенных таблиц (табличных частей) и их псевдонимы;
- Примеры запросов с использованием
ТЧ; - Типичные ошибки и способы их устранения;
- Практические рекомендации для оптимизации․
Табличные части в запросе: что нужно знать
В запросах 1С табличные части рассматриваются как вложенные таблицы․ Для обращения к полям ТЧ используется следующая запись:
Документ․ИмяТабличнойЧасти․(Поле1, Поле2, …)
Где Документ – объект (документ, справочник, регистр), ИмяТабличнойЧасти – название ТЧ, а в круглых скобках перечисляются поля, которые нужно вывести․
1․1 Псевдонимы (AS / КАК)
Для удобства чтения и избежания конфликтов имён рекомендуется задавать псевдонимы как для основной таблицы, так и для вложенной:
ВЫБРАТЬ
Документ․Ссылка КАК ДокСсылка,
Документ․Дата КАК ДокДата,
Документ․Товары․(Номенклатура КАК Товар, Количество КАК Кол)
ИЗ
Документ․РеализацияТоваров КАК Документ
1․2 Объединение (JOIN) с табличными частями
Если требуется выполнить соединение с другими справочниками, это делается так же, как и с обычными таблицами, только в FROM указываем вложенную часть через точку:
ВЫБРАТЬ
Реализация․Ссылка,
Товары․Номенклатура,
Номенклатура․Наименование КАК НаименованиеТовара,
Товары․Количество
ИЗ
Документ․РеализацияТоваров КАК Реализация
ЛЕВОЕ СОЕДИНЕНИЕ Реализация․Товары КАК Товары
ПО Товары․Ссылка = Товары․Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Справочник․Номенклатура КАК Номенклатура
ПО Товары․Номенклатура = Номенклатура․Ссылка
ГДЕ
Реализация․Дата > &ДатаНачала
Пошаговый разбор типового запроса 2․1 Задача
Получить список всех документов «ВозвратТоваровПоставщику» с указанием товаров, их количества и цены, а также суммировать стоимость по каждому документу․
2․2 Текст запроса Запрос = Новый Запрос;
Запрос․Текст =
"ВЫБРАТЬ
Возврат․Ссылка КАК ДокСсылка,
Возврат․Номер КАК НомерДок,
Возврат․Дата КАК ДатаДок,
Товары․Номенклатура КАК Товар,
Товары․Количество КАК Кол,
Товары․Цена КАК Цена,
(Товары․Количество * Товары․Цена) КАК СуммаСтроки,
СУММА(Товары․Количество * Товары․Цена) КАК СуммаДокумента
ИЗ
Документ․ВозвратТоваровПоставщику КАК Возврат
ЛЕВОЕ СОЕДИНЕНИЕ Возврат․Товары КАК Товары
ПО Товары․Ссылка = Товары․Ссылка
СГРУППИРОВАТЬ ПО
Возврат․Ссылка,
Возврат․Номер,
Возврат․Дата,
Товары․Номенклатура,
Товары․Количество,
Товары․Цена
";
Выборка = Запрос․Выполнить․Выбрать;
ПОКА Выборка․Следующий ЦИКЛ
// обработка строки
КОНЕЦЦИКЛ;
Запрос = Новый Запрос;
Запрос․Текст =
"ВЫБРАТЬ
Возврат․Ссылка КАК ДокСсылка,
Возврат․Номер КАК НомерДок,
Возврат․Дата КАК ДатаДок,
Товары․Номенклатура КАК Товар,
Товары․Количество КАК Кол,
Товары․Цена КАК Цена,
(Товары․Количество * Товары․Цена) КАК СуммаСтроки,
СУММА(Товары․Количество * Товары․Цена) КАК СуммаДокумента
ИЗ
Документ․ВозвратТоваровПоставщику КАК Возврат
ЛЕВОЕ СОЕДИНЕНИЕ Возврат․Товары КАК Товары
ПО Товары․Ссылка = Товары․Ссылка
СГРУППИРОВАТЬ ПО
Возврат․Ссылка,
Возврат․Номер,
Возврат․Дата,
Товары․Номенклатура,
Товары․Количество,
Товары․Цена
";
Выборка = Запрос․Выполнить․Выбрать;
ПОКА Выборка․Следующий ЦИКЛ
// обработка строки
КОНЕЦЦИКЛ;
Обратите внимание на несколько ключевых моментов:
- Табличная часть
Возврат․Товарыуказана в секцииЛЕВОЕ СОЕДИНЕНИЕ– это гарантирует, что даже если у документа нет строк в ТЧ, он всё равно попадёт в результат (поле будетNULL)․ - Для расчёта суммы строки используется простое арифметическое выражение
(Товары․Количество * Товары․Цена)․ - Для получения общей суммы по документу применяется агрегат
СУММА(․․․)иСГРУППИРОВАТЬ ПО․
2․3 Как вывести ТЧ в виде одной строки (конкатенация)
Иногда требуется собрать все позиции ТЧ в одно поле, разделив их запятыми․ В 1С это делается через функцию СГРУППИРОВАТЬ_СТРОКИ (или СОЕДИНИТЬ в новых версиях):
Запрос․Текст =
"ВЫБРАТЬ
Возврат․Ссылка,
СГРУППИРОВАТЬ_СТРОКИ(Товары․Номенклатура) КАК ТоварыСписок
ИЗ
Документ․ВозвратТоваровПоставщику КАК Возврат
ЛЕВОЕ СОЕДИНЕНИЕ Возврат․Товары КАК Товары
ПО Товары․Ссылка = Товары․Ссылка
СГРУППИРОВАТЬ ПО Возврат․Ссылка";
Часто встречающиеся ошибки и способы их исправления - Ошибка «Неизвестное поле»․ Чаще всего происходит из‑за опечатки в имени табличной части или поля․ Проверьте регистр и наличие поля в конфигураторе․
- Ошибка «Ссылка не найдена»․ При использовании
ЛЕВОЕ СОЕДИНЕНИЕ убедитесь, что в условии ПО указаны корректные ссылки (обычно Таблица․Ссылка = ТЧ․Ссылка)․ - Низкая производительность․ Табличные части хранятся в отдельной таблице БД, поэтому каждый
JOIN добавляет нагрузку․ По возможности ограничьте выборку условиями ГДЕ и используйте индексы (поле Ссылка уже индексировано)․ - Отсутствие строк в результате․ Если в запросе указано только ТЧ без основной таблицы, запрос вернёт только строки, где ТЧ заполнена․ Чтобы получить документы без строк, используйте
ЛЕВОЕ СОЕДИНЕНИЕ или добавьте поле из основной таблицы в SELECT․
Лучшие практики - Всегда задавайте псевдонимы․ Это упрощает чтение кода и предотвращает конфликты имён․
- Фильтруйте данные в запросе, а не в коде․ Условие
ГДЕ работает быстрее, чем перебор в цикле․ - Не забывайте про агрегаты․ Если нужны суммарные показатели – используйте
СУММА, МИН, МАКС и т․д․ - Тестируйте запрос в Конфигураторе․ Вкладка «Запросы» позволяет быстро проверить корректность синтаксиса и увидеть план выполнения․
- Оптимизируйте JOIN‑ы․ Если вам нужны только поля из ТЧ, а не из основной таблицы, можно писать запрос только к ТЧ, указав в
FROM её как отдельную таблицу: ТаблицаТЧ КАК ТЧ․
Пример полного решения задачи
ЛЕВОЕ СОЕДИНЕНИЕ убедитесь, что в условии ПО указаны корректные ссылки (обычно Таблица․Ссылка = ТЧ․Ссылка)․JOIN добавляет нагрузку․ По возможности ограничьте выборку условиями ГДЕ и используйте индексы (поле Ссылка уже индексировано)․ЛЕВОЕ СОЕДИНЕНИЕ или добавьте поле из основной таблицы в SELECT․- Всегда задавайте псевдонимы․ Это упрощает чтение кода и предотвращает конфликты имён․
- Фильтруйте данные в запросе, а не в коде․ Условие
ГДЕработает быстрее, чем перебор в цикле․ - Не забывайте про агрегаты․ Если нужны суммарные показатели – используйте
СУММА,МИН,МАКСи т․д․ - Тестируйте запрос в Конфигураторе․ Вкладка «Запросы» позволяет быстро проверить корректность синтаксиса и увидеть план выполнения․
- Оптимизируйте 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
- Техническая поддержка – +7 (495) -23‑45‑68
- Консультации по продуктам – +7 (495) -23‑45‑69
- Отдел продаж – +7 (495) -23‑45‑70
- Отдел разработки – dev@1c․ru
- Отдел внедрения – implementation@1c․ru
- Отдел обучения – training@1c․ru
- Генеральный директор – Иванов И․И․, ivanov@1c․ru
- Технический директор – Петров П․П․, petrov@1c․ru