Работа с Системой компоновки данных (СКД) — это база для любого разработчика 1С. Однако начинающие специалисты часто сталкиваются с ситуацией, когда вроде бы простой отчет с параметром выдает пустой результат или вовсе игнорирует настройки. В этой статье мы подробно разберем, как передавать параметры в запрос СКД, почему использование секции ГДЕ не всегда оправдано и как сделать отчет удобным для пользователя без написания лишнего кода.
Рассмотрим ситуацию: разработчик создает отчет по регистру накопления, добавляет в запрос условие ГДЕ КассаОстаткиИОбороты.Валюта = &Валюта и пытается программно заполнить этот параметр в модуле объекта. Несмотря на то, что код выполняется, отчет выводит только шапку.
Проанализируем причины такого поведения. Чаще всего проблема кроется в одном из трех факторов:
Использование в значение Истина.КомпоновщикНастроек.Настройки перекрываются ПользовательскимиНастройками, которые имеют приоритет при формировании отчета на управляемых формах.Если специфика задачи требует жесткой программной подстановки значения (например, ограничение данных в зависимости от прав доступа или текущего контекста), мы используем процедуру ПриКомпоновкеРезультата. Давайте изучим правильный алгоритм действий.
Рассмотрим пример кода, который гарантированно установит значение параметра:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Получаем доступ к параметрам данных через компоновщик настроек
ЭлементПараметраДанных = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Валюта");
Если ЭлементПараметраДанных <> Неопределено Тогда
// Устанавливаем само значение (предполагаем, что Валюта — это реквизит формы или объекта)
ЭлементПараметраДанных.Значение = Валюта;
// КРИТИЧЕСКИ ВАЖНО: включаем флаг использования
ЭлементПараметраДанных.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Важное примечание: Если вы работаете в среде управляемых форм, настройки, измененные пользователем на форме, хранятся в коллекции КомпоновщикНастроек.ПользовательскиеНастройки. Если вы измените основную коллекцию Настройки, а параметр уже выведен на форму пользователю, ваше программное изменение может не сработать. В таких случаях нужно искать параметр по его идентификатору в пользовательских настройках.
Посмотрим на ситуацию со стороны производительности. Использование конструкции ГДЕ в конце запроса заставляет систему сначала выбрать ВСЕ данные из регистра, а уже потом фильтровать их. Это крайне неэффективно для больших баз.
Правильнее передавать фильтр напрямую в параметры виртуальной таблицы. Разберем, как должен выглядеть запрос:
ВЫБРАТЬ
КассаОстаткиИОбороты.Валюта КАК Валюта,
КассаОстаткиИОбороты.СуммаНачальныйОстаток КАК СуммаНачальныйОстаток,
КассаОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток
ИЗ
РегистрНакопления.Касса.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , Валюта = &Валюта) КАК КассаОстаткиИОбороты
В этом случае база данных отсечет лишние записи еще на этапе формирования выборки, что значительно ускорит работу отчета. СКД автоматически создаст параметр Валюта на соответствующей закладке конструктора.
Многие разработчики по привычке создают реквизиты на форме и пишут код для их передачи в СКД. Однако платформа 8.3 позволяет сделать это штатными средствами за несколько кликов. Выясним, как вывести параметр на форму автоматически.
Выполним следующие шаги в схеме компоновки данных:
Валюта.Теперь, при запуске отчета, поле выбора валюты автоматически появится в верхней части формы. Пользователю не нужно будет "глубоко лезть" в настройки, а вам не придется писать ни строчки кода в процедуре ПриКомпоновкеРезультата.
Проанализируем еще несколько сценариев, которые часто встречаются в реальной практике:
Передача списка значений: Если вы хотите, чтобы пользователь мог выбрать не одну валюту, а сразу несколько, измените условие в запросе на Валюта В (&Валюта). В настройках параметра СКД убедитесь, что тип данных позволяет выбирать список или массив. При программной передаче в этом случае нужно использовать объект СписокЗначений.
Необязательные параметры: Чтобы параметр можно было не заполнять (и тогда отчет покажет данные по всем валютам), используйте фигурные скобки в тексте запроса. Это синтаксис расширения языка запросов СКД:
ГДЕ
{КассаОстаткиИОбороты.Валюта = &Валюта}
Если параметр &Валюта не будет отмечен флагом использования, СКД просто проигнорирует это условие и выведет все данные.
Фиксированные настройки: Бывают случаи, когда нужно жестко ограничить данные так, чтобы пользователь не смог это изменить (например, отчет только по безналичным расчетам). Для этого используйте КомпоновщикНастроек.ФиксированныеНастройки. Они не видны в интерфейсе и всегда применяются к итоговому результату.
Таким образом, мы рассмотрели основные механизмы работы с параметрами. Помните: всегда отдавайте предпочтение штатным настройкам СКД и используйте программный код только тогда, когда стандартных возможностей платформы действительно недостаточно.