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

Особенно актуальна эта тема для разработчиков, которые занимаются интеграцией систем, обменом данными или написанием сложных отчетов. Например, при экспорте данных в JSON или XML важно корректно обрабатывать ссылки, чтобы не потерять связность информации. Или при написании универсальных процедур, которые должны работать с разными типами данных — здесь проверка на ссылочность становится обязательной.

Мы рассмотрим не только стандартные методы вроде ТипЗнч(), но и менее очевидные приемы, включая работу с метаданными, рефлексией и даже анализом структуры хранения данных в базе. А в конце статьи вы найдете FAQ с ответами на самые частые вопросы по этой теме.

1. Что такое ссылочный тип в 1С и зачем его проверять

Ссылочный тип (Reference Type) в 1С:Предприятие — это особый вид данных, который представляет собой ссылку на объект метаданных, а не само значение. Например, когда вы получаете элемент справочника Номенклатура.НайтиПоНаименованию("Молоко"), результат будет не строкой "Молоко", а ссылкой на этот элемент. Это позволяет:

  • 🔗 Сохранять связность данных — при изменении наименования объекта ссылка останется валидной.
  • 📊 Работать с метаданными — через ссылку можно получить доступ к реквизитам, табличным частям и методам объекта.
  • 🔄 Обеспечивать целостность — система автоматически контролирует удаление ссылок (если не отключены соответствующие настройки).

Проверка ссылочного типа необходима в следующих случаях:

  1. При написании универсальных процедур, которые должны обрабатывать разные типы данных (например, рекурсивный обход структуры).
  2. При сериализации/десериализации данных (например, при обмене с внешними системами через JSON или XML).
  3. При отладке кода, когда нужно понять, почему функция возвращает неожиданный результат.
  4. При работе с динамическими списками или запросами, где типы полей могут варьироваться.
📊 Как часто вам приходится проверять типы данных в 1С?
Постоянно, это часть моей работы
Иногда, при отладке
Рядом, но не часто
Никогда не сталкивался

Важно понимать, что ссылочные типы не являются примитивными — их нельзя сравнивать напрямую со строками или числами. Например, код Если СсылкаНаДокумент = "Документ 123" Тогда... приведет к ошибке, потому что сравниваются несовместимые типы. Поэтому проверка типа становится критичной для корректной работы алгоритмов.

2. Способы проверки ссылочного типа в конфигураторе

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

2.1. Просмотр свойств в палитре свойств

Самый простой способ — посмотреть тип поля или переменной в палитре свойств:

  1. Выделите переменную, реквизит или параметр в модуле.
  2. Откройте палитру свойств (Alt+Enter).
  3. Найдите свойство Тип — если там указано что-то вроде СправочникСсылка.Номенклатура или ДокументСсылка.ЗаказПокупателя, это ссылочный тип.

Для полей запросов или динамических списков тип можно увидеть в колонке Тип данных при просмотре структуры результата (например, после выполнения запроса в отладчике).

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 для ссылочных типов, но можно:

  1. Создать пустую ссылку через Справочники.Номенклатура.ПустаяСсылка().
  2. Найти существующую ссылку по идентификатору или наименованию.
  3. Использовать механизм XDTO для динамического создания объектов (в последних версиях платформы).

Пример:

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

НоваяСсылка.Наименование = "Новый контрагент";

НоваяСсылка.Записать();

❓ Как проверить ссылочный тип в запросе 1С?

В языке запросов можно использовать функцию ТИП() или ТИПЗНАЧЕНИЯ():

ВЫБРАТЬ

ТИП(СсылкаНаДокумент) КАК ТипСсылки

ИЗ

Документ.ЗаказПокупателя КАК ЗаказПокупателя

Результат будет содержать строковое представление типа, аналогичное ТипЗнч().

❓ Что делать, если "ТипЗнч()" возвращает неожиданный тип?

Это может происходить по нескольким причинам:

  1. Неявное преобразование типов — платформа может автоматически конвертировать данные (например, строку в число).
  2. Ошибка в коде — возможно, переменная была переопределена ранее.
  3. Особенности конфигурации — некоторые объекты могут иметь нестандартные типы (например, в расширениях).

Рекомендации:

  • Используйте отладчик для пошагового анализа.
  • Проверяйте источник данных — откуда пришло значение.
  • Используйте Сообщить() для вывода промежуточных значений.