При работе с современными конфигурациями на платформе 1С:Предприятие 8.3, такими как Зарплата и управление персоналом 3.1 или Бухгалтерия предприятия 3.0, специалисты часто сталкиваются с необходимостью запуска системы в режиме обычного приложения (толстый клиент). Это может быть продиктовано использованием внешних инструментов, таких как консоль запросов для обычных форм, или специфических обработок. Однако после очередного обновления конфигурации запуск может прерваться критической ошибкой: «Ошибка при вызове метода контекста (ПараметрыРаботыКлиентаПриЗапуске). Попытка передачи мутабельного значения».
В данной статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы работы Библиотеки стандартных подсистем (БСП) и рассмотрим несколько эффективных способов решения ситуации.
Для начала разберем техническую суть происходящего. Ошибка возникает в момент передачи данных от сервера к клиенту. В системе 1С объекты делятся на сериализуемые и мутабельные (изменяемые). К мутабельным относятся объекты, которые не могут быть переданы между контекстами выполнения (например, с сервера на клиент), так как они имеют жесткую привязку к памяти того процесса, в котором были созданы.
Метод ПараметрыРаботыКлиентаПриЗапуске в современных версиях БСП собирает массивную структуру данных, необходимую для инициализации интерфейса: настройки цветов, шрифтов, параметров функциональных опций и прав доступа. Проблема заключается в том, что в режиме Управляемого приложения платформа автоматически «подчищает» или преобразует многие коллекции в их фиксированные (неизменяемые) аналоги при передаче. В режиме же Обычного приложения (толстый клиент) этот механизм автоматического приведения типов часто дает сбой.
Чаще всего виновниками становятся следующие типы данных:
СписокЗначений — который в обычном приложении считается мутабельным при передаче через границу сервера.Как показывает практика и обсуждения на профессиональных форумах, наиболее оперативным решением является корректировка свойств общих модулей, отвечающих за инициализацию параметров БСП. Рассмотрим этот процесс по шагам:
СтандартныеПодсистемыВызовСервера. Именно в нем чаще всего происходит сбой при попытке вернуть структуру параметров на клиент.Важное примечание: Если флаг Клиент (обычное приложение) недоступен для редактирования (серого цвета), выполним следующие действия:
Если конфигурация снята с поддержки или вы используете расширение, более правильным с точки зрения архитектуры будет принудительное преобразование возвращаемых данных в неименяемые типы. Разберем, как это реализовать в коде функции ПараметрыРаботыКлиентаПриЗапуске.
Проанализируем пример кода, который предотвращает передачу мутабельных данных путем оборачивания результата в ФиксированнаяСтруктура:
Функция ПараметрыРаботыКлиентаПриЗапуске(Параметры) Экспорт
Результат = Новый Структура;
// ... здесь происходит заполнение структуры параметрами БСП ...
// Перед возвратом преобразуем мутабельные объекты
Для каждого Элемент Из Результат Цикл
Если ТипЗнч(Элемент.Значение) = Тип("СписокЗначений") Тогда
Результат.Вставить(Элемент.Ключ, Новый ФиксированныйСписокЗначений(Элемент.Значение));
КонецЕсли;
КонецЦикла;
Возврат Новый ФиксированнаяСтруктура(Результат);
КонецФункции
Этот метод гарантирует, что платформа не встретит препятствий при сериализации данных для передачи на сторону обычного клиента.
Чтобы не вносить изменения непосредственно в типовую конфигурацию (сохраняя возможность легкого обновления), рекомендуется использовать Расширения конфигурации. Это позволит перехватить выполнение метода и внести правки только для режима обычного приложения.
Создадим расширение и добавим в него метод с аннотацией &После:
&После("ПараметрыРаботыКлиентаПриЗапуске")
Функция Расш1_ПараметрыРаботыКлиентаПриЗапуске(Параметры)
// Проверяем, что мы находимся в режиме обычного приложения
#Если ТолстыйКлиентОбычноеПриложение Тогда
// Если в результате есть ключи, вызывающие ошибку (например, стили или списки),
// мы можем их удалить или заменить.
// Рассмотрим ситуацию с очисткой параметров оформления:
Если ТипЗнч(Результат) = Тип("Структура") Тогда
Если Результат.Свойство("ПараметрыЦветовойСхемы") Тогда
Результат.Удалить("ПараметрыЦветовойСхемы");
КонецЕсли;
КонецЕсли;
#КонецЕсли
Возврат Результат;
КонецФункции
Разберем ситуацию, описанную пользователями: на релизе 3.1.10.50 проблем не было, а на 3.1.10.135 ошибка появилась. Это связано с тем, что разработчики 1С постепенно отказываются от поддержки Толстого клиента (обычное приложение) в современных конфигурациях. В новых версиях БСП (начиная с 3.0.3 и выше) добавляется все больше параметров, специфичных для мобильных клиентов и веб-интерфейсов, которые физически не могут быть адекватно интерпретированы старым механизмом обычного приложения.
Проанализируем рекомендации вендора: компания 1С официально заявляет, что работа в режиме обычного приложения для конфигураций на управляемых формах является «технологическим ограничением». Тем не менее, описанные выше способы позволяют обойти это ограничение для отладки или использования сервисных инструментов.
Для устранения ошибки выполните следующие действия:
СтандартныеПодсистемыВызовСервера — включение флага «Клиент (обычное приложение)» решает проблему в 90% случаев.Результат, содержащий мутабельное значение (например, СписокЗначений).ФиксированнаяСтруктура, ФиксированныйСписокЗначений) для передачи данных.Следование этим инструкциям позволит вам продолжить использование необходимых инструментов в обычном приложении даже на самых современных версиях конфигураций 1С.