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