При попытке хранения кодов маркировки, таких как DataMatrix или GS1, в регистрах сведений 1С, разработчики часто сталкиваются с критическими ошибками при передаче данных между клиентом и сервером или при открытии динамических списков. Система выдает сообщение об ошибке Текст XML содержит недопустимый символ. Давайте разберемся, почему это происходит и как правильно организовать хранение таких данных.
Основная проблема заключается в том, что коды маркировки DataMatrix содержат внутри себя специальные управляющие символы (например, символ GS — Group Separator, имеющий код 29 в таблице ASCII). Платформа 1С использует XML-сериализацию для обмена данными между клиентской и серверной частями. Стандарт XML жестко регламентирует допустимые символы, и управляющие коды из состава DataMatrix в него не входят.
Когда вы пытаетесь передать массив строк, содержащих такие символы, или вывести их в динамический список, платформа пытается сформировать XML-пакет, сталкивается с «запрещенным» символом и аварийно завершает операцию.
Наиболее надежный архитектурный подход, позволяющий сохранить целостность кода для печати и избежать проблем с XML — использование типа данных ХранилищеЗначений. Мы можем хранить полную строку кода как бинарный объект, что исключает ее интерпретацию системой как текстового XML.
Рассмотрим, как реализовать этот подход на практике:
GTIN и СерийныйНомер).ХранилищеЗначений для хранения полного «сырого» кода.При записи данных преобразуйте строку в двоичные данные, а при чтении — обратно:
// Пример записи в регистр
ТекстКода = "010468...[управляющие символы]...92UNdK...";
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(ТекстКода, "UTF-8");
РесурсХранилище = Новый ХранилищеЗначений(ДвоичныеДанные);
// Пример чтения из регистра
ДвоичныеДанные = РесурсХранилище.Получить();
ТекстКода = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные, "UTF-8");
Для обеспечения быстрого поиска по регистру не стоит использовать всю строку целиком. Стандарт GS1 подразумевает, что код состоит из идентификаторов применения (AI). Разделите код на логические составляющие сразу при загрузке из файла.
Вынесите GTIN, Серийный номер и другие ключевые параметры в отдельные строковые измерения регистра. Это позволит:
Если вы уже столкнулись с ошибкой при открытии формы списка, первым делом проанализируйте запрос этого списка. Если в выборку попадает поле, содержащее «сырой» DataMatrix, система будет пытаться его сериализовать для отображения на форме.
Чтобы исправить это:
ДинамическогоСписка.GTIN, Серийный номер).Применяя данные методы, вы обеспечите стабильную работу вашего расширения и избежите конфликтов с платформенными механизмами обработки строк. Помните, что DataMatrix — это не просто строка, а структурированные данные, поэтому разделение на компоненты является не только технической необходимостью, но и профессиональной практикой разработки в 1С.