Почему не работает внешний отчет Анализ начислений и удержаний в ЗУП 3.1 и как это исправить

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

При работе с современными конфигурациями на базе Библиотеки стандартных подсистем (БСП), такими как ЗУП 3.1, Бухгалтерия предприятия 3.0 или ERP, программисты часто сталкиваются с проблемой: попытка сохранить типовой отчет как внешний и запустить его через меню «Файл — Открыть» приводит к фатальной ошибке. Система выдает сообщение: «Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа. по причине: Ошибка преобразования данных XDTO...».

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

Выясняем причину: почему возникает ошибка XDTO

Для начала проанализируем ситуацию с технической стороны. Ошибка преобразования XDTO при передаче данных между клиентом и сервером всегда означает одно: платформа попыталась передать объект, который не может быть сериализован (превращен в последовательность байтов или XML-текст).

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

Эти объекты существуют только на сервере. Когда выполнение серверной процедуры заканчивается и управление возвращается на клиент, платформа пытается передать все содержимое КомпоновщикаНастроек (включая дополнительные свойства) на сторону клиента. Поскольку макет компоновки или схема не могут быть сериализованы, происходит крах обмена данными. В типовых (встроенных) отчетах БСП сама контролирует очистку этих свойств, но во внешнем отчете этот механизм часто «ломается».

Решение 1: Программная очистка макета в модуле объекта

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

Разберем по шагам, что нужно сделать в модуле объекта вашего внешнего отчета. Нам потребуется найти или создать процедуру ПриКомпоновкеРезультата. Посмотрим на пример кода, который решает проблему:


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

	// Инициализация процессора компоновки
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, , ДанныеРасшифровки, Истина);

	// Вывод результата
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

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

Важный момент: если вы используете радикальную очистку через Очистить(), убедитесь, что в этих свойствах не хранятся данные, которые действительно нужны на клиенте (хотя для внешнего отчета это большая редкость).

Решение 2: Регистрация в справочнике Дополнительные отчеты и обработки

Проанализируем ситуацию, когда код править не хочется или ошибка сохраняется. Часто проблема возникает из-за того, что внешний отчет запускается в «изолированном» контексте через Файл — Открыть.

Рассмотрим альтернативный путь:

  1. Зайдите в раздел Администрирование — Печатные формы, отчеты и обработки.
  2. Выберите пункт Дополнительные отчеты и обработки.
  3. Нажмите «Добавить из файла» и выберите ваш отчет.
  4. Настройте размещение (в каком разделе интерфейса он будет виден) и права доступа.

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

Решение 3: Исправление обращений к менеджеру объекта

Многие типовые отчеты, такие как Анализ начислений и удержаний, содержат в модуле объекта вызовы функций из собственного менеджера. Например:

Отчеты.АнализНачисленийИУдержаний.ПолучитьТекстЗапроса()

Когда отчет становится внешним, у него нет записи в коллекции Отчеты метаданных. Любое обращение к Отчеты.ИмяВашегоОтчета приведет к ошибке, так как платформа ищет объект в составе конфигурации, а не во внешнем файле.

Чтобы это исправить, выполните следующие действия:

  1. Найдите в модуле объекта все упоминания Отчеты.АнализНачисленийИУдержаний.
  2. Замените их на обращение к текущему объекту через ЭтотОбъект (если методы перенесены в модуль объекта) или перенесите необходимые функции из модуля менеджера типового отчета в модуль объекта вашего внешнего отчета.
  3. Если отчет использует общие модули ЗУП для достройки схемы (например, ЗарплатаКадрыОтчеты), убедитесь, что в эти методы передается правильный контекст.

Решение 4: Проблема кэша и переименование

Бывают случаи, когда вы внесли правки, очистили свойства, но ошибка сохраняется. Это может быть связано с агрессивным кэшированием метаданных внешних обработок платформой 1С. Система запоминает структуру объекта и при повторном запуске (даже если файл изменен) может использовать старое описание типов данных.

В этом случае помогает простое действие: переименуйте файл отчета и измените его Имя в свойствах корневого элемента в конфигураторе. Это заставит платформу инициализировать объект «с чистого листа», что часто помогает избавиться от «фантомных» ошибок XDTO.

Резюме

Для успешной работы типового отчета в качестве внешнего в ЗУП 3.1 необходимо:

Следуя этим рекомендациям, вы сможете адаптировать практически любой сложный отчет под свои нужды, сохраняя его функциональность и стабильность работы.

← На главную