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

В этой статье мы разберём все актуальные способы получения СправочникСсылка, включая малоизвестные приёмы и типичные ошибки. Вы узнаете, как работать с этим типом в различных версиях платформы (8.3, 8.3.20+), как избежать распространённых проблем с приведением типов, и почему иногда Новый СправочникСсылка() ведёт себя не так, как ожидается. Материал будет полезен как начинающим программистам , так и тем, кто хочет систематизировать свои знания.

Что такое СправочникСсылка и зачем он нужен

Тип СправочникСсылка — это основа работы со справочниками в 1С:Предприятие. Он представляет собой ссылку на конкретный элемент справочника, а не сам объект. Это ключевое отличие от типа СправочникОбъект, который содержит все реквизиты и методы элемента. Ссылка легковеснее, её проще передавать между модулями и использовать в запросах.

Основные случаи, когда требуется получить СправочникСсылка:

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

Важно понимать, что СправочникСсылка — это не просто строка или число. Это сложный тип, который хранит метаданные о справочнике (имя, UUID) и идентификатор элемента. Поэтому операции вроде Строка(Ссылка) или сравнение через = могут давать неожиданные результаты, если не учитывать особенности платформы.

💡

Если вам нужно получить уникальный идентификатор элемента справочника (например, для обмена данными), используйте метод Ссылка.УникальныйИдентификатор() вместо приведения к строке. Это гарантирует корректную работу даже при переносе данных между базами.

Способы получения СправочникСсылка в коде 1С

Существует несколько способов получить ссылку на элемент справочника. Выбор метода зависит от контекста: нужно ли создать новую ссылку, получить существующую из базы, или преобразовать другой тип данных. Рассмотрим каждый вариант с примерами.

1. Конструктор Новый СправочникСсылка()

Самый прямой способ — использовать конструктор. Он позволяет создать ссылку по имени справочника и идентификатору элемента:

Ссылка = Новый СправочникСсылка("Номенклатура", УникальныйИдентификатор);

Ссылка = Новый СправочникСсылка("Контрагенты", "00000000-0000-0000-0000-000000000001");

Однако здесь есть подводные камни:

  • 🔸 Если передать несуществующий UUID, платформа не выдаст ошибку сразу — проблема проявится позже, при попытке использовать ссылку.
  • 🔸 В некоторых конфигурациях (например, Бухгалтерия 3.0) идентификаторы могут быть не UUID, а числовые коды. Тогда второй параметр должен быть числом.

2. Метод ПолучитьСсылку() у объекта справочника

Если у вас уже есть объект справочника (например, после создания или выборки), можно получить его ссылку так:

Объект = Справочники.Номенклатура.СоздатьЭлемент();

Объект.Наименование = "Товар тестовый";

Объект.Записать();

Ссылка = Объект.Ссылка;

Это надёжный способ, так как платформа сама контролирует корректность ссылки. Но помните: если объект ещё не записан в базу, метод Ссылка вернёт Неопределённо.

3. Поиск по реквизитам через менеджер справочника

Когда нужно найти элемент по какому-либо критерию (например, по наименованию или коду), используйте менеджер справочника:

Ссылка = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

Ссылка = Справочники.Номенклатура.НайтиПоКоду("00000001");

Обратите внимание: эти методы возвращают Неопределённо, если элемент не найден. Всегда проверяйте результат!

Если Ссылка = Неопределённо Тогда

Сообщить("Элемент не найден!");

КонецЕсли;

Использовать конструктор Новый СправочникСсылка() только с валидными UUID|Проверять результат методов НайтиПо... на Неопределённо|Убедиться, что объект записан в базу перед получением ссылки|Использовать УникальныйИдентификатор() для обмена данными-->

Работа с СправочникСсылка в запросах 1С

В языке запросов тип СправочникСсылка используется повсеместно, но здесь есть свои нюансы. Например, если вы хотите получить ссылку в результате запроса, нужно явно указать это в выборке:

Выбрать

Номенклатура.Ссылка Как СсылкаНаЭлемент

Из

Справочник.Номенклатура Как Номенклатура

Где

Номенклатура.ПометкаУдаления = Ложь

