Автоматическая подхватка начальных настроек при первом запуске базы 1С

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

Развертывание разработанной конфигурации или решения на базе Библиотеки стандартных подсистем (БСП) у новых клиентов часто сопряжено с рутинными операциями. Одной из ключевых задач администратора при первом запуске является заполнение начальных параметров: адресов HTTP и Web-сервисов, параметров подключения к внешним источникам данных, путей к файловым хранилищам и других системных констант. Вводить эти данные вручную в каждой новой базе долго и чревато опечатками.

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

Описанный в обсуждении вариант с «захардкоженным» путем к файлу настроек имеет существенные ограничения. В реальных условиях у клиентов могут отличаться операционные системы, структура каталогов, права доступа пользователей или тип развертывания (файловый или клиент-серверный вариант). Ниже представлены наиболее надежные и профессиональные способы решения этой задачи.


Способ 1. Передача пути к файлу конфигурации через параметр запуска /C

Это один из наиболее гибких и безопасных способов, исключающий необходимость прописывать жесткие пути в коде конфигурации. Администратор на стороне клиента может указать путь к файлу настроек непосредственно в строке запуска системы 1С.

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

Рассмотрим по шагам реализацию этого механизма:

  1. Администратор прописывает путь к файлу конфигурации в свойствах ярлыка запуска, в bat-файле или в параметрах запуска информационной базы в файле .v8i:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "C:\1C\Bases\ClientBase" /C "C:\1c_sharing\config.json"

  1. В модуле управляемого приложения в обработчике события ПриНачалеРаботыСистемы мы анализируем глобальную переменную ПараметрЗапуска. Напишем код для проверки параметра и вызова процедуры загрузки:

Процедура ПриНачалеРаботыСистемы()
    
    ПутьКФайлуНастроек = ПараметрЗапуска;
    
    Если ЗначениеЗаполнено(ПутьКФайлуНастроек) Тогда
        ФайлКонфига = Новый Файл(ПутьКФайлуНастроек);
        Если ФайлКонфига.Существует() Тогда
            Попытка
                ЗагрузитьНастройкиИзФайла(ПутьКФайлуНастроек);
            Исключение
                ЗаписатьЛогОшибки("Ошибка загрузки настроек: " + ОписаниеОшибки());
            КонецПопытки;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Способ 2. Автоматический поиск конфигурационного файла в каталоге базы данных

Если база данных поставляется клиентам в файловом варианте, мы можем существенно упростить задачу локальному администратору. Ему достаточно будет положить файл настроек (например, settings.json) в ту же папку, где расположен файл базы данных 1Cv8.1CD.

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

Разберем пример получения пути к каталогу базы данных из строки соединения:


Функция ПолучитьПутьКФайлуВКаталогеБазы(ИмяФайла) Экспорт
    
    СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
    
    // Строка соединения файловой базы выглядит так: File="C:\1C\Bases\ClientBase";
    ПозицияФайла = Найти(СтрокаСоединения, "File=""");
    Если ПозицияФайла = 0 Тогда
        Возврат ""; // Это серверный вариант, данный метод не применим напрямую
    КонецЕсли;
    
    ПутьКаталога = Сред(СтрокаСоединения, ПозицияФайла + 6);
    ПозицияКонца = Найти(ПутьКаталога, """;");
    Если ПозицияКонца > 0 Тогда
        ПутьКаталога = Лев(ПутьКаталога, ПозицияКонца - 1);
        Возврат ПутьКаталога + "\" + ИмяФайла;
    КонецЕсли;
    
    Возврат "";
    
КонецФункции

В обработчике первого запуска базы мы можем вызвать эту функцию и произвести импорт данных:


ИмяФайлаКонфигурации = "settings.json";
ПолныйПутьКФайлу = ПолучитьПутьКФайлуВКаталогеБазы(ИмяФайлаКонфигурации);

Если ЗначениеЗаполнено(ПолныйПутьКФайлу) Тогда
    ФайлНастроек = Новый Файл(ПолныйПутьКФайлу);
    Если ФайлНастроек.Существует() Тогда
        ВыполнитьЗагрузкуНастроек(ПолныйПутьКФайлу);
    КонецЕсли;
КонецЕсли;

Способ 3. Использование системных переменных окружения (Environment Variables)

Этот подход является стандартным в DevOps и системном администрировании. Он отлично показывает себя как в файловых, так и в серверных вариантах развертывания баз данных (особенно при контейнеризации в Docker).

Как это работает: Системный администратор задает в операционной системе Windows или Linux переменную окружения, например, MYAPP_CONFIG_PATH, содержащую полный путь к общему файлу конфигурации. В коде 1С мы считываем значение этой переменной.

Проанализируем пример кода для чтения переменной окружения:


ПутьККонфигу = ПолучитьПеременнуюОкружения("MYAPP_CONFIG_PATH");

Если ЗначениеЗаполнено(ПутьККонфигу) Тогда
    ФайлКонфигурации = Новый Файл(ПутьККонфигу);
    Если ФайлКонфигурации.Существует() Тогда
        ИмпортироватьНастройкиИзФайла(ПутьККонфигу);
    Иначе
        ЗаписатьВЖурналРегистрации("НастройкаИнициализации", 
            УровеньЖурналаРегистрации.Предупреждение, , , 
            "Файл настроек по пути " + ПутьККонфигу + " не найден.");
    КонецЕсли;
КонецЕсли;

Способ 4. Переход от устаревшего INF/INI-формата к JSON

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

Мы настоятельно рекомендуем использовать формат JSON. Платформа 1С:Предприятие предоставляет мощные встроенные инструменты для быстрой сериализации и десериализации JSON в объекты 1С (такие как Структура или Соответствие).

Посмотрим на пример структуры JSON-файла настроек:


{
  "HTTP_Services": {
    "Address_Billing": "http://192.168.1.100/billing",
    "Address_CRM": "http://192.168.1.105/crm"
  },
  "External_Sources": {
    "SQL_Server_IP": "192.168.1.200",
    "Database_Name": "Production_Data"
  },
  "FirstRunCompleted": true
}

Для загрузки этой структуры в базу 1С нам потребуется написать всего несколько строк кода:


Функция ПрочитатьНастройкиJSON(ПутьКФайлу)
    
    Чтение = Новый ЧтениеJSON;
    Попытка
        Чтение.ОткрытьФайл(ПутьКФайлу);
        Настройки = ПрочитатьJSON(Чтение);
        Чтение.Закрыть();
        Возврат Настройки; // Возвращает Структуру 1С
    Исключение
        ЗаписатьЛогОшибки("Не удалось прочитать JSON-файл: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    
КонецФункции

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


Настройки = ПрочитатьНастройкиJSON(ПутьКФайлу);
Если Настройки <> Неопределено Тогда
    
    // Запись адресов HTTP-сервисов в константы
    Если Настройки.Свойство("HTTP_Services") Тогда
        Константы.АдресБиллинга.Установить(Настройки.HTTP_Services.Address_Billing);
        Константы.АдресCRM.Установить(Настройки.HTTP_Services.Address_CRM);
    КонецЕсли;
    
КонецЕсли;

Способ 5. Централизованный веб-сервер настроек (Discovery Service)

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

Как это работает: При первом старте база данных отправляет HTTP-запрос на ваш удаленный веб-сервер (Discovery-сервис), передавая уникальный токен клиента или ИНН организации. В ответ сервер возвращает JSON-пакет с актуальными настройками подключения для конкретного клиента.

Этот метод исключает необходимость участия локального системного администратора в настройке конфигурационных файлов. Процедура инициализации выглядит следующим образом:


Процедура ИнициализироватьНастройкиЧерезСервер(ТокенКлиента)
    
    HTTPСоединение = Новый HTTPСоединение("api.ourcompany.ru", , , , , 10);
    HTTPЗапрос = Новый HTTPRequest("/get_config?token=" + ТокенКлиента);
    
    Попытка
        HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
        Если HTTPОтвет.КодСостояния = 200 Тогда
            
            Чтение = Новый ЧтениеJSON;
            Чтение.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
            Настройки = ПрочитатьJSON(Чтение);
            Чтение.Закрыть();
            
            // Заполняем настройки в базе
            Константы.АдресВнешнегоСервиса.Установить(Настройки.ServiceURL);
            
        КонецЕсли;
    Исключение
        // Обработка отсутствия связи при первом запуске
    КонецПопытки;
    
КонецПроцедуры

Способ 6. Использование стандартных механизмов обновления БСП

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

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


Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
    
    Обработчик = Обработчики.Добавить();
    Обработчик.Версия = "0.0.0.0";
    Обработчик.Процедура = "ОбщийМодульОбновлениеБП.ВыполнитьПервоначальнуюНастройкуБазы";
    Обработчик.ВыполнятьВТранзакции = Истина;
    
КонецПроцедуры

В теле процедуры ВыполнитьПервоначальнуюНастройкуБазы мы совмещаем один из вышеописанных методов (например, чтение JSON-файла из папки базы или через параметры запуска) и записываем значения.


Подведем итоги

Для надежного автоматического подхвата настроек в 1С рекомендуется придерживаться следующих правил:

  1. Откажитесь от жестко прописанных путей в кодовой базе 1С.
  2. Используйте формат JSON для конфигурационных файлов вместо INI или TXT.
  3. Для файловых баз реализуйте автоматический поиск файла настроек в каталоге информационной базы.
  4. Для серверных и масштабируемых систем задействуйте передачу пути через параметр запуска /C или переменные окружения ОС.
  5. Привязывайте логику первоначального импорта настроек к обработчикам обновления БСП, чтобы исключить повторное выполнение тяжелого кода при последующих штатных запусках пользователями.
← На главную