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

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

Как сделать ссылку на реквизит документа в 1С

Как сделать ссылку на реквизит документа в 1С: добавление реквизита ссылочного типа в конфигураторе, обращение через точку в коде, запросы и проверка заполнения.

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

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

Важно понимать разницу между самой ссылкой и её реквизитами. Ссылка — это уникальный идентификатор объекта в базе, она всегда существует, пока существует объект. Реквизиты ссылки — это данные объекта, которые можно получить через ссылку, обратившись к ним «через точку». Например, Документ.Контрагент — это ссылка, а Документ.Контрагент.Наименование — уже значение реквизита справочника, полученное через эту ссылку.

Добавление реквизита ссылочного типа в конфигураторе

Основной способ создать ссылку на объект в документе — добавить реквизит ссылочного типа через конфигуратор. Для этого откройте конфигурацию, найдите нужный документ в дереве объектов, раскройте ветку «Реквизиты» и добавьте новый элемент. В свойстве «Тип» выберите нужный вид ссылки: например, «СправочникСсылка.Номенклатура» или «ДокументСсылка.ЗаказПокупателя».

Если реквизит должен хранить ссылки на объекты разных видов, задайте составной тип данных, отметив несколько типов галочками. Это удобно, например, для реквизита «Основание», который может ссылаться и на заказ, и на счёт на оплату. Однако злоупотреблять составными типами не стоит: они усложняют запросы и замедляют выборку, особенно когда в состав входят десятки видов документов.

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

Порядок действий в конфигураторе
  1. 1
    Откройте конфигуратор и найдите документ в дереве объектов
  2. 2
    Добавьте новый реквизит и задайте ему имя без пробелов
  3. 3
    В свойстве «Тип» выберите нужный вид ссылки (СправочникСсылка, ДокументСсылка)
  4. 4
    Настройте проверку заполнения при необходимости
  5. 5
    Разместите реквизит на форме документа
  6. 6
    Обновите конфигурацию базы данных (F7) и проверьте результат в режиме предприятия

Обращение к реквизиту через точку в коде

Когда у вас есть переменная со ссылкой на документ, получить значение её реквизита можно обращением через точку: НомерДокумента = СсылкаНаДокумент.Номер;. Этот приём называется «разыменованием» ссылки. При таком обращении платформа выполняет скрытое обращение к базе данных и читает данные объекта.

Через точку можно обращаться и к реквизитам реквизитов: СсылкаНаДокумент.Контрагент.Наименование вернёт наименование контрагента, указанного в документе. Цепочка может быть длинной, но каждый уровень — это отдельное обращение к базе, поэтому длинные цепочки в циклах заметно снижают производительность.

Если нужно прочитать несколько реквизитов одного объекта, эффективнее использовать метод ПолучитьОбъект() или запрос. Получение объекта оправдано, когда планируется изменение данных; для простого чтения нескольких полей лучше подходит запрос с конструкцией ВЫБРАТЬ, так как он забирает только нужные поля одним обращением.

1c
// Обращение к реквизиту через точку
Контрагент = ДокументСсылка.Контрагент;
ИННКонтрагента = ДокументСсылка.Контрагент.ИНН;

// Чтение нескольких реквизитов запросом
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Реализация.Номер, Реализация.Дата, Реализация.Контрагент.Наименование ИЗ Документ.РеализацияТоваровУслуг КАК Реализация ГДЕ Реализация.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    Сообщить(Выборка.Номер);
КонецЕсли;

Получение ссылки на документ и проверка её корректности

Прежде чем обращаться к реквизитам, нужно получить саму ссылку. Основные способы: Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Номер, Дата) — поиск по номеру и дате; ПолучитьСсылку(УникальныйИдентификатор) — по GUID; чтение из реквизита другого объекта. Если объект не найден, метод поиска вернёт пустую ссылку, и обращение к её реквизитам даст пустые значения или ошибку.

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

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

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

В языке запросов 1С обращение к реквизитам через точку работает аналогично коду: Реализация.Контрагент.Наименование. Это удобно для вывода связанных данных в отчётах без явных соединений таблиц. Платформа автоматически преобразует такое обращение в левое соединение с таблицей справочника.

