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

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

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

Фундаментальные понятия: Пустая ссылка и Неопределено

Прежде чем писать код, необходимо четко разграничить два состояния, которые часто путают новички. В системе типов существует значение Неопределено (Undefined), которое означает отсутствие какого-либо значения вообще. Это не ноль, не пустая строка и не пустая ссылка.

С другой стороны, существует понятие Пустая ссылка. Это специальное значение для типов данных "Ссылка", которое указывает на то, что переменная имеет тип ссылки, но не указывает ни на какой конкретный объект в базе данных. Технически это значение типа СправочникСсылка.Номенклатура, у которого внутренний идентификатор (UUID) равен нулю.

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

Различие критично при сериализации данных или работе с внешними источниками. Если вы получаете данные из JSON или XML, поле может прийти как null (что соответствует Неопределено), а не как пустая ссылка конкретного типа. Неправильная обработка такой ситуации вызовет исключение "Неверный тип значения".

💡

Используйте функцию ТипЗнч() для быстрой диагностики: если тип значения Неопределено, то это не пустая ссылка, а отсутствие значения.

Проверка в объектном режиме (Код 1С)

Наиболее частый сценарий — проверка переменной непосредственно в коде модуля. Здесь важно использовать правильный синтаксис, чтобы избежать ошибок приведения типов. Самый надежный и рекомендуемый платформой способ — использование встроенной функции ЗначениеЗаполнено.

Эта функция универсальна: она возвращает Истина, если значение не является пустым. Для ссылок "непустым" считается любая ссылка на существующий элемент или документ. Для строк — не пустая строка, для чисел — не ноль. Однако, для ссылок часто требуется более явная проверка.

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

Сообщить("Номенклатура не выбрана!");

Возврат;

КонецЕсли;

Альтернативный метод — явное сравнение с пустой ссылкой конкретного типа. Этот подход более громоздкий, но иногда необходим, когда нужно гарантировать, что переменная содержит именно ссылку определенного типа, даже если она пустая.

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

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

📊 Как вы чаще всего проверяете заполненность полей?
Через ЗначениеЗаполнено
Сравнением с ПустаяСсылка
Через ЕСТЬ NULL в запросе
Интуитивно

Особенности работы в Запросах

Язык запросов работает иначе, чем встроенный язык. Здесь нет понятия "объект в памяти", есть выборка строк из таблицы. Для проверки ссылки на пустоту в запросе используется конструкция ЕСТЬ NULL. Это аналог проверки на пустую ссылку или неопределенное значение в контексте базы данных.

Синтаксис предельно прост: вы указываете поле и условие ЕСТЬ NULL или НЕ ЕСТЬ NULL. Это позволяет фильтровать записи на уровне СУБД, что значительно производительнее, чем выгружать все данные и проверять их в цикле на клиенте или сервере.

ВЫБРАТЬ

РеализацияТоваровУслуг.Ссылка КАК Ссылка,

РеализацияТоваровУслуг.Контрагент КАК Контрагент

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ГДЕ

РеализацияТоваровУслуг.Контрагент ЕСТЬ NULL

Важно понимать разницу между ЕСТЬ NULL и сравнением с пустой ссылкой в тексте запроса. В большинстве случаев СУБД хранит пустые ссылки как NULL-значения в соответствующих колонках. Поэтому конструкция ЕСТЬ NULL является наиболее корректной и оптимизированной.

⚠️ Внимание: В запросах нельзя использовать функцию ЗначениеЗаполнено. Попытка вызвать её в тексте запроса приведет к ошибке синтаксиса. Используйте только операторы языка запросов.

Если вам нужно отобрать записи, где ссылка заполнена, используйте инверсию: НЕ ЕСТЬ NULL. Это стандартная практика при формировании выборок для отчетов, где отсутствие контрагента или номенклатуры делает строку бессмысленной.

Сравнение производительности методов

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

Функция ЗначениеЗаполнено является встроенной оптимизированной функцией платформы. Она работает быстрее всего, так как реализована на уровне ядра. Ручное сравнение с пустой ссылкой требует создания временного объекта пустой ссылки (хотя платформа может кэшировать это), что добавляет микро-накладные расходы.

Метод проверки Контекст использования Производительность Читаемость
ЗначениеЗаполнено() Код 1С (сервер/клиент) Высокая Отличная
ЕСТЬ NULL Язык запросов Максимальная (на уровне СУБД) Хорошая
= ПустаяСсылка() Код 1С (строгая типизация) Средняя Низкая
= Неопределено Проверка отсутствия значения Высокая Средняя
💡

В циклах по большим выборкам всегда отдавайте предпочтение фильтрации на уровне запроса (ЕСТЬ NULL), а не проверке в цикле кода 1С.

Использование ТипЗнч внутри циклов для проверки ссылок считается дурным тоном и сильно замедляет работу. Эта функция предназначена для отладки и динамического определения типов, а не для бизнес-логики в "горячих" участках кода.

Типичные ошибки разработчиков

Даже опытные специалисты иногда допускают ошибки при работе со ссылками. Одна из самых распространенных — попытка присвоить Неопределено в поле типа "Ссылка" без явного приведения, или наоборот, ожидание Неопределено там, где система подставляет пустую ссылку.

Например, при чтении данных из регистра сведений, если измерение не заполнено, в объектном режиме вы получите пустую ссылку соответствующего типа, а не Неопределено. Если ваш код рассчитывает на Неопределено, логика проверки Если Значение = Неопределено не сработает.

  • 🔸 Игнорирование проверки перед обращением к реквизитам объекта.
  • 🔸 Использование магических чисел или строк вместо констант пустых ссылок.
  • 🔸 Попытка записать Null из внешнего источника напрямую в поле Ссылка без обработки.

Еще одна частая проблема возникает при работе с динамическими списками и формами. Если пользователь очистил поле выбора, оно может стать пустой ссылкой. При записи такого объекта в базу данных нужно убедиться, что бизнес-логика разрешает хранение записей с пустыми ссылками в конкретных измерениях.

Почему возникает ошибка "Поле не обнаружено"?

Часто это случается, когда вы пытаетесь обратиться к реквизиту через точку (Ссылка.Реквизит), но переменная Ссылка содержит Неопределено, а не объект. Платформа не может найти реквизит у несуществующего объекта.

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

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

Здесь функция ЗначениеЗаполнено снова выступает спасителем, так как она корректно обрабатывает любые типы. Однако, если вам нужно убедиться, что внутри переменной лежит именно ссылка (пусть и пустая), потребуется комбинация проверок.

Сначала проверяем тип, затем заполненность. Это гарантирует, что мы не перепутаем пустую строку и пустую ссылку, что может быть критично для логики проведения документов.

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

Если Не ЗначениеЗаполнено(МояПеременная) Тогда

// Это пустая ссылка на номенклатуру

ОбрабатыватьПустуюСсылку();

КонецЕсли;

КонецЕсли;

⚠️ Внимание: Интерфейсы и правила обмена данными могут меняться в новых версиях платформы. Всегда сверяйте поведение сериализации XDTO или JSON в документации к вашей версии 1С:Предприятие перед внедрением в продуктивную среду.

При обмене данными с внешними системами через HTTP-сервисы часто приходит ситуация, когда ожидаемая ссылка отсутствует. В этом случае лучше явно приводить входящие данные к типу ссылки, используя конструкторы типов, чтобы избежать разночтений в дальнейшем.

☑️ Аудит кода проверки ссылок

Выполнено: 0 / 4

Часто задаваемые вопросы (FAQ)

В чем разница между ПустаяСсылка() и Неопределено?

ПустаяСсылка() — это значение конкретного типа ссылки (например, СправочникСсылка), которое не указывает на объект, но имеет тип. Неопределено — это отсутствие значения любого типа. Пустая ссылка имеет тип, Неопределено — нет.

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

Да, в полях таблиц ИБ пустые ссылки хранятся как NULL. Однако, если на поле стоит ограничение целостности (запрет записи пустых ссылок), попытка записи вызовет ошибку транзакции.

Почему ЗначениеЗаполнено возвращает Ложь для числа 0?

Потому что для числовых типов ноль считается "пустым" или "незначимым" значением по логике платформы. Для ссылок "пустым" является ссылка с нулевым UUID.

Как проверить ссылку в СКД (Система Компоновки Данных)?

В настройках отчета СКД используйте условие группировки или отбора: ИмяПоля ЕСТЬ NULL или ИмяПоля НЕ ЕСТЬ NULL. Синтаксис аналогичен обычным запросам.

Что будет, если сравнить Ссылку и Строку?

При строгом контроле типов это вызовет ошибку. При слабом контроле сравнение вернет Ложь, так как типы несовместимы. Всегда приводите типы перед сравнением.