При работе с кодами маркировки (Data Matrix) разработчики часто сталкиваются с необходимостью записи в строковые реквизиты кодов, содержащих управляющие символы, такие как Символ(29) (разделитель групп GS). Если в обычных формах это не вызывало проблем, то в управляемом приложении попытка открыть форму такого элемента приводит к критической ошибке: Ошибка передачи данных между клиентом и сервером, сопровождаемой упоминанием ошибки преобразования данных XDTO.
Давайте разберемся, в чем кроется причина. Управляемое приложение 1С построено на архитектуре, где тонкий клиент общается с сервером 1С через протокол, использующий XML-сериализацию. Спецификация XML строго регламентирует допустимые символы внутри текстовых узлов. Управляющие символы ASCII (включая Символ(29)) считаются недопустимыми в стандартном XML-документе. Когда платформа пытается передать значение реквизита на клиент для отображения в форме, парсер XDTO натыкается на «запрещенный» символ и прерывает операцию, так как не может сформировать корректный XML-тег.
Рассмотрим несколько подходов, которые помогут нам обойти это ограничение и обеспечить корректную работу конфигурации.
Это самый архитектурно верный способ. Суть его заключается в разделении ответственности: визуальное отображение и техническое содержимое кода маркировки должны находиться в разных реквизитах.
КодМаркировкиСырой (тип Строка неограниченной длины или ХранилищеЗначения).Наименование записывайте «очищенный» код или его часть, доступную для восприятия пользователем.Если вам критически важно видеть спецсимволы в интерфейсе, можно применить технику экранирования. Перед записью данных в базу, программно заменяйте недопустимые символы на строковые эквиваленты, которые платформа воспринимает спокойно.
Рассмотрим пример реализации функции замены:
Функция ЗаменитьСимволыДляХранения(ИсходнаяСтрока)
// Заменяем символ 29 на текстовый маркер [GS]
Возврат СтрЗаменить(ИсходнаяСтрока, Символ(29), "[GS]");
КонецФункции
Функция ВосстановитьСимволы(СтрокаСЗаменителями)
// Возвращаем реальный символ для сканирования
Возврат СтрЗаменить(СтрокаСЗаменителями, "[GS]", Символ(29));
КонецФункции
Этот метод позволяет безопасно хранить и отображать данные, а при необходимости совершать обратную трансформацию.
Иногда ошибка возникает именно в динамических списках при попытке платформы автоматически получить представление для полей. Вы можете отключить эту опцию, чтобы избежать преждевременной сериализации «проблемных» данных.
Шаги по настройке:
ДинамическийСписок.ПолучениеПредставленияДляНевидимыхПолей.Данный метод помогает устранить ошибку при открытии формы, но является «костыльным» решением, так как не отменяет сам факт наличия недопустимых символов в данных. Используйте его с осторожностью, только если нет возможности изменить структуру хранения данных.
Если вам нужно сохранить исходный код маркировки в максимально полном виде без каких-либо изменений, используйте тип ХранилищеЗначения. Данные в таком реквизите передаются между клиентом и сервером как бинарный поток. Поскольку бинарные данные не подлежат классической XML-сериализации, ограничения на спецсимволы к ним не применяются.
Вывод: для стабильной работы вашего приложения старайтесь избегать хранения спецсимволов в стандартных полях ввода, предназначенных для обычного вывода строк. Наилучшим выбором будет либо очистка данных, либо вынос «сырого» кода в ХранилищеЗначения.