Однако разыменование в запросах имеет ограничения. Нельзя обращаться через точку к реквизитам полей составного типа, если они присутствуют не у всех видов объектов: запрос завершится ошибкой. Также не рекомендуется разыменовывать поля в условиях ГДЕ и виртуальных таблицах — это может существенно замедлить выполнение, потому что оптимизатор СУБД хуже справляется с неявными соединениями.

Для проверки типа ссылки в запросе используются функции ТИПЗНАЧЕНИЯ() и ССЫЛКА: конструкция ГДЕ Реализация.Основание ССЫЛКА Документ.ЗаказПокупателя отфильтрует только строки, где реквизит составного типа содержит ссылку на заказ. Это стандартный приём при работе с реквизитами-основаниями.

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

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

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

Типичные ошибки
01
Разыменование ссылки внутри цикла — многократные обращения к базе и резкое падение производительности
02
Обращение к реквизиту без проверки заполненности ссылки — ошибки и пустые значения в отчётах
03
Составной тип из десятков видов документов без необходимости — медленные запросы и неудобный выбор
04
Использование ПолучитьОбъект() только для чтения данных — лишняя нагрузка и риск блокировок
05
Отсутствие связей параметров выбора — пользователи выбирают договоры и контрагентов, не связанные друг с другом

Проверка результата и безопасные границы изменений

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

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

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

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

Как выбрать способ

Конфигурация собственная или снята с поддержкиДобавьте реквизит напрямую в конфигураторе
Конфигурация типовая на поддержкеИспользуйте расширение конфигурации или дополнительные реквизиты
Нужно только читать связанные данные в отчётеИспользуйте разыменование в запросе или левое соединение
Связь нужна редко и не участвует в отборахРассмотрите хранение связи в регистре сведений
Контрольные точки

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

Реквизит на форме документа
Норма

Поле отображается, выбор из списка работает

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

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

Значение ссылки в коде
Норма

ЗначениеЗаполнено(Ссылка) возвращает Истина

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

Пустая ссылка или строка «Объект не найден»

Отчёт с разыменованием
Норма

Связанные данные выводятся, запрос выполняется быстро

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

Ошибка запроса или заметные задержки при формировании

Часто задаваемые вопросы

Чем ссылка отличается от объекта в 1С?

Ссылка — это легковесный идентификатор объекта, содержащий только указатель на запись в базе. Объект — это полная копия данных в памяти, которую можно изменять и записывать. Для чтения одного-двух реквизитов достаточно ссылки с обращением через точку; объект нужен только для изменения данных.

Почему при обращении через точку возникает ошибка «Поле объекта не обнаружено»?

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

Можно ли сделать реквизит, ссылающийся на несколько видов документов?

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

Как найти документ по ссылке, если известен только GUID?

Используйте метод ПолучитьСсылку с параметром типа УникальныйИдентификатор: Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)). После этого проверьте запросом, существует ли объект, — метод возвращает ссылку независимо от наличия записи в базе.

Почему в запросе нельзя написать Ссылка.Реквизит.Реквизит для составного поля?

Потому что платформа не может заранее определить, из какой таблицы брать вложенный реквизит: у разных видов объектов составного типа набор реквизитов разный. Решение — сначала отфильтровать нужный тип через ССЫЛКА или ТИПЗНАЧЕНИЯ, а затем использовать соединение с конкретной таблицей.

Опасно ли добавлять реквизит в рабочую базу?

Добавление нового реквизита безопасно и не затрагивает существующие данные. Опасны изменения типа существующего реквизита и его удаление — при обновлении несовместимые значения будут потеряны. Перед такими операциями обязательно создайте резервную копию базы и проверьте обновление на тестовой копии.

Итог

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

Ссылка на реквизит документа создаётся через реквизит ссылочного типа в конфигураторе или расширении. К данным обращайтесь через точку в коде и запросах, избегая разыменования в циклах. Проверяйте заполненность и существование ссылок, а перед изменением типов существующих реквизитов делайте резервную копию.