Как исправить ошибку передачи данных XDTO «ПоясняющийТекст» при внедрении БСП в толстом клиенте?

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

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

Проанализируем ситуацию: суть ошибки

Типичная картина выглядит следующим образом: при попытке открыть управляемую форму (например, форму подбора адреса из состава БСП) система выдает ошибку: «Ошибка при вызове метода контекста (ОткрытьФорму) по причине: Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа». В детальном описании мы видим проблему с XDTO-сериализацией: Значение: {http://v8.1c.ru/8.1/data/ui/style}ПоясняющийТекст Тип: {http://v8.1c.ru/8.1/data/ui}Color.

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

Почему в файловой базе все работает?

Рассмотрим, почему разработчик не видит этой проблемы при локальной отладке. В файловом варианте работы 1С физическая граница между клиентом и сервером отсутствует. Весь код выполняется в рамках одного адресного пространства, и процесса сериализации/десериализации данных через XDTO просто не происходит. Как только база переносится на сервер (SQL), протокол обмена становится строгим, и любые недопустимые типы в контексте формы вызывают аварийное завершение метода ОткрытьФорму.

Решение 1: Переход на Тонкий клиент

Это самый правильный и рекомендуемый путь. Проанализируем архитектуру современных библиотек от 1С. Начиная с версии 2.0, БСП официально ориентирована на работу в Тонком клиенте и Веб-клиенте. Работа управляемых форм БСП в режиме Толстого клиента технически возможна, но не гарантируется и не тестируется вендором.

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

Решение 2: Программная замена стилей на абсолютные цвета

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

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

Пример кода для исправления ситуации:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Исправление ошибки передачи стиля ПоясняющийТекст
    // Вместо ссылки на стиль устанавливаем конкретный цвет
    ЦветПодсказки = Новый Цвет(128, 128, 128); // Серый цвет, аналогичный стандартному
    
    Для Каждого Элемент Из Элементы Цикл
        Попытка
            Если Элемент.ЦветТекста = ЦветаСтиля.ПоясняющийТекст Тогда
                Элемент.ЦветТекста = ЦветПодсказки;
            КонецЕсли;
        Исключение
            // Игнорируем элементы, у которых нет свойства ЦветТекста
        КонецПопытки;
    КонецЦикла;

КонецПроцедуры

Такой подход исключает передачу объекта ЦветаСтиля.ПоясняющийТекст через границу клиент-сервер, так как Новый Цвет(R, G, B) сериализуется платформой без ошибок.

Решение 3: Настройка основного стиля конфигурации

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

  1. Откройте свойства конфигурации (правой кнопкой на самом верхнем элементе дерева метаданных).
  2. Найдите пункт Основной стиль.
  3. Попробуйте установить его в значение ИнформационнаяПанель или создайте свой пустой стиль и назначьте его основным.
  4. Сохраните конфигурацию и обновите базу данных.

Это действие часто «пересобирает» внутренние таблицы соответствий типов XDTO и может помочь избежать ошибки без переписывания кода БСП.

Решение 4: Повышение режима совместимости и очистка кеша

Проанализируем влияние платформы. Ошибка преобразования типа Color была признана багом в некоторых релизах ветки 8.3.10 и 8.3.11. Хотя вы используете платформу 8.3.12, установленный режим совместимости с 8.3.10 заставляет систему использовать старые алгоритмы работы с XDTO.

Если ваша конфигурация позволяет, попробуйте выполнить следующие шаги:

  1. Повысьте режим совместимости до значения «Не использовать» или до актуальной версии платформы (например, 8.3.12). Это обновит правила сериализации.
  2. Очистите серверный кеш. Обычного передобавления базы в список недостаточно. Необходимо остановить службу 1C:Enterprise 8.3 Server Agent и полностью удалить содержимое папок в каталоге snaccxt на сервере (там хранятся сеансовые данные и кешированные описания типов).

Резюме по решению

Подводя итог, можно сказать, что ошибка вызвана попыткой передать специфический объект оформления ПоясняющийТекст в режиме, который платформа считает устаревшим для БСП (Толстый клиент). Наилучшим решением будет переход на Тонкий клиент. Если это невозможно — используйте программную замену цветов в процедуре ПриСозданииНаСервере или экспериментируйте с настройками Основного стиля конфигурации.

← На главную