При администрировании распределенных баз данных 1С часто возникает задача автоматизации процесса обновления конфигурации. Типичный сценарий выглядит следующим образом: в работающем сеансе в режиме «Предприятие» инициируется завершение работы пользователей, после чего вызывается Конфигуратор для выполнения обновления (например, из хранилища конфигурации или файла) с последующим автоматическим перезапуском системы в пользовательском режиме.
Для реализации этого сценария разработчики используют метод платформы ЗавершитьРаботуСистемы(), передавая в него параметры командной строки. В параметрах указывается запуск в режиме DESIGNER (Конфигуратор) для обновления базы данных, а также ключ /RunEnterprise, который должен запустить режим «Предприятие» (ENTERPRISE) сразу после успешного завершения обновления.
Однако на практике этот механизм может вести себя нестабильно. Рассмотрим ситуацию: при одновременном запуске процедуры обновления на нескольких десятках рабочих мест (например, на торговых точках) часть из них успешно завершает процесс, а на остальных запуск «Предприятия» прерывается окном авторизации с ошибкой неверного логина или пароля. Выясним, почему возникает эта проблема и как ее решить.
Проанализируем механику работы платформы «1С:Предприятие 8.3» при передаче параметров командной строки через системные вызовы. Нестабильное («рандомное») проявление ошибки на разных компьютерах указывает на влияние окружения операционной системы и нюансы разбора аргументов командной строки.
"Администратор"), то корректность ее передачи зависит от настроек системной локали Windows для программ, не поддерживающих Юникод (Active Code Page). Если на некоторых компьютерах установлена англоязычная локаль или MUI-версия операционной системы без правильной настройки региональных стандартов, операционная система передает кириллическое имя пользователя в неверной кодировке (например, CP1252 вместо CP1251). В итоге платформа получает искаженное имя пользователя (набор нечитаемых символов), тогда как цифровой или латинский пароль (например, "123") передается без искажений. Это объясняет, почему при ручном вводе пароля под корректно выбранным пользователем вход выполняется успешно./RunEnterprise. Синтаксис передачи параметров внутрь ключа /RunEnterprise требует вложенного экранирования. Кавычки должны экранироваться несколько раз (в коде 1С, затем при передаче в операционную систему и далее парсеру самой платформы). Малейшая ошибка в количестве кавычек приводит к тому, что парсер командной строки Windows некорректно группирует параметры, обрезая имя пользователя или пароль на первом же пробеле или спецсимволе./Out и /DumpResult). При перезапуске платформы Конфигуратор и запускаемое им Предприятие могут одновременно обращаться к одному и тому же файлу логов. Если процесс Конфигуратора еще не успел полностью завершиться и освободить дескриптор файла, указанного в параметре /Out, запускающийся процесс Предприятия аварийно останавливает запуск или сбрасывает параметры авторизации./WA). Если у текущего пользователя операционной системы нет соответствующих прав в базе данных 1С, возникнет окно с ошибкой доступа.Рассмотрим детально способы решения этой проблемы — от простых организационных мер до кардинального изменения архитектуры скрипта обновления.
Самый простой и надежный способ избежать проблем с кодировкой символов при передаче через системные параметры — отказаться от использования кириллицы в именах служебных учетных записей. Создадим специального пользователя для автоматизации с правами администратора, имя которого состоит только из латинских букв.
Выполним следующие шаги:
AdminUpdate (или RobotUpdate)./N "Администратор" укажем /N "AdminUpdate".Латинские символы имеют одинаковую кодировку во всех основных кодовых страницах (ANSI, OEM, UTF-8), поэтому имя пользователя гарантированно будет передано без искажений на любом компьютере независимо от региональных настроек Windows.
Чтобы исключить влияние учетных записей операционной системы при возникновении ошибок разбора параметров командной строки, рекомендуется принудительно отключать Windows-аутентификацию с помощью ключа /WA- в параметрах запуска «Предприятия». Это заставит систему использовать только те параметры, которые переданы в явном виде.
Модифицируем строку запуска следующим образом:
/RunEnterprise "ENTERPRISE /WA- /N""Администратор"" /P""123"" /Out"""" /DumpResult"""""
Обратите внимание на конструкцию /WA-. Она гарантирует, что платформа проигнорирует текущего пользователя Windows и будет пытаться войти исключительно под учетной записью 1С.
Наиболее устойчивым к сбоям и профессиональным решением является отказ от использования вложенного параметра /RunEnterprise внутри метода ЗавершитьРаботуСистемы(). Передача параметров «через матрешку» (Предприятие -> Конфигуратор -> Предприятие) крайне чувствительна к блокировкам файлов и синтаксису кавычек.
Вместо этого мы можем использовать схему с динамическим формированием внешнего командного файла (батника), который последовательно выполнит запуск процессов обновления и последующего старта системы.
Разберем по шагам, как реализовать этот подход на языке 1С:
update.bat.chcp 1251), что решает любые проблемы с кодировками.Рассмотрим пример программного кода, который формирует и запускает такой командный файл:
// Определим пути к технологическим файлам
ПутьККаталогу = ДиректорияВременныхФайлов();
ИмяФайлаСкрипта = ПутьККаталогу + "update_1c.bat";
ФайлЛога = "D:\update1C.log";
ФайлРезультата = "D:\DumpResult.log";
// Формируем текст бат-файла
ТекстСкрипта = Новый ТекстовыйДокумент;
ТекстСкрипта.ДобавитьСтроку("@echo off");
// Установим кодировку Windows-1251 для поддержки кириллицы в консоли
ТекстСкрипта.ДобавитьСтроку("chcp 1251 > nul");
// Сделаем небольшую паузу перед стартом для корректного закрытия текущего сеанса 1С
ТекстСкрипта.ДобавитьСтроку("timeout /t 5 /nobreak > nul");
// Строка запуска Конфигуратора для обновления
СтрокаКонфигуратора = """C:\Program Files\1cv8\common\1cestart.exe"" DESIGNER "
+ "/F ""ПутьКВашейБазе"" "
+ "/N ""Администратор"" /P ""123"" "
+ "/ConfigurationRepositoryF ""http://блабла.ru/retail_prod"" "
+ "/ConfigurationRepositoryN ""Точка 1"" /ConfigurationRepositoryP """" "
+ "/ConfigurationRepositoryBindCfg -forceBindAlreadyBindedUser -forceReplaceCfg "
+ "/ConfigurationRepositoryUpdateCfg -force /UpdateDBCfg "
+ "/Out """ + ФайлЛога + """ -NoTruncate /DumpResult """ + ФайлРезультата + """";
ТекстСкрипта.ДобавитьСтроку(СтрокаКонфигуратора);
// Пауза после закрытия конфигуратора, чтобы освободить дескрипторы файлов
ТекстСкрипта.ДобавитьСтроку("timeout /t 3 /nobreak > nul");
// Строка запуска Предприятия после успешного обновления
СтрокаПредприятия = """C:\Program Files\1cv8\common\1cestart.exe"" ENTERPRISE "
+ "/F ""ПутьКВашейБазе"" "
+ "/WA- /N ""Администратор"" /P ""123""";
ТекстСкрипта.ДобавитьСтроку(СтрокаПредприятия);
// Самоудаление бат-файла после выполнения
ТекстСкрипта.ДобавитьСтроку("del ""%~f0""");
// Записываем файл в кодировке ANSI (Важно для корректной интерпретации chcp 1251)
ТекстСкрипта.Записать(ИмяФайлаСкрипта, КодировкаТекста.ANSI);
// Запускаем внешний файл на исполнение
ЗапуститьПриложение(ИмяФайлаСкрипта);
// Завершаем текущий сеанс работы 1С штатно
ЗавершитьРаботуСистемы(Ложь);
Проанализируем преимущества данного подхода. Во-первых, использование явной кодировки КодировкаТекста.ANSI при записи файла в сочетании с директивой chcp 1251 гарантирует, что имя пользователя "Администратор" распознается командным интерпретатором Windows безошибочно на любом компьютере. Во-вторых, использование команды timeout позволяет выдержать гарантированную паузу между процессами. Процесс Предприятия запустится только тогда, когда процесс Конфигуратора завершит работу и полностью освободит системные ресурсы, включая файлы журналов регистрации и блокировок базы данных.
Таким образом, комбинируя переход на латинские имена служебных пользователей или вынося логику обновления во внешний командный сценарий, мы полностью исключаем влияние локальных настроек операционной системы и обеспечиваем стабильное прохождение обновлений на всех рабочих станциях распределенной информационной системы.