Соединение таблиц - одна из основных и самых востребованных операций при работе с данными в 1С. В этой статье мы подробно разберем два основных вида соединений: внутреннее и внешнее.
Внутреннее соединение в 1С
Внутреннее соединение в 1С - это способ объединения данных из двух или более таблиц таким образом, чтобы в результат попадали только те записи, которые удовлетворяют заданному условию связи. Другими словами, соединяются только совпадающие строки таблиц.
Внутреннее соединение применяется, когда нужно:
- Получить данные, связанные между разными сущностями (таблицами)
- Отфильтровать результат по определенному условию
- Избежать дублирования данных в выборке
Пример запроса с внутренним соединением в 1С
ВЫБРАТЬ
Товары.Наименование КАК Товар, Склады.Наименование КАК Склад, ОстаткиТоваров.Количество ИЗ Справочник.Товары КАК Товары ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады ПО Товары.Ссылка = ОстаткиТоваров.Номенклатура И Склады.Ссылка = ОстаткиТоваров.Склад ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров ПО Товары.Ссылка = ОстаткиТоваров.Номенклатура И Склады.Ссылка = ОстаткиТоваров.Склад;
Этот запрос выводит наименования товаров, складов и их текущие остатки с помощью внутреннего соединения трех таблиц: Товары, Склады и ОстаткиТоваров.
Особенности внутреннего соединения
При использовании внутреннего соединения следует учитывать несколько особенностей:
- Если условие соединения не выполнено, строка не попадает в результат
- Могут получаться дублирующиеся строки, если найдено несколько совпадений
- Требуется тщательно прописывать условия соединения, иначе результат будет неверным
Чтобы избежать дублирования, можно добавить секцию УНИКАЛЬНЫЙ
или применить агрегатные функции.
1С внутреннее соединение
Внутренние соединения широко используются в 1С для решения различных задач. Вот несколько примеров, когда внутреннее соединение в 1С незаменимо:
- Получение данных из нескольких документов или справочников
- Анализ взаимосвязанных данных, например, товаров и складов
- Формирование аналитических отчетов по связанным данным
Также внутренние соединения позволяют выполнять в 1С следующие полезные операции:
- Фильтрация данных по нескольким условиям
- Устранение дублирующих записей при объединении таблиц
- Сортировка и группировка связанных данных
Таким образом, внутренние соединения в 1С - мощный и гибкий инструмент для решения широкого круга задач.
Внешние соединения в 1С
В отличие от внутреннего соединения, внешнее соединение в 1С включает в результирующую выборку не только совпадающие строки таблиц, но и те строки, для которых не нашлось соответствия.
Существует несколько разновидностей внешних соединений в 1С:
- Левое внешнее - в результат добавляются строки из левой таблицы
- Правое внешнее - в результат добавляются строки из правой таблицы
- Полное внешнее - в результат добавляются строки из обеих таблиц.
Внешнее соединение в 1С применяется в следующих случаях:
- Нужны данные, которых нет в основной таблице
- Требуются несовпадающие или частично совпадающие записи
- Необходим полный набор данных из нескольких таблиц
1С запрос: внешнее соединение
Рассмотрим пример запроса на языке запросов 1С с внешним соединением:
ВЫБРАТЬ Покупатели.Наименование КАК Покупатель, Товары.Наименование КАК Товар, Цены.Цена ИЗ Справочник.Контрагенты КАК Покупатели ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЦеныНоменклатуры КАК Цены ПО Цены.Номенклатура = Товары.Ссылка ГДЕ Покупатели.Тип = ЗНАЧЕНИЕ(Справочник.Контрагенты.ТипыКонтрагентов.Покупатель)
Здесь выполняется левое внешнее соединение таблиц Контрагенты, Товары и ЦеныНоменклатуры. Благодаря этому в результат попадут цены не всех товаров, а только тех, что указаны для конкретных покупателей.
Особенности внешних соединений
При работе с внешними соединениями в 1С следует обращать внимание на ряд моментов:
- При несовпадающих записях могут возникать значения NULL
- Часто требуется дополнительная фильтрация результата
- Легко получить избыточный объем данных
Чтобы этого избежать, важно правильно строить запрос, ставить необходимые условия (фильтры, ограничения, сортировки).
Сравнение внутреннего и внешнего соединения в 1С
Давайте сравним особенности внутреннего и внешнего соединения в 1С.
Главное отличие в том, что при внутреннем соединении в результат попадают только строки, удовлетворяющие заданному условию. А при внешнем соединении в результат также включаются строки, для которых подходящей пары не нашлось.
Ключевые различия можно резюмировать так:
Критерий | Внутреннее соединение | Внешнее соединение |
Несовпадающие строки | Исключаются | Включаются |
NULL значения | Нет | Могут быть |
Объем данных | Меньше | Больше |
1С 83: внутреннее соединение
Теперь давайте более детально разберем особенности применения внутреннего соединения в конкретной версии платформы - 1С 8.3.
В этой версии при использовании внутренних соединений следует учитывать:
- Поддержка множественных соединений таблиц
- Возможность применения вложенных подзапросов
- Наличие дополнительных условий фильтрации в секции ГДЕ
Это позволяет гибко настраивать логику соединения данных из произвольного количества источников.
Рассмотрим конкретный пример внутреннего соединения в запросе на языке 1С 8.3:
ВЫБРАТЬ Документ.ПриходТовара.Номер КАК Номер, Документ.ПриходТовара.Дата КАК Дата, Товары.Наименование КАК Товар, Склады.Наименование КАК Склад, ВЫБОР КОГДА Документ.ПриходТовара.Организация ЕСТЬ NULL ТОГДА "Не указано" ИНАЧЕ Организации.Наименование КОНЕЦ КАК Поставщик ИЗ Документ.ПриходТовара КАК Документ ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары ПО Документ.Товар = Товары.Ссылка ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады ПО Документ.Склад = Склады.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организации ПО Документ.Организация = Организации.Ссылка
Здесь используется внутреннее соединение документа ПриходТовара со справочниками Товары, Склады и левое внешнее с оединение со справочником Организации. Это позволяет получить полную информацию о приходах товаров.
1С: внутреннее соединение и подзапрос
Еще один полезный прием при работе с соединениями в 1С - использование подзапросов. Подзапросы позволяют выполнять фильтрацию и группировку данных на лету.
Например, чтобы отфильтровать товары по наличию остатков, можно воспользоваться таким подзапросом:
ВЫБРАТЬ Товары.Наименование КАК Товар, Товары.Артикул, Подзапрос.КоличествоОстатков КАК Остаток ИЗ Справочник.Товары КАК Товары ВНУТРЕННЕЕ СОЕДИНЕНИЕ ( ВЫБРАТЬ Остатки.Номенклатура, СУММА(Остатки.Количество) КАК КоличествоОстатков ИЗ РегистрНакопления.Остатки КАК Остатки ГДЕ Остатки.Количество > 0 СГРУППИРОВАТЬ ПО Остатки.Номенклатура ) КАК Подзапрос ПО Товары.Ссылка = Подзапрос.Номенклатура
Таким образом, грамотное использование внутренних соединений в сочетании с подзапросами открывает широкие возможности для решения разнообразных задач в 1С.
Оптимизация соединений в запросах 1С
При работе с соединениями в запросах 1С важный момент - их оптимизация для повышения производительности. Рассмотрим основные приемы.
Использование псевдонимов
Псевдонимы позволяют сократить громоздкие имена таблиц и полей, упростив запрос. Например:
ИЗ Документ.ПриходТовара КАК ПТ ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары ПО ПТ.Товар = Товары.Ссылка
Устранение неоднозначностей
Если одинаковые поля встречаются в разных таблицах, следует указывать полные пути. Иначе возникнет ошибка.
ПТ.Дата КАК ДатаПрихода, Товары.Дата КАК ДатаИзменения
Ограничение выборки
Чем меньше данных обрабатывает запрос, тем быстрее он выполняется. Стоит ограничивать выборку по возможности с помощью секций ГДЕ, ОТБОР, СОРТИРОВКА и др.
ОТБОР ДатаПрихода ПОСЛЕДНИЕ 7 ДНЕЙ
Индексы значительно ускоряют выборку и соединение данных. Нужно стараться использовать проиндексированные поля при составлении запросов.
Построение оптимальной логики
Порядок соединений таблиц может существенно влиять на скорость. Нужно выстраивать логику оптимальным образом.
Профилирование запросов в 1С
Чтобы выявить узкие места, можно воспользоваться профилированием запросов. Эта функция покажет, на каких этапах (соединение таблиц, сортировка и т.д.) тратится больше всего времени.
Включить профилирование можно с помощью метода Запрос.УстановитьПрофилирование(Истина). Анализируя полученную статистику, можно оптимизировать запрос и значительно ускорить его работу.
Распространенные ошибки при соединении
Рассмотрим типовые ошибки при работе с соединениями в 1С и способы их исправления.
Условия должны корректно связывать нужные поля таблиц. Иначе результат будет неверным.
Путаница с внутренним и внешним
Неправильный выбор типа соединения может привести к неожиданному результату. Нужно четко представлять разницу.
Необработанные NULL значения
NULL может сломать логику запроса. Требуется явная обработка (замена на 0, пустую строку и т.п.).
В заключение давайте резюмируем основные приемы оптимизации соединений в 1С:
- Псевдонимы таблиц и полей
- Ограничение объема данных
- Использование индексов
- Правильное построение логики
- Профилирование запросов
Следуя этим правилам, можно существенно ускорить работу запросов и избежать многих проблем.