При администрировании инфраструктуры 1С:Предприятие часто возникает необходимость поддерживать несколько различных версий платформ на одном рабочем месте или сервере. Особенно это актуально для компаний, использующих кастомные или сильно измененные конфигурации старых поколений, которые по разным причинам экономически нецелесообразно переводить на современные релизы 1С 8.3. Однако в процессе развертывания старых платформ мы можем столкнуться с неожиданными системными сбоями.
В этой статье мы подробно проанализируем одну из самых распространенных и неочевидных проблем, возникающих при попытке установить платформу 1С:Предприятие 8.2 (например, релиз 8.2.19.130) на компьютер под управлением операционной системы Windows, где ранее уже была успешно развернута более новая ветка платформы — 1С:Предприятие 8.3. В процессе инсталляции процесс прерывается критическим сообщением: «Windows Error: Ошибка исполнения функции», после чего программа установки выполняет откат изменений (rollback) и завершает работу.
Давайте подробно разберем, почему возникает эта ошибка, изучим лог-файлы установщика, выясним внутренние механизмы конфликта версий и рассмотрим несколько эффективных способов решения этой проблемы.
Для того чтобы понять природу возникновения ошибки, нам недостаточно стандартного диалогового окна Windows Installer, которое сообщает лишь об общем сбое. Давайте запустим установку платформы через командную строку с ведением подробного протоколирования (дебаг-лога). Для этого мы будем использовать утилиту командной строки msiexec.exe или запустим непосредственно исполняемый файл дистрибутива с соответствующим ключом.
Для запуска подробного логирования выполним в командной консоли следующую команду:
D:\8.2.19.130\setup.exe /debuglog C:\debuglog.txt
После воспроизведения ошибки и аварийного завершения программы установки давайте откроем созданный файл C:\debuglog.txt и проанализируем его содержимое. В логе мы увидим стандартную последовательность действий Windows Installer: инициализацию интерфейса, проверку прав доступа, сопоставление путей. Но самый критический участок лога выглядит следующим образом:
MSI (c) (D4:C0) [22:09:41:851]: Doing action: customReadInstalledComponents
Начало действия 22:09:41: customReadInstalledComponents.
MSI (c) (D4:EC) [22:09:41:889]: Invoking remote custom action. DLL: C:\Users\Andry\AppData\Local\Temp\MSIBD4E.tmp, Entrypoint: readInstalledComponents
MSI (c) (D4!D0) [22:09:41:978]: PROPERTY CHANGE: Adding DESIGNERALLCLIENTS property. Its value is '1'.
MSI (c) (D4!D0) [22:09:42:009]: PROPERTY CHANGE: Adding THINCLIENTFILE property. Its value is '0'.
...
MSI (c) (D4!D0) [22:09:42:126]: PROPERTY CHANGE: Adding SERVERCLIENT property. Its value is '0'.
MSI (c) (D4!D0) [22:16:23:367]: Transforming table Error.
MSI (c) (D4!D0) [22:16:23:392]: Продукт: 1C:Enterprise 8.2 (8.2.19.130) -- Windows Error: Ошибка исполнения функции.
CustomAction customReadInstalledComponents returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)
Завершение действия 22:16:23: customReadInstalledComponents. Возвращенное значение 3.
Давайте внимательно проанализируем этот фрагмент. Мы видим, что инсталлятор успешно запускает внешнее кастомное действие (Custom Action) под названием customReadInstalledComponents. Данная функция реализована во временной динамической библиотеке 1С (DLL) и предназначена для считывания параметров уже установленных в системе компонентов платформы.
Программа обращается к общему конфигурационному файлу программы запуска — 1CEStart.cfg, который хранит глобальные настройки для всех установленных версий 1С:Предприятия. Однако на этапе парсинга файла библиотека аварийно завершает свою работу с системным кодом ошибки 1603, что транслируется пользователю как «Windows Error: Ошибка исполнения функции».
Основным виновником сбоя является конфликт форматов данных между релизами платформ 8.2 и 8.3 в общем конфигурационном файле 1CEStart.cfg. Данный файл физически располагается по пути:
C:\ProgramData\1C\1CEStart\1CEStart.cfg
Когда в операционной системе устанавливается современная платформа 1С:Предприятие 8.3 (особенно релизы ветки 8.3.9 и новее), инсталлятор записывает в этот файл специфический параметр конфигурации, регулирующий права административного доступа при установке тонких и толстых клиентов:
ADMINISTRATIONFUNC=0 (или ADMINISTRATIONFUNC=1)
Этот параметр сообщает стартеру и будущим программам установки, нужно ли разворачивать утилиты администрирования. Однако во времена активной разработки и поддержки платформы версии 8.2 такого параметра еще не существовало. Парсер конфигурационных файлов, встроенный в инсталлятор версии 8.2, написан без учета возможности появления неизвестных ему ключей конфигурации. Встречая строку ADMINISTRATIONFUNC, парсер не может корректно ее интерпретировать, что вызывает необрабатываемое исключение (Unhandled Exception) внутри библиотеки установщика 1С. В результате вся инсталляция аварийно прерывается.
Теперь, когда мы досконально выяснили техническую причину сбоя, давайте рассмотрим практические методы решения проблемы.
Самым аккуратным и правильным с технической точки зрения решением является удаление проблемной строки из файла конфигурации. Это позволит нам сохранить все существующие настройки запуска баз данных и установленные компоненты платформы 8.3, одновременно открыв дорогу для инсталляции 8.2.
Давайте выполним эту процедуру по шагам:
C:\ProgramData по умолчанию является скрытой в операционной системе Windows. Чтобы быстро перейти в нее, мы рекомендуем нажать сочетание клавиш Win + R на клавиатуре, ввести в открывшемся окне «Выполнить» строку %ProgramData%\1C\1CEStart и нажать кнопку «ОК» или клавишу Enter.ProgramData относится к системным ресурсам, обычное редактирование файлов в нем ограничено политиками безопасности Windows. Если вы просто дважды кликните по файлу 1CEStart.cfg и отредактируете его в стандартном Блокноте, система не позволит вам сохранить изменения напрямую. Она либо предложит сохранить файл в другое место, либо задействует механизм виртуализации UAC (VirtualStore). В последнем случае измененная копия запишется в профиль пользователя, а оригинальный проблемный файл останется нетронутым в системной директории, и инсталлятор 1С снова упадет с ошибкой. Поэтому найдите Блокнот (или Notepad++) в меню «Пуск», кликните по нему правой кнопкой мыши и выберите пункт «Запуск от имени администратора».C:\ProgramData\1C\1CEStart. Обязательно переключите тип отображаемых файлов в диалоговом окне на «Все файлы (*.*)». Откройте файл 1CEStart.cfg.ADMINISTRATIONFUNC=0 (или с единицей на конце). Полностью удалите эту строку из файла.После выполнения этих шагов вы можете смело запускать стандартный инсталлятор 1С:Предприятие 8.2 — установка пройдет быстро и без каких-либо ошибок.
Если на обслуживаемом компьютере нет критически важных глобальных настроек запуска или вы не хотите тратить время на ручной поиск и редактирование строк кода внутри конфигурационных файлов, можно воспользоваться официальным обходным маневром, который рекомендует сама компания 1С.
Давайте рассмотрим этот алгоритм:
C:\ProgramData\1C\1CEStart\.1CEStart.cfg и переименуем его в любое другое произвольное имя, например в 1CEStart.cfg.bak или 1CEStart_temp.cfg.1CEStart.cfg, кастомное действие customReadInstalledComponents отработает корректно на "чистом листе" и не вызовет сбоев. Программа установки успешно завершит свою работу.C:\ProgramData\1C\1CEStart\. Инсталлятор версии 8.2 создал в процессе работы новый чистый файл 1CEStart.cfg. Нам необходимо удалить этот вновь созданный файл и вернуть оригинальное имя нашему старому файлу (переименовать 1CEStart.cfg.bak обратно в 1CEStart.cfg).ADMINISTRATIONFUNC, чтобы в будущем при обновлении или переустановке платформ мы вновь не столкнулись с аналогичным поведением системы.Проводя аудит рабочих мест пользователей, мы можем столкнуться со специфическим поведением операционной системы, когда на компьютер устанавливается учебная версия платформы (например, при обучении по популярным методическим пособиям разработчика). В этом случае структура каталогов и конфигурационных файлов будет иметь небольшое отличие.
Давайте обратим внимание на этот важный нюанс. При развертывании учебного релиза платформы 1С:Предприятие 8.2 глобальные параметры инсталляции сохраняются в папке с измененным именем, содержащим дублирующуюся букву «t» на конце названия директории запуска:
C:\ProgramData\1C\1CEStartt\1CEStart.cfg
Если вы столкнулись с ошибкой исполнения функции при развертывании учебного пакета, процедуру очистки параметра ADMINISTRATIONFUNC или переименования конфигурационного файла необходимо проводить именно в папке 1CEStartt. В остальном методика исправления полностью совпадает со стандартными коммерческими версиями платформ.
Для системных администраторов, обеспечивающих развертывание программного обеспечения в доменной сети предприятия, ручное редактирование конфигурационных файлов на десятках или сотнях рабочих станций не представляется возможным. В такой ситуации мы можем автоматизировать процесс обхода ошибки с помощью командного сценария.
Давайте проанализируем пример пакетного файла (BAT-скрипта), который можно запускать централизованно через групповые политики (GPO) или системы автоматизированного развертывания ПО. Скрипт временно убирает мешающий конфигурационный файл, производит тихую установку платформы 8.2 из сетевого каталога дистрибутивов и затем производит очистку оригинального конфигурационного файла, возвращая его на место.
Рассмотрим структуру такого скрипта:
@echo off
set "cfgPath=C:\ProgramData\1C\1CEStart"
set "cfgFile=%cfgPath%\1CEStart.cfg"
set "cfgTemp=%cfgPath%\1CEStart.tmp"
:: Шаг 1: Если файл конфигурации существует, временно переименовываем его
if exist "%cfgFile%" (
ren "%cfgFile%" "1CEStart.tmp"
)
:: Шаг 2: Запуск тихой установки платформы 8.2 с нужными параметрами компонентов
msiexec.exe /i "D:\8.2.19.130\1CEnterprise 8.2.msi" /passive TRANSFORMS="1049.mst" DESIGNERALLCLIENTS=1 THINCLIENT=0 THINCLIENTFILE=0 SERVER=0 WEBSERVEREXT=0 CONFREPOSSERVER=0 SERVERCLIENT=0 CONVERTER77=0 LANGUAGES=RU
:: Шаг 3: Удаляем автоматически созданный инсталлятором чистый файл 1CEStart.cfg
if exist "%cfgFile%" (
del /f /q "%cfgFile%"
)
:: Шаг 4: Возвращаем наш исходный файл конфигурации на место
if exist "%cfgTemp%" (
ren "%cfgTemp%" "1CEStart.cfg"
)
:: Шаг 5: Скриптовое удаление строки ADMINISTRATIONFUNC из восстановленного файла
if exist "%cfgFile%" (
powershell -Command "(Get-Content '%cfgFile%') | Where-Object { $_ -notmatch 'ADMINISTRATIONFUNC' } | Set-Content '%cfgFile%'"
)
Давайте разберем, как работает этот сценарий. Сначала мы проверяем наличие конфигурационного файла, созданного платформой 8.3. Если он есть, мы переименовываем его в файл с расширением .tmp. На втором шаге мы вызываем службу Windows Installer для развертывания платформы 8.2 в тихом режиме (ключ /passive), жестко зафиксировав необходимые компоненты и языковые пакеты.
После завершения установки 8.2 мы удаляем созданный инсталлятором шаблонный пустой файл конфигурации и возвращаем наш исходный рабочий файл из временного расширения .tmp назад в .cfg. В завершение мы используем короткую команду PowerShell для того, чтобы автоматически вырезать из оригинального файла строку с параметром ADMINISTRATIONFUNC. Таким образом, мы получаем полностью рабочие платформы обеих версий без потери пользовательских настроек списков баз данных.
Иногда после успешного завершения инсталляции платформы 8.2 с использованием вышеописанных методов системные администраторы могут столкнуться с тем, что старые информационные базы все равно отказываются запускаться. При попытке старта может появляться сообщение о несовместимости версий или невозможности запустить исполняемый файл.
В этом случае мы рекомендуем выполнить следующие действия:
8.2. Если там пусто, стартер по умолчанию будет пытаться запустить базу под платформой 8.3, что может приводить к ошибкам конвертации формата базы данных.%userprofile%\AppData\Local\1C\1cv82 и %userprofile%\AppData\Roaming\1C\1cv82.Подводя итог, можно сделать вывод, что совместное сосуществование различных поколений программных продуктов 1С:Предприятие вполне реально и стабильно, если знать тонкости работы системных файлов конфигурации и вовремя устранять конфликты форматов данных.