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