При разработке внешних отчетов и обработок в платформе 1С 7.7 часто возникает ситуация, когда пользователь выбирает условия отбора на форме (например, указывает конкретный район или заказчика), но сгенерированный отчет выводит полные данные без учета выбранных значений. Разберем основные причины такого поведения и способы исправления алгоритма.
Проанализируем типичный случай, когда параметры с диалоговой формы отчета не передаются в выборку данных. Выясним ключевые ошибки, допускаемые при написании кода:
Район), но внутри процедур модуля выборка элементов справочника выполняется сплошным обходом через метод ВыбратьЭлементы(). В результате фильтрация по выбранным реквизитам просто не происходит.ODBCRecordset) разработчики часто вызывают метод УстановитьТекстовыйПараметр(), но забывают добавить соответствующую метку (например, :ОстМеньше) в секцию WHERE текста запроса. В итоге параметр передается «вникуда».(nolock) создаются лишние блокировки таблиц на время формирования отчета.Посмотрим на пример кода модуля формирования отчета, где допущены описанные выше ошибки:
СпрРайон = СоздатьОбъект("Справочник.Области");
СпрРайон.ПорядокКодов();
СпрРайон.ВыбратьЭлементы();
Пока СпрРайон.ПолучитьЭлемент() = 1 Цикл
// Выводится секция для ВСЕХ районов подряд, игнорируя отбор на форме
Таб.ВывестиСекцию("Район");
СпрЗаказчик = СоздатьОбъект("Справочник.Заказчик");
СпрЗаказчик.ВыбратьЭлементы();
Пока СпрЗаказчик.ПолучитьЭлемент() = 1 Цикл
Если СпрЗаказчик.Район = СпрРайон.ТекущийЭлемент() Тогда
RS.УстановитьТекстовыйПараметр("НачДата", НачПер);
RS.УстановитьТекстовыйПараметр("КонДата", ОконПер);
RS.УстановитьТекстовыйПараметр("ОстМеньше", ОстМеньше); // Параметр установлен, но в WHERE его нет!
RS.УстановитьТекстовыйПараметр("ТекЗаказчик", СпрЗаказчик.ТекущийЭлемент());
ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса); // Запрос выполняется в цикле для каждого заказчика!
...
КонецЕсли;
КонецЦикла;
КонецЦикла;
В приведенном коде реквизит формы Район вообще не задействован. Вся база районов и заказчиков обходится во вложенных циклах, а значение ОстМеньше передается в ODBCRecordset, но в тексте запроса секция WHERE фильтрацию по нему не содержит.
Рассмотрим шаги, необходимые для восстановления корректной работы отборов и повышения скорости работы отчета:
ТаблицуЗначений.Выбран() = 1 или ПустоеЗначение() = 0). В зависимости от этого динамически добавляйте условия в секцию WHERE SQL-запроса.RS.УстановитьТекстовыйПараметр("ИмяПараметра", Значение) должен соотноситься с псевдонимом :ИмяПараметра в тексте SQL-запроса.(nolock) к таблицам в секциях FROM и JOIN для предотвращения блокировок таблиц базы данных.Пример правильного оформления секции источников данных в SQL-запросе с использованием (nolock):
|FROM
| _1SJourn as Жур (nolock)
|INNER JOIN
| $Документ.АктОбъемаРабот as Док (nolock) ON Док.IDDoc = Жур.IDDoc
|INNER JOIN
| $Справочник.Объект as Спр (nolock) ON Спр.ID = $Док.Объект
Соблюдение этих правил позволит избавиться от ситуаций, когда параметры на форме отчета не влияют на результат, а также существенно ускорит процесс формирования отчетов в 1С 7.7.