Частые ошибки при работе с ссылками в запросах:

  • 📌 Сравнение ссылок через = может не работать, если ссылки из разных баз (даже с одинаковыми UUID). Используйте Ссылка1.УникальныйИдентификатор() = Ссылка2.УникальныйИдентификатор().
  • 📌 Приведение к строке в запросе (Представление(Номенклатура.Ссылка)) даёт наименование, а не идентификатор.

Если вам нужно отфильтровать данные по ссылке, передавайте её в запрос как параметр:

Запрос = Новый Запрос;

Запрос.Текст =

"Выбрать

| Контрагенты.Ссылка Как Контрагент

|Из

| Справочник.Контрагенты Как Контрагенты

|Где

| Контрагенты.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ИскомаяСсылка);

Результат = Запрос.Выполнить();

📊 Какой способ получения СправочникСсылка вы используете чаще?
Конструктор Новый СправочникСсылка()
Методы менеджера справочника (НайтиПоНаименованию)
Через запросы
Получаю ссылку от объекта (Объект.Ссылка)

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

Одна из самых распространённых проблем — некорректное приведение типов. Например, если вы пытаетесь присвоить строковое значение переменной типа СправочникСсылка, платформа не выдаст ошибку сразу, ноlater это приведёт к падению:

// ОШИБКА! Так делать нельзя

Ссылка = "00000000-0000-0000-0000-000000000001"; // Это строка, а не СправочникСсылка!

Для безопасного приведения используйте:

Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда

Ссылка = Значение;

Иначе

Сообщить("Передан неверный тип данных!");

КонецЕсли;

Также полезно проверять, что ссылка указывает на существующий элемент:

Если НЕ Ссылка.Пустая() И Справочники.Номенклатура.ЭтоГруппа(Ссылка) = Ложь Тогда

// Ссылка валидна и указывает на элемент (не группу)

КонецЕсли;

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

Типичные ошибки и как их избежать

Даже опытные разработчики иногда сталкиваются с проблемами при работе со СправочникСсылка. Вот наиболее частые ошибки и способы их решения:

Ошибка Причина Решение
Ошибка приведение типов: СправочникСсылка <- Строка Попытка присвоить строковый UUID без конструктора Использовать Новый СправочникСсылка("Имя", UUID)
Элемент справочника не найден Ссылка создана через конструктор, но элемент удалён Проверять Справочники.Имя.СуществуетСсылка(Ссылка)
Сравнение ссылок из разных баз возвращает Ложь Сравниваются не UUID, а внутренние идентификаторы Сравнивать через УникальныйИдентификатор()
Недопустимое значение параметра (параметр номер 2) Передан неверный UUID или код в конструктор Проверять формат UUID или использовать числовой код

Особое внимание уделите работе с пустыми ссылками. В есть два "пустых" состояния:

  • 🔘 Неопределённо — когда ссылка не инициализирована.
  • 🔘 Пустая ссылка — когда ссылка создана, но не указывает на элемент (например, Новый СправочникСсылка("Номенклатура", "")).

Чтобы надёжно проверить ссылку на "пустоту", используйте:

Если Ссылка = Неопределённо Или Ссылка.Пустая() Тогда

// Ссылка некорректна

КонецЕсли;

Почему Ссылка = Неопределённо и Ссылка.Пустая() — это не одно и то же?

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

Практические примеры использования

Рассмотрим несколько реальных сценариев, где работа со СправочникСсылка критически важна.

1. Создание элемента с родителем

При создании нового элемента справочника часто нужно указать родительскую группу. Для этого используется ссылка на группу:

Родитель = Справочники.Номенклатура.НайтиПоНаименованию("Товары");

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();

НовыйЭлемент.Родитель = Родитель; // Здесь передаём СправочникСсылка

НовыйЭлемент.Наименование = "Новый товар";

НовыйЭлемент.Записать();

2. Обмен данными между базами

При обмене данными через XML, JSON или Универсальный формат ссылки передаются как UUID. Чтобы восстановить ссылку в другой базе:

UUID = "00000000-0000-0000-0000-000000000001";

Ссылка = Новый СправочникСсылка("Контрагенты", UUID);

Если НЕ Справочники.Контрагенты.СуществуетСсылка(Ссылка) Тогда

// Создать новый элемент, если его нет

КонецЕсли;

3. Работа с динамическими списками

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

