В процессе разработки и отладки программного кода в 1С разработчики нередко сталкиваются с ситуацией, когда один и тот же текст запроса с одинаковыми на первый взгляд параметрами возвращает разное количество строк или разные значения в отладчике (при выполнении кода) и в консоли запросов.
Рассмотрим подробнее причинно-следственные связи этой проблемы, разберем реальный случай из практики и выясним, на что обращать внимание при диагностике подобных расхождений.
Запрос в 1С всегда обращается к таблицам базы данных на сервере СУБД. Если запрос выполняется по ссылке документа или справочника (например, через условие ГДЕ ТаблицаТовары.Ссылка = &Ссылка), он считывает только те данные, которые фактически записаны и зафиксированы в базе.
Если в процессе обработки проведения или выполнения алгоритма в модуле объекта были изменены значения в табличной части (например, изменен реквизит ВариантОбеспечения или признак Отменено), но вызов метода Записать() еще не произошел или изменения не зафиксированы в базе, возникает следующее расхождение:
Проанализируем фрагмент запроса, используемый при формировании движений документа ЗаказКлиента:
Запрос.Текст = "";
Для Каждого ТекстЗапроса Из ТекстыЗапроса Цикл
Запрос.Текст = Запрос.Текст + ТекстЗапроса.Значение;
КонецЦикла;
Результат = Запрос.ВыполнитьПакет();
Для Каждого ТекстЗапроса Из ТекстыЗапроса Цикл
ИмяТаблицы = ТекстЗапроса.Представление;
Если Не ПустаяСтрока(ИмяТаблицы) Тогда
Индекс = ТекстыЗапроса.Индекс(ТекстЗапроса);
Таблицы.Вставить(ИмяТаблицы, Результат[Индекс].Выгрузить());
КонецЕсли;
КонецЦикла;
Рассмотрим отбор во вложенном запросе пакета, где проверяются условия по табличной части документа:
ГДЕ
ТаблицаТовары.Ссылка = &Ссылка
И (НЕ ТаблицаТовары.Отменено)
И ТаблицаТовары.ВариантОбеспечения В (
ЗНАЧЕНИЕ(Перечисление.ВариантыОбеспечения.Отгрузить),
ЗНАЧЕНИЕ(Перечисление.ВариантыОбеспечения.ОтгрузитьОбособленно)
)
И &Статус В (
ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОбеспечению),
ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОтгрузке),
ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.Закрыт)
)
В данном случае в консоли запросов значение реквизита ВариантОбеспечения в базе данных было установлено как Не обеспечивать, из-за чего строки отсекались фильтром. В то же время во время выполнения документа в отладчике реквизиты табличной части перед выполнением запроса программно пересчитывались и устанавливались в значение Отгрузить. Это и приводило к разнице в количестве итоговых строк.
Помимо несохраненных изменений в объекте, разберем другие факторы, которые могут вызывать расхождение результатов отладки и консоли запросов:
УстановленПривилегированныйРежим(), опускающего проверки RLS. В консоли запросов отбор по правам текущего пользователя продолжает действовать.Неопределено вместо пустой ссылки конкретного справочника (например, Справочники.Номенклатура.ПустаяСсылка()) или передача объекта Граница вместо типа Дата в виртуальные таблицы остатков.Запрос использует предварительно заполненный МенеджерВременныхТаблиц, выполнение отдельного фрагмента в консоли без наполнения временных таблиц даст пустой результат.Чтобы оперативно определить причину расхождений, рекомендуем соблюдать следующую последовательность действий:
ТипЗнч(&ИмяПараметра) непосредственно перед вызовом метода Запрос.Выполнить().ПередЗаписью или ОбработкаПроведения перед вызовом запросов.Запрос.МенеджерВременныхТаблиц.ПолучитьДанные("ИмяВременнойТаблицы").Выгрузить().УстановленПривилегированныйРежим() в точке выполнения запроса.