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