Почему расшифровка отчета работает в файловой базе, но не передает параметры в SQL-варианте 1С?

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

При разработке и доработке отчетов на базе системы компоновки данных (СКД) разработчики нередко сталкиваются с ситуацией, когда механизм расшифровки безупречно функционирует в файловой информационной базе, но перестает работать после переноса конфигурации в клиент-серверный режим (SQL). В этом случае форма отчета-расшифровки открывается, однако отборы не применяются, а параметры и группировки оказываются пустыми.

Разберем подробнее причины такого поведения платформы 1С:Предприятие и выясним, как правильно вызывать серверные процедуры обработки расшифровки.

Причины различий в работе файлового и клиент-серверного режимов

Проанализируем ключевые архитектурные различия, которые влияют на механизм расшифровки при переходе от файловой базы к SQL:

  1. Разделение адресных пространств (Клиент — Сервер). В файловом режиме клиентские и серверные вызовы выполняются в рамках одного общего процесса и разделяют единую память. В таких условиях некоторые неявные ссылки на контекст формы или пропущенные параметры могут не вызывать ошибок. В клиент-серверном режиме тонкий клиент и кластер серверов 1С работают в изолированных процессах, а данные передаются строго через механизм сериализации. Объект ДанныеРасшифровкиКомпоновкиДанных не существует на стороне тонкого клиента напрямую — с ним можно работать только на сервере или через временное хранилище.
  2. Зависимость алгоритма от схемы и настроек. При вызове серверных функций для получения массива полей и значений расшифровки серверу необходим доступ к структуре полей схемы. Если параметр с компоновщиком настроек пропущен, серверный метод не может сопоставить идентификатор поля ячейки с метаданными СКД и возвращает пустой массив.
  3. Особенности временного хранилища. В клиент-серверном режиме критически важно передавать уникальный идентификатор формы при помещении данных во временное хранилище. Без явной привязки к УникальныйИдентификатор формы объект расшифровки может быть удален сборщиком мусора сразу после завершения текущего серверного вызова.

Анализ ошибки в вызове функции получения полей расшифровки

Рассмотрим пример кода, в котором была допущена ошибка. В типовых конфигурациях (например, в 1C:Бухгалтерия) для обработки клика по ячейке отчета используется вызов функции общего модуля:


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

В файловой базе такой вызов мог частично отрабатывать за счет кэшированных данных в общей памяти процесса. Однако в клиент-серверном варианте функция БухгалтерскиеОтчетыВызовСервера.ПолучитьМассивПолейРасшифровки без настроек не может определить структуру полей и возвращает пустой массив. В результате открываемый отчет-расшифровка не получает необходимых отборов.

Правильное решение проблемы

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


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

Разберем назначение параметров этого метода:

  1. Расшифровка — идентификатор ячейки или элемента расшифровки, полученный в событии таблицы.
  2. ДанныеРасшифровкиТек — адрес объекта ДанныеРасшифровкиКомпоновкиДанных во временном хранилище.
  3. Отчет.КомпоновщикНастроек — компоновщик настроек отчета, содержащий текущие пользовательские настройки, выбранные поля и структуру отчета.
  4. Истина — признак необходимости включения дополнительных системных полей и родителей группировок.

Рекомендации по диагностике и отладке в режиме SQL

Если в клиент-серверном режиме поведение отчета отличается от файлового, выполним следующие диагностические шаги:

  1. Включение отладки на сервере 1С. Убедимся, что служба кластера серверов 1С запущена с параметром -debug. В конфигураторе перейдем в меню Отладка — Подключение и настроим автоматическое подключение к фоновым заданиям и клиент-серверным вызовам.
  2. Проверка адреса временного хранилища. Убедимся, что при формировании отчета адрес расшифровки корректно сохраняется в реквизит формы и передается при клике на расшифровку без перетирания другими контекстными вызовами.
  3. Использование стандартного механизма. Если логика формирования расшифровки не требует специфической ручной обработки, рекомендуется использовать объект ОбработкаРасшифровкиКомпоновкиДанных, который выполняет сбор настроек и передачу параметров в подчиненный отчет стандартными средствами платформы.
← На главную