Как получить доступ к схеме компоновки данных на клиенте и настроить обработку расшифровки в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на управляемых формах разработчики часто сталкиваются с задачей переопределения стандартной расшифровки или динамической модификации схемы компоновки данных (СКД). Нередко возникает вопрос: как обратиться к объекту СхемаКомпоновкиДанных непосредственно в клиентском контексте, например, для инициализации объекта ОбработкаРасшифровкиКомпоновкиДанных? Разберем архитектурные особенности платформы 1С:Предприятие 8.3 и выясним правильные способы решения этой задачи.

Архитектура хранения СКД и ограничения тонкого клиента

Проанализируем, где и в каком виде существует схема компоновки данных. Объект СхемаКомпоновкиДанных имеет контекст доступности: Сервер, толстый клиент, внешнее соединение. На тонком клиенте этот объект физически существовать не может.

Когда на сервере выполняется вызов РеквизитФормыВЗначение("Отчет"), платформа создает временный прикладной объект ОтчетОбъект. В этот момент схема компоновки данных считывается из метаданных (из макета основной схемы отчета). При завершении серверного вызова объект отчета уничтожается, так как сервер 1С работает по модели без сохранения состояния (stateless). На клиенте сохраняются только данные формы (реквизит формы Отчет типа ДанныеФормыСтруктура), содержащие пользовательские параметры, отборы и настройки компоновщика, но не саму схему.

Инициализация расшифровки на тонком клиенте

Типичная ошибка заключается в попытке передать саму схему в конструктор источника настроек на клиенте. Рассмотрим правильный синтаксис работы с расшифровкой.

Для создания объекта ИсточникДоступныхНастроекКомпоновкиДанных на клиенте не требуется передавать объект схемы. Конструктор источника доступных настроек в клиентском контексте принимает ссылку на данные формы отчета или строковый путь к ним. Посмотрим на пример стандартного кода клиентского обработчика расшифровки:


&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Создаем источник доступных настроек, передавая реквизит формы "Отчет"
    ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет);
    
    // Инициализируем обработку расшифровки
    // Реквизит формы "ДанныеРасшифровки" содержит адрес во временном хранилище
    ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, ИсточникНастроек);
    
    // Выполняем дальнейшие действия по выбору действия расшифровки
    ПараметрыРасшифровки = Новый ПараметрыВыполненияДействияРасшифровкиКомпоновкиДанных;
    ПараметрыРасшифровки.Параметры = Расшифровка;
    
    // Вызов диалога расшифровки или программное открытие связанного отчета
    
КонецПроцедуры

Разберем, почему этот код работает: конструктор ИсточникДоступныхНастроекКомпоновкиДанных(Отчет) на стороне клиента не загружает в память всю схему, а сохраняет внутреннюю ссылку на объект формы, позволяя платформе прозрачно связывать настройки и метаданные при обращении к серверу.

Работа с динамически измененной СКД через временное хранилище

Если в отчете используется программно созданная или модифицированная на сервере схема, стандартная привязка через реквизит формы Отчет приведет к тому, что платформа при очередном вызове перечитает схему по умолчанию из макета. Рассмотрим по шагам, как правильно организовать работу с динамической схемой и ее расшифровкой.

  1. Помещение схемы во временное хранилище:

    При программном формировании или модификации схемы на сервере поместим объект СхемаКомпоновкиДанных во временное хранилище с привязкой к уникальному идентификатору формы:

    
    &НаСервере
    Процедура ИнициализироватьДинамическуюСхемуНаСервере()
        
        // Получаем или генерируем схему
        Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
        
        // Вносим программные изменения в схему (поля, наборы данных и т.д.)
        // ...
        
        // Помещаем схему во временное хранилище формы
        АдресСхемы = ПоместитьВоВременноеХранилище(Схема, УникальныйИдентификатор);
        
        // Инициализируем компоновщик настроек адресом из хранилища
        ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы);
        Отчет.КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
        
    КонецПроцедуры
    
  2. Программная компоновка и сохранение данных расшифровки:

    В обработчике ПриКомпоновкеРезультата модуля отчета отменяем стандартную обработку и формируем отчет вручную, передавая объект ДанныеРасшифровкиКомпоновкиДанных в процессор компоновки:

    
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
        
        СтандартнаяОбработка = Ложь;
        
        // Извлекаем модифицированную схему из хранилища
        Схема = ПолучитьИзВременногоХранилища(АдресСхемы);
        
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
        
        ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
        
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
        ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
        ПроцессорВывода.Вывести(ПроцессорКомпоновки);
        
    КонецПроцедуры
    
  3. Расшифровка динамической схемы на клиенте:

    Для корректной обработки расшифровки отчета с измененными полями на клиенте передаем в источник настроек строковый адрес схемы во временном хранилище:

    
    &НаКлиенте
    Процедура РезультатОбработкаРасшифровкиДинамическая(Элемент, Расшифровка, СтандартнаяОбработка)
        
        СтандартнаяОбработка = Ложь;
        
        // Передаем URL из временного хранилища, где лежит модифицированная схема
        ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы);
        ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, ИсточникНастроек);
        
        // Выполнение действий расшифровки
        
    КонецПроцедуры
    

Таким образом, мы выяснили: на клиенте схема СКД не хранится, однако для стандартных отчетов достаточно передать реквизит формы Отчет в конструктор ИсточникДоступныхНастроекКомпоновкиДанных, а при динамической модификации схемы связь между клиентом и сервером организуется через передачу строкового адреса временного хранилища.

← На главную