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

· 9 мин

Содержание

Быстрее всего режим работы 1С определяется по строке соединения: если в ней есть File="…", база файловая, если Srvr="…";Ref="…" — клиент-серверная. Её видно в окне запуска под списком баз, а в коде её возвращает функция СтрокаСоединенияИнформационнойБазы().

Частое заблуждение — проверять режим директивой #Если Сервер Тогда. Она отвечает на другой вопрос: где сейчас выполняется код. В файловой базе серверный код тоже есть, просто он работает внутри процесса клиентского приложения. Поэтому «клиент или сервер» в 1С — это два разных вопроса, и у каждого свой способ проверки.

Два смысла вопроса: режим базы и контекст кода

Разведите задачи сразу, иначе проверка вернёт не то, что нужно.

Что хотите узнатьЧем проверятьГде работает
База файловая или на сервере 1ССтрока соединенияОкно запуска, код, ярлык
Код выполняется на клиенте или на сервереДирективы &НаКлиенте, &НаСервере, инструкции #ЕслиМодуль формы, общие модули
Какое приложение запущено: тонкий, толстый, веб-клиентИнструкции препроцессора, свойства сеансаКод
На какой машине реально работает серверная частьИмяКомпьютера() на сервере, журнал регистрацииКод, журнал

Первая задача нужна администратору и разработчику, который пишет код «под режим»: например, в файловой базе нельзя рассчитывать на параллельные фоновые задания. Вторая нужна при отладке ошибок вида Метод объекта не обнаружен или Использование недоступно на клиенте.

Как узнать режим базы без программирования

Начните с этих способов: они не требуют Конфигуратора и прав администратора.

Окно запуска 1С

  1. Запустите ярлык 1С:Предприятия, откроется список информационных баз.
  2. Выделите нужную базу одним щелчком.
  3. Посмотрите на строку под списком. Там написано одно из трёх:
    • 📁 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)
Фоновые и регламентные заданияВыполняются, пока открыт хотя бы один сеансВыполняет кластер, клиент не нужен
Цена серверного вызоваПочти нулевая, всё в одном процессеСетевой обмен, лишние вызовы заметны

Отсюда несколько практических следствий:

  1. 🐢 Код с десятком серверных вызовов в цикле в файловой базе летает, а на сервере тормозит. Проверяйте производительность в том режиме, в котором база будет работать.
  2. 🔒 Длинная транзакция в файловой базе останавливает работу всех, кто пишет в те же таблицы. На сервере с управляемыми блокировками пострадают только те, кто трогает те же записи.
  3. ⏰ Регламентные задания в файловой базе не выполняются ночью, если все закрыли программу. Обработчик, который рассчитывает на ночной обмен, должен это учитывать.
  4. 🔤 Сортировка строк и сравнение через ПОДОБНО зависят от СУБД. Результаты запроса с сортировкой по строковым полям в двух режимах могут расходиться в порядке строк.

Поэтому в коде, который должен вести себя по-разному, ветвление делают по строке соединения или по ОбщегоНазначения.ИнформационнаяБазаФайловая(), а не по #Если Сервер.

Частые ошибки при определении режима

  • ❌ Проверка #Если Сервер Тогда вместо строки соединения. Условие истинно и в файловой базе. Результат — ветка «для сервера» выполняется у всех.
  • ❌ Поиск "Srvr" без приведения регистра. СтрНайти() чувствительна к регистру. Сначала НРег(), потом поиск по "srvr=".
  • ❌ Вызов на клиенте при веб-публикации. На клиенте строка может начинаться с ws=, и проверка решит, что режим «не определён». Вызывайте функцию на сервере.
  • ❌ Вывод по типу клиента. Тонкий клиент — не значит серверная база, толстый — не значит файловая.
  • ❌ Вывод по пути к сетевой папке. File="\\srv01\Bases\Buh" — это файловая база на общем ресурсе, а не сервер 1С. Слово «сервер» в имени компьютера ничего не решает.
  • ❌ Проверка по формату журнала регистрации. .lgd бывает в обоих режимах.
Можно ли определить режим из внешней обработки?
Да. Внешняя обработка выполняется в контексте той базы, к которой подключена, и СтрокаСоединенияИнформационнойБазы() вернёт её строку. В модуле формы обработки вызывайте функцию в процедуре с директивой &НаСервереБезКонтекста.
Что вернёт строка соединения при COM-подключении?
Строку той базы, к которой выполнено подключение: File=… или Srvr=…;Ref=…. Тип сеанса при этом будет COMConnection.
Как узнать режим, если в окне запуска стоит веб-публикация?
Откройте файл default.vrd в каталоге публикации на веб-сервере. Атрибут ib содержит строку соединения базы: с File= или Srvr=. Либо выполните проверку кодом на сервере.
Отличается ли проверка для мобильного клиента?
Мобильный клиент подключается через веб-публикацию, как веб-клиент. Режим базы определяйте на сервере той же функцией.
Влияет ли режим на лицензии?
Да. Для работы с базой на сервере 1С нужна ещё и лицензия на сервер, а клиентские лицензии нужны в обоих режимах.