Как передать дополнительные параметры с управляемой формы в систему компоновки данных (СКД)

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает ситуация, когда стандартных параметров, определенных в схеме, недостаточно. Например, пользователю нужно интерактивно выбрать путь к внешней базе данных, ввести логин или пароль, которые не должны храниться в самой схеме в явном виде, но должны участвовать в формировании результата. Разберем подробно, как связать реквизиты формы с механизмом СКД и обеспечить их корректную работу.

Выясним причину проблемы: почему реквизиты формы не видны в СКД

Рассмотрим ситуацию: вы создали отчет, добавили в него реквизиты (например, ПутьКБазе, Логин, Пароль) и вынесли их на форму. Однако при попытке обратиться к ним в модуле объекта внутри процедуры ПриКомпоновкеРезультата вы обнаруживаете, что они пусты. Это происходит потому, что при формировании отчета стандартными командами создается новый экземпляр объекта отчета на сервере, который «не знает» о значениях, заполненных в реквизитах конкретной формы.

Проанализируем также ошибку «Итератор для значения не определен». Она часто возникает в общем модуле ОбщегоНазначенияКлиентСервер, когда механизмы платформы или БСП пытаются обойти коллекцию настроек, которая по каким-то причинам не была инициализирована или передана как Неопределено. Это случается при неправильном вызове кастомных форм настроек.

Способ 1. Программная передача параметров через Компоновщик настроек

Это самый надежный и правильный метод. Мы создаем параметры в самой схеме СКД, а на форме оставляем удобные элементы управления. В момент формирования отчета мы принудительно записываем значения из формы в КомпоновщикНастроек.

Рассмотрим по шагам реализацию в модуле объекта отчета:

  1. В схеме СКД создаем параметры с именами, например, ВнешнийЛогин и ВнешнийПароль.
  2. В модуле объекта переопределяем процедуру ПриКомпоновкеРезультата.
  3. Прописываем код установки значений параметров.

Пример кода для установки параметров:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Передаем значение из реквизита объекта (заполненного на форме) в параметр СКД
    ПараметрЛогин = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ВнешнийЛогин");
    Если ПараметрЛогин <> Неопределено Тогда
        ПараметрЛогин.Значение = ЭтотОбъект.Логин;
        ПараметрЛогин.Использование = Истина;
    КонецЕсли;

    // Альтернативный и более краткий способ через УстановитьЗначениеПараметра
    КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ВнешнийПароль", ЭтотОбъект.Пароль);

КонецПроцедуры

Способ 2. Синхронизация с пользовательскими настройками

Если нам важно, чтобы параметры не просто передавались в запрос, но и сохранялись в Вариантах отчета, их необходимо связать с механизмом пользовательских настроек. В СКД настройки разделены на «основные» и «пользовательские». Если параметр вынесен в пользовательские настройки, его значение в КомпоновщикНастроек.Настройки может игнорироваться, так как приоритет имеют ПользовательскиеНастройки.

Разберем пример функции, которая корректно находит и устанавливает значение параметра, учитывая его «пользовательский» статус:


Процедура УстановитьЗначениеПараметраСКД(ИмяПараметра, Значение)
    
    // Ищем параметр в основных настройках
    ЭлементПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
    
    Если ЭлементПараметра <> Неопределено Тогда
        // Проверяем, вынесен ли параметр в пользовательские настройки
        ИдентификаторПользовательскойНастройки = ЭлементПараметра.ИдентификаторПользовательскойНастройки;
        
        Если ЗначениеЗаполнено(ИдентификаторПользовательскойНастройки) Тогда
            // Ищем и обновляем значение в пользовательских настройках
            Для Каждого ЭлементПН Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
                Если ЭлементПН.ИдентификаторПользовательскойНастройки = ИдентификаторПользовательскойНастройки Тогда
                    ЭлементПН.Значение = Значение;
                    ЭлементПН.Использование = Истина;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
        Иначе
            // Если настройки не пользовательские, устанавливаем напрямую
            ЭлементПараметра.Значение = Значение;
            ЭлементПараметра.Использование = Истина;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Способ 3. Использование двух форм (Основная и Настройки)

Посмотрим на ситуацию, когда стандартная форма настроек выдает ошибку Не передан служебный параметр "НастройкиОтчета". Это часто происходит, если вы пытаетесь заменить системную форму настроек своей, но не инициализируете её должным образом.

Практика показывает, что наиболее стабильный вариант — это создание Основной формы отчета, на которой располагаются:

  1. Стандартная таблица ПользовательскиеНастройкиОтчета.
  2. Ваши произвольные реквизиты (Путь к базе, чек-боксы и т.д.).
  3. Командная панель со стандартными кнопками.

В этом случае при нажатии кнопки «Сформировать» форма автоматически передает свое состояние в объект, и если вы правильно связали реквизиты формы с реквизитами отчета (через путь к данным), то в процедуре ПриКомпоновкеРезультата данные будут доступны через ЭтотОбъект.

Особенности работы со списками значений

Если ваш параметр в СКД имеет тип СписокЗначений (например, список артикулов, загруженный из Excel), используйте метод ЗагрузитьЗначения. Проанализируем пример:


ПараметрДанных = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("СписокАртикулов");
Если ПараметрДанных <> Неопределено Тогда
    ПараметрДанных.Значение.ЗагрузитьЗначения(МассивПолученныхАртикулов);
    ПараметрДанных.Использование = Истина;
КонецЕсли;

Важные рекомендации

Во-первых, всегда проверяйте свойство Использование у параметров. Если оно установлено в Ложь, СКД проигнорирует значение параметра, даже если оно заполнено.

Во-вторых, для работы с паролями на форме используйте свойство РежимПароля. Помните, что для безопасности лучше не сохранять реальные пароли в вариантах отчета навсегда. Если это необходимо, убедитесь, что доступ к базе настроек ограничен.

В-третьих, если вы используете БСП, обратите внимание на переопределяемые модули. В них можно внедрить логику заполнения параметров при открытии отчета или при смене варианта, что избавит вас от необходимости писать много кода непосредственно в формах.

Таким образом, комбинируя создание реквизитов на форме и программную установку параметров в КомпоновщикеНастроек, вы получаете полный контроль над процессом формирования отчета, сохраняя при этом все преимущества типовых механизмов 1С.

← На главную