Файловая база или сервер 1С и где выполняется код: как проверить
Содержание
Быстрее всего режим работы 1С определяется по строке соединения: если в ней есть File="…", база файловая, если Srvr="…";Ref="…" — клиент-серверная. Её видно в окне запуска под списком баз, а в коде её возвращает функция СтрокаСоединенияИнформационнойБазы().
Частое заблуждение — проверять режим директивой #Если Сервер Тогда. Она отвечает на другой вопрос: где сейчас выполняется код. В файловой базе серверный код тоже есть, просто он работает внутри процесса клиентского приложения. Поэтому «клиент или сервер» в 1С — это два разных вопроса, и у каждого свой способ проверки.
Два смысла вопроса: режим базы и контекст кода
Разведите задачи сразу, иначе проверка вернёт не то, что нужно.
| Что хотите узнать | Чем проверять | Где работает |
|---|---|---|
| База файловая или на сервере 1С | Строка соединения | Окно запуска, код, ярлык |
| Код выполняется на клиенте или на сервере | Директивы &НаКлиенте, &НаСервере, инструкции #Если | Модуль формы, общие модули |
| Какое приложение запущено: тонкий, толстый, веб-клиент | Инструкции препроцессора, свойства сеанса | Код |
| На какой машине реально работает серверная часть | ИмяКомпьютера() на сервере, журнал регистрации | Код, журнал |
Первая задача нужна администратору и разработчику, который пишет код «под режим»: например, в файловой базе нельзя рассчитывать на параллельные фоновые задания. Вторая нужна при отладке ошибок вида Метод объекта не обнаружен или Использование недоступно на клиенте.
Как узнать режим базы без программирования
Начните с этих способов: они не требуют Конфигуратора и прав администратора.
Окно запуска 1С
- Запустите ярлык 1С:Предприятия, откроется список информационных баз.
- Выделите нужную базу одним щелчком.
- Посмотрите на строку под списком. Там написано одно из трёх:
- 📁
File="D:\Bases\Buh"— файловая база, путь к каталогу; - 🖥️
Srvr="srv01";Ref="buh";— база на сервере 1С, имя сервера и имя базы в кластере; - 🌐
ws="http://srv01/buh"— подключение через веб-сервер. Режим самой базы отсюда не виден: за публикацией может стоять и файловая, и серверная база.
- 📁
Кнопка «Изменить» в окне запуска
Выделите базу и нажмите Изменить. На первом шаге мастера переключатель показывает тип расположения: на этом компьютере или в локальной сети, на сервере 1С:Предприятия, на веб-сервере. Дальше ничего не меняйте — закройте мастер кнопкой отмены.
Файл списка баз ibases.v8i
Список баз пользователя хранится в файле %APPDATA%\1C\1CEStart\ibases.v8i. Откройте его Блокнотом и найдите секцию с именем базы в квадратных скобках. Строка Connect= содержит ту же строку соединения:
[Бухгалтерия предприятия]
Connect=Srvr="srv01";Ref="buh";
Если базы в окне запуска появляются из общего списка (файл .v8i на сетевом ресурсе), путь к нему указан в настройках окна запуска. Строки Connect= там такие же.
Ярлык с параметрами командной строки
Если пользователь входит по ярлыку, а не через окно запуска, откройте свойства ярлыка и посмотрите поле «Объект»:
| Параметр в ярлыке | Режим |
|---|---|
/F"D:\Bases\Buh" | Файловая база |
/S"srv01\buh" | Клиент-серверная база: сервер\имя базы |
/WS"http://srv01/buh" | Через веб-сервер |
/IBConnectionString"…" | Смотрите содержимое строки: File= или Srvr= |
Пример ярлыка тонкого клиента к серверной базе:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"srv01\buh" /N"Иванов"
Признаки на диске и в службах
- 📁 В каталоге файловой базы лежит файл
1Cv8.1CD— это и есть сама база. - 🖥️ На сервере 1С работает служба агента сервера 1С:Предприятия, а в диспетчере задач видны процессы
ragent.exe,rmngr.exe,rphost.exe. - 🔌 Клиент к серверной базе подключается к агенту по порту 1540, затем к менеджеру кластера (1541) и к рабочим процессам из диапазона портов, заданного в свойствах рабочего сервера.
Проверка режима работы 1С кодом на встроенном языке
Глобальная функция СтрокаСоединенияИнформационнойБазы() доступна и на клиенте, и на сервере. Надёжнее вызывать её на сервере: там она возвращает реальное расположение базы, даже если пользователь зашёл через веб-публикацию.
&НаСервереБезКонтекста
Функция РежимРаботыБазы()
СтрокаСоединения = НРег(СтрокаСоединенияИнформационнойБазы());
Если СтрНайти(СтрокаСоединения, "file=") > 0 Тогда
Возврат "Файловый";
ИначеЕсли СтрНайти(СтрокаСоединения, "srvr=") > 0 Тогда
Возврат "Клиент-серверный";
Иначе
Возврат "Не определён: " + СтрокаСоединения;
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура ПоказатьРежим(Команда)
ПоказатьПредупреждение(, "Режим базы: " + РежимРаботыБазы());
КонецПроцедуры
НРег() здесь не для красоты: платформа может вернуть File= или file=, а СтрНайти() различает регистр.
Разбор строки на параметры
Когда нужно не только определить режим, но и получить имя сервера или путь к каталогу, разберите строку целиком:
Функция ПараметрыСоединения() Экспорт
Результат = Новый Соответствие;
Для Каждого Часть Из СтрРазделить(СтрокаСоединенияИнформационнойБазы(), ";", Ложь) Цикл
Позиция = СтрНайти(Часть, "=");
Если Позиция = 0 Тогда
Продолжить;
КонецЕсли;
Ключ = НРег(СокрЛП(Лев(Часть, Позиция - 1)));
Значение = СтрЗаменить(СокрЛП(Сред(Часть, Позиция + 1)), """", "");
Результат.Вставить(Ключ, Значение);
КонецЦикла;
Возврат Результат;
КонецФункции
Для серверной базы Результат.Получить("srvr") вернёт имя сервера (иногда с портом, например srv01:1541), Результат.Получить("ref") — имя базы в кластере. Для файловой — Результат.Получить("file") вернёт путь.
Готовая функция в типовых конфигурациях
В конфигурациях на Библиотеке стандартных подсистем (БП 3.0, ЗУП 3.1, УТ 11) писать свою проверку не нужно. Серверная функция ОбщегоНазначения.ИнформационнаяБазаФайловая() возвращает Истина для файловой базы. Её удобно использовать во внешних обработках, которые подключаются к типовым базам.
Где выполняется код: директивы и инструкции препроцессора
Контекст выполнения задают два механизма.
Директивы компиляции в модулях форм и команд определяют, где выполняется процедура:
&НаКлиенте— в клиентском приложении;&НаСервере— на сервере, с передачей данных формы;&НаСервереБезКонтекста— на сервере, без данных формы, вызов дешевле;&НаКлиентеНаСервереБезКонтекста— компилируется и там, и там.
Инструкции препроцессора включают или выключают куски кода при компиляции:
#Если Сервер Тогда
// код компилируется в серверном контексте — в любой базе, и файловой тоже
#КонецЕсли
#Если ТонкийКлиент Или ВебКлиент Тогда
// код только для управляемых клиентов
#КонецЕсли
#Если ТолстыйКлиентОбычноеПриложение Тогда
// код для толстого клиента в режиме обычного приложения
#КонецЕсли
#Если ВнешнееСоединение Тогда
// код для COM-соединения
#КонецЕсли
#Если Сервер не говорит, что база клиент-серверная. В файловом варианте серверный контекст тоже существует: серверная часть платформы работает внутри процесса клиентского приложения, а при веб-публикации — внутри модуля веб-сервера.
Как увидеть, на какой машине работает серверная часть
Сравните имя компьютера, полученное на сервере, с именем компьютера пользователя:
&НаСервереБезКонтекста
Функция ОписаниеСеанса()
Сеанс = ПолучитьТекущийСеансИнформационнойБазы();
Возврат СтрШаблон("Приложение: %1; компьютер пользователя: %2; серверная часть на: %3; сеанс № %4",
ПредставлениеПриложения(Сеанс.ИмяПриложения),
Сеанс.ИмяКомпьютера,
ИмяКомпьютера(),
Формат(Сеанс.НомерСеанса, "ЧГ=0"));
КонецФункции
В файловой базе с тонким клиентом оба имени совпадут. В клиент-серверной ИмяКомпьютера() вернёт имя сервера с рабочим процессом. Объект Новый СистемнаяИнформация, созданный на сервере, точно так же покажет версию ОС и платформы той машины, где работает серверная часть.
Сеанс и тип приложения: тонкий, толстый и веб-клиент
Свойство ИмяПриложения сеанса показывает, чем пользователь подключился. Основные значения:
ИмяПриложения | Что это |
|---|---|
1CV8C | Тонкий клиент |
1CV8 | Толстый клиент |
WebClient | Веб-клиент в браузере |
Designer | Конфигуратор |
COMConnection | Внешнее COM-соединение |
BackgroundJob | Фоновое задание |
Функция ПредставлениеПриложения() превращает эти имена в понятный текст — так их и показывает список активных пользователей.
Что важно знать про управляемые клиенты:
- 🌐 В веб-клиенте нет доступа к COM-объектам и ограничена работа с локальными файлами. Код с
Новый COMОбъектпрячьте под#Если Не ВебКлиент Тогда. - 🔄 Тонкий клиент работает и с файловой, и с серверной базой, и через веб-сервер. Тип клиента о режиме базы ничего не говорит.
- 🧩 В управляемом приложении на клиенте нельзя обращаться к базе напрямую: запросы, чтение объектов и регистров — только в серверных процедурах.
- 🖥️ Режим приложения проверяет функция
ТекущийРежимЗапуска(): она возвращаетРежимЗапускаКлиентскогоПриложения.УправляемоеПриложениеилиОбычноеПриложение. Вызывается на клиенте.
Журнал регистрации и логи сервера
Если доступа к коду нет, режим видно по тому, где лежит журнал регистрации.
| Режим | Где журнал |
|---|---|
| Файловый | Подкаталог 1Cv8Log в каталоге базы, рядом с 1Cv8.1CD |
| Клиент-серверный | На сервере 1С: srvinfo\reg_1541\<идентификатор базы>\1Cv8Log |
Формат журнала одинаковый для обоих режимов: старый текстовый (.lgf и .lgp) или новый SQLite (.lgd). Формат на режим не указывает.
Сам журнал открывается в пользовательском режиме: Администрирование → Обслуживание → Журнал регистрации. В клиент-серверной базе в событиях заполнены колонки рабочего сервера, основного и вспомогательного IP-порта. В файловой они пустые.
Технологический журнал
Для глубокой диагностики включают технологический журнал файлом logcfg.xml в каталоге conf платформы. По типам событий режим видно сразу:
- 🗄️ события
DBMSSQL,DBPOSTGRS— запросы к СУБД, значит база клиент-серверная; - 📁 события
DBV8DBEng— работа файлового движка; - 📞 события
CALLиSCALL— серверные вызовы и вызовы между процессами кластера.
Технологический журнал быстро растёт. Ставьте фильтр по базе и событиям и ограничивайте срок хранения параметром history, иначе за сутки на сервере кончится место на диске.
Чем отличаются запросы и транзакции в двух режимах
Режим определяют не из любопытства: от него зависит поведение кода, который в файловой базе работал, а на сервере повёл себя иначе. Или наоборот.
| Что | Файловый режим | Клиент-серверный режим |
|---|---|---|
| Блокировки данных | На уровне таблиц: запись в регистр блокирует всю таблицу | На уровне записей, если используются управляемые блокировки |
| Параллельная запись | Пользователи пишут по очереди | Несколько транзакций одновременно |
| Временные таблицы | Средствами файлового движка | В СУБД (в MS SQL — в tempdb) |
| Фоновые и регламентные задания | Выполняются, пока открыт хотя бы один сеанс | Выполняет кластер, клиент не нужен |
| Цена серверного вызова | Почти нулевая, всё в одном процессе | Сетевой обмен, лишние вызовы заметны |
Отсюда несколько практических следствий:
- 🐢 Код с десятком серверных вызовов в цикле в файловой базе летает, а на сервере тормозит. Проверяйте производительность в том режиме, в котором база будет работать.
- 🔒 Длинная транзакция в файловой базе останавливает работу всех, кто пишет в те же таблицы. На сервере с управляемыми блокировками пострадают только те, кто трогает те же записи.
- ⏰ Регламентные задания в файловой базе не выполняются ночью, если все закрыли программу. Обработчик, который рассчитывает на ночной обмен, должен это учитывать.
- 🔤 Сортировка строк и сравнение через
ПОДОБНОзависят от СУБД. Результаты запроса с сортировкой по строковым полям в двух режимах могут расходиться в порядке строк.
Поэтому в коде, который должен вести себя по-разному, ветвление делают по строке соединения или по ОбщегоНазначения.ИнформационнаяБазаФайловая(), а не по #Если Сервер.
Частые ошибки при определении режима
- ❌ Проверка
#Если Сервер Тогдавместо строки соединения. Условие истинно и в файловой базе. Результат — ветка «для сервера» выполняется у всех. - ❌ Поиск
"Srvr"без приведения регистра.СтрНайти()чувствительна к регистру. СначалаНРег(), потом поиск по"srvr=". - ❌ Вызов на клиенте при веб-публикации. На клиенте строка может начинаться с
ws=, и проверка решит, что режим «не определён». Вызывайте функцию на сервере. - ❌ Вывод по типу клиента. Тонкий клиент — не значит серверная база, толстый — не значит файловая.
- ❌ Вывод по пути к сетевой папке.
File="\\srv01\Bases\Buh"— это файловая база на общем ресурсе, а не сервер 1С. Слово «сервер» в имени компьютера ничего не решает. - ❌ Проверка по формату журнала регистрации.
.lgdбывает в обоих режимах.
Можно ли определить режим из внешней обработки?
СтрокаСоединенияИнформационнойБазы() вернёт её строку. В модуле формы обработки вызывайте функцию в процедуре с директивой &НаСервереБезКонтекста.Что вернёт строка соединения при COM-подключении?
File=… или Srvr=…;Ref=…. Тип сеанса при этом будет COMConnection.Как узнать режим, если в окне запуска стоит веб-публикация?
default.vrd в каталоге публикации на веб-сервере. Атрибут ib содержит строку соединения базы: с File= или Srvr=. Либо выполните проверку кодом на сервере.