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

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

При работе в конфигурациях на базе обычных форм (например, УТ 10.3) с внедренными подсистемами на управляемых формах (маркировка товаров ИС МП «Честный знак»), программисты часто сталкиваются с труднодиагностируемой ошибкой: «Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа». Ситуация осложняется тем, что ошибка сопровождается сообщением о сбое преобразования XDTO: КонецСвойства: item. Проанализируем причины возникновения этой проблемы и рассмотрим способы её решения.

Выясним причину ошибки XDTO

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

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

Проанализируем программный код настройки формы

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


&НаКлиентеНаСервереБезКонтекста
Процедура НастроитьЭлементыФормы(Форма)
    Элементы = Форма.Элементы;
    Объект = Форма.Объект;
    
    // Определение признаков продукции
    ЭтоМолочнаяПродукция = (Объект.ВидПродукции = ПредопределенноеЗначение("Перечисление.ВидыПродукцииИС.МолочнаяПродукцияБезВЕТИС"));
    
    // Программное изменение свойств элементов
    Элементы.ТоварыGTIN.Видимость = Объект.Операция = ПредопределенноеЗначение("Перечисление.ОперацииМаркировкиИСМП.МаркировкаОстатков");
    
    // Опасный участок: работа с ОписаниемТипов
    Если ЭтоМолочнаяПродукция Тогда
        МассивТипов = Новый Массив;
        МассивТипов.Добавить(Тип("СправочникСсылка.КлассификаторВЕТИСПродукция"));
        Элементы.ТоварыИдентификаторПроисхожденияВЕТИС.ОграничениеТипа = Новый ОписаниеТипов(МассивТипов);
    КонецЕсли;
КонецПроцедуры

В данном примере использование Новый ОписаниеТипов внутри процедуры &НаКлиентеНаСервереБезКонтекста является потенциальной точкой отказа. Если массив типов формируется некорректно или содержит типы, недоступные в текущем сеансе, сериализатор XDTO выдаст ошибку «КонецСвойства: item».

Решение 1: Перенос логики в контекстные серверные процедуры

Для исправления ситуации попробуем отказаться от передачи формы как параметра в бесконтекстную процедуру. Вместо &НаКлиентеНаСервереБезКонтекста следует использовать &НаСервере. Это позволит платформе более стабильно управлять контекстом формы.

Рассмотрим, как изменить вызов:

  1. Удалим директиву &НаКлиентеНаСервереБезКонтекста.
  2. Установим директиву &НаСервере.
  3. Уберем параметр Форма, так как внутри контекстной процедуры мы имеем прямой доступ к ЭтаФорма и Элементы.

&НаСервере
Процедура НастроитьЭлементыФормыНаСервере()
    // Прямое обращение к свойствам формы
    ОбъектМанипуляции = ЭтаФорма.Объект;
    ЭлементыФормы = ЭтаФорма.Элементы;
    
    // Настройка видимости
    ЭлементыФормы.ТоварыКодТНВЭД.Видимость = (ОбъектМанипуляции.Операция = ПредопределенноеЗначение("Перечисление.ОперацииМаркировкиИСМП.ВводВОборот"));
КонецПроцедуры

Решение 2: Безопасная установка свойств элементов

Если вы используете Библиотеку Стандартных Подсистем (БСП), крайне рекомендуется заменить прямое обращение к свойствам элементов через точку на вызовы специальных функций. Это предотвратит ошибки обращения к несуществующим или недоступным свойствам. Рассмотрим использование функции УстановитьСвойствоЭлементаФормы.

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


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

Решение 3: Очистка кэша и пользовательских настроек

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

Выполним следующие шаги для диагностики:

Решение 4: Обновление платформы

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

Важный момент: При работе с маркировкой «Честный знак» критически важно, чтобы константа ВестиУчетМаркируемойПродукцииИСМП была установлена в значение Истина. Проверим это программно:


Если Не Константы.ВестиУчетМаркируемойПродукцииИСМП.Получить() Тогда
    // Без этой константы формы ИС МП могут работать некорректно
    // и вызывать ошибки при попытке инициализации элементов
    Возврат; 
КонецЕсли;

Подводя итог, можно сказать, что проблема «Значения недопустимого типа» в формах ИС МП чаще всего решается либо исправлением программного кода (отказ от бесконтекстных вызовов при настройке интерфейса), либо техническим обслуживанием базы данных (очистка настроек и кэша). При необходимости комплексной адаптации конфигурации можно применить готовое обновление УТ 10.3 для работы с маркировкой.

← На главную