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