Как исправить ошибку загрузки компоненты frame в 1С на Ubuntu Linux?

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

При запуске толстого или тонкого клиента 1С:Предприятие в среде Linux (в частности, на различных дистрибутивах Ubuntu) пользователи и системные администраторы могут столкнуться с критической ошибкой инициализации графической оболочки:

«Ошибка загрузки компоненты frame»

Если выполнить диагностику зависимостей через утилиту ldd для файла frame.so, система выводит сообщение о том, что не найдена требуемая версия интерфейса бинарной совместимости: libstdc++.so.6: version 'CXXABI_1.3.11' not found.

Разберем подробнее, почему возникает данный сбой, проанализируем механизм работы динамических библиотек в 1С и рассмотрим по шагам надежные способы устранения этой проблемы.

Выясним причину ошибки

Компонента frame.so представляет собой графическое ядро клиента платформы 1С. Она связывает внутренние интерфейсные механизмы программы с графической средой операционной системы (библиотеками GTK, WebKitGTK и графическими подсистемами вывода).

Основная причина несовместимости заключается в следующем:

  1. Системные графические библиотеки операционной системы скомпилированы современным компилятором GCC и требуют для работы набор символов CXXABI_1.3.11 (или более новый).
  2. В каталог установки 1С (например, /opt/1C/v8.3/x86_64/ или /opt/1C/v8.3/i386/) по умолчанию включена собственная, более старая сборка библиотеки libstdc++.so.6.
  3. При старте приложения исполняемый файл 1С в первую очередь обращается к локальной библиотеке из собственного каталога. Когда системные компоненты запрашивают современные символы ABI, устаревшая библиотека из комплекта поставки 1С не может их предоставить, и запуск аварийно прерывается.

Диагностика версий ABI в библиотеках

Прежде чем вносить изменения, проверим, какие именно версии ABI поддерживаются системной библиотекой и библиотекой из дистрибутива 1С. Для этого выполним поиск символов с помощью команды strings:


strings /opt/1C/v8.3/x86_64/libstdc++.so.6 | grep CXXABI
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep CXXABI

Если в выводе системной библиотеки присутствует строка CXXABI_1.3.11, а во внутренней библиотеке 1С она отсутствует, значит, для корректной работы клиенту необходимо использовать системную версию библиотеки.

Способ 1. Замена внутренней библиотеки 1С системной ссылкой

Рассмотрим основной способ решения, заключающийся в переименовании встроенного файла и создании символической ссылки на актуальную системную библиотеку. Разберем команды для 64-битной версии платформы:

  1. Перейдем к каталогу с установленной платформой и переименуем оригинальный файл библиотеки:

sudo mv /opt/1C/v8.3/x86_64/libstdc++.so.6 /opt/1C/v8.3/x86_64/libstdc++.so.6.orig
  1. Создадим символическую ссылку на системную библиотеку (точный путь к файлу версии в /usr/lib/x86_64-linux-gnu/ может отличаться в зависимости от установленной версии GCC):

sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /opt/1C/v8.3/x86_64/libstdc++.so.6

Также можно просто удалить или убрать файл libstdc++.so.6 из каталога 1С без создания ссылки — в этом случае загрузчик Linux автоматически найдет нужную библиотеку в системных путях /usr/lib.

Способ 2. Запуск через переменную LD_PRELOAD (без изменения файлов 1С)

Если вы не хотите модифицировать файлы в каталоге /opt/1C/ (например, чтобы избежать перезаписи при установке обновлений платформы), можно использовать механизм предварительной загрузки системной библиотеки через переменную окружения LD_PRELOAD.

Посмотрим на пример команды запуска:

LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 /opt/1C/v8.3/x86_64/1cv8

Данную конструкцию удобно прописать в скрипт запуска или в ярлык рабочего стола (файл с расширением .desktop) в параметре Exec.

Способ 3. Учет разрядности платформы (Multiarch)

Проанализируем ситуацию, когда на 64-битной операционной системе запускается 32-битный клиент 1С (каталог /opt/1C/v8.3/i386/). В таком случае системная 64-битная библиотека не подойдет.

Разберем последовательность действий для 32-битного клиента:

  1. Включим архитектуру i386 и установим соответствующий пакет системных библиотек:

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libstdc++6:i386
  1. Переименуем устаревшую встроенную 32-битную библиотеку 1С:

sudo mv /opt/1C/v8.3/i386/libstdc++.so.6 /opt/1C/v8.3/i386/libstdc++.so.6.orig

Рекомендации по выбору дистрибутива ОС

Для производственных серверов и рабочих мест рекомендуется использовать стабильные выпуски с длительным сроком поддержки (Ubuntu LTS). Промежуточные не-LTS релизы операционных систем часто содержат экспериментальные версии системных библиотек и компиляторов, что может приводить к конфликтам зависимостей в проприетарном программном обеспечении.

← На главную