К статье
Практический материал

Разработка и Конфигурация · 12 мин

Связь по типу в 1С: что это такое и как её использовать

Что такое связь по типу в 1С, как работает механизм СвязиПараметровВыбора и СвязиПоТипу, где применяется и как настроить фильтрацию полей ввода.

Связь по типу в 1С — это механизм платформы, который автоматически ограничивает выбор значения в поле ввода в зависимости от типа, указанного в другом поле объекта. Классический пример: в документе есть поле «Вид операции» или «Тип расчетов», а рядом — поле с ссылкой, которая должна указывать на объект именно этого типа. Когда пользователь выбирает тип, платформа сама подставляет нужное ограничение и не даёт выбрать «чужой» объект.

Механизм реализован через свойство СвязьПоТипу у полей ввода управляемой и обычной формы, а также через конструкцию СвязиПоТипу в языке запросов и при программной работе с параметрами выбора. Он тесно связан с другим механизмом — связями параметров выбора, но решает более узкую задачу: фильтрует не по значению, а именно по типу данных.

Разработчику важно понимать этот механизм, потому что составные типы (когда реквизит может хранить ссылки на разные объекты — например, «СправочникСсылка.Контрагенты» или «СправочникСсылка.Организации») встречаются в типовых конфигурациях повсеместно. Без корректной связи по типу пользователь увидит в списке выбора все возможные объекты сразу, что приводит к ошибкам ввода и некорректным данным в базе.

Где встречается связь по типу в реальных конфигурациях

Чаще всего связь по типу нужна там, где реквизит имеет составной тип данных. Типовой сценарий — регистр сведений или план видов характеристик, где одно измерение задаёт «настройку» (что именно храним), а другое — значение, тип которого зависит от этой настройки. Похожая схема используется в механизме дополнительных реквизитов и сведений в конфигурациях на БСП: тип значения свойства определяется описанием типа в самом свойстве.

Второй распространённый случай — документы, где поле «Основание» или «Документ-основание» может ссылаться на несколько видов документов, а конкретный вид определяется выбранным видом операции. Третий — обработки и отчёты, где пользователь сначала выбирает тип объекта (например, «Справочники» или «Документы»), а затем конкретный объект этого типа.

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

Как работает механизм: типы, владельцы и ограничение выбора

Логика проста: у поля ввода есть свойство, ссылающееся на элемент формы или реквизит, который определяет тип. Когда значение «главного» поля меняется, платформа пересчитывает допустимый тип для зависимого поля. Если тип нового значения не совместим с уже выбранным значением зависимого поля — платформа может очистить его или потребовать повторного выбора, в зависимости от настроек режима.

Важно различать три похожих механизма платформы:

  • Связь по типу — ограничивает выбор типом, заданным в другом поле. Работает с составными типами.
  • Связи параметров выбора — передают в форму выбора отбор по значениям других полей (например, показывать только договоры выбранного контрагента).
  • Связь по владельцу — частный случай связи параметров выбора для подчинённых справочников: выбор ограничен элементами, принадлежащими указанному владельцу.

Эти механизмы комбинируются. Например, поле «Договор» может одновременно иметь связь по типу (если тип договора зависит от вида операции) и связь параметров выбора по контрагенту. Порядок применения: сначала платформа определяет допустимый тип, затем внутри него накладывает отборы.

Настройка связи по типу в управляемой форме

В управляемой форме настройка выполняется в конфигураторе через палитру свойств элемента формы. Для поля ввода, связанного с реквизитом составного типа, найдите свойство СвязьПоТипу. В нём указывается путь к данным, определяющим тип, — обычно это другой реквизит объекта или формы.

Дополнительно доступно свойство, определяющее поведение при смене типа: очищать ли значение, если оно перестало соответствовать новому типу. Для пользовательского интерфейса очистка обычно предпочтительнее — она явно показывает, что старое значение больше недействительно, и исключает «тихое» сохранение несовместимых данных.

