При разработке сложных аналитических систем в 1С часто возникает задача реализации «drill-down» (расшифровки), когда при нажатии на значение в одном отчете открывается другой отчет, отфильтрованный по выбранному значению. Однако на практике программисты часто сталкиваются с ситуацией, когда параметр вроде бы передается, но второй отчет открывается пустым или выдает ошибку о незаполненном обязательном параметре. В этой статье мы разберем, как правильно организовать передачу параметров между внешними отчетами, проанализируем типичные ошибки и рассмотрим рабочее программное решение.
Типичная ситуация: в коде формы отчета-приемника в процедуре ПриСозданииНаСервере прописана установка значения параметра. Программист видит в отладчике, что значение ПарамНоменклатура.Значение заполнено, но система компоновки данных (СКД) все равно не видит этого значения при выполнении запроса. Проанализируем основные причины такого поведения:
КлючВарианта, система может загрузить настройки, в которых структура параметров отличается от ожидаемой.Для начала рассмотрим, как правильно инициировать открытие второго отчета из первого. Рассмотрим фрагмент кода, который необходимо разместить в обработчике расшифровки или при нажатии кнопки. Нам крайне важно явно указать ключ варианта, чтобы быть уверенными в структуре параметров отчета-приемника.
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Номенклатура", ВыбраннаяНоменклатура);
ПараметрыФормы.Вставить("КлючВарианта", "Основной");
ОткрытьФорму("ВнешнийОтчет.ИмяВашегоОтчета.Форма", ПараметрыФормы, Параметры.ОписаниеОповещения);
Обратите внимание на использование КлючВарианта. Это гарантирует, что при открытии формы будет загружена именно та схема, с которой мы планируем работать программно. Без этого 1С может загрузить последний сохраненный вариант пользователя, где нужный параметр может быть вообще отключен или переименован.
Теперь перейдем к самому важному — обработке входящих данных в форме второго отчета. Рассмотрим наиболее надежный способ, который позволяет обойти ограничения стандартного механизма инициализации. Вместо того чтобы полагаться на автоматику, мы возьмем управление процессом на себя.
Для этого в модуле формы отчета-приемника следует использовать следующий подход:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем наличие переданного параметра в структуре Параметры
Если Параметры.Свойство("Номенклатура") Тогда
// 1. Отключаем стандартную обработку, чтобы система не пыталась
// выполнить инициализацию настроек по своему усмотрению
СтандартнаяОбработка = Ложь;
// 2. Устанавливаем флаг автоматического формирования при открытии
Параметры.СформироватьПриОткрытии = Истина;
// 3. Получаем доступ к параметрам данных компоновщика
ПараметрыОтчета = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных;
// 4. Используем метод УстановитьЗначениеПараметра - это более надежно,
// чем поиск через НайтиЗначениеПараметра()
ПараметрыОтчета.УстановитьЗначениеПараметра("Номенклатура", Параметры.Номенклатура);
// 5. Принудительно вызываем компоновку результата
ЭтаФорма.СкомпоноватьРезультат();
КонецЕсли;
КонецПроцедуры
Выясним причину, по которой этот код работает стабильнее исходного варианта. Здесь мы используем СтандартнаяОбработка = Ложь. Это критически важный шаг для внешних отчетов. Поскольку контекст объекта создается заново, стандартный механизм может перекрывать настройки, установленные в начале процедуры. Принудительный вызов СкомпоноватьРезультат() гарантирует, что отчет начнет формироваться именно с теми параметрами, которые мы только что записали в КомпоновщикНастроек.
Рассмотрим подробнее несколько технических моментов, которые помогут избежать ошибок в будущем:
Если в схеме компоновки данных параметр отмечен как включаемый в пользовательские настройки, его значение нужно дублировать и туда. В противном случае пользователь увидит на форме пустое поле параметра, хотя отчет может сформироваться правильно. Проанализируем, как найти нужный элемент в пользовательских настройках:
Система связывает основные и пользовательские настройки через ИдентификаторПользовательскойНастройки. Если вы хотите, чтобы переданное значение отобразилось в поле ввода на форме, вам нужно программно найти элемент в коллекции Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы по этому идентификатору и установить значение там.
Важно помнить: в параметры СКД всегда следует передавать ссылки (например, СправочникСсылка.Номенклатура), а не объекты (СправочникОбъект). Передача «тяжелого» объекта не только избыточна для запроса, но и может привести к ошибке несоответствия типов, так как СКД ожидает ссылку для сопоставления с данными в базе.
Посмотрим на альтернативный вариант. Платформа 1С поддерживает стандартный ключ параметров Отбор. Если при открытии формы вы передадите структуру с ключом Отбор, где ключи — это имена полей СКД, система сама попытается применить эти фильтры. Это работает для простых случаев, но если вам нужно заполнить именно Параметры (те, что используются внутри текста запроса через символ &), то ручная установка через КомпоновщикНастроек, рассмотренная выше, является единственным надежным способом.
Мы проанализировали ситуацию, когда программная установка параметров не приводит к желаемому результату. Основным решением является правильное сочетание управления СтандартнойОбработкой и использование метода УстановитьЗначениеПараметра. Помните, что для внешних отчетов в управляемых формах контроль над жизненным циклом создания формы и компоновки результата часто приходится брать в свои руки, чтобы обеспечить предсказуемое поведение системы.