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