Как в 1С8 запросе установить значение поля, если значения в поле нет
Работая с запросами в 1С:Предприятие 8, часто приходится обрабатывать пустые значения полей. В этой статье мы системно разберем, как корректно определить тип пустого значения (NULL или Неопределено), чем они отличаются, и какие конструкции применять в запросах 1С для безопасной замены на значения по умолчанию. Приведены примеры для разных версий платформы, пошаговые инструкции, чек-лист оптимизации и ответы на частые вопросы.
Ключевые моменты
- NULL — значение на уровне SQL (обычно при LEFT/FULL JOIN, когда нет соответствия).
- Неопределено — тип данных платформы 1С (возникает в ряде виртуальных таблиц/регистров).
- Для NULL используйте ЕСТЬNULL() или проверку «ЕСТЬ NULL»; для Неопределено — «ВЫБОР КОГДА … = Неопределено».
- Сначала диагностируйте тип «пустоты» через Консоль запросов, затем выбирайте оптимальную конструкцию.
Диагностика: NULL или Неопределено
Перед заменой значений определите, что именно возвращает ваше выражение:
- Виртуальные таблицы регистров — чаще возвращают Неопределено.
- Соединения таблиц (LEFT/FULL JOIN) — чаще возвращают NULL.
- При сомнении используйте Консоль запросов, отобразите проблемное поле и посмотрите фактическое значение.
Проверенные конструкции
1) Замена Неопределено
```1c
ВЫБОР
КОГДА СвободныеОстаткиОстатки.ВНаличииОстаток = Неопределено
ТОГДА 0
ИНАЧЕ СвободныеОстаткиОстатки.ВНаличииОстаток
КОНЕЦ КАК Остаток
```
Подходит для виртуальных таблиц/регистров. Совместимо с 8.0+.
2) Проверка NULL через «ЕСТЬ NULL»
```1c
ВЫБОР
КОГДА СвободныеОстаткиОстатки.ВНаличииОстаток ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ СвободныеОстаткиОстатки.ВНаличииОстаток
КОНЕЦ КАК Остаток
```
Используйте при соединениях таблиц. Понятно и предсказуемо, особенно в старых версиях.
3) Функция ЕСТЬNULL()
```1c
ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) КАК Остаток
```
Коротко и быстро. Поддерживается обычно с 8.2.14+. Для NULL.
Универсальная конструкция (оба случая)
```1c
ВЫБОР
КОГДА Поле = Неопределено ИЛИ Поле ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Поле
КОНЕЦ КАК НормализованноеПоле
```
Пошаговая инструкция
- Шаг 1. Определите источник данных и вероятный тип пустого значения (по таблице выше).
- Шаг 2. Откройте Консоль запросов и выполните проблемный запрос на тестовой базе.
- Шаг 3. Убедитесь в типе «пустоты»: NULL или Неопределено.
- Шаг 4. Выберите подходящую конструкцию (ЕСТЬNULL/ЕСТЬ NULL/ВЫБОР КОГДА = Неопределено).
- Шаг 5. Протестируйте корректность результата на контрольных данных.
- Шаг 6. Замерьте производительность на объеме 100k+ строк, при необходимости оптимизируйте.
Примеры для разных версий платформы
1С 8.2 и выше
```1c
ВЫБОР
Номенклатура.Наименование,
ЕСТЬNULL(Остатки.Количество, 0) КАК КоличествоОстаток
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
ПО Номенклатура.Ссылка = Остатки.Номенклатура
```
1С 8.0–8.1 (устаревшие версии)
```1c
ВЫБОР
Номенклатура.Наименование,
ВЫБОР
КОГДА Остатки.Количество ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Остатки.Количество
КОНЕЦ КАК КоличествоОстаток
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
ПО Номенклатура.Ссылка = Остатки.Номенклатура
```
Чек-лист оптимизации
- [ ] Тип пустого значения определен (NULL/Неопределено)
- [ ] Выбран корректный способ проверки
- [ ] Написаны тесты/подборка контрольных данных
- [ ] Замерена производительность на большом объеме
- [ ] Обработаны граничные случаи (негативные значения, пропуски)
- [ ] Добавлены комментарии для сложных мест
- [ ] Соответствие стандартам предприятия проверено
Типичные ошибки и решения
- Путаница NULL и Неопределено — тестируйте в Консоли запросов.
- Использование ЕСТЬNULL() там, где его нет в версии платформы — для совместимости применяйте «ВЫБОР КОГДА … ЕСТЬ NULL».
- Неправильное значение по умолчанию (например, 0 вместо пустого значения) — учитывайте бизнес-логику и отчётность.
FAQ
Чем NULL отличается от Неопределено?
NULL — значение SQL при соединениях таблиц; Неопределено — платформенное значение 1С, характерное для виртуальных таблиц/регистров.
Что быстрее?
Для NULL — ЕСТЬNULL(), как правило, быстрее. Для Неопределено — прямое сравнение «= Неопределено».
Можно ли одной конструкцией закрыть оба случая?
Да, используйте проверку «Поле = Неопределено ИЛИ Поле ЕСТЬ NULL» и задайте значение по умолчанию.
Нужно ли всегда заменять пустые значения?
Нет. Иногда отсутствие данных имеет смысловую нагрузку — обсуждайте с аналитиками.
+ There are no comments
Add yours