В 1С:Предприятие 8.3 понятие ссылочного типа — одно из ключевых для работы с объектами конфигурации. Отличить ссылочный тип от обычного значения (например, числа или строки) критически важно при написании кода, настройке обменов данными или отладке ошибок. Но как это сделать быстро и без ошибок?
Эта статья поможет разобраться в вопросе с разных сторон: от визуальных признаков в конфигураторе до программных методов проверки. Мы рассмотрим способы для программистов (с использованием встроенного языка) и для пользователей (без написания кода), а также разберём типичные ошибки и нюансы, которые могут сбить с толку даже опытных специалистов.
Особое внимание уделим практическим примерам — они помогут закрепить теорию. Если вы когда-либо сталкивались с ошибками вроде "Недопустимое значение типа (Ссылка)" или "Ожидался тип СправочникСсылка", эта инструкция станет вашим спасательным кругом.
1. Что такое ссылочный тип в 1С и зачем его определять
В 1С:Предприятие ссылочный тип — это особый вид данных, который указывает на объект базы (например, элемент справочника, документ или план счетов). В отличие от примитивных типов (число, строка, дата), ссылка содержит не само значение, а указатель на него.
Почему это важно? Например, при обмене данными между базами или при написании отчётов. Если передать вместо ссылки просто строку с названием, система не сможет связать данные с реальным объектом. Или другой случай: при программном создании документа нужно указать ссылку на контрагента, а не его название.
Основные ссылочные типы в 1С:
- 📄 СправочникСсылка — ссылка на элемент справочника (например,
Справочник.Контрагенты) - 📑 ДокументСсылка — ссылка на документ (например,
Документ.РеализацияТоваровУслуг) - 📊 ПланСчетовСсылка — ссылка на счёт бухгалтерского плана
- 🔗 ХарактеристикаСсылка, ПланВидовХарактеристикСсылка и другие
Если кратко: ссылочный тип всегда привязан к конкретному объекту метаданных (справочнику, документу и т.д.), в то время как нессылка — это"голые" данные (строка"Иванов" vs. ссылка на элемент справочника"Иванов Иван Иванович").
2. Визуальные признаки ссылочного типа в конфигураторе
Не всегда нужно писать код, чтобы понять, ссылочный тип перед вами или нет. В Конфигураторе 1С есть несколько визуальных подсказок:
В окне"Значение" (при отладке или просмотре переменных):
- 🔹 Ссылочный тип отображается как гиперссылка (подчёркнутый текст синего цвета). Например:
Справочник.Номенклатура.Товар1. - 🔹 Нессылка показывается как обычный текст (чёрный, без подчёркивания). Например:
"Товар1"(строка) или1000(число).
В окне"Выражение" (при написании кода):
- 🔹 Если подвести курсор к переменной ссылочного типа, всплывающая подсказка покажет полный путь (например,
СправочникСсылка.Контрагенты). - 🔹 Для нессылки подсказка будет простой:
Строка,Числои т.д.
В режиме"1С:Предприятие" (пользовательском) ссылочные поля в формах обычно выделены жирным шрифтом или имеют кнопку выбора (🔍) рядом с полем.
| Признак | Ссылочный тип | Нессылка |
|---|---|---|
| Цвет в отладчике | Синий, подчёркнутый | Чёрный |
| Подсказка при наведении | Полный путь (например, СправочникСсылка.Номенклатура) |
Простой тип (Строка, Число) |
| Поведение в форме | Кнопка выбора (🔍), открытие списка при клике | Обычное текстовое поле |
| Пример отображения | Документ.ПоступлениеТоваров.Поступление1 от 01.01.2023 |
"Поступление1" или 3500.50 |
3. Программные методы проверки ссылочного типа
Для программистов 1С есть несколько надёжных способов определить, является ли переменная ссылочным типом. Рассмотрим их с примерами кода.
3.1. Функция ТипЗнч
Самый универсальный метод — использовать встроенную функцию ТипЗнч. Она возвращает строку с описанием типа значения:
Перем МояПеременная;
// Пример 1: Ссылочный тип
МояПеременная = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Сообщить(ТипЗнч(МояПеременная)); // Вернёт:"СправочникСсылка.Контрагенты"
// Пример 2: Нессылка
МояПеременная ="ООО Ромашка";
Сообщить(ТипЗнч(МояПеременная)); // Вернёт:"Строка"
Чтобы проверить, является ли тип ссылочным, можно использовать условие:
Если Найти(ТипЗнч(МояПеременная),"Ссылка") > 0 Тогда
Сообщить("Это ссылочный тип!");
Иначе
Сообщить("Это НЕ ссылочный тип.");
КонецЕсли;
3.2. Метод ЭтоСсылка (для платформы 8.3.14+)
В новых версиях платформы появился удобный метод ЭтоСсылка, который возвращает Истина, если значение — ссылка:
Если МояПеременная.ЭтоСсылка Тогда
Сообщить("Переменная содержит ссылку!");
КонецЕсли;
Поддержка метода ЭтоСсылка
Метод ЭтоСсылка доступен начиная с версии платформы 8.3.14. В более старых версиях используйте ТипЗнч или Тип.
3.3. Проверка через Тип и ВидыТипов
Для более сложных проверок (например, если нужно отличить СправочникСсылка от ДокументСсылка) используйте комбинацию Тип и ВидыТипов:
ТипПеременной = Тип(МояПеременная);
Если ТипПеременной = ВидыТипов.СправочникСсылка Тогда
Сообщить("Это ссылка на справочник!");
ИначеЕсли ТипПеременной = ВидыТипов.ДокументСсылка Тогда
Сообщить("Это ссылка на документ!");
КонецЕсли;
Убедитесь, что переменная инициализирована|Используйте ТипЗнч для быстрой проверки|Для точного определения типа применяйте Тип и ВидыТипов|В новых версиях платформы пробуйте метод ЭтоСсылка-->
4. Ошибки при работе со ссылочными типами и как их избежать
Даже опытные разработчики иногда сталкиваются с ошибками, связанными со ссылочными типами. Рассмотрим наиболее частые из них и способы решения.
4.1. Ошибка:"Недопустимое значение типа (Ссылка)"
Эта ошибка возникает, когда вместо ссылки передаётся значение другого типа. Например:
// Ошибочный код:
НовыйДокумент.Контрагент ="ООО Ромашка"; // Пытаемся присвоить строку вместо ссылки
// Правильный код:
НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
4.2. Ошибка:"Ожидался тип СправочникСсылка.Контрагенты"
Аналогичная проблема — когда передаётся ссылка на другой справочник или документ. Например:
// Ошибочный код:
НовыйДокумент.Контрагент = Справочники.Номенклатура.НайтиПоНаименованию("Товар1"); // Передаём номенклатуру вместо контрагента
// Правильный код:
НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
4.3. Пустая ссылка vs. Неопределённое значение
В 1С есть нюанс: ПустаяСсылка и Неопределённое — это разные вещи! Пустая ссылка — это валидный объект типа Ссылка, но не указывающий ни на что. А Неопределённое — это отсутствие значения вообще.
Перем МояСсылка;
// Пример 1: Пустая ссылка
МояСсылка = Справочники.Контрагенты.ПустаяСсылка;
Сообщить(МояСсылка.ЭтоСсылка); // Вернёт Истина
// Пример 2: Неопределённое значение
МояСсылка = Неопределённое;
Сообщить(ТипЗнч(МояСсылка)); // Вернёт"Неопределённое"
Всегда проверяйте переменные на Неопределённое перед работой со ссылками, чтобы избежать ошибок выполнения.
⚠️ Внимание: В некоторых версиях платформы методЭтоСсылкаможет возвращатьИстинадаже для пустых ссылок. Учитывайте это при написании условий.
5. Как определить ссылочный тип без программирования (для пользователей)
Если вы не программист, но понять, ссылочный тип перед вами или нет, воспользуйтесь этими способами:
5.1. Проверка в формах 1С
В пользовательском режиме (1С:Предприятие):
- 🔍 Если поле имеет кнопку выбора (лупа 🔍), оно почти всегда ссылочное.
- 📋 При клике на такое поле открывается список для выбора (справочник, документ и т.д.).
- 🖱️ Наведите курсор на поле — во всплывающей подсказке может отобразиться тип (например,"Справочник: Контрагенты").
5.2. Экспорт в Excel или текстовый файл
Если вы экспортируете данные из отчёта или обработки:
- 📊 Ссылочные поля обычно экспортируются с полным путём (например,
Справочник.Контрагенты.ООО Ромашка). - 📝 Нессылки экспортируются как есть: строки, числа, даты.
5.3. Просмотр в отчётах
В большинстве стандартных отчётов 1С:
- 📈 Ссылочные поля отображаются как гиперссылки (можно кликнуть, чтобы открыть объект).
- 📉 Обычные данные (строки, числа) — как простой текст.
⚠️ Внимание: В некоторых конфигурациях (например, 1С:Бухгалтерия 3.0) внешний вид полей может быть переопределён. Если сомневаетесь, обратитесь к администратору базы.
6. Практические примеры: когда нужно отличать ссылочный тип
Разберём реальные ситуации, где умение определять ссылочные типы критически важно.
6.1. Обмен данными между базами
При настройке обмена (например, через Универсальный формат обмена или EnterpriseData):
- 🔄 Ссылочные поля должны передаваться как ссылки, иначе данные не свяжутся.
- 📦 Пример ошибки: если в исходной базе контрагент — это ссылка, а в целевой базе он записан как строка, обмен завершится с ошибкой.
6.2. Заполнение документов по шаблону
При программном создании документов:
- 📝 Если шаблон ожидает ссылку на номенклатуру, а вы передаёте строку с названием, документ не проведётся.
- 🔗 Пример правильного кода:
НовыйДокумент.Товары.Добавить;НовыйДокумент.Товары[0].Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Товар1"); // Ссылка!
НовыйДокумент.Товары[0].Количество = 10;
6.3. Отладка и поиск ошибок
Если скрипт выдаёт ошибку типа "Недопустимое значение типа":
- 🐞 Первое, что нужно проверить — соответствие типов передаваемых данных.
- 🔎 Используйте
Сообщить(ТипЗнч(Переменная)), чтобы вывести тип проблемной переменной.
В отладчике (F5) можно посмотреть значение переменной в момент ошибки — это часто помогает понять, где тип данных не совпадает с ожидаемым.
7. Таблица соответствия: ссылочные типы и их аналоги
Для удобства сведем в таблицу основные ссылочные типы и их нессылки-аналоги:
| Ссылочный тип | Пример значения | Аналог (нессылка) | Пример аналога |
|---|---|---|---|
СправочникСсылка.Контрагенты |
Справочник.Контрагенты.ООО Ромашка |
Строка |
"ООО Ромашка" |
ДокументСсылка.РеализацияТоваровУслуг |
Документ.РеализацияТоваровУслуг.РТУ00001 от 01.01.2023 |
Строка |
"РТУ00001" |
ПланСчетовСсылка.ОсновныеСредства |
ПланСчетов.ОсновныеСредства.01 |
Строка |
"01" |
ХарактеристикаСсылка.Цвета |
ПланВидовХарактеристик.Цвета.Красный |
Строка |
"Красный" |
КаталогСсылка.Файлы |
Каталог.Файлы.Инструкция.pdf |
Строка |
"Инструкция.pdf" |
Эта таблица поможет быстро сориентироваться, какой тип данных ожидает та или иная функция.
FAQ: Частые вопросы о ссылочных типах в 1С
Как преобразовать строку в ссылочный тип?
Используйте методы поиска по справочнику или документу. Например:
СсылкаНаКонтрагента = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Если СсылкаНаКонтрагента = Справочники.Контрагенты.ПустаяСсылка Тогда
Сообщить("Контрагент не найден!");
Иначе
Сообщить("Ссылка получена:" + СсылкаНаКонтрагента);
КонецЕсли;
Если нужно создать новый элемент:
НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент;
НовыйКонтрагент.Наименование ="ООО Новая Ромашка";
НовыйКонтрагент.Записать;
Можно ли сравнивать ссылки как строки?
Технически можно, но не рекомендуется. Сравнение ссылок через = работает корректно:
Ссылка1 = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Ссылка2 = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Если Ссылка1 = Ссылка2 Тогда
Сообщить("Ссылки указывают на один объект"); // Это сработает
КонецЕсли;
А вот преобразование ссылки в строку и сравнение строк может привести к ошибкам, так как формат строкового представления ссылки зависит от версии платформы.
Как проверить, что ссылка не пустая?
Используйте метод ПустаяСсылка или сравнение с Неопределённое:
Если МояСсылка = Справочники.Контрагенты.ПустаяСсылка Тогда
Сообщить("Ссылка пустая!");
ИначеЕсли МояСсылка = Неопределённое Тогда
Сообщить("Переменная не инициализирована!");
Иначе
Сообщить("Ссылка валидна:" + МояСсылка);
КонецЕсли;
Почему при обмене данными ссылки теряются?
Это типичная проблема при обмене между базами с разными идентификаторами объектов. Решения:
- 🔄 Используйте Универсальный формат обмена (EnterpriseData) — он сохраняет связи между объектами.
- 🔗 Настройте правила соответствия ссылок в обработке обмена.
- 📋 Перед обменом убедитесь, что в целевой базе существуют все необходимые справочники и документы.
Если обмен настроен через COM-соединение или HTTP-сервисы, проверьте, что передаёте именно ссылки, а не строковые представления объектов.
Как узнать, на какой объект указывает ссылка, не открывая её?
Используйте свойства ссылки:
Если МояСсылка.ЭтоСсылка Тогда
Сообщить("Тип объекта:" + МояСсылка.Метаданные.Имя); // Например,"Контрагенты"
Сообщить("Полное имя:" + МояСсылка.НаименованиеПолное); // Например,"ООО Ромашка (ИНН 1234567890)"
КонецЕсли;
Для документов можно получить дату и номер:
Сообщить("Документ:" + МояСсылка.Дата +", №" + МояСсылка.Номер);