Порядок настройки в конфигураторе
  1. 1
    Откройте форму объекта в конфигураторе и выделите поле ввода с составным типом
  2. 2
    В палитре свойств найдите «СвязьПоТипу» и укажите путь к реквизиту, определяющему тип (например, «Объект.ВидОперации»)
  3. 3
    Установите поведение при смене типа: очистка значения при несовместимости
  4. 4
    Проверьте, что реквизит-источник типа заполняется раньше зависимого поля — иначе связь сработает на пустом значении
  5. 5
    Запустите форму в режиме предприятия и проверьте выбор при разных значениях управляющего поля

Если управляющее поле само является ссылкой, тип которой нужно «извлечь», потребуется промежуточный реквизит формы с типом ОписаниеТипов или строковое поле с именем типа — платформа должна понимать, какой тип считать текущим. В типовых механизмах это часто делается через хранение имени типа в виде строки (например, «СправочникСсылка.Номенклатура»).

Программная настройка через связи параметров выбора

Когда декларативной настройки недостаточно — например, тип зависит от вычисляемого условия или нескольких полей сразу, — ограничение задаётся программно. В управляемых формах для этого используется массив связей параметров выбора элемента формы, в который добавляется объект СвязьПараметраВыбора.

bsl
// Пример: ограничение типа поля "Значение" по имени типа из поля "ИмяТипа"
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Владелец", "Объект.Контрагент");
МассивСвязей = Новый Массив;
МассивСвязей.Добавить(НоваяСвязь);
Элементы.Договор.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);

// Ограничение типа динамически:
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.Номенклатура"));
Элементы.Значение.ОграничениеТипа = Новый ОписаниеТипов(МассивТипов);

Ключевой приём — изменение свойства ОграничениеТипа элемента формы в обработчике изменения управляющего поля. Это фактически реализует связь по типу «вручную»: при изменении вида операции код пересчитывает допустимое описание типов и присваивает его полю. После смены ограничения проверьте текущее значение поля: если оно не входит в новый тип, присвойте Неопределено, чтобы форма не хранила несовместимую ссылку.

Программный способ даёт гибкость, но требует аккуратности: логику смены типа нужно вызывать и при открытии формы (при чтении существующего объекта), иначе для ранее сохранённых документов ограничение не применится до первого изменения управляющего поля.

Связь по типу в обычных формах и запросах

В обычных формах (режим совместимости, старые конфигурации) у поля ввода есть аналогичные свойства: «СвязьПоТипу», где указывается элемент управления или путь к данным, определяющим тип, и флаг очистки при смене типа. Логика поведения аналогична управляемым формам, но настройка делается через диалог свойств элемента управления.

В языке запросов связь по типу проявляется иначе — через конструкцию виртуальных таблиц и проверку типа с помощью ВЫРАЗИТЬ(... КАК ...) и ССЫЛКА. Когда нужно соединить таблицу с полем составного типа только по объектам конкретного вида, используют приведение типа:

bsl
ВЫБРАТЬ
	Док.Ссылка,
	Док.Основание
ИЗ
	Документ.РеализацияТоваровУслуг КАК Док
ГДЕ
	Док.Основание ССЫЛКА Документ.ЗаказКлиента

Условие ССЫЛКА отсекает записи, где составное поле хранит ссылку другого типа. Это не та же самая настройка, что в форме, но концептуально решает ту же задачу — фильтрацию по типу значения.

Типичные ошибки и их последствия

Типичные ошибки
01
Указана связь по типу, но управляющий реквизит заполняется позже зависимого — при открытии формы поле остаётся без ограничения, пользователь выбирает лишнее
02
Не включена очистка при смене типа — в реквизите остаётся ссылка старого типа, документ сохраняется с неконсистентными данными
03
Ограничение настроено только в форме, но запись возможна программно — через обмен или обработку попадают значения недопустимого типа
04
В запросе к составному полю не используется приведение типа — соединение даёт дубли строк или пустые значения по «чужим» типам
05
Программная установка ОграничениеТипа выполняется только в обработчике изменения, но не при открытии формы существующего объекта

