При внедрении Библиотеки стандартных подсистем (БСП) в самописные конфигурации разработчики часто сталкиваются с трудностями, которые не проявляются в файловом варианте, но блокируют работу в клиент-серверном режиме. Одна из самых коварных проблем — ошибка передачи данных между клиентом и сервером, связанная с преобразованием типов 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С. Начиная с версии 2.0, БСП официально ориентирована на работу в Тонком клиенте и Веб-клиенте. Работа управляемых форм БСП в режиме Толстого клиента технически возможна, но не гарантируется и не тестируется вендором.
Тонкий клиент использует более совершенные механизмы оптимизации трафика и сериализации данных. Если ваша задача позволяет, запустите приложение в режиме тонкого клиента, и ошибка с вероятностью 99% исчезнет без внесения правок в код. Это связано с тем, что в Тонком клиенте передача стилей реализована иначе, и платформа корректно сопоставляет системные цвета на обеих сторонах соединения.
Если специфика вашей конфигурации требует использования именно Толстого клиента, нам придется пойти на хитрость и «обмануть» механизм сериализации. Проблема заключается в ссылке на стиль ПоясняющийТекст. Мы можем заменить динамическую ссылку на фиксированное значение цвета в формате RGB.
Разберем, как это сделать программно. В модуле проблемной формы (например, в формах адресного классификатора) найдем процедуру ПриСозданииНаСервере. Нам нужно вручную переопределить цвета для элементов, которые используют данный стиль.
Пример кода для исправления ситуации:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Исправление ошибки передачи стиля ПоясняющийТекст
// Вместо ссылки на стиль устанавливаем конкретный цвет
ЦветПодсказки = Новый Цвет(128, 128, 128); // Серый цвет, аналогичный стандартному
Для Каждого Элемент Из Элементы Цикл
Попытка
Если Элемент.ЦветТекста = ЦветаСтиля.ПоясняющийТекст Тогда
Элемент.ЦветТекста = ЦветПодсказки;
КонецЕсли;
Исключение
// Игнорируем элементы, у которых нет свойства ЦветТекста
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Такой подход исключает передачу объекта ЦветаСтиля.ПоясняющийТекст через границу клиент-сервер, так как Новый Цвет(R, G, B) сериализуется платформой без ошибок.
Иногда корень проблемы кроется в настройках самой конфигурации. Посмотрим на свойства корневого узла метаданных. Если в свойстве Основной стиль ничего не выбрано или выбран стиль, который конфликтует с объектами БСП, платформа может давать сбой при десериализации форм.
ИнформационнаяПанель или создайте свой пустой стиль и назначьте его основным.Это действие часто «пересобирает» внутренние таблицы соответствий типов XDTO и может помочь избежать ошибки без переписывания кода БСП.
Проанализируем влияние платформы. Ошибка преобразования типа Color была признана багом в некоторых релизах ветки 8.3.10 и 8.3.11. Хотя вы используете платформу 8.3.12, установленный режим совместимости с 8.3.10 заставляет систему использовать старые алгоритмы работы с XDTO.
Если ваша конфигурация позволяет, попробуйте выполнить следующие шаги:
1C:Enterprise 8.3 Server Agent и полностью удалить содержимое папок в каталоге snaccxt на сервере (там хранятся сеансовые данные и кешированные описания типов).Подводя итог, можно сказать, что ошибка вызвана попыткой передать специфический объект оформления ПоясняющийТекст в режиме, который платформа считает устаревшим для БСП (Толстый клиент). Наилучшим решением будет переход на Тонкий клиент. Если это невозможно — используйте программную замену цветов в процедуре ПриСозданииНаСервере или экспериментируйте с настройками Основного стиля конфигурации.