Как сохранить в наименовании элемента справочника скрытые символы в управляемых формах 1С?

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

При работе с кодами маркировки (Data Matrix) разработчики часто сталкиваются с необходимостью записи в строковые реквизиты кодов, содержащих управляющие символы, такие как Символ(29) (разделитель групп GS). Если в обычных формах это не вызывало проблем, то в управляемом приложении попытка открыть форму такого элемента приводит к критической ошибке: Ошибка передачи данных между клиентом и сервером, сопровождаемой упоминанием ошибки преобразования данных XDTO.

Почему возникает данная ошибка?

Давайте разберемся, в чем кроется причина. Управляемое приложение 1С построено на архитектуре, где тонкий клиент общается с сервером 1С через протокол, использующий XML-сериализацию. Спецификация XML строго регламентирует допустимые символы внутри текстовых узлов. Управляющие символы ASCII (включая Символ(29)) считаются недопустимыми в стандартном XML-документе. Когда платформа пытается передать значение реквизита на клиент для отображения в форме, парсер XDTO натыкается на «запрещенный» символ и прерывает операцию, так как не может сформировать корректный XML-тег.

Методы решения проблемы

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

1. Хранение «чистых» данных отдельно от представления

Это самый архитектурно верный способ. Суть его заключается в разделении ответственности: визуальное отображение и техническое содержимое кода маркировки должны находиться в разных реквизитах.

  1. Создайте реквизит КодМаркировкиСырой (тип Строка неограниченной длины или ХранилищеЗначения).
  2. В реквизит Наименование записывайте «очищенный» код или его часть, доступную для восприятия пользователем.
  3. При необходимости использования «сырого» кода с разделителями (например, для печати на сканере), извлекайте его из специализированного реквизита, минуя механизмы визуального отображения управляемой формы.

2. Замена спецсимволов на «заменители»

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

Рассмотрим пример реализации функции замены:


Функция ЗаменитьСимволыДляХранения(ИсходнаяСтрока)
    // Заменяем символ 29 на текстовый маркер [GS]
    Возврат СтрЗаменить(ИсходнаяСтрока, Символ(29), "[GS]");
КонецФункции

Функция ВосстановитьСимволы(СтрокаСЗаменителями)
    // Возвращаем реальный символ для сканирования
    Возврат СтрЗаменить(СтрокаСЗаменителями, "[GS]", Символ(29));
КонецФункции

Этот метод позволяет безопасно хранить и отображать данные, а при необходимости совершать обратную трансформацию.

3. Настройка динамического списка

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

Шаги по настройке:

  1. Откройте форму списка справочника в Конфигураторе.
  2. Найдите элемент управления ДинамическийСписок.
  3. Перейдите в свойства и снимите флаг ПолучениеПредставленияДляНевидимыхПолей.

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

4. Использование ХранилищаЗначений

Если вам нужно сохранить исходный код маркировки в максимально полном виде без каких-либо изменений, используйте тип ХранилищеЗначения. Данные в таком реквизите передаются между клиентом и сервером как бинарный поток. Поскольку бинарные данные не подлежат классической XML-сериализации, ограничения на спецсимволы к ним не применяются.

Вывод: для стабильной работы вашего приложения старайтесь избегать хранения спецсимволов в стандартных полях ввода, предназначенных для обычного вывода строк. Наилучшим выбором будет либо очистка данных, либо вынос «сырого» кода в ХранилищеЗначения.

← На главную