Многие разработчики при написании запросов к временным таблицам сталкиваются с ситуацией, когда использование ПОЛНОГО СОЕДИНЕНИЯ дает неожиданные результаты. Казалось бы, данные должны объединиться, но в итоге мы видим «пропавшие» записи или пустые строки там, где ожидались цифры. Давайте вместе разберем, почему это происходит и как правильно обрабатывать результаты соединения.
Основная причина «пропадания» данных кроется в том, как 1С работает с NULL. При использовании ПОЛНОГО СОЕДИНЕНИЯ база данных пытается сопоставить записи из двух таблиц по заданному условию. Если для записи из первой таблицы не находится соответствия во второй (и наоборот), в поля «недостающей» части подставляется значение NULL.
Проблема возникает, когда мы пытаемся обращаться к этому полю как к полноценному объекту или использовать его в условиях группировки. В примере, который мы рассматриваем, автор пытался вывести партнера, но так как партнер мог отсутствовать в одной из сторон соединения, результирующее поле содержало NULL, из-за чего логика вывода нарушалась.
Чтобы гарантированно получить корректный результат при соединении, нам необходимо научиться «склеивать» поля соединения, чтобы в итоговой выборке не оставалось неопределенных значений. Рассмотрим, как это сделать правильно.
ЕСТЬNULL для поля связи: Это ключевой момент. Вместо того чтобы просто выбирать поле из одной таблицы, мы должны проверить, заполнено ли оно. Если оно равно NULL, мы подставляем значение из другой таблицы.СправочникСсылка.Партнеры, а в другой — СправочникСсылка.Контрагенты, соединение не сработает, даже если значения выглядят одинаково.ЕСТЬNULL, чтобы вместо пустого значения получить ноль.Рассмотрим, как должен выглядеть финальный запрос, чтобы избежать ошибок и получить все данные:
ВЫБРАТЬ
ЕСТЬNULL(РасчетыСКлиентами.Партнер, ЗаказыКлиентов.Партнер) КАК Партнер,
ЕСТЬNULL(РасчетыСКлиентами.НачальныйОстаток, 0) КАК НачальныйОстаток,
ЕСТЬNULL(РасчетыСКлиентами.Приход, 0) КАК Приход,
ЕСТЬNULL(РасчетыСКлиентами.Расход, 0) КАК Расход,
ЕСТЬNULL(РасчетыСКлиентами.КонечныйОстаток, 0) КАК КонечныйОстаток,
ЕСТЬNULL(ЗаказыКлиентов.СуммаЗаказов, 0) КАК СуммаЗаказов
ИЗ
РасчетыСКлиентами КАК РасчетыСКлиентами
ПОЛНОЕ СОЕДИНЕНИЕ ЗаказыКлиентов КАК ЗаказыКлиентов
ПО РасчетыСКлиентами.Партнер = ЗаказыКлиентов.Партнер
Когда вы используете конструкцию ЕСТЬNULL(Таблица1.Партнер, Таблица2.Партнер), вы сообщаете системе: «Возьми значение из первой таблицы, если оно есть. Если же там пустота — возьми значение из второй таблицы». Это превращает «дырявые» данные, полученные при ПОЛНОМ СОЕДИНЕНИИ, в чистую и понятную таблицу, пригодную для дальнейшего вывода в отчет.
При работе с большими объемами данных в конфигурациях уровня 1С:Управление торговлей или 1С:ERP, помните о следующем:
ПОЛНОЕ СОЕДИНЕНИЕ может быть ресурсоемким. Если вы видите, что запрос выполняется медленно, попробуйте переписать его через ОБЪЕДИНИТЬ ВСЕ, если это возможно в рамках вашей задачи.ГДЕ Поле = NULL. Всегда используйте ГДЕ Поле ЕСТЬ NULL или ГДЕ Поле ЕСТЬ НЕ NULL, если вам нужно отфильтровать записи по наличию или отсутствию значений.Работая сообща с этими инструментами, вы сможете избежать стандартных ловушек и создавать надежные, быстрые отчеты, которые будут отображать данные именно так, как вы задумали!