Развертывание разработанной конфигурации или решения на базе Библиотеки стандартных подсистем (БСП) у новых клиентов часто сопряжено с рутинными операциями. Одной из ключевых задач администратора при первом запуске является заполнение начальных параметров: адресов HTTP и Web-сервисов, параметров подключения к внешним источникам данных, путей к файловым хранилищам и других системных констант. Вводить эти данные вручную в каждой новой базе долго и чревато опечатками.
В этой статье мы подробно разберем, как автоматизировать процесс первоначальной настройки системы. Мы проанализируем различные архитектурные подходы — от простых конфигурационных файлов до использования системных переменных окружения и механизмов БСП, выясним их преимущества и недостатки, а также рассмотрим примеры кода на встроенном языке 1С:Предприятие.
Описанный в обсуждении вариант с «захардкоженным» путем к файлу настроек имеет существенные ограничения. В реальных условиях у клиентов могут отличаться операционные системы, структура каталогов, права доступа пользователей или тип развертывания (файловый или клиент-серверный вариант). Ниже представлены наиболее надежные и профессиональные способы решения этой задачи.
Это один из наиболее гибких и безопасных способов, исключающий необходимость прописывать жесткие пути в коде конфигурации. Администратор на стороне клиента может указать путь к файлу настроек непосредственно в строке запуска системы 1С.
Как это работает: Путь передается через ключ запуска /C. Программа считывает этот параметр при старте, проверяет существование файла по указанному адресу и импортирует настройки.
Рассмотрим по шагам реализацию этого механизма:
.v8i:"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "C:\1C\Bases\ClientBase" /C "C:\1c_sharing\config.json"
ПриНачалеРаботыСистемы мы анализируем глобальную переменную ПараметрЗапуска. Напишем код для проверки параметра и вызова процедуры загрузки:
Процедура ПриНачалеРаботыСистемы()
ПутьКФайлуНастроек = ПараметрЗапуска;
Если ЗначениеЗаполнено(ПутьКФайлуНастроек) Тогда
ФайлКонфига = Новый Файл(ПутьКФайлуНастроек);
Если ФайлКонфига.Существует() Тогда
Попытка
ЗагрузитьНастройкиИзФайла(ПутьКФайлуНастроек);
Исключение
ЗаписатьЛогОшибки("Ошибка загрузки настроек: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если база данных поставляется клиентам в файловом варианте, мы можем существенно упростить задачу локальному администратору. Ему достаточно будет положить файл настроек (например, settings.json) в ту же папку, где расположен файл базы данных 1Cv8.1CD.
Как это работает: При запуске программа программно определяет физическое местонахождение текущей информационной базы, проверяет наличие файла настроек в этом каталоге и загружает данные.
Разберем пример получения пути к каталогу базы данных из строки соединения:
Функция ПолучитьПутьКФайлуВКаталогеБазы(ИмяФайла) Экспорт
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
// Строка соединения файловой базы выглядит так: File="C:\1C\Bases\ClientBase";
ПозицияФайла = Найти(СтрокаСоединения, "File=""");
Если ПозицияФайла = 0 Тогда
Возврат ""; // Это серверный вариант, данный метод не применим напрямую
КонецЕсли;
ПутьКаталога = Сред(СтрокаСоединения, ПозицияФайла + 6);
ПозицияКонца = Найти(ПутьКаталога, """;");
Если ПозицияКонца > 0 Тогда
ПутьКаталога = Лев(ПутьКаталога, ПозицияКонца - 1);
Возврат ПутьКаталога + "\" + ИмяФайла;
КонецЕсли;
Возврат "";
КонецФункции
В обработчике первого запуска базы мы можем вызвать эту функцию и произвести импорт данных:
ИмяФайлаКонфигурации = "settings.json";
ПолныйПутьКФайлу = ПолучитьПутьКФайлуВКаталогеБазы(ИмяФайлаКонфигурации);
Если ЗначениеЗаполнено(ПолныйПутьКФайлу) Тогда
ФайлНастроек = Новый Файл(ПолныйПутьКФайлу);
Если ФайлНастроек.Существует() Тогда
ВыполнитьЗагрузкуНастроек(ПолныйПутьКФайлу);
КонецЕсли;
КонецЕсли;
Этот подход является стандартным в DevOps и системном администрировании. Он отлично показывает себя как в файловых, так и в серверных вариантах развертывания баз данных (особенно при контейнеризации в Docker).
Как это работает: Системный администратор задает в операционной системе Windows или Linux переменную окружения, например, MYAPP_CONFIG_PATH, содержащую полный путь к общему файлу конфигурации. В коде 1С мы считываем значение этой переменной.
Проанализируем пример кода для чтения переменной окружения:
ПутьККонфигу = ПолучитьПеременнуюОкружения("MYAPP_CONFIG_PATH");
Если ЗначениеЗаполнено(ПутьККонфигу) Тогда
ФайлКонфигурации = Новый Файл(ПутьККонфигу);
Если ФайлКонфигурации.Существует() Тогда
ИмпортироватьНастройкиИзФайла(ПутьККонфигу);
Иначе
ЗаписатьВЖурналРегистрации("НастройкаИнициализации",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Файл настроек по пути " + ПутьККонфигу + " не найден.");
КонецЕсли;
КонецЕсли;
В обсуждении часто упоминается использование .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);
КонецЕсли;
КонецЕсли;
Если вы поставляете тиражное решение и у клиентов на местах есть стабильный доступ к сети Интернет, можно отказаться от передачи локальных файлов конфигурации в пользу веб-сервиса авторизации и настроек.
Как это работает: При первом старте база данных отправляет HTTP-запрос на ваш удаленный веб-сервер (Discovery-сервис), передавая уникальный токен клиента или ИНН организации. В ответ сервер возвращает JSON-пакет с актуальными настройками подключения для конкретного клиента.
Этот метод исключает необходимость участия локального системного администратора в настройке конфигурационных файлов. Процедура инициализации выглядит следующим образом:
Процедура ИнициализироватьНастройкиЧерезСервер(ТокенКлиента)
HTTPСоединение = Новый HTTPСоединение("api.ourcompany.ru", , , , , 10);
HTTPЗапрос = Новый HTTPRequest("/get_config?token=" + ТокенКлиента);
Попытка
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
Настройки = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Заполняем настройки в базе
Константы.АдресВнешнегоСервиса.Установить(Настройки.ServiceURL);
КонецЕсли;
Исключение
// Обработка отсутствия связи при первом запуске
КонецПопытки;
КонецПроцедуры
Поскольку автор вопроса использует базу на «обрезанной» БСП, правильным решением будет интеграция механизма первоначального заполнения в штатную подсистему обновления информационной базы БСП. Это гарантирует, что код инициализации выполнится ровно один раз при первом открытии базы или при обновлении конфигурации.
Для этого в общем модуле, отвечающем за обновление конфигурации, мы регистрируем обработчик для версии 0.0.0.0. При первом запуске чистой базы БСП автоматически запустит этот обработчик в фоновом режиме:
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "0.0.0.0";
Обработчик.Процедура = "ОбщийМодульОбновлениеБП.ВыполнитьПервоначальнуюНастройкуБазы";
Обработчик.ВыполнятьВТранзакции = Истина;
КонецПроцедуры
В теле процедуры ВыполнитьПервоначальнуюНастройкуБазы мы совмещаем один из вышеописанных методов (например, чтение JSON-файла из папки базы или через параметры запуска) и записываем значения.
Для надежного автоматического подхвата настроек в 1С рекомендуется придерживаться следующих правил: