6. Объектная модель прикладного решения
#35

Готовишься к экзамену?

Полнофункциональный тренажер @bot_1cnik_bot с полноценным обучением, режимом экзамена и подробной статистикой.

Перейти в бота

При выполнении внешнего соединения (LEFT/RIGHT/FULL JOIN) в запросе 1С: что будет записано в полях присоединенной таблицы, если по условию соединения подходящая строка не нашлась?

Будет подставлен 0 (ноль).
Неправильно: Ноль - это обычное числовое значение и может быть корректным результатом только если данные действительно равны 0. При внешнем соединении отсутствие строки в присоединяемом источнике обозначается специальным значением отсутствия данных, а не «подстановкой нуля».
В полях будет значение NULL.
Правильно: При внешнем соединении строки из основной таблицы попадают в результат даже без пары, а поля, которые должны были прийти из присоединенной таблицы, получают значение NULL. NULL в языке запросов 1С используется именно для обозначения отсутствующего значения в выборке.
Будет значение «Неопределено».
Неправильно: «Неопределено» - это значение языка 1С (BSP/BSL), которое обычно встречается в вычислениях, параметрах и переменных, но не является тем, чем заполняются поля при внешних соединениях в запросе. В результате запроса для таких ситуаций применяется именно NULL.
Будет «Пустая ссылка» (например, Справочник.Партнеры.ПустаяСсылка()).
Неправильно: Пустая ссылка - это валидное значение ссылочного типа, означающее «не выбран элемент справочника/документа», но это не то же самое, что отсутствие строки при соединении. При внешнем соединении платформа возвращает NULL, а пустую ссылку можно получить только если вы явно замените NULL (например, через ЕСТЬNULL()).

Пояснение

Во внешних соединениях (левое/правое/полное) запрос 1С сохраняет строки «ведущей» части результата даже тогда, когда во второй таблице не нашлось соответствия по условию JOIN. Чтобы явно показать, что данных из присоединенного источника нет, платформа заполняет поля, получаемые из этой присоединенной таблицы, значением NULL. Практический пример (левое внешнее соединение): вы выбираете список заказов и присоединяете к ним оплату. Заказы без оплаты всё равно попадут в выборку, но реквизиты оплаты (дата, сумма, документ оплаты) будут NULL. Важные нюансы и лучшие практики: 1) NULL - не «0», не пустая строка и не пустая ссылка. Это отдельное значение «нет данных», которое появляется в результатах запросов, особенно при внешних соединениях. 2) Любые выражения с NULL часто дают NULL-результат. Например, если вы вычисляете СуммаОплаты + 10, а СуммаОплаты = NULL, то итог также может стать NULL. Поэтому при расчетах лучше заранее подставлять значение по умолчанию. 3) Для корректной обработки используйте: • проверку «ЕСТЬ NULL» (например, Поле ЕСТЬ NULL), чтобы отфильтровать строки без соответствия; • функцию ЕСТЬNULL(Поле, ЗначениеПоУмолчанию), чтобы заменить NULL на безопасное значение (0 для чисел, "" для строк, ПустаяСсылка() для ссылок). Мини-сценарии: • Нужно вывести «0» вместо пустой суммы - используйте ЕСТЬNULL(Сумма, 0). • Нужно выбрать строки, где нет связанной записи - добавьте условие: ПрисоединеннаяТаблица.Ссылка ЕСТЬ NULL. • Нужно получить пустую ссылку вместо NULL - используйте ЕСТЬNULL(ПрисоединеннаяТаблица.Ссылка, Справочник.Номенклатура.ПустаяСсылка()). Итог: отсутствие соответствия при внешнем соединении в результате запроса обозначается NULL, а любые «подстановки» (0, пустая ссылка и т.п.) делаются только явными выражениями в запросе.