Как исправить ошибку «Ошибка преобразования данных XDTO: Текст: false» при вызове серверных функций

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

В процессе разработки на платформе 1С:Предприятие 8.3 (особенно на управляемых формах) программисты часто сталкиваются с загадочной ошибкой: «Ошибка преобразования данных XDTO: Текст: false». Она возникает в момент завершения выполнения серверного вызова и возврата управления на сторону клиента. В этой статье мы подробно разберем, почему это происходит, как работает механизм сериализации данных и какими способами можно навсегда устранить эту проблему.

Разбор ситуации и анализ причин ошибки

Давайте проанализируем ситуацию, представленную в коде автора. Рассмотрим фрагмент кода, который вызывает сбой:


&НаСервере
Функция ВыполнитьПроверкуСПоступлениемТоваров(ЭтотОбъект, ЗадатьВопрос)
    ЭтотОбъект = ЭтотОбъект.ПолучитьОбъект();
    // ... логика проверки ...
    Возврат ЗадатьВопрос;
КонецФункции

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

Ошибка XDTO: Текст: false — это низкоуровневое системное сообщение. Оно сигнализирует о том, что механизм сериализации (преобразования данных в формат, понятный для передачи по сети) не смог обработать какой-то объект. В 1С существуют так называемые «мутабельные» (изменяемые) типы данных, которые могут существовать исключительно на сервере. К ним относятся:

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

Решение №1: Использование ключевого слова Знач

Самый правильный и надежный способ избежать данной ошибки — использовать передачу параметров по значению. Для этого в определении функции перед именем параметра необходимо поставить ключевое слово Знач (или Val в англоязычном варианте).

Разберем, как изменится поведение системы:


&НаСервере
Функция ВыполнитьПроверкуСПоступлениемТоваров(Знач ЭтотОбъект, ЗадатьВопрос)
    ЭтотОбъект = ЭтотОбъект.ПолучитьОбъект(); 
    // Теперь это безопасно!
    // ... логика ...
    Возврат ЗадатьВопрос;
КонецФункции

В этом случае платформа создает локальную копию ссылки внутри серверного вызова. Даже если мы присвоим этой переменной ДокументОбъект, по завершении функции платформа не будет пытаться передать это значение обратно на клиент. Это не только устраняет ошибку, но и немного повышает производительность, так как исключается лишний трафик обмена данными.

Решение №2: Явная очистка мутабельных переменных

Если по каким-то причинам вы не можете или не хотите использовать Знач (например, если параметр должен возвращать какие-то данные, но не объект целиком), мы можем применить метод «ручной очистки». Рассмотрим этот вариант:


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

Здесь мы не переопределяем сам входящий параметр объектом, либо явно присваиваем ему Неопределено перед выходом. Платформа успешно сериализует Неопределено для передачи на клиент, и ошибка XDTO не возникнет.

Решение №3: Работа со структурами и коллекциями

Часто программисты сталкиваются с этой ошибкой не напрямую, а через коллекции. Например, если вы передаете на сервер Структура, и внутри серверного метода добавляете в эту структуру элемент, содержащий РезультатЗапроса или ссылку на ЭтотОбъект (в контексте модуля объекта), при возврате структуры на клиент возникнет ошибка.

Проанализируем пример неправильной работы со структурами:


&НаСервере
Процедура ОбработатьДанныеНаСервере(ПараметрыПроцедуры)
    Запрос = Новый Запрос("ВЫБРАТЬ... ");
    ПараметрыПроцедуры.Вставить("Результат", Запрос.Выполнить()); // ОШИБКА ТУТ!
КонецПроцедуры

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

ПараметрыПроцедуры.Удалить("Результат");

Важные рекомендации по диагностике

Если вы не можете сразу определить, какая именно переменная вызывает ошибку XDTO: Текст: false, воспользуйтесь следующей методикой:

  1. Установите точку останова на самой последней строке серверной функции (на операторе Возврат или КонецФункции).
  2. Откройте окно «Табло» или «Вычислить выражение».
  3. Проверьте типы всех аргументов функции. Если тип значения заканчивается на ...Объект (например, СправочникОбъект.Номенклатура), это и есть источник проблемы.
  4. Особое внимание уделите переменным с именами Объект, Параметры, СтруктураДанных.

Помните, что платформа 1С делает «невидимую» работу по синхронизации контекста. Даже если вы не планировали использовать измененный параметр на клиенте, платформа все равно попытается его передать, если не указано Знач. Использование этого ключевого слова — признак хорошего тона и профессионального подхода к разработке на управляемых формах.

Подводя итог, можно сказать, что ошибка «XDTO: Текст: false» — это всегда сигнал о нарушении границ между клиентской и серверной памятью. Соблюдение правил типизации и использование передачи по значению позволят вам создавать стабильный и быстрый код.

← На главную