При разработке отчетов и обработок в 1С часто возникает ситуация, когда запросы по отдельности отрабатывают корректно и возвращают данные, но при объединении их в пакет с использованием временных таблиц результат оказывается пустым. Разберем подобную ситуацию на реальном примере, проанализируем частые ошибки разработчиков и выясним, почему консоль и конструктор запросов могут не сообщать об ошибке.
Рассмотрим пакетный запрос, в котором мы сначала получаем штрихкоды номенклатуры в разрезе определенной единицы измерения и помещаем их во временную таблицу, а затем пытаемся соединить эту таблицу со справочником номенклатуры.
ВЫБРАТЬ
РСШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод,
РСШтрихкодыНоменклатуры.Номенклатура КАК НоменклатураШтрихкодСсылка
ПОМЕСТИТЬ РСШтрихкоды
ИЗ
РегистрСведений.ШтрихкодыНоменклатуры КАК РСШтрихкодыНоменклатуры
ГДЕ
РСШтрихкодыНоменклатуры.ЕдиницаИзмерения.ЕдиницаИзмеренияПоКлассификатору = &ЕдиницаИзмеренияШтука
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СпрНоменклатура.Ссылка КАК НоменклатураСсылка,
РСШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ПОЛНОЕ СОЕДИНЕНИЕ РСШтрихкодыНоменклатуры КАК РСШтрихкодыНоменклатуры
ПО СпрНоменклатура.Ссылка = РСШтрихкодыНоменклатуры.НоменклатураШтрихкодСсылка
На первый взгляд логика ясна: мы создали временную таблицу РСШтрихкоды, а потом должны присоединить ее к справочнику. Однако при выполнении запроса записи не выводятся. Выясним причину.
Присмотримся к тексту второго запроса пакета. Мы поместили данные во временную таблицу под именем РСШтрихкоды. Но в секции ИЗ второго запроса мы выполняем соединение не с созданной временной таблицей, а с физическим регистром сведений РСШтрихкодыНоменклатуры!
Правильный синтаксис второго пакета должен был выглядеть так:
ВЫБРАТЬ
СпрНоменклатура.Ссылка КАК НоменклатураСсылка,
ТаблицаШтрихкоды.Штрихкод КАК Штрихкод
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РСШтрихкоды КАК ТаблицаШтрихкоды
ПО СпрНоменклатура.Ссылка = ТаблицаШтрихкоды.НоменклатураШтрихкодСсылка
Из-за опечатки платформа пыталась соединить справочник с реальным регистром напрямую, ожидая поле НоменклатураШтрихкодСсылка, которого в реальном регистре нет (там поле называется просто Номенклатура). Но почему тогда система не выдала синтаксическую ошибку еще на этапе написания?
Одной из главных загадок для разработчика в таких случаях является отсутствие сообщения об ошибке в Конструкторе запросов. Рассмотрим причины такого поведения:
РегистрСведений.ШтрихкодыНоменклатуры, Конструктор видит обращение к физической таблице и пропускает его. Ошибка проявится только на этапе выполнения, когда механизм базы данных не найдет нужных полей или корректной структуры.Разберем дополнительные нюансы, которые часто приводят к проблемам при работе с временными таблицами.
1. Отсутствие индексов во временной таблице
В исходном примере временная таблица создается без индексов. При малом количестве строк это незаметно. Однако, если штрихкодов тысячи, соединение без индекса вызовет серьезное замедление работы сервера. Рекомендуем всегда использовать предложение ИНДЕКСИРОВАТЬ ПО для полей, по которым в дальнейшем будет происходить соединение:
ПОМЕСТИТЬ РСШтрихкоды
...
ИНДЕКСИРОВАТЬ ПО НоменклатураШтрихкодСсылка
2. Жизненный цикл Менеджера временных таблиц (МВТ)
При тестировании запросов в консолях важно помнить о работе объекта МенеджерВременныхТаблиц. Некоторые консоли не очищают МВТ между запусками. Вы можете изменить логику первого пакета, но второй пакет продолжит брать данные из кэшированной старой таблицы. В программном коде также всегда следите за созданием и уничтожением таблиц, чтобы избежать конфликта имен.
3. Использование "ПОЛНОЕ СОЕДИНЕНИЕ" вместо "ЛЕВОЕ СОЕДИНЕНИЕ"
В коде автора используется ПОЛНОЕ СОЕДИНЕНИЕ. В контексте платформы 1С это означает, что в итоговую выборку попадет абсолютно вся номенклатура (даже без штрихкодов) и абсолютно все штрихкоды (даже если у них по какой-то причине нет номенклатуры - "битые ссылки"). Если ваша задача — просто вывести номенклатуру и связанные с ней штрихкоды, гораздо эффективнее и быстрее использовать ЛЕВОЕ СОЕДИНЕНИЕ от справочника номенклатуры к таблице штрихкодов.
4. Влияние параметров запроса
В условии используется параметр &ЕдиницаИзмеренияШтука. Если в консоли этот параметр не заполнен или передан некорректный тип, первая таблица (РСШтрихкоды) будет создана, но останется пустой. Платформа 1С не считает запрос к пустой временной таблице ошибкой. Соединение просто вернет пустой результат для присоединенных колонок, из-за чего может показаться, что "запрос не срабатывает". Всегда проверяйте заполненность параметров перед отладкой.
Если вы столкнулись с подобной проблемой и не можете понять, на каком этапе теряются данные, применим следующие шаги:
ПОМЕСТИТЬ), чтобы визуально убедиться, что отбор работает и данные есть.МенеджерВременныхТаблиц.Таблицы. Поместив эту конструкцию в табло отладчика, вы увидите реальный список всех сформированных таблиц в оперативной памяти сервера и их актуальные названия.Будьте внимательны при именовании таблиц и псевдонимов (алиасов) в пакетах. Правильное использование ЛЕВОЕ СОЕДИНЕНИЕ, обязательное индексирование и контроль имен гарантируют предсказуемый и быстрый результат выполнения ваших запросов.