Как правильно дописать строку в файл 1CEStart.cfg из bat-файла в кодировке UTF-16 LE без склеивания строк

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

При автоматизации развертывания и настройки рабочих мест пользователей платформы «1С:Предприятие» системные администраторы часто сталкиваются с необходимостью динамического редактирования конфигурационного файла 1CEStart.cfg. Этот файл располагается в профиле каждого пользователя по пути %APPDATA%\1C\1CEStart\1CEStart.cfg и отвечает за ключевые параметры запуска платформы, включая пути к общим спискам информационных баз (файлам .v8i).

Основная сложность работы с этим файлом заключается в его кодировке. Платформа «1С» сохраняет свои конфигурационные файлы в двухбайтовом формате UTF-16 Little Endian (в среде Windows часто обозначаемом как UCS-2 LE) с обязательным маркером последовательности байтов BOM (Byte Order Mark). Попытки добавить строки в такой файл с помощью стандартных скриптов командной строки (.bat или .cmd) часто приводят к двум неприятным последствиям: новые параметры либо приклеиваются «хвостом» к предыдущей строке, ломая синтаксис файла, либо в документе появляются лишние пустые строки.

В этой статье мы подробно разберем физические причины такого поведения командного интерпретатора Windows, проанализируем структуру файлов конфигурации на уровне байтов и предложим несколько надежных вариантов решения этой задачи — от классического CMD до современного PowerShell и встроенных механизмов самой платформы «1С».

Выясняем причину: почему CMD некорректно дописывает строки

Посмотрим на поведение стандартного командного файла. По умолчанию консоль Windows работает в однобайтовой кодировке (например, CP866 или CP1251). Для работы с Юникодом в cmd.exe предусмотрен ключ /U, который заставляет внутренние команды выводить данные в формате UTF-16 LE.

Администраторы часто пытаются использовать следующую конструкцию для добавления пути к общей базе:


cmd /U /C echo CommonInfoBases=\\server\share\ibases.v8i>>"%Appdata%\1C\1CEStart\1CEStart.cfg"

При этом результатом часто становится склеивание добавленной строки с последней строкой файла. Если же администратор пытается принудительно вставить перевод строки с помощью echo. перед записью основного параметра, то в файле образуются лишние пустые строки:


cmd /U /C echo.>>"%Appdata%\1C\1CEStart\1CEStart.cfg"
cmd /U /C echo CommonInfoBases=\\server\share\ibases.v8i>>"%Appdata%\1C\1CEStart\1CEStart.cfg"

Проанализируем ситуацию на уровне байтов. В кодировке UTF-16 LE каждый символ кодируется двумя байтами. Символы перевода строки (CRLF) физически выглядят в HEX-редакторе следующим образом: 0D 00 0A 00. Оператор перенаправления потока >> работает на низком байтовом уровне файловой системы. Он не анализирует структуру текстового файла и не знает, на каком символе завершился файл.

Здесь возможны два сценария:

  1. В конце исходного файла нет перевода строки (нет байтов 0D 00 0A 00): Если утилита, создавшая или редактировавшая файл ранее, не записала в его конец символы CRLF, то указатель файла находится сразу за последним значащим символом. Команда cmd /U /C echo начинает писать новые байты ровно с позиции указателя. В результате первый символ вашей новой строки записывается вплотную к последнему символу файла, превращая две разные настройки в одну нечитаемую строку.
  2. В конце исходного файла уже есть перевод строки (байты 0D 00 0A 00 присутствуют): Если вы предварительно выполняете команду echo. для подстраховки, а перевод строки в оригинальном файле уже присутствовал, оператор запишет еще один CRLF. В итоге в конфигурационном файле образуется пустая строка. Хотя для платформы «1С» пустые строки обычно не критичны, это замусоривает файл и затрудняет его дальнейший автоматический анализ.

Дополнительная проблема заключается в маркере BOM (Byte Order Mark). Символы FF FE в начале файла указывают операционной системе и программам на порядок байтов UTF-16 LE. Если файла 1CEStart.cfg изначально не существовало на компьютере пользователя, первая же команда перенаправления > или >> через cmd /U создаст файл без этого маркера. Без BOM-маркера платформа «1С» или текстовые редакторы могут некорректно распознать кодировку файла и проигнорировать все записанные в него параметры.

Разберем по шагам наиболее эффективные методы решения этой проблемы.

Решение 1. Полная перезапись файла вместо дозаписи (подход CMD)

Поскольку файл 1CEStart.cfg на компьютерах пользователей обычно содержит всего несколько строк настроек, наиболее простым и безопасным решением в рамках обычного BAT-файла является его полная перезапись «с нуля». Это полностью решает проблему непредсказуемых окончаний строк и гарантирует чистую структуру файла без мусора.

Рассмотрим пример скрипта, который полностью формирует конфигурационный файл:


@echo off
set "cfg_path=%Appdata%\1C\1CEStart\1CEStart.cfg"

:: Создаем файл заново и пишем первую строку (оператор > заменяет файл)
cmd /U /C echo InstalledLocation=C:\Program Files\1cv8>"%cfg_path%"

:: Дописываем остальные параметры (оператор >> дописывает строки)
cmd /U /C echo CommonInfoBases=\\server\share\ibases.v8i>>"%cfg_path%"
cmd /U /C echo UseHWLicenses=1>>"%cfg_path%"
cmd /U /C echo ShowObsoleteVersions=0>>"%cfg_path%"

