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













