Отдельная группа проблем — производительность. Составные типы сами по себе усложняют индексы и запросы, а соединения по полям составного типа без приведения могут выполняться заметно медленнее. Если составной тип используется только ради «универсальности», а реально хранится один-два вида ссылок, стоит пересмотреть структуру метаданных в пользу отдельных реквизитов.

Контрольные точки

Как проверить результат

Выбор в зависимом поле при установленном типе
Норма

Список выбора открывается сразу для нужного вида объектов

Тревожный признак

Предлагается выбор типа или видны объекты других видов

Смена управляющего поля после заполнения зависимого
Норма

Значение очищается или остаётся только при совместимости типов

Тревожный признак

Старая ссылка сохраняется при несовместимом типе

Открытие ранее сохранённого объекта
Норма

Ограничение действует сразу, значение отображается корректно

Тревожный признак

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

Когда связь по типу не нужна: альтернативы

Не каждую фильтрацию стоит решать связью по типу. Если реквизит имеет одиночный тип, а отбирать нужно по значениям — используйте связи параметров выбора. Если речь о подчинённом справочнике — достаточно связи по владельцу, она настраивается на уровне метаданных и работает без дополнительных действий в форме.

Маршрут решения

Как выбрать механизм

Реквизит составного типа, конкретный тип определяется другим полемНастройте связь по типу (декларативно или через ОграничениеТипа)
Тип один, но нужен отбор по значению другого поляИспользуйте связи параметров выбора
Справочник подчинён другому справочникуДостаточно связи по владельцу в метаданных
Отбор зависит от сложного вычисляемого условияПрограммно формируйте параметры формы выбора в обработчике НачалоВыбора

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

Итог

Что важно запомнить

Связь по типу ограничивает выбор в поле ввода типом, заданным в другом поле, и особенно полезна для реквизитов составного типа. Настраивается декларативно в форме или программно через ОграничениеТипа, действует только на интерактивный выбор и требует проверки поведения при открытии формы и смене типа.

Частые вопросы

Чем связь по типу отличается от связи параметров выбора?

Связь по типу ограничивает сам тип выбираемого значения — какой вид объектов вообще можно выбрать. Связи параметров выбора передают в форму выбора отбор по конкретным значениям (например, контрагенту) внутри уже определённого типа. В сложных формах оба механизма применяются одновременно.

Почему связь по типу не срабатывает при открытии сохранённого документа?

Чаще всего ограничение устанавливается только в обработчике изменения управляющего поля. При открытии формы этот обработчик не вызывается, поэтому логику установки ограничения нужно выполнить также в обработчике ПриСозданииНаСервере или ПриОткрытии.

Защищает ли связь по типу от записи неправильных данных?

Нет, она влияет только на интерактивный выбор в форме. Программное присваивание в модулях, обменах и обработках её обходит. Если критична целостность, добавьте проверку типа в обработчике ОбработкаПроверкиЗаполнения объекта.

Что делать, если управляющее поле хранит тип в виде строки?

Строковое представление типа нужно преобразовать: получить тип по имени через функцию Тип() и сформировать ОписаниеТипов, затем присвоить его свойству ОграничениеТипа элемента формы. Декларативная связь по типу напрямую со строкой обычно не работает.

Влияет ли составной тип на производительность?

Да, поля составного типа усложняют индексы и соединения в запросах. Соединения по таким полям без приведения типа могут работать медленнее. Если фактически используется один вид ссылок, лучше заменить составной тип на одиночный.

Можно ли очистить значение автоматически при смене типа?

Да. В настройках связи по типу есть режим поведения при смене типа — очистка несовместимого значения. При программной реализации это делается вручную: после смены ОграничениеТипа проверьте текущее значение и присвойте Неопределено, если тип не совпадает.