При работе с современными редакциями конфигураций, такими как Зарплата и управление персоналом 3.1 или Бухгалтерия предприятия 3.0, многие технические специалисты сталкиваются с необходимостью запуска системы в режиме Толстый клиент (обычное приложение). Это требуется для использования старых внешних обработок, консолей запросов или специфических инструментов отладки, которые не поддерживают управляемый интерфейс.
Однако после очередного обновления платформы или релиза конфигурации (начиная с версий БСП 3.0 и выше) запуск в этом режиме может прерываться критической ошибкой APPCRASH в модуле ecsui.dll или сообщением о попытке передачи мутабельного значения. В этой статье мы подробно разберем причины этой проблемы и рассмотрим пошаговые инструкции по её устранению.
Прежде всего, проанализируем техническую сторону вопроса. Ошибка APPCRASH с кодом исключения c0000005 в модуле ecsui.dll свидетельствует о нарушении доступа к памяти при попытке отрисовки интерфейса. В новых версиях платформы 8.3.13 и выше механизмы взаимодействия клиента и сервера в обычном приложении претерпели изменения.
Основная причина кроется в работе Библиотеки Стандартных Подсистем (БСП). Рассмотрим ситуацию: при запуске системы вызывается метод ПараметрыРаботыКлиентаПриЗапуске(). В современных типовых решениях этот метод возвращает структуру, содержащую вложенные коллекции (например, Соответствие или Структура), которые в режиме обычного приложения платформа пытается передать с сервера на клиент «как есть».
Выясним причину ошибки: в управляемом приложении этот процесс оптимизирован, но в обычном приложении срабатывает строгая проверка на мутабельность (изменяемость) объектов. Как только платформа встречает в возвращаемом результате объект, который нельзя однозначно сериализовать для передачи между контекстами в данном режиме, работа приложения аварийно завершается.
Рассмотрим первый и наиболее корректный с точки зрения программирования способ решения проблемы. Нам необходимо изменить механизм передачи данных в общих модулях, чтобы избежать прямой передачи мутабельных структур. Разберем ситуацию на примере модуля СтандартныеПодсистемыВызовСервера.
Для реализации этого метода нам потребуется внести изменения в две функции: ПараметрыРаботыКлиентаПриЗапуске и ПараметрыРаботыКлиента. Мы заменим прямой возврат структуры на возврат адреса во временном хранилище.
Пошаговый алгоритм действий:
СтандартныеПодсистемыВызовСервера.Пример модифицированного кода для сервера:
Функция ПараметрыРаботыКлиентаПриЗапуске(Параметры) Экспорт
Результат = Новый Структура;
// ... стандартная логика формирования параметров ...
Если ТекущийРежимЗапуска() = РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Тогда
Возврат ПоместитьВоВременноеХранилище(Результат);
Иначе
Возврат Результат;
КонецЕсли;
КонецФункции
В этом случае на клиенте, в модуле СтандартныеПодсистемыКлиентПовтИсп, нам нужно будет проверить: если полученное значение является строкой (адресом), то данные нужно извлечь методом ПолучитьИзВременногоХранилища(). Важно использовать ключевое слово ЗНАЧ в параметрах функций, чтобы принудительно исключить возврат мутабельных данных обратно на сервер.
Проанализируем второй способ, который подходит в случаях, когда толстый клиент нужен исключительно для работы с внешними инструментами и полная инициализация всех подсистем БСП не требуется. Этот метод быстрее в реализации, так как требует меньше правок кода.
Разберем по шагам внесение изменений:
СтандартныеПодсистемыВызовСервера и установим флаг Клиент (обычное приложение). Это позволит модулю компилироваться в нужном нам контексте.Пример программного кода для вставки:
// В начале процедуры инициализации параметров клиента
Если ТекущийРежимЗапуска() = РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Тогда
// Прерываем дальнейшее выполнение стандартной логики БСП,
// которая несовместима с обычными формами
Возврат;
КонецЕсли;
Такой подход позволяет «обмануть» систему: платформа запускается, но тяжеловесные механизмы БСП, предназначенные для управляемого интерфейса (обновление интерфейса, настройка рабочего стола, мониторинг производительности), просто не включаются. Это предотвращает вызов библиотеки ecsui.dll с некорректными параметрами и устраняет APPCRASH.
Рассмотрим более современный подход, который позволяет избежать внесения изменений в основную конфигурацию, что особенно важно для типовых решений, находящихся на поддержке. Мы можем перенести описанные выше изменения в Расширение.
Преимущества использования расширений:
Для этого создадим новое расширение, заимствуем в него нужные методы модуля СтандартныеПодсистемыВызовСервера и используем аннотацию &Вместо. Внутри метода пропишем логику из первого или второго способа. Обратите внимание, что даже внутри расширения для обычных форм могут потребоваться специфические настройки прав доступа.
Проанализируем ситуацию, когда правка кода не помогает. В некоторых случаях падение ecsui.dll в клиент-серверном варианте работы вызвано кэшированием метаданных на стороне сервера или клиента. Посмотрим, какие профилактические действия стоит предпринять:
/ClearCache. Это принудительно обновит локальные копии метаданных, которые могли быть повреждены при обновлении.Подведем итог: проблема запуска толстого клиента в современных конфигурациях вызвана тем, что разработчики 1С официально переориентировали БСП на работу исключительно в управляемом режиме. Однако, используя предложенные методы модификации параметров запуска через временное хранилище или прерывание инициализации, мы можем успешно продолжать использовать привычные инструменты в режиме обычного приложения.