В системе 1С:Предприятие ссылочные типы данных играют ключевую роль — они позволяют работать с объектами конфигурации (справочниками, документами, планами видов характеристик) через ссылки, а не через значения. Однако не всегда очевидно, как именно определить, что перед вами именно ссылочный тип, а не примитивный (число, строка) или составной. Эта статья поможет разобраться в нюансах проверки ссылочных типов как в конфигураторе, так и во встроенном языке, а также избежать типичных ошибок при работе с ними.
Особенно актуальна эта тема для разработчиков, которые занимаются интеграцией систем, обменом данными или написанием сложных отчетов. Например, при экспорте данных в JSON или XML важно корректно обрабатывать ссылки, чтобы не потерять связность информации. Или при написании универсальных процедур, которые должны работать с разными типами данных — здесь проверка на ссылочность становится обязательной.
Мы рассмотрим не только стандартные методы вроде ТипЗнч(), но и менее очевидные приемы, включая работу с метаданными, рефлексией и даже анализом структуры хранения данных в базе. А в конце статьи вы найдете FAQ с ответами на самые частые вопросы по этой теме.
1. Что такое ссылочный тип в 1С и зачем его проверять
Ссылочный тип (Reference Type) в 1С:Предприятие — это особый вид данных, который представляет собой ссылку на объект метаданных, а не само значение. Например, когда вы получаете элемент справочника Номенклатура.НайтиПоНаименованию("Молоко"), результат будет не строкой "Молоко", а ссылкой на этот элемент. Это позволяет:
- 🔗 Сохранять связность данных — при изменении наименования объекта ссылка останется валидной.
- 📊 Работать с метаданными — через ссылку можно получить доступ к реквизитам, табличным частям и методам объекта.
- 🔄 Обеспечивать целостность — система автоматически контролирует удаление ссылок (если не отключены соответствующие настройки).
Проверка ссылочного типа необходима в следующих случаях:
- При написании универсальных процедур, которые должны обрабатывать разные типы данных (например, рекурсивный обход структуры).
- При сериализации/десериализации данных (например, при обмене с внешними системами через JSON или XML).
- При отладке кода, когда нужно понять, почему функция возвращает неожиданный результат.
- При работе с динамическими списками или запросами, где типы полей могут варьироваться.
Важно понимать, что ссылочные типы не являются примитивными — их нельзя сравнивать напрямую со строками или числами. Например, код Если СсылкаНаДокумент = "Документ 123" Тогда... приведет к ошибке, потому что сравниваются несовместимые типы. Поэтому проверка типа становится критичной для корректной работы алгоритмов.
2. Способы проверки ссылочного типа в конфигураторе
Если вам нужно определить, является ли поле или переменная ссылочным типом на этапе разработки (в конфигураторе), можно использовать несколько подходов. Рассмотрим их подробно.
2.1. Просмотр свойств в палитре свойств
Самый простой способ — посмотреть тип поля или переменной в палитре свойств:
- Выделите переменную, реквизит или параметр в модуле.
- Откройте палитру свойств (
Alt+Enter). - Найдите свойство
Тип— если там указано что-то вродеСправочникСсылка.НоменклатураилиДокументСсылка.ЗаказПокупателя, это ссылочный тип.
Для полей запросов или динамических списков тип можно увидеть в колонке Тип данных при просмотре структуры результата (например, после выполнения запроса в отладчике).
2.2. Использование функции "ТипЗнч()" в отладчике
Если вы работаете в режиме отладки, можно быстро проверить тип значения с помощью функции ТипЗнч():
Сообщить(ТипЗнч(МояПеременная));
Для ссылочных типов результат будет выглядеть так:
СправочникСсылка.КонтрагентыДокументСсылка.РеализацияТоваровУслугПланВидовХарактеристикСсылка.Номенклатура
Если же переменная содержит значение (не ссылку), результат будет другим:
ЧислоСтрокаДата
Чтобы быстро вызвать отладчик и проверить тип, поставьте точку останова (F9) на нужной строке кода и запустите отладку (F5).
2.3. Анализ метаданных через "МетодМетаданных()"
Для более глубокого анализа (например, при работе с динамически создаваемыми объектами) можно использовать метод МетодМетаданных():
Метаданные = Метаданные.Справочники.Номенклатура;
Если Метаданные.ЭтоГруппа Тогда
// Это группа справочника (не ссылочный тип в привычном смысле)
Иначе
// Это элемент справочника (ссылочный тип)
КонецЕсли;
Этот подход полезен, когда нужно отличать группы справочников от элементов, так как группы не являются ссылочными типами в полном смысле (они не хранят данные, а только структурируют их).
3. Проверка ссылочного типа во встроенном языке (1С:Предприятие)
На этапе выполнения (в режиме 1С:Предприятие) проверка ссылочного типа осуществляется с помощью встроенных функций и операторов. Рассмотрим основные методы.
3.1. Функция "ТипЗнч()" — универсальный инструмент
Как и в конфигураторе, во встроенном языке можно использовать ТипЗнч(), но с некоторыми нюансами:
ТипПеременной = ТипЗнч(МояПеременная);
Если СтрНачинаетсяС(ТипПеременной, "СправочникСсылка.") Или
СтрНачинаетсяС(ТипПеременной, "ДокументСсылка.") Или
СтрНачинаетсяС(ТипПеременной, "ПланВидовХарактеристикСсылка.") Тогда
// Это ссылочный тип
КонецЕсли;
Этот метод работает для всех стандартных ссылочных типов, но не покрывает пользовательские типы (если они определены в конфигурации). Для них потребуется дополнительная проверка.
3.2. Оператор "Тип" — альтернатива для новых версий платформы
В последних версиях 1С:Предприятие 8.3
(начиная с 8.3.10) появился оператор Тип, который упрощает проверку:
Если Тип(МояПеременная) = Тип("СправочникСсылка.Контрагенты") Тогда
// Это ссылка на справочник "Контрагенты"
КонецЕсли;
Преимущества этого подхода:
- 🔍 Безопасность — нет риска опечаток в строковых сравнениях.
- 🚀 Производительность — оператор работает быстрее, чем анализ строки.
- 📌 Поддержка автодополнения — в конфигураторе подскажет доступные типы.
Как проверить тип в старых версиях платформы?
В версиях ниже 8.3.10 оператор "Тип" не поддерживается. Используйте функцию "ТипЗнч()" с анализом строки, как показано в разделе 3.1.
3.3. Проверка через методы объектов
Если переменная содержит ссылку на объект, можно воспользоваться его методами. Например, для справочников и документов доступны методы ЭтоГруппа() и Ссылка.Пустая():
Если МояПеременная.ЭтоГруппа() Тогда
// Это группа справочника (не ссылочный тип в полном смысле)
ИначеЕсли МояПеременная.Ссылка.Пустая() Тогда
// Это пустая ссылка
Иначе
// Это валидная ссылка на объект
КонецЕсли;
Этот способ полезен, когда нужно не только определить ссылочность, но и проверить состояние ссылки (пустая, группа, элемент).
3.4. Работа с динамическими типами (рефлексия)
Для сложных случаев, когда тип переменной заранее неизвестен (например, при обработке данных из внешнего источника), можно использовать рефлексию:
Попытка
Если МояПеременная.Ссылка.Метаданные() <> Неопределено Тогда
// Это ссылочный тип (имеет метод "Ссылка")
Иначе
// Это не ссылочный тип
КонецЕсли;
Исключение
// Обработка ошибки, если переменная не поддерживает метод "Ссылка"
КонецПопытки;
Этот метод требует осторожности, так как может вызывать исключения, если переменная не является объектом 1С. Всегда оборачивайте такой код в Попытка...Исключение.
Использовать ТипЗнч() для универсальной проверки|Применить оператор Тип в новых версиях платформы|Проверить методы объекта (ЭтоГруппа(), Ссылка.Пустая())|Использовать рефлексию для динамических типов-->
4. Типичные ошибки при проверке ссылочных типов
Даже опытные разработчики иногда допускают ошибки при работе со ссылочными типами. Рассмотрим наиболее распространенные из них и способы их избежать.
4.1. Путаница между ссылкой и значением
Частая ошибка — попытка сравнить ссылку с примитивным значением:
// НЕПРАВИЛЬНО!
Если СсылкаНаДокумент = "Документ №123" Тогда
// Ошибка: нельзя сравнивать ссылку со строкой
КонецЕсли;
Правильный вариант:
Если СсылкаНаДокумент.Наименование = "Документ №123" Тогда
// Сравниваем свойство ссылки (Наименование) со строкой
КонецЕсли;
4.2. Игнорирование пустых ссылок
Если не проверить ссылку на Пустая(), можно получить ошибку при попытке доступа к ее свойствам:
// ОПАСНО!
Наименование = СсылкаНаДокумент.Наименование; // Вызовет ошибку, если ссылка пустая
// ПРАВИЛЬНО
Если НЕ СсылкаНаДокумент.Пустая() Тогда
Наименование = СсылкаНаДокумент.Наименование;
КонецЕсли;
4.3. Неучет групп справочников
Группы справочников не являются ссылочными типами в полном смысле — они не хранят данные, а только структурируют их. Если не учесть это, можно получить неожиданное поведение:
Если ТипЗнч(МояПеременная) = "СправочникСсылка.Номенклатура" Тогда
// Это может быть как элемент, так и группа!
Если МояПеременная.ЭтоГруппа() Тогда
// Обработка группы
Иначе
// Обработка элемента
КонецЕсли;
КонецЕсли;
4.4. Ошибки при работе с динамическими типами
При динамическом создании объектов (например, через Новый) легко забыть проверить тип:
Объект = Новый ДокументОбъект.ЗаказПокупателя;
Если ТипЗнч(Объект) = "ДокументОбъект.ЗаказПокупателя" Тогда
// Это объект документа, а не ссылка!
КонецЕсли;
Объект документа (ДокументОбъект) и ссылка на документ (ДокументСсылка) — это разные типы! Не путайте их.
Всегда проверяйте не только ссылочность типа, но и его "пустоту" (Пустая()), а также различайте объекты и ссылки на них.
5. Практические примеры проверки ссылочных типов
Рассмотрим несколько реальных сценариев, где проверка ссылочного типа критически важна.
5.1. Универсальная функция обработки данных
Допустим, у вас есть функция, которая должна обрабатывать разные типы данных — и ссылочные, и примитивные:
Функция ОбработатьДанные(Значение)
ТипДанных = ТипЗнч(Значение);
Если СтрНачинаетсяС(ТипДанных, "СправочникСсылка.") Тогда
Возврат "Это ссылка на справочник: " + Значение.Наименование;
ИначеЕсли СтрНачинаетсяС(ТипДанных, "ДокументСсылка.") Тогда
Возврат "Это ссылка на документ: " + Значение.Номер;
ИначеЕсли ТипДанных = "Число" Тогда
Возврат "Это число: " + Значение;
Иначе
Возврат "Неопознанный тип: " + ТипДанных;
КонецЕсли;
КонецФункции
5.2. Экспорт данных в JSON с учетом ссылок
При экспорте в JSON ссылки нужно преобразовывать в читаемый формат (например, в строку с UID или наименованием):
Функция СсылкаВJSON(Ссылка)
Если НЕ Ссылка.Пустая() Тогда
Возврат JSONЗначение(Ссылка.УникальныйИдентификатор());
Иначе
Возврат JSONЗначение(Неопределено);
КонецЕсли;
КонецФункции
5.3. Проверка параметров функции
Если функция принимает параметры разного типа, их нужно валидировать:
Процедура ЗагрузитьДанные(Источник)
Если Тип(Источник) <> Тип("СправочникСсылка.Контрагенты") И
Тип(Источник) <> Тип("ДокументСсылка.ЗаказПокупателя") Тогда
ВызватьИсключение "Неверный тип параметра 'Источник'!";
КонецЕсли;
// Далее работаем со ссылочным типом
КонецПроцедуры
6. Таблица сравнения методов проверки
Ниже представлена сравнительная таблица методов проверки ссылочных типов с указанием их особенностей:
| Метод | Применимость | Преимущества | Недостатки | Пример |
|---|---|---|---|---|
ТипЗнч() |
Все версии платформы | Универсален, работает везде | Требует анализа строки, медленнее | ТипЗнч(Переменная) |
Оператор Тип |
1С 8.3.10 и выше | Быстрее, поддерживает автодополнение | Не работает в старых версиях | Тип(Переменная) |
Методы объекта (ЭтоГруппа(), Пустая()) |
Для ссылочных типов | Позволяет проверять состояние ссылки | Не работает с примитивными типами | Переменная.Пустая() |
Рефлексия (Метаданные()) |
Для динамических типов | Гибкость, работает с неизвестными типами | Сложнее в реализации, риск исключений | Переменная.Ссылка.Метаданные() |
| Палитра свойств (конфигуратор) | На этапе разработки | Визуально, не требует кода | Только для статического анализа | Просмотр в Alt+Enter |
Выбор метода зависит от контекста:
- 🛠️ Для отладки удобнее
ТипЗнч()или палитра свойств. - ⚡ Для производительности в новых версиях лучше оператор
Тип. - 🔄 Для динамических типов подходит рефлексия.
7. Особенности работы со ссылочными типами в разных версиях 1С
Поведение ссылочных типов может отличаться в зависимости от версии платформы 1С:Предприятие. Рассмотрим ключевые различия.
7.1. 1С:Предприятие 8.2
В версии 8.2:
- Отсутствует оператор
Тип— только функцияТипЗнч(). - Меньше встроенных методов для работы с метаданными.
- Ссылочные типы менее строго типизированы, что может приводить к неявным преобразованиям.
7.2. 1С:Предприятие 8.3 (до 8.3.10)
В ранних версиях 8.3:
- Появилась лучшая поддержка управляемых форм, но механизмы работы со ссылками остались прежними.
- Добавлены новые методы для проверки ссылок (например,
Ссылка.Полная()). - Улучшена работа с пустыми ссылками.
7.3. 1С:Предприятие 8.3.10 и выше
В актуальных версиях:
- 🆕 Появился оператор
Тип, упрощающий проверки. - 🔧 Улучшена работа с динамическими типами (например, через
Новый Структура()). - 📈 Оптимизирована производительность операций со ссылками.
- 🔒 Ужесточена типизация — меньше неявных преобразований.
Если вы поддерживаете старые конфигурации, используйте функцию "ТипЗнч()" для совместимости. В новых проектах предпочтительнее оператор "Тип".
7.4. Особенности в "1С:Предприятие 8.3.20" и выше
В последних обновлениях платформы:
- Добавлена поддержка nullable-ссылок (явно помеченных как допускающих
Неопределено). - Улучшена работа с внешними источниками данных (веб-сервисы, HTTP-сервисы).
- Появились новые методы для проверки целостности ссылок (например,
Ссылка.Существует()).
Если вы работаете с последними версиями, рекомендуется использовать новые возможности платформы для более надежной и безопасной работы со ссылками.
8. FAQ: Ответы на частые вопросы
❓ Как отличить ссылочный тип от объекта (например, ДокументОбъект от ДокументСсылка)?
Ссылочный тип (например, ДокументСсылка.ЗаказПокупателя) — это ссылка на объект, а объект (ДокументОбъект.ЗаказПокупателя) — это экземпляр документа с методами и свойствами. Чтобы их отличить:
Если ТипЗнч(МояПеременная) = "ДокументСсылка.ЗаказПокупателя" Тогда
// Это ссылка
ИначеЕсли ТипЗнч(МояПеременная) = "ДокументОбъект.ЗаказПокупателя" Тогда
// Это объект
КонецЕсли;
Также можно использовать метод ЭтоОбъект() (если он поддерживается в вашей версии платформы).
❓ Почему функция "ТипЗнч()" возвращает "Неопределено" для пустой ссылки?
Это особенность платформы: пустая ссылка не имеет типа в привычном смысле. Чтобы корректно обработать такой случай, сначала проверяйте ссылку на пустоту:
Если МояПеременная = Неопределено Или МояПеременная.Пустая() Тогда
// Ссылка пустая или не определена
Иначе
ТипДанных = ТипЗнч(МояПеременная);
КонецЕсли;
❓ Можно ли создать ссылочный тип динамически (в runtime)?
Да, но с оговорками. В 1С:Предприятие нет прямого аналога new для ссылочных типов, но можно:
- Создать пустую ссылку через
Справочники.Номенклатура.ПустаяСсылка(). - Найти существующую ссылку по идентификатору или наименованию.
- Использовать механизм XDTO для динамического создания объектов (в последних версиях платформы).
Пример:
НоваяСсылка = Справочники.Контрагенты.СоздатьЭлемент();
НоваяСсылка.Наименование = "Новый контрагент";
НоваяСсылка.Записать();
❓ Как проверить ссылочный тип в запросе 1С?
В языке запросов 1С можно использовать функцию ТИП() или ТИПЗНАЧЕНИЯ():
ВЫБРАТЬ
ТИП(СсылкаНаДокумент) КАК ТипСсылки
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
Результат будет содержать строковое представление типа, аналогичное ТипЗнч().
❓ Что делать, если "ТипЗнч()" возвращает неожиданный тип?
Это может происходить по нескольким причинам:
- Неявное преобразование типов — платформа может автоматически конвертировать данные (например, строку в число).
- Ошибка в коде — возможно, переменная была переопределена ранее.
- Особенности конфигурации — некоторые объекты могут иметь нестандартные типы (например, в расширениях).
Рекомендации:
- Используйте отладчик для пошагового анализа.
- Проверяйте источник данных — откуда пришло значение.
- Используйте
Сообщить()для вывода промежуточных значений.