При работе в конфигурациях на базе обычных форм (например, УТ 10.3) с внедренными подсистемами на управляемых формах (маркировка товаров ИС МП «Честный знак»), программисты часто сталкиваются с труднодиагностируемой ошибкой: «Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа». Ситуация осложняется тем, что ошибка сопровождается сообщением о сбое преобразования XDTO: КонецСвойства: item. Проанализируем причины возникновения этой проблемы и рассмотрим способы её решения.
Ошибка преобразования XDTO при передаче данных между клиентом и сервером обычно означает, что платформа пытается сериализовать (превратить в XML-пакет) объект, который не поддерживается механизмом обмена. В контексте управляемых форм, работающих внутри обычного приложения («толстого клиента»), этот механизм наиболее уязвим. Рассмотрим основные причины:
ОписаниеТипов с недопустимым набором типов), платформа выдает ошибку при попытке вернуть измененный контекст на клиент.ОграничениеТипа), механизм сериализации может «споткнуться» на сложных коллекциях.Чаще всего ошибка возникает в процедурах, которые динамически управляют видимостью и доступностью колонок. Разберем типичный пример кода, который может приводить к сбою (из модуля формы документа маркировки):
&НаКлиентеНаСервереБезКонтекста
Процедура НастроитьЭлементыФормы(Форма)
Элементы = Форма.Элементы;
Объект = Форма.Объект;
// Определение признаков продукции
ЭтоМолочнаяПродукция = (Объект.ВидПродукции = ПредопределенноеЗначение("Перечисление.ВидыПродукцииИС.МолочнаяПродукцияБезВЕТИС"));
// Программное изменение свойств элементов
Элементы.ТоварыGTIN.Видимость = Объект.Операция = ПредопределенноеЗначение("Перечисление.ОперацииМаркировкиИСМП.МаркировкаОстатков");
// Опасный участок: работа с ОписаниемТипов
Если ЭтоМолочнаяПродукция Тогда
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.КлассификаторВЕТИСПродукция"));
Элементы.ТоварыИдентификаторПроисхожденияВЕТИС.ОграничениеТипа = Новый ОписаниеТипов(МассивТипов);
КонецЕсли;
КонецПроцедуры
В данном примере использование Новый ОписаниеТипов внутри процедуры &НаКлиентеНаСервереБезКонтекста является потенциальной точкой отказа. Если массив типов формируется некорректно или содержит типы, недоступные в текущем сеансе, сериализатор XDTO выдаст ошибку «КонецСвойства: item».
Для исправления ситуации попробуем отказаться от передачи формы как параметра в бесконтекстную процедуру. Вместо &НаКлиентеНаСервереБезКонтекста следует использовать &НаСервере. Это позволит платформе более стабильно управлять контекстом формы.
Рассмотрим, как изменить вызов:
&НаКлиентеНаСервереБезКонтекста.&НаСервере.Форма, так как внутри контекстной процедуры мы имеем прямой доступ к ЭтаФорма и Элементы.
&НаСервере
Процедура НастроитьЭлементыФормыНаСервере()
// Прямое обращение к свойствам формы
ОбъектМанипуляции = ЭтаФорма.Объект;
ЭлементыФормы = ЭтаФорма.Элементы;
// Настройка видимости
ЭлементыФормы.ТоварыКодТНВЭД.Видимость = (ОбъектМанипуляции.Операция = ПредопределенноеЗначение("Перечисление.ОперацииМаркировкиИСМП.ВводВОборот"));
КонецПроцедуры
Если вы используете Библиотеку Стандартных Подсистем (БСП), крайне рекомендуется заменить прямое обращение к свойствам элементов через точку на вызовы специальных функций. Это предотвратит ошибки обращения к несуществующим или недоступным свойствам. Рассмотрим использование функции УстановитьСвойствоЭлементаФормы.
Проанализируем пример безопасной настройки:
// Вместо: Элементы.КнопкаДействия.Доступность = Истина;
// Используем механизм БСП (если доступен в конфигурации):
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "КнопкаДействия", "Доступность", Истина);
Поскольку ошибка часто не воспроизводится на демонстрационных базах (как заметил автор темы), велика вероятность того, что проблема кроется в сохраненных настройках формы конкретного пользователя. Управляемые формы сохраняют состояние колонок, видимость и положение элементов в системных таблицах 1С.
Выполним следующие шаги для диагностики:
snccntx в каталоге сервера приложений. Это принудительно обновит скомпилированные модули и метаданные в памяти сервера.Если вышеуказанные меры не помогают, следует обратить внимание на версию платформы. Ошибка XDTO: item часто является следствием внутренних багов сериализации в платформе 8.3.18.1334. Попробуем обновить платформу до более современных и стабильных релизов (например, ветки 8.3.22 или 8.3.24). В новых версиях механизмы взаимодействия «обычного» и «управляемого» режимов были значительно доработаны.
Важный момент: При работе с маркировкой «Честный знак» критически важно, чтобы константа ВестиУчетМаркируемойПродукцииИСМП была установлена в значение Истина. Проверим это программно:
Если Не Константы.ВестиУчетМаркируемойПродукцииИСМП.Получить() Тогда
// Без этой константы формы ИС МП могут работать некорректно
// и вызывать ошибки при попытке инициализации элементов
Возврат;
КонецЕсли;
Подводя итог, можно сказать, что проблема «Значения недопустимого типа» в формах ИС МП чаще всего решается либо исправлением программного кода (отказ от бесконтекстных вызовов при настройке интерфейса), либо техническим обслуживанием базы данных (очистка настроек и кэша). При необходимости комплексной адаптации конфигурации можно применить готовое обновление УТ 10.3 для работы с маркировкой.