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