Разработка и Конфигурация · 11 мин
Что такое ссылка на объект в 1С и как с ней работать
Что такое ссылка на объект в 1С, чем ссылка отличается от объекта, как получить, проверить и использовать ссылку в коде и запросах. Практические примеры.
Ссылка на объект в 1С — это уникальный идентификатор записи в базе данных: элемента справочника, документа, плана счетов, плана видов характеристик и других ссылочных типов. Сама по себе ссылка не содержит данных объекта — она лишь указывает на конкретную запись в таблице базы, подобно тому как номер полки указывает на место книги в библиотеке, но не является самой книгой.
Понимание разницы между ссылкой и объектом — один из ключевых навыков разработчика и администратора 1С. От этого зависит производительность кода: обращение к данным через ссылку может вызывать неявные запросы к базе, а в массовых обработках это приводит к серьёзному замедлению. Путаница между этими понятиями — частая причина ошибок «Объект не найден» и лишней нагрузки на сервер.
Ссылка существует у любого объекта, который хранится в базе данных и может быть указан в реквизитах других объектов: контрагент, номенклатура, документ реализации, счёт учёта. У записей регистров сведений и накопления ссылки нет — они идентифицируются измерениями или регистратором.
Чем ссылка отличается от объекта
Встроенный язык 1С разделяет два представления одной записи базы данных. Ссылка (например, СправочникСсылка.Номенклатура) — легковесное значение, содержащее только идентификатор и тип. Объект (например, СправочникОбъект.Номенклатура) — полная копия данных записи в памяти, которую можно изменять и записывать обратно.
Когда вы обращаетесь к реквизиту через ссылку — Контрагент.ИНН — платформа незаметно выполняет запрос к базе и возвращает значение. Это удобно для одиночных обращений, но в цикле по тысяче элементов порождает тысячу отдельных запросов. Объект же загружает все данные одним обращением и удерживает их в памяти.
Ссылка и объект: когда что использовать
Подходит для сравнения, передачи в параметры, заполнения реквизитов и работы в запросах. Не позволяет изменять данные.
Нужен для чтения множества реквизитов в цикле и для изменения данных с последующим вызовом Записать(). Требует больше памяти.
Важно понимать: изменение реквизитов объекта в памяти не меняет данные в базе, пока не вызван метод Записать(). И наоборот — если два пользователя одновременно получили объект одной записи и записали его, изменения первого могут быть потеряны или вызовут конфликт блокировок.
Как устроена ссылка внутри платформы
Физически ссылка хранится как уникальный идентификатор — GUID из 32 шестнадцатеричных символов. Именно он лежит в поле ссылочного реквизита таблицы базы данных. Платформа дополнительно знает тип ссылки, поэтому по одному значению может определить, к какой таблице обращаться.
GUID сохраняется при выгрузке и загрузке данных через стандартные механизмы обмена, поэтому один и тот же элемент справочника в центральной и периферийной базах имеет одинаковую ссылку. На этом построены планы обмена и синхронизация между конфигурациями. Если же создать «такой же» элемент вручную в другой базе, его ссылка будет иной — это два разных объекта для платформы.
Как получить ссылку в коде и в запросе
Существует несколько типовых способов получить ссылку. Выбор зависит от того, что известно об объекте: код, наименование, GUID или контекст формы.
Справочники.Номенклатура.НайтиПоКоду("000001")— поиск по коду;Справочники.Номенклатура.НайтиПоНаименованию("Стол")— поиск по наименованию;Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Номер, Дата)— поиск документа;Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID))— ссылка по известному GUID;Элемент.Ссылка— когда уже есть объект, полученный из выборки или формы.
В запросах ссылки используются напрямую: поле Ссылка есть у любой ссылочной таблицы, и именно его возвращает выборка по умолчанию. Сравнение в условии ГДЕ Номенклатура = &Ссылка работает по ссылке и выполняется быстро, поскольку сравниваются только идентификаторы.
СсылкаКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Если Не СсылкаКонтрагент.Пустая() Тогда
КонтрагентОбъект = СсылкаКонтрагент.ПолучитьОбъект();
КонтрагентОбъект.Комментарий = "Проверен";
КонтрагентОбъект.Записать();
КонецЕсли;Обратный переход — из объекта в ссылку — выполняется через свойство Ссылка. Для нового, ещё не записанного объекта ссылка уже существует (платформа назначает её при создании), но записи в базе до вызова Записать() нет.
Проверка ссылки: пустая, битая, предопределённая
Работа со ссылками требует трёх стандартных проверок. Первая — на пустоту: метод Пустая() или сравнение с Справочники.Номенклатура.ПустаяСсылка(). Пустая ссылка означает, что реквизит не заполнен, и обращение к её реквизитам вернёт неопределённые значения.
Вторая проверка — на «битость». Битая ссылка возникает, когда запись удалена из базы, а ссылки на неё остались в других объектах. При обращении к реквизитам такой ссылки платформа выдаёт строку вида <Объект не найден> (123:abc...). Программно это определяется запросом: если выборка по ссылке вернула пустой результат, запись не существует.
Как проверить состояние ссылки
Возвращает Ложь — реквизит заполнен
Возвращает Истина — значение не выбрано
Выборка содержит одну запись
Выборка пуста — ссылка битая, объекта нет в базе
Показывает наименование или номер документа
Показывает <Объект не найден> с идентификатором
Третья проверка — метод Предопределенный у объекта или функция ОбщегоНазначения.ПредопределенныйЭлемент в типовых конфигурациях. Предопределённые элементы создаются конфигуратором, их нельзя удалить в пользовательском режиме, и на них часто завязана логика кода, поэтому переименовывать и переносить их следует осторожно.
Ссылки в реквизитах, на форме и в движениях документа
Реквизит ссылочного типа хранит только ссылку. Когда документ записывается, в таблицу базы попадает идентификатор контрагента, а не его наименование или ИНН. Поэтому переименование контрагента мгновенно отражается во всех документах — они показывают актуальные данные по той же ссылке.
На форме поле ввода ссылочного типа отображает представление объекта (наименование или номер с датой), но значением поля остаётся ссылка. Это важно при программной работе с формой: присваивать такому полю строку нельзя, нужно передать именно ссылку, иначе получите ошибку несоответствия типов.
В движениях документа ссылка на сам документ хранится в служебном поле «Регистратор». Именно по регистратору платформа определяет, какие записи регистра принадлежат документу, и удаляет их при отмене проведения. Замена регистратора вручную в записях регистра — частая причина «потерянных» движений.
Типичные ошибки и ограничения
Самая распространённая ошибка — обращение к реквизитам ссылки внутри цикла обхода табличной части или результата запроса. Каждое обращение через точку порождает отдельный запрос к базе. Правильный приём — выбрать нужные поля сразу в запросе через точку (Товары.Номенклатура.СтавкаНДС) или собрать ссылки и получить данные одним пакетным запросом.
Вторая группа ошибок связана с изменением данных. Получение объекта через ПолучитьОбъект() в обработчиках, где достаточно ссылки, замедляет работу и создаёт лишние блокировки. А запись объекта без проверки Модифицированность() и обработки исключений может прервать пакетную обработку на первой же ошибке проведения.
Отдельного внимания заслуживает удаление данных. Пометка на удаление не разрывает ссылки, а вот непосредственное удаление элемента, на который ссылаются документы, оставляет битые ссылки. Всегда используйте штатную обработку «Удаление помеченных объектов» с контролем ссылочной целостности — она покажет все места использования и не даст удалить занятый объект.
Как выбрать способ работы в конкретной задаче
Для большинства задач решение определяется простым правилом: если данные менять не нужно — работайте со ссылкой и запросами; если нужно изменить запись — получайте объект, меняйте, записывайте. Смешивание подходов без необходимости увеличивает нагрузку и риск конфликтов.
Как выбрать действие
При работе в фоновых заданиях и обменах помните: ссылку можно безопасно сериализовать в строку GUID и восстановить в другом сеансе. Объект передавать между сеансами нельзя — он существует только в оперативной памяти текущего соединения.
Что важно запомнить
Ссылка — идентификатор записи, объект — её данные в памяти. Используйте ссылку для сравнения и заполнения реквизитов, объект — для изменения данных. Проверяйте ссылки на пустоту и битость, избегайте обращений через точку в циклах и удаляйте данные только с контролем целостности.
Частые вопросы о ссылках в 1С
Можно ли изменить данные через ссылку, не получая объект?
Напрямую — нет: ссылка доступна только для чтения. Единственный практический обходной путь — изменение данных запросом на уровне СУБД или методом УстановитьЗначение в расширениях, но это обходит все проверки платформы и считается небезопасной практикой. Штатный путь — ПолучитьОбъект() и Записать().
Что означает надпись «Объект не найден» в реквизите?
Это битая ссылка: запись была физически удалена из базы, а ссылка на неё осталась. Восстановить данные можно только из резервной копии или обмена. Саму битую ссылку следует заменить на корректное значение или очистить, предварительно разобравшись, почему объект был удалён.
Почему два одинаковых контрагента не равны при сравнении?
Потому что сравнение идёт по ссылке, то есть по GUID. Два элемента с одинаковым наименованием, ИНН и прочими реквизитами — разные записи с разными идентификаторами. Такие дубли нужно искать специальными обработками поиска дублей и объединять с заменой ссылок во всех документах.
Сохраняется ли ссылка при обмене между базами?
Да, при штатных обменах GUID объекта передаётся вместе с данными, поэтому в базе-приёмнике элемент получает ту же ссылку. Это обеспечивает корректную синхронизацию: повторная выгрузка обновляет существующий объект, а не создаёт дубль.
Как узнать GUID элемента справочника?
Программно — выражением Ссылка.УникальныйИдентификатор(). Для просмотра пользователем можно открыть элемент и выполнить этот код во внешней обработке или консоли кода. Обратное преобразование делается методом ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)).
Чем пустая ссылка отличается от значения Неопределено?
Пустая ссылка — это типизированное значение: платформа знает, что реквизит должен содержать, например, элемент справочника «Номенклатура», просто он не выбран. Неопределено означает отсутствие значения вообще, без типа. В реквизитах составного типа возможны оба варианта, и проверять их нужно раздельно.