Разработка и Конфигурация · 10 мин
Как связать таблицы в 1С: запросы, СКД и связи реквизитов
Способы связать таблицы в 1С: соединения в запросах (левое, внутреннее), связи в СКД, связь по владельцу и типам. Примеры кода, ошибки и проверка результата.
Связь таблиц в 1С — базовая операция, без которой не работают ни отчёты, ни выборки данных, ни динамические списки. Под «таблицами» здесь понимаются таблицы справочников, документов, регистров сведений и накоплений, а связать их можно тремя основными способами: соединением в запросе, связью наборов данных в СКД и связью реквизитов через тип значения.
Чаще всего задача звучит так: «есть таблица продаж и справочник номенклатуры — нужно вывести товары вместе с их свойствами» или «нужно соединить заказы с оплатами». Во всех этих случаях механизм один — вы указываете, по каким полям строки одной таблицы соответствуют строкам другой.
Важно понимать, что в 1С нет прямого доступа к физическим таблицам СУБД: платформа работает с объектной моделью, а запросы пишутся на встроенном языке запросов, похожем на SQL. Это значит, что связь всегда строится через поля объектов — ссылки, измерения, реквизиты.
Какие виды связей таблиц существуют в 1С
Прежде чем писать код, определите, какого результата вы хотите добиться. От этого зависит выбор механизма: соединение в запросе подходит для выборки и отчётов, связь наборов данных — для отчётов на СКД из нескольких источников, а связь параметров выбора — для зависимых полей в формах.
Логически связи делятся на «один ко многим» (один контрагент — много документов) и «многие ко многим» (товары и склады через регистр остатков). В языке запросов 1С обе реализуются через соединения, разница только в том, какие поля участвуют в условии.
Связь таблиц в запросе: ЛЕВОЕ и ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Стандартный приём — левое соединение: берутся все строки левой таблицы, а из правой подтягиваются совпадающие. Если совпадения нет, поля правой таблицы будут NULL. Это безопасный вариант, когда вы не уверены, что связь есть у каждой строки.
Внутреннее соединение возвращает только те строки, где связь найдена с обеих сторон. Оно удобно, когда нужно отобрать пары «документ — оплата» и исключить неоплаченные документы.
ВЫБРАТЬ
Реализация.Номер,
Реализация.Контрагент КАК Контрагент,
Контрагенты.ИНН
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО Реализация.Контрагент = Контрагенты.СсылкаКлючевое правило: соединяйте таблицы по полю-ссылке. В примере выше условие Реализация.Контрагент = Контрагенты.Ссылка — это связь по ссылке справочника. Соединение по строковым полям (наименование, код) работает медленнее и даёт дубли при совпадающих значениях.
Если соединяете с виртуальной таблицей регистра (например, РегистрНакопления.Продажи.Обороты), сначала задайте параметры виртуальной таблицы (период, отбор), а потом накладывайте соединение. Иначе платформа соединит полные таблицы, и запрос резко замедлится на больших базах.
Соединение с регистрами сведений и срезом последних
Типовая задача — вывести цены или курсы валют на дату документа. Для этого регистр сведений соединяют через виртуальную таблицу СрезПоследних, где период передаётся параметром.
ВЫБРАТЬ
Товары.Номенклатура,
Цены.Цена
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК Цены
ПО Товары.Номенклатура = Цены.НоменклатураЧастая ошибка — соединять со срезом без ограничения по измерению в параметрах виртуальной таблицы, а потом фильтровать в условии соединения. Результат тот же, но платформа сначала строит срез по всем записям. Если набор данных большой, укажите отбор прямо в параметрах виртуальной таблицы.
Как связать таблицы в отчёте на СКД
В системе компоновки данных соединение внутри одного запроса делается как обычно. Но если данные берутся из двух разных запросов или запроса и объекта, используется закладка «Связи наборов данных» в конструкторе СКД.
Там вы указываете: источник (первый набор), приёмник (второй набор), выражение-источник и выражение-приёмник — поля, по которым идёт связь. Например, набор «Продажи» и набор «Оплаты» связываются по полю ЗаказКлиента.
- 1Создайте два набора данных типа «Запрос» — например, Продажи и Оплаты
- 2Откройте закладку «Связи наборов данных» и добавьте строку
- 3Укажите источник — Продажи, приёмник — Оплаты
- 4В полях «Выражение источник» и «Выражение приёмник» укажите общее поле, например Заказ
- 5На закладке «Настройки» проверьте, что поля обоих наборов доступны для вывода
- 6Сформируйте отчёт и сверьте итоги с исходными данными
По умолчанию связь в СКД работает как левое соединение: строки источника выводятся даже без соответствия в приёмнике. Если нужен другой тип связи, его можно изменить в свойствах связи, но делайте это осознанно — внутренняя связь скроет строки без пары.
Связь по владельцу и связь параметров выбора в формах
Отдельный вид связи — подчинённые справочники. Если у справочника «Договоры контрагентов» установлен владелец «Контрагенты», то в форме документа поле «Договор» автоматически фильтруется по выбранному контрагенту. Для этого в свойствах реквизита формы должна быть настроена связь параметров выбора.
В управляемой форме это делается так: у поля ввода открываете свойство «СвязиПараметровВыбора», добавляете строку вида Отбор.Владелец → путь к данным поля «Контрагент». После этого список договоров в выпадающем списке покажет только договоры выбранного контрагента.
// В модуле формы, программная установка связи
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Владелец", "Объект.Контрагент");
НовыйМассив = Новый Массив();
НовыйМассив.Добавить(НоваяСвязь);
Элементы.Договор.СвязиПараметровВыбора = Новый ФиксированныйМассив(НовыйМассив);Эта связь влияет только на выбор в интерфейсе — она не защищает данные на уровне запроса. Если документ заполняется программно или загружается из файла, проверку соответствия договора контрагенту нужно выполнять отдельно в обработчиках проведения.
Типичные ошибки при связывании таблиц
Большинство проблем со связями сводится к нескольким повторяющимся сценариям. Их легко распознать по симптомам: дубли строк, пустые колонки, медленный запрос.
Отдельно проверяйте составные типы. Если реквизит может хранить ссылки на разные справочники (например, «Плательщик» — контрагент или физлицо), соединение с одним справочником даст NULL для строк другого типа. Решение — два левых соединения или функция ВЫРАЗИТЬ с приведением типа.
Как проверить, что связь работает правильно
Простейшая проверка — сравнить количество строк до и после соединения. Если после левого соединения строк стало больше, чем в исходной таблице, значит в правой таблице есть дубли по полю связи. Это сигнал, что соединять нужно не с сырыми данными, а со сгруппированными.
Как проверить результат
Равно числу строк левой таблицы (при левом соединении)
Строк стало больше — в правой таблице дубли по полю связи
Заполнены там, где связь существует, NULL — где её нет
Пусто везде — неверное условие соединения или тип полей не совпадает
Запрос отрабатывает за секунды на рабочем объёме данных
Заметная пауза — нет отборов в виртуальных таблицах или соединение по неиндексированному полю
Суммы совпадают с исходными документами
Итоги завышены — связь «один ко многим» без группировки приёмника
Для отладки удобно вывести поле связи из обеих таблиц рядом и глазами сравнить значения. Если типы различаются (строка против ссылки, число разной длины), соединение молча не сработает — платформа не выдаст ошибку, просто не найдёт совпадений.
Что важно запомнить
Связывайте таблицы по полям-ссылкам и измерениям, а не по строкам. Для выборок используйте ЛЕВОЕ СОЕДИНЕНИЕ в запросе, для отчётов из нескольких источников — связи наборов данных в СКД, для зависимых полей в формах — связь параметров выбора. После настройки всегда проверяйте количество строк и итоги: дубли и пустые колонки — главные признаки неверной связи.
Частые вопросы о связывании таблиц в 1С
Чем левое соединение отличается от внутреннего?
Левое соединение возвращает все строки левой таблицы, подставляя NULL там, где пары не нашлось. Внутреннее возвращает только строки, для которых связь есть с обеих сторон. Если нужно видеть, например, всех клиентов, включая тех, у кого нет продаж, — используйте левое соединение.
Можно ли связать таблицы по нескольким полям?
Да. В условии соединения перечислите несколько равенств через И: ПО Таб1.Поле1 = Таб2.Поле1 И Таб1.Поле2 = Таб2.Поле2. Так обычно соединяются регистры с несколькими измерениями, например остатки по номенклатуре и складу одновременно.
Почему после соединения строки задвоились?
В правой таблице на одно значение поля связи приходится несколько записей — связь оказалась «один ко многим». Сгруппируйте правую таблицу во вложенном запросе (СУММА, МАКСИМУМ по нужным полям) и соединяйтесь уже со сгруппированным результатом.
Как связать табличную часть документа с регистром?
Обратитесь к табличной части как к отдельной таблице: Документ.РеализацияТоваровУслуг.Товары. Дальше соединение строится обычным образом — например, по полю Номенклатура с измерением регистра. Учтите, что у табличной части есть служебное поле Ссылка, по которому можно вернуться к шапке документа.
Что делать, если соединение по полю не срабатывает, хотя значения совпадают?
Проверьте типы полей: строка не равна ссылке, даже если на экране они выглядят одинаково. Также у строковых полей проверьте длину и наличие пробелов. Приведите типы через функцию ВЫРАЗИТЬ или соединяйтесь по ссылочным полям.
Нужно ли связывать таблицы в динамическом списке формы?
Динамический список строится на запросе, поэтому соединения в нём работают так же. Но помните: если в произвольном запросе динамического списка нет основной таблицы с ключевым полем, список потеряет часть интерактивных функций — например, быстрое обновление текущей строки. Для списков документов основную таблицу лучше оставлять и соединять вторичные данные с ней.