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