Работа со справочниками в 1С:Предприятие — одна из самых частых задач как для разработчиков, так и для опытных пользователей. Указание ссылок на элементы справочников требуется при написании кода, настройке обменов данными, создании отчетов или обработок. Однако даже опытные специалисты иногда сталкиваются с ошибками типа «Недопустимое значение типа» или «Объект не найден», когда пытаются сослаться на справочник неправильным способом.
В этой статье мы разберем все актуальные способы указания ссылок на справочники — от ручного ввода в коде до визуальных инструментов платформы. Особое внимание уделим нюансам работы с разными версиями 1С 8.3 (включая управляемые формы и обычные), а также типичным ошибкам, которые возникают при некорректном формировании ссылок. Если вы ищете конкретный пример — используйте оглавление или FAQ в конце статьи.
1. Основные понятия: что такое ссылка на справочник в 1С
Прежде чем переходить к практике, важно понять, что именно представляет собой ссылка на справочник в контексте 1С:Предприятие. Это не просто текстовое название элемента, а специальный объект платформы, который содержит:
- 🔹 Уникальный идентификатор (UID) — внутренний код элемента в базе данных
- 🔹 Тип объекта — указание на конкретный справочник (например,
СправочникСсылка.Номенклатура) - 🔹 Пометка удаления — статус, показывающий, активен элемент или помечен на удаление
- 🔹 Данные представления — текстовое отображение (наименование, код и т.п.)
Ссылка отличается от самого элемента справочника тем, что она легковесная — не содержит всех реквизитов, а только минимально необходимую информацию для идентификации. Это позволяет экономить ресурсы при работе с большими объемами данных.
Если вам нужно получить все реквизиты элемента справочника (например, артикул, единицу измерения или цену), используйте метод ПолучитьОбъект() по ссылке.
В 1С 8.3 ссылки на справочники могут быть:
- 📌 Пустыми (
СправочникСсылка.ПустаяСсылка()) — когда элемент не выбран - 📌 Неопределенными — если ссылка не инициализирована (типичная ошибка при работе с формами)
- 📌 Конкретными — ссылающимися на существующий элемент
2. Способ 1: Получение ссылки через встроенный язык (код 1С)
Самый универсальный и гибкий метод — использование встроенного языка 1С. Он подходит для любых конфигураций и позволяет получать ссылки как в серверных, так и в клиентских процедурах. Рассмотрим основные варианты кода.
2.1. Получение ссылки по наименованию или коду
Если вам известен код или наименование элемента справочника, можно использовать следующий синтаксис:
// Получение ссылки по коду
Ссылка = Справочники.Номенклатура.НайтиПоКоду("00000001");
// Получение ссылки по наименованию (точный поиск)
Ссылка = Справочники.Номенклатура.НайтиПоНаименованию("Монитор Samsung 24\"", Истина);
Обратите внимание на второй параметр в методе НайтиПоНаименованию() — если передать Истина, поиск будет точным (с учетом регистра), если Ложь — неточным.
2.2. Получение ссылки по UID
Уникальный идентификатор (UID) — самый надежный способ ссылаться на элементы, так как он не меняется при переносе данных между базами. Чтобы получить ссылку по UID:
UID = Новый УникальныйИдентификатор("123e4567-e89b-12d3-a456-426614174000");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(UID);
UID можно узнать через МетодОбъекта() или в консоли отладки, выбрав элемент и выполнив команду:
Сообщить(ВыбранныйЭлемент.УникальныйИдентификатор());
Что делать, если метод ПолучитьСсылку() возвращает Неопределено?
Это означает, что элемент с указанным UID не найден в базе. Возможные причины:
- Элемент был удален
- UID указан неверно (опечатка или неполный формат)
- Вы работаете в другой базе данных, где этого элемента нет
- У вас недостаточно прав на просмотр справочника
2.3. Получение ссылки из текущей формы
Если вы работаете в управляемой форме и нужно получить ссылку на элемент, выбранный пользователем в поле ввода, используйте:
// Для управляемых форм
Ссылка = ЭлементыФормы.ПолеСправочника.Значение;
// Для обычных форм
Ссылка = ЭлементыФормы.ПолеСправочника.Ссылка;
Важно проверять, что ссылка не пустая, перед дальнейшей работой:
Если НЕ Ссылка.Пустая() Тогда
// Ваш код здесь
КонецЕсли;
Всегда проверяйте ссылки на пустоту (Ссылка.Пустая()) перед использованием, чтобы избежать ошибок выполнения.
3. Способ 2: Использование конструктора запросов
Конструктор запросов в 1С позволяет получать ссылки на справочники в результате выполнения SQL-подобных запросов. Это удобно, когда нужно отобрать элементы по сложным условиям.
3.1. Простой запрос с возвратом ссылок
Пример запроса, который возвращает ссылки на элементы справочника Контрагенты с определенным типом:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КонтрагентыСсылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ЭтоГруппа = ЛОЖЬ
| И Контрагенты.ВидКонтрагента = &ВидКонтрагента";
Запрос.УстановитьПараметр("ВидКонтрагента", ВидыКонтрагентов.Покупатель);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Ссылка.Наименование);
КонецЦикла;
В результате поле Ссылка будет содержать полноценные ссылки на элементы справочника, с которыми можно дальше работать.
3.2. Запрос с объединением нескольких справочников
Если нужно получить данные из связанных справочников, используйте конструкцию ВЫБРАТЬ РАЗЛИЧНЫЕ или соединения (ЛЕВОЕ СОЕДИНЕНИЕ):
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураСсылка КАК Номенклатура,
| ЕдиницыИзмеренияСсылка КАК ЕдиницаИзмерения
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
| ПО Номенклатура.ЕдиницаИзмерения = ЕдиницыИзмерения.Ссылка
|ГДЕ
| Номенклатура.ЭтоГруппа = ЛОЖЬ";
3.3. Особенности работы с виртуальными таблицами
При работе с виртуальными таблицами (например, Справочник.Номенклатура.СрезПоследних) ссылки возвращаются в виде специальных объектов. Чтобы получить стандартную ссылку, используйте метод ПолучитьОбъект():
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура КАК Номенклатура
|ИЗ
| Справочник.Номенклатура.СрезПоследних КАК Номенклатура
|ГДЕ
| Номенклатура.ПометкаУдаления = ЛОЖЬ";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Ссылка = Выборка.Номенклатура.ПолучитьОбъект();
Сообщить(Ссылка.Наименование);
КонецЦикла;
⚠️ Внимание: Виртуальные таблицы могут возвращать данные с задержкой, особенно в больших базах. Всегда проверяйте производительность запросов на реальных объемах данных.
4. Способ 3: Визуальные инструменты (без программирования)
Не все задачи требуют написания кода. В 1С 8.3 есть несколько визуальных инструментов, позволяющих получить ссылки на справочники без программирования.
4.1. Конструктор выражений
Конструктор выражений доступен в многих местах платформы — от настроек отчетов до условий в бизнес-процессах. Чтобы получить ссылку:
- Откройте конструктор (например, в настройке отбора отчета)
- Выберите тип значения
СправочникСсылка.ИмяВашегоСправочника - Нажмите кнопку выбора (
...) и выберите нужный элемент - Система автоматически подставит код вида
Справочники.Номенклатура.НайтиПоНаименованию("Товар 1")
Преимущество этого метода — автоматическая проверка синтаксиса и подсказки по доступным справочникам.
4.2. Конструктор движений документов
При настройке движений документов (например, в регистрах накопления) можно указывать ссылки на справочники прямо в таблице движений:
- 📋 Откройте документ в режиме
1С:Предприятие - 📋 Перейдите в форму настройки движений (
Еще → Изменить форму) - 📋 В колонке «Справочник» нажмите на кнопку выбора и укажите нужный элемент
Система сохраняет ссылку в виде кода, который потом можно просмотреть в конфигураторе.
4.3. Обработки с полями выбора
Многие стандартные обработки (например, УниверсальныйОтчет.epf или ПомощникПоискаИЗамены.epf) содержат поля для выбора элементов справочников. После выбора ссылка автоматически фиксируется в параметрах обработки.
Чтобы увидеть, как именно хранится ссылка:
- Откройте обработку в режиме
1С:Предприятие - Выберите нужный элемент справочника
- Сохраните настройки обработки в файл (
.epf) - Откройте файл в текстовом редакторе — там будет строка с ссылкой в формате XML
⚠️ Внимание: При переносе обработок между базами ссылки на справочники могут «сломаться», если в целевой базе нет элементов с такими же UID. Всегда проверяйте работоспособность после импорта.
5. Способ 4: Работа со ссылками в обменах данными
При настройке обменов данными (например, через Универсальный формат обмена или EnterpriseData) ссылки на справочники передаются в специальном формате. Рассмотрим ключевые моменты.
5.1. Формат ссылок в XML-обменах
В XML-файлах обмена ссылки на справочники представляются в виде:
<Ссылка>123e4567-e89b-12d3-a456-426614174000</Ссылка>
Где вместо UID подставляется реальный идентификатор элемента. Чтобы правильно обработать такие ссылки при загрузке, используйте метод ЗагрузитьОбъектПоСсылке():
UID = Новый УникальныйИдентификатор("123e4567-e89b-12d3-a456-426614174000");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(UID);
Если Ссылка.Пустая() Тогда
// Создать новый элемент, если его нет в базе
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.УстановитьНовыйУникальныйИдентификатор(UID);
НовыйЭлемент.Наименование = "Название из обмена";
НовыйЭлемент.Записать();
Ссылка = НовыйЭлемент.Ссылка;
КонецЕсли;
5.2. Особенности обменов через REST API
При работе с REST API (например, в 1С:Fresh или облачных решениях) ссылки передаются в формате:
{
"ref": "catalog:123e4567-e89b-12d3-a456-426614174000"
}
Чтобы преобразовать такой JSON в ссылку 1С:
Данные = JSON.Прочитать(СтрокаJSON);
UID = Новый УникальныйИдентификатор(СтрЗначение(Данные.ref));
Ссылка = Справочники.Каталог.ПолучитьСсылку(UID);
5.3. Типичные ошибки при обменах
Самые распространенные проблемы со ссылками в обменах:
| Ошибка | Причина | Решение |
|---|---|---|
| «Объект не найден» | В целевой базе нет элемента с таким UID | Настроить создание отсутствующих элементов |
| «Недопустимый формат UID» | UID указан не полностью или с опечаткой | Проверять формат UID перед загрузкой |
| «Тип не совпадает» | Пытаетесь загрузить ссылку на Номенклатуру в поле для Контрагентов |
Проверять соответствие типов справочников |
| «Пустая ссылка» | В исходных данных передается null или пустое значение |
Обрабатывать пустые значения отдельно |
- Все UID имеют корректный формат (36 символов, дефисы на 8, 13, 18, 23 позициях)
- Типы справочников в источнике и приемнике совпадают
- В целевой базе достаточно прав для создания элементов
- Обработаны случаи пустых ссылок-->
6. Способ 5: Работа со ссылками в отчетах и СКД
В системе компоновки данных (СКД) ссылки на справочники часто используются как параметры или поля вывода. Рассмотрим ключевые нюансы.
6.1. Передача ссылок как параметров отчета
Чтобы передать ссылку на справочник в отчет как параметр:
- Откройте схему компоновки данных
- Добавьте новый параметр типа
СправочникСсылка.ИмяСправочника - В коде вызова отчета передайте ссылку:
ПараметрыОтчета = Новый Структура();ПараметрыОтчета.Вставить("Контрагент", Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка"));
Отчет = ПолучитьОтчет("ПродажиПоКонтрагенту");
Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьПараметр("Контрагент", ПараметрыОтчета.Контрагент);
Отчет.Скомпоновать();
6.2. Вывод ссылок в результатах отчета
В настройках СКД можно указать, что поле должно возвращать ссылку, а не просто наименование. Для этого:
- 📊 В схеме компоновки выберите нужное поле
- 📊 В свойствах поля установите
ТипЗначения = СправочникСсылка.ИмяСправочника - 📊 В настройках отображения укажите, какие реквизиты выводить (наименование, код и т.п.)
Пример настройки вывода:
ЭлементРезультата = Результат.ПолучитьЭлемент(0);
Ссылка = ЭлементРезультата.Значение; // Это будет полноценная ссылка на справочник
Сообщить(Ссылка.Наименование + " (" + Ссылка.Код + ")");
6.3. Фильтрация по ссылкам в отчетах
Чтобы отфильтровать данные в отчете по ссылке на справочник:
- 🔍 В настройках отчета добавьте отбор
- 🔍 Выберите поле типа
СправочникСсылка - 🔍 Укажите нужный элемент через кнопку выбора (
...)
В коде это будет выглядеть так:
КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
ЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Справочники.Контрагенты.НайтиПоНаименованию("ООО Весна");
7. Типичные ошибки и их решение
Даже опытные разработчики иногда сталкиваются с проблемами при работе со ссылками на справочники. Разберем самые распространенные ошибки и способы их исправления.
7.1. «Недопустимое значение типа»
Эта ошибка возникает, когда вы пытаетесь присвоить ссылке значение неверного типа. Например:
СсылкаНаНоменклатуру = Справочники.Контрагенты.НайтиПоНаименованию("ООО Весна"); // ОШИБКА!
Решение: всегда проверяйте соответствие типов:
// Правильно:
СсылкаНаКонтрагента = Справочники.Контрагенты.НайтиПоНаименованию("ООО Весна");
СсылкаНаНоменклатуру = Справочники.Номенклатура.НайтиПоНаименованию("Товар 1");
7.2. «Объект не найден»
Ошибка означает, что элемент с указанным кодом, наименованием или UID отсутствует в базе. Проверьте:
- 🔎 Правильность написания кода/наименования (регистр имеет значение!)
- 🔎 Существует ли элемент в справочнике (возможно, он помечен на удаление)
- 🔎 Достаточно ли прав у текущего пользователя для просмотра этого элемента
Для диагностики используйте:
Если НЕ ЗначениеЗаполнено(Справочники.Номенклатура.НайтиПоКоду("00000001")) Тогда
Сообщить("Элемент с кодом 00000001 не найден!");
КонецЕсли;
7.3. Пустые ссылки в формах
Если в форме поле со ссылкой на справочник suddenly становится пустым, проверьте:
- 🛠 Настройку свойства
ОчищатьПриВводев элементе формы - 🛠 Логику обработчиков событий
ПриИзмененииилиПередЗаписью - 🛠 Права пользователя на просмотр справочника
Чтобы избежать проблем, всегда инициализируйте ссылки:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ЭлементыФормы.Контрагент.Значение = Неопределено Тогда
ЭлементыФормы.Контрагент.Значение = СправочникСсылка.Контрагенты.ПустаяСсылка();
КонецЕсли;
КонецПроцедуры
7.4. Проблемы с UID при переносе данных
UID элементов справочников могут дублироваться в разных базах, если они были созданы независимо друг от друга (например, в двух разных организациях). При слиянии таких баз возникнут конфликты. Решения:
- 🔄 Использовать внешние идентификаторы вместо UID
- 🔄 Настроить правила преобразования ссылок при обмене
- 🔄 Применять механизм
ПоискПоРеквизитамвместо прямой привязки по UID
8. Продвинутые приемы работы со ссылками
Для опытных разработчиков полезно знать несколько неочевидных приемов, которые упрощают работу со ссылками.
8.1. Массовое получение ссылок
Если нужно получить ссылки на все элементы справочника, используйте Выбрать():
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Ссылка.Наименование);
КонецЦикла;
Для ускорения работы с большими справочниками добавьте отбор:
Выборка = Справочники.Номенклатура.Выбрать();
Выборка.Отбор.ЭтоГруппа.Установить(Ложь);
Выборка.Отбор.ПометкаУдаления.Установить(Ложь);
8.2. Сравнение ссылок
Чтобы сравнить две ссылки, используйте метод Сравнить() или оператор =:
Ссылка1 = Справочники.Номенклатура.НайтиПоКоду("00000001");
Ссылка2 = Справочники.Номенклатура.НайтиПоКоду("00000002");
Если Ссылка1.Сравнить(Ссылка2) = 0 Тогда
Сообщить("Ссылки совпадают!");
Иначе
Сообщить("Ссылки разные");
КонецЕсли;
Оператор = работает аналогично:
Если Ссылка1 = Ссылка2 Тогда
// Ссылки указывают на один и тот же элемент
КонецЕсли;
8.3. Получение ссылок из динамических списков
В управляемых формах для работы с динамическими списками используйте:
ВыделенныеСтроки = ЭлементыФормы.СписокНоменклатуры.ВыделенныеСтроки;
Для Каждого Строки Из ВыделенныеСтроки Цикл
Ссылка = Строки.Ссылка;
Сообщить(Ссылка.Наименование);
КонецЦикла;
8.4. Работа с ссылками в фоновых заданиях
При работе с фоновыми заданиями ссылки на справочники нужно передавать аккуратно, так как они могут стать невалидными к моменту выполнения задачи. Лучше передавать UID или код:
Параметры = Новый Структура();
Параметры.Вставить("UID", ВыбранныйЭлемент.УникальныйИдентификатор());
ФоновоеЗадание = ФоновыеЗадания.Выполнить(
"ОбработатьЭлемент",
Параметры,
Истина // Выполнить на сервере
);
В обработчике фонового задания:
Процедура ОбработатьЭлемент(Параметры) Экспорт
UID = Новый УникальныйИдентификатор(Параметры.UID);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(UID);
// Дальнейшая обработка
КонецПроцедуры
⚠️ Внимание: В кластерных базах фоновые задания могут выполняться на другом рабочем процессе, где кэш ссылок отличается. Всегда перепроверяйте актуальность ссылок при длительных заданиях.
FAQ: Ответы на частые вопросы
Как получить ссылку на группу справочника?
Группы справочников тоже являются элементами и имеют ссылки. Чтобы получить ссылку на группу, используйте те же методы, что и для элементов:
СсылкаНаГруппу = Справочники.Номенклатура.НайтиПоНаименованию("Одежда");
Если СсылкаНаГруппу.ЭтоГруппа Тогда
Сообщить("Это группа!");
КонецЕсли;
Группы можно отличить от элементов с помощью свойства ЭтоГруппа.
Можно ли получить ссылку на справочник по внешнему коду?
Да, для этого предназначен метод НайтиПоРеквизиту():
Ссылка = Справочники.Номенклатура.НайтиПоРеквизиту("ВнешнийКод", "EXT0001");
Внешний код должен быть предварительно заполнен в реквизите элемента справочника.
Как передать ссылку на справочник в HTTP-запросе?
Для передачи через HTTP-Сервисы или REST API лучше конвертировать ссылку в строку с UID:
Функция СсылкаВСтроку