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