Преимущества этого метода: простой синтаксис, предсказуемый результат, отсутствие пустых строк в середине и в конце файла. Перевод строки гарантированно добавляется в конец каждой строки самой командой echo.

Решение 2. Использование PowerShell для «умной» работы с кодировками

Современным стандартом администрирования операционных систем семейства Windows является среда PowerShell. Она изначально спроектирована для работы с объектами и текстовыми файлами в различных кодировках, автоматически управляя маркерами BOM и символами конца строки.

Ниже представлен скрипт PowerShell, который интеллектуально решает задачу: он проверяет наличие файла, корректно считывает его в кодировке Unicode (UTF-16 LE), проверяет, нет ли уже нужного параметра в файле, и при необходимости дописывает его без создания дублей и пустых строк.


$cfgPath = "$env:APPDATA\1C\1CEStart\1CEStart.cfg"
$newLine = "CommonInfoBases=\\server\share\ibases.v8i"

if (Test-Path $cfgPath) {
    # Читаем файл с явным указанием кодировки UTF-16 LE (Unicode)
    $content = Get-Content -Path $cfgPath -Encoding Unicode
    
    # Проверяем, добавлена ли уже эта строка ранее
    if ($content -notcontains $newLine) {
        # Добавляем строку. PowerShell сам корректно добавит CRLF, учитывая состояние файла
        Add-Content -Path $cfgPath -Value $newLine -Encoding Unicode
    }
} else {
    # Если файла не существовало, создаем родительскую директорию и записываем файл с правильным BOM
    $null = New-Item -Path (Split-Path $cfgPath) -ItemType Directory -Force
    Set-Content -Path $cfgPath -Value $newLine -Encoding Unicode
}

Вы можете вызвать этот скрипт PowerShell прямо из классического BAT-файла одной строкой:


powershell -NoProfile -ExecutionPolicy Bypass -Command "$cfg='''%Appdata%\1C\1CEStart\1CEStart.cfg'''; $val='''CommonInfoBases=\\server\share\ibases.v8i'''; if(Test-Path $cfg){$c=Get-Content $cfg -Encoding Unicode; if($c -notcontains $val){Add-Content $cfg -Value $val -Encoding Unicode}}else{$null=New-Item (Split-Path $cfg) -Type Directory -Force; Set-Content $cfg -Value $val -Encoding Unicode}"

Преимущества этого метода: гарантированное сохранение правильной кодировки UTF-16 LE с BOM-маркером, защита от дублирования строк при повторном запуске скрипта (например, при каждом входе пользователя в систему), аккуратная обработка символов перевода строк.

Решение 3. Архитектурный подход «1С» (альтернатива редактированию файлов пользователей)

Правка конфигурационных файлов в профиле каждого конкретного пользователя (%APPDATA%) — ресурсоемкий процесс, который часто дает сбои в доменных сетях или на терминальных серверах (например, при сбросе профилей пользователей или появлении новых сотрудников). Разработчики платформы «1С:Предприятие» предусмотрели штатные механизмы, позволяющие полностью избежать ручной или скриптовой правки пользовательских файлов 1CEStart.cfg.

Проанализируем эти возможности:

  1. Использование общего конфигурационного файла (%ProgramData%):

    Платформа «1С» при запуске сначала считывает настройки из общего (глобального) конфигурационного файла, который находится по пути: %ProgramData%\1C\1CEStart\1CEStart.cfg (для устаревших операционных систем: C:\Documents and Settings\All Users\Application Data\1C\1CEStart\1CEStart.cfg).

    После чтения глобального файла платформа считывает локальный файл пользователя и объединяет эти настройки. Если вы один раз пропишете пути к общим спискам баз в глобальном файле %ProgramData%\1C\1CEStart\1CEStart.cfg, эти настройки автоматически применятся ко всем пользователям данного компьютера или терминального сервера. Вам больше не придется писать скрипты под учетными записями пользователей.

  2. Использование параметра CommonCfgLocation:

    Вы можете прописать в глобальном файле 1CEStart.cfg всего одну строку, указывающую на общий сетевой файл конфигурации:

    CommonCfgLocation=\\server\1c_distrib\1cescmn.cfg

    Этот параметр перенаправляет платформу к единому конфигурационному файлу на вашем файловом сервере. Любые изменения (добавление новых списков баз .v8i, указание сетевых каталогов для автоматического обновления версий платформы и списков разрешенных к установке компонентов) вы будете делать централизованно в одном файле 1cescmn.cfg на сервере. Изменения мгновенно вступят в силу у всех пользователей сети.

  3. Публикация списков информационных баз по протоколу HTTP (HTTPS):

    Начиная с версии платформы 8.3.14, у администраторов появилась возможность публиковать списки информационных баз через веб-серверы. В конфигурационном файле 1CEStart.cfg достаточно указать параметр:

    WebCommonInfoBases=https://webserver.domain.local/1c_bases_list

    В этом случае платформа при запуске будет динамически скачивать актуальный список баз по протоколу HTTPS, что полностью решает проблемы с сетевыми правами доступа к файловым шарам.

Используя предложенные методы работы с кодировками или переходя на централизованные механизмы управления платформой «1С», вы сможете раз и навсегда решить проблемы со сбоями запуска программы у конечных пользователей из-за повреждения файлов настроек.

← На главную