Процедура ПриИзмененииВыбора(Элемент)

ВыбраннаяСтрока = ЭлементыФормы.СписокНоменклатуры.ТекущиеДанные;

СсылкаНаЭлемент = ВыбраннаяСтрока.Ссылка; // Получаем СправочникСсылка

КонецПроцедуры

💡

При обмене данными всегда используйте УникальныйИдентификатор() вместо приведения ссылки к строке. Это гарантирует корректную работу даже при переносе между базами с разными префиксами.

Особенности в разных версиях 1С

Поведение типа СправочникСсылка может отличаться в зависимости от версии платформы и конфигурации. Например:

  • 🔹 В 1С:Предприятие 8.3.20+ появилась поддержка UUID как основного идентификатора, что упростило обмен данными.
  • 🔹 В старых версиях (8.2 и ниже) часто использовались числовые коды вместо UUID, что требовало дополнительных проверок.
  • 🔹 В конфигурациях на управляемых формах (например, УТ 11, ERP 2) ссылки в динамических списках передаются автоматически, но в обычных формах их нужно обрабатывать вручную.

Также в некоторых отраслевых решениях (например, 1С:Мед или 1С:Госзаказ) могут быть дополнительные проверки прав доступа при работе со ссылками. Всегда тестируйте код в целевой конфигурации!

⚠️ Внимание: В конфигурациях с включённым режимом "Управление доступом на уровне записей" (RLS) проверка существования ссылки через СуществуетСсылка() может возвращать Ложь, даже если элемент есть, но у пользователя нет прав на просмотр.

FAQ: Частые вопросы по СправочникСсылка

Как получить ссылку на элемент справочника, если известен только его код?

Используйте метод менеджера справочника НайтиПоКоду():

Ссылка = Справочники.Номенклатура.НайтиПоКоду("00000001");

Если код числовой, передавайте его как число, а не строку. В некоторых конфигурациях (например, БП 3.0) коды могут быть составными (например, "А-001"), тогда нужно использовать НайтиПоРеквизиту("Код", "А-001").

Можно ли сравнивать СправочникСсылка из разных баз данных?

Нет, прямое сравнение через = работать не будет, даже если у элементов одинаковые UUID. Сравнивайте через УникальныйИдентификатор():

Если Ссылка1.УникальныйИдентификатор() = Ссылка2.УникальныйИдентификатор() Тогда

// Ссылки указывают на один и тот же элемент

КонецЕсли;

Это актуально для обмена данными между базами.

Почему при создании ссылки через конструктор не возникает ошибка, даже если элемента не существует?

Платформа не проверяет существование элемента на этапе создания ссылки. Ошибка возникнет только при попытке использовать эту ссылку (например, получить реквизиты или записать объект). Всегда проверяйте ссылки через СуществуетСсылка():

Ссылка = Новый СправочникСсылка("Контрагенты", "00000000-0000-0000-0000-000000000001");

Если НЕ Справочники.Контрагенты.СуществуетСсылка(Ссылка) Тогда

Сообщить("Элемент не найден!");

КонецЕсли;

Как преобразовать строку с UUID в СправочникСсылка?

Используйте конструктор Новый СправочникСсылка() с проверкой формата UUID:

Функция СтрокаВСсылку(ИмяСправочника, UUIDСтрока) Экспорт

Если НЕ РегВыр.Проверка(UUIDСтрока, "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}") Тогда

Возврат Неопределённо;

КонецЕсли;

Возврат Новый СправочникСсылка(ИмяСправочника, UUIDСтрока);

КонецФункции

Для числовых кодов вместо UUID используйте второй параметр как число.

Что делать, если метод НайтиПоНаименованию() возвращает группу вместо элемента?

По умолчанию метод ищет и элементы, и группы. Чтобы исключить группы, добавьте проверку:

Ссылка = Справочники.Номенклатура.НайтиПоНаименованию("Товар 1");

Если Справочники.Номенклатура.ЭтоГруппа(Ссылка) Тогда

Сообщить("Найдена группа, а не элемент!");

Иначе

// Работаем со ссылкой на элемент

КонецЕсли;

В некоторых конфигурациях (например, УТ 11) можно использовать НайтиПоНаименованию(..., Ложь), где второй параметр отключает поиск по группам.