Версия сервера 1С — номер сборки платформы, на которой работает кластер: служба агента ragent и рабочие процессы rphost. Клиент должен совпадать с ней до последней цифры: тонкий клиент 8.3.27.1786 подключится к серверу 8.3.27.1786, но не к 8.3.25.1286. Вопрос встаёт после обновления сервера, когда у пользователей ошибка несовпадения версий, или когда новый релиз типовой требует свежую платформу. Ниже — где смотреть версии клиента и сервера, почему они расходятся и в каком порядке обновлять платформу, чтобы простой занял минуты.
«Версией 1С» называют четыре разных номера, и их постоянно путают:
| Что | Пример | Где посмотреть |
|---|---|---|
| Версия клиента — платформа на компьютере пользователя | 8.3.27.1786 | «О программе», СистемнаяИнформация в клиентском коде |
| Версия сервера — платформа кластера | 8.3.27.1786 | «О программе», свойства службы агента, rac agent version |
| Режим совместимости конфигурации | Версия 8.3.24 | Конфигуратор: свойства корня конфигурации, группа «Совместимость» |
| Версия конфигурации (релиз) | 2.5.20.x | «О программе», Метаданные.Версия |
Режим совместимости — свойство конфигурации, а не сервера: конфигурация в режиме «Версия 8.3.24» штатно работает на платформе 8.3.27, и при обновлении платформы его не меняют. Зависимость обратная: релиз может требовать платформу не ниже определённой. В типовых на БСП минимальная и рекомендуемая версии задаются в ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности; в КА 2.5.20 это сборки 8.3.24.1548 и 8.3.25.1286.
Пользователю проще всего открыть Главное меню → Справка → О программе: там текущие версии клиента и сервера, а по ссылке «Информация для технической поддержки» — текст для копирования в обращение.
На сервере откройте services.msc → «Агент сервера 1С:Предприятия 8.3 (x86-64)» → «Свойства» → «Исполняемый файл». Каталог перед \bin\ragent.exe и есть версия сервера: служба запускает именно эту сборку, сколько бы версий ни стояло рядом. Консоль кластера номер не показывает, но подключается только к агенту своей версии — см. статью о консоли кластера.
Все команды только читают; rac agent version отвечает, если на сервере запущен ras.
rem Версия сервера 1С в Windows. Все команды только читают.
rem 1. Строка запуска службы агента: номер версии - каталог перед \bin\ragent.exe
sc qc "1C:Enterprise 8.3 Server Agent (x86-64)"
rem 2. Установленные версии платформы: 64- и 32-разрядные
dir /b /ad "%ProgramFiles%\1cv8\8.*"
dir /b /ad "%ProgramFiles(x86)%\1cv8\8.*"
rem 3. Версия агента через сервер администрирования ras (порт 1545)
"%ProgramFiles%\1cv8\8.3.27.1786\bin\rac.exe" agent version srv01:1545
Сводка по компьютеру: какие версии установлены, где есть сервер и клиенты и какие службы на какую версию смотрят.
# Get-1CVersions.ps1 - версии платформы 1С на этом компьютере и службы, которые их запускают.
# Только читает. Windows PowerShell 5.1, 64-разрядный (в 32-разрядном Program Files подменяется).
$services = @(Get-CimInstance Win32_Service | Where-Object { $_.PathName -match '\\1cv8\\' })
$roots = @($env:ProgramFiles, ${env:ProgramFiles(x86)}) | Where-Object { $_ } |
ForEach-Object { Join-Path $_ '1cv8' } | Where-Object { Test-Path $_ } | Select-Object -Unique
$rows = foreach ($root in $roots) {
$arch = if ($root -like '*(x86)*') { 'x86' } else { 'x64' }
foreach ($dir in Get-ChildItem $root -Directory | Where-Object Name -match '^\d+(\.\d+){3}$') {
$bin = Join-Path $dir.FullName 'bin'
$marker = '\' + $dir.Name + '\bin\'
[pscustomobject]@{
Version = $dir.Name
Arch = $arch
Server = Test-Path (Join-Path $bin 'ragent.exe')
Thin = Test-Path (Join-Path $bin '1cv8c.exe')
Full = Test-Path (Join-Path $bin '1cv8.exe')
# Службы, чья строка запуска ведет в каталог этой версии: агент, ras, сервер хранилища
Services = ($services | Where-Object { $_.PathName.Contains($marker) } |
ForEach-Object { $_.Name }) -join '; '
}
}
}
$rows | Sort-Object Arch, { [version]$_.Version } | Format-Table -AutoSize
На Linux версии лежат в каталогах /opt/1cv8/x86_64/<версия>, а работающий агент виден по пути процесса:
# Версия сервера 1С на Linux. Команды только читают.
ls /opt/1cv8/x86_64/ # установленные версии: каталоги вида 8.3.27.1786
ps -eo pid,args | grep '[r]agent' # в пути работающего ragent - номер версии
systemctl list-units --all 'srv1cv8*' # службы сервера 1С (8.3.21+): версия в имени юнита
СистемнаяИнформация.ВерсияПриложения возвращает версию той платформы, где выполняется код: на клиенте — клиента, в серверном вызове — рабочего процесса кластера. Обработка показывает обе версии, каталоги программ, режим совместимости и релиз.
// Обработка «Версии платформы»: модуль формы, на форме - команда ПоказатьВерсии.
// Версии клиента и сервера, каталоги программ, режим совместимости и релиз конфигурации.
&НаКлиенте
Процедура ПоказатьВерсии(Команда)
СисИнфо = Новый СистемнаяИнформация;
ДанныеСервера = СведенияСервера();
Строки = Новый Массив;
Строки.Добавить("Клиент: " + СисИнфо.ВерсияПриложения + " (" + Строка(СисИнфо.ТипПлатформы) + ")");
#Если Не ВебКлиент Тогда
// Из какого каталога запущен клиент - какую из установленных сборок выбрала программа запуска
Строки.Добавить("Каталог клиента: " + КаталогПрограммы());
#КонецЕсли
Строки.Добавить("Сервер: " + ДанныеСервера.Версия + " (" + ДанныеСервера.ТипПлатформы
+ "), компьютер " + ДанныеСервера.Компьютер);
Строки.Добавить("Каталог сервера: " + ДанныеСервера.Каталог);
Строки.Добавить("Вариант работы: " + ДанныеСервера.ВариантРаботы);
Строки.Добавить("Режим совместимости конфигурации: " + ДанныеСервера.РежимСовместимости);
Строки.Добавить("Конфигурация: " + ДанныеСервера.Конфигурация);
ПоказатьПредупреждение(, СтрСоединить(Строки, Символы.ПС));
КонецПроцедуры
// Выполняется там, где работает серверный код: в рабочем процессе кластера,
// а в файловой базе - в процессе самого клиента.
&НаСервереБезКонтекста
Функция СведенияСервера()
СисИнфо = Новый СистемнаяИнформация;
СтрокаСоединения = НРег(СтрокаСоединенияИнформационнойБазы());
Если СтрНайти(СтрокаСоединения, "file=") > 0 Тогда
ВариантРаботы = "файловый";
ИначеЕсли СтрНайти(СтрокаСоединения, "srvr=") > 0 Тогда
ВариантРаботы = "клиент-серверный";
Иначе
ВариантРаботы = "через веб-сервер";
КонецЕсли;
Сведения = Новый Структура;
Сведения.Вставить("Версия", СисИнфо.ВерсияПриложения);
Сведения.Вставить("ТипПлатформы", Строка(СисИнфо.ТипПлатформы));
Сведения.Вставить("Компьютер", ИмяКомпьютера());
Сведения.Вставить("Каталог", КаталогПрограммы());
Сведения.Вставить("ВариантРаботы", ВариантРаботы);
// Метаданные доступны только на сервере: это свойства конфигурации, а не платформы
Сведения.Вставить("РежимСовместимости", Строка(Метаданные.РежимСовместимости));
Сведения.Вставить("Конфигурация", Метаданные.Синоним + " " + Метаданные.Версия);
Возврат Сведения;
КонецФункции
Сборку для запуска выбирает программа запуска по полю «Версия 1С:Предприятия» в свойствах базы (окно запуска → «Изменить…» → «Далее» до последней страницы):
DefaultVersion в 1CEStart.cfg, без неё — самая свежая;8.3 или 8.3.27 — сборка, закреплённая за маской в DefaultVersion, иначе самая свежая подходящая из установленных или доступных для установки;При подключении клиент сверяется с сервером. Подбор по умолчанию включён (/AppAutoCheckVersion+), и при расхождении клиент ищет сборку сервера: среди установленных, в каталогах DistributiveLocation из 1CEStart.cfg и 1CESCmn.cfg, по адресу дистрибутива, который сервер возвращает вместе с ошибкой (PublishDistributiveLocation… в conf.cfg, pubdst в default.vrd), через интернет-сервис. Поэтому ошибка несовпадения почти всегда значит одно: нужной сборки на компьютере нет и поставить её неоткуда. Типичные причины:
/AppAutoCheckVersion- в ярлыке;Закрепление версий в 1CEStart.cfg — в статье о списке баз 1С. Правило маски видно в коде: функция сравнивает номера по общим частям, поэтому 8.3.27.1786 подходит под 8.3.27; она же не даёт коду с новыми методами запуститься на старой платформе.
// Общий модуль ВерсииПлатформыКлиентСервер (флажки «Клиент (управляемое приложение)» и «Сервер»).
// Номер версии - 8.3.27.1786, маска - неполный номер: 8.3 или 8.3.27.
// Сравнивает версии по частям, которые есть в обоих номерах: -1, 0 или 1.
// СравнитьВерсии("8.3.27.1786", "8.3.27") = 0 - сборка подходит под маску.
Функция СравнитьВерсии(Знач Версия1, Знач Версия2) Экспорт
Части1 = СтрРазделить(СокрЛП(Версия1), ".", Ложь);
Части2 = СтрРазделить(СокрЛП(Версия2), ".", Ложь);
Для Индекс = 0 По Мин(Части1.Количество(), Части2.Количество()) - 1 Цикл
Число1 = Число(Части1[Индекс]);
Число2 = Число(Части2[Индекс]);
Если Число1 > Число2 Тогда
Возврат 1;
ИначеЕсли Число1 < Число2 Тогда
Возврат -1;
КонецЕсли;
КонецЦикла;
Возврат 0;
КонецФункции
// Самая свежая сборка из списка, подходящая под маску: так программа запуска
// выбирает версию для базы с неполным номером. Пустая строка - подходящей нет.
Функция ПодобратьВерсию(Знач Маска, Знач Установленные) Экспорт
Результат = "";
Для Каждого Версия Из Установленные Цикл
Если СравнитьВерсии(Версия, Маска) = 0
И (Результат = "" Или СравнитьВерсии(Версия, Результат) > 0) Тогда
Результат = Версия;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Исключение, если версия платформы ниже нужной. Вызывается перед кодом с новыми методами,
// например АдминистрированиеСервера.ПолучитьВерсию() доступен с 8.3.16.
Процедура ПроверитьВерсиюПлатформы(Знач МинимальнаяВерсия) Экспорт
СисИнфо = Новый СистемнаяИнформация;
Если СравнитьВерсии(СисИнфо.ВерсияПриложения, МинимальнаяВерсия) < 0 Тогда
ВызватьИсключение СтрШаблон("Нужна платформа %1 или новее, сейчас %2.
|Обновите платформу на сервере и клиентах.", МинимальнаяВерсия, СисИнфо.ВерсияПриложения);
КонецЕсли;
КонецПроцедуры
// Пример: на компьютере стоят 8.3.24, 8.3.25 и 8.3.27, в свойствах базы - маска.
Процедура ПримерПодбора() Экспорт
Установленные = СтрРазделить("8.3.24.1548,8.3.25.1286,8.3.27.1786", ",");
Сообщить(ПодобратьВерсию("8.3", Установленные)); // 8.3.27.1786
Сообщить(ПодобратьВерсию("8.3.25", Установленные)); // 8.3.25.1286
Сообщить(ПодобратьВерсию("8.3.26", Установленные)); // пусто: сборку нужно установить
ПроверитьВерсиюПлатформы("8.3.16"); // на 8.3.15 и более ранних - исключение
КонецПроцедуры
Чтобы обновить платформу на сервере 1С без сюрпризов, новую версию ставят рядом со старой, а службу переключают в окно обслуживания:
docs\ru\V8Update.htm каталога новой версии. Сделать резервную копию баз.sc qc, rac agent version, вход в базу и «О программе». Зарегистрировать консоль кластера новой версии.Если всё установлено заранее, само переключение занимает минуты, дольше ждут выхода пользователей. Простой сокращают:
DistributiveLocation, и программа запуска ставит версию сама. Без прав администратора установка не пройдёт, поэтому терминальные серверы готовят заранее. С 8.3.23 загрузку и установку клиента до обновления сервера настраивают файлом ClientUpdate.cfg.// Обработка «Перед обновлением платформы»: модуль формы, на форме - команда ПроверитьСерверы.
// По каждому серверу: версия агента против целевой и число сеансов в базах.
// На серверах должен работать ras (по умолчанию порт 1545). Платформа 8.3.17 и новее.
&НаКлиенте
Процедура ПроверитьСерверы(Команда)
// Серверы через запятую и сборка, на которую переходим
Сводка = СостояниеСерверов("srv01:1545, srv02:1545", "8.3.27.1786");
ПоказатьПредупреждение(, СтрСоединить(Сводка, Символы.ПС));
КонецПроцедуры
&НаСервереБезКонтекста
Функция СостояниеСерверов(Знач Адреса, Знач ЦелеваяВерсия)
Сводка = Новый Массив;
Для Каждого Адрес Из СтрРазделить(Адреса, ",", Ложь) Цикл
Части = СтрРазделить(СокрЛП(Адрес), ":", Ложь);
Если Части.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
ИмяСервера = Части[0];
ПортRAS = ?(Части.Количество() > 1, Число(Части[1]), 1545);
Попытка
Агент = Новый АдминистрированиеСервера(ИмяСервера, ПортRAS);
// Если заведены администраторы центрального сервера:
// Агент.ВыполнитьАутентификацию(Пароль, Имя) - пароль идет первым параметром
Версия = Агент.ПолучитьВерсию();
Сводка.Добавить(СтрШаблон("%1: сервер 1С %2 - %3", ИмяСервера, Версия,
?(Версия = ЦелеваяВерсия, "уже обновлен", "обновить до " + ЦелеваяВерсия)));
ДобавитьСеансыПоБазам(Агент, Сводка);
Исключение
// Сюда попадают и недоступный ras, и отказ в аутентификации
Сводка.Добавить(СтрШаблон("%1: не удалось опросить - %2", ИмяСервера,
ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())));
КонецПопытки;
КонецЦикла;
Возврат Сводка;
КонецФункции
// Сеансы по базам каждого кластера. Фоновые задания и конфигуратор тоже считаются:
// при остановке службы они оборвутся вместе с пользователями.
&НаСервереБезКонтекста
Процедура ДобавитьСеансыПоБазам(Агент, Сводка)
Для Каждого Кластер Из Агент.ПолучитьКластеры() Цикл
// Без администраторов кластера - пустые имя и пароль, иначе передайте их
Кластер.ВыполнитьАутентификацию("", "");
Сеансов = Новый Соответствие;
Для Каждого Сеанс Из Кластер.ПолучитьСеансы() Цикл
Ключ = Строка(Сеанс.ИдентификаторИнформационнойБазы);
Сеансов.Вставить(Ключ, ?(Сеансов[Ключ] = Неопределено, 0, Сеансов[Ключ]) + 1);
КонецЦикла;
Для Каждого База Из Кластер.ПолучитьИнформационныеБазы() Цикл
Количество = Сеансов[Строка(База.ИдентификаторИнформационнойБазы)];
Сводка.Добавить(СтрШаблон(" кластер ""%1"", база %2: сеансов %3", Кластер.Имя, База.Имя,
?(Количество = Неопределено, 0, Количество)));
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Новый СистемнаяИнформация в процедуре &НаКлиенте даёт версию клиента, в &НаСервереБезКонтекста — сервера. В файловой базе серверный код выполняется в процессе клиента (или модуля веб-сервера), и версии совпадают всегда.КаталогПрограммы() показывает, какую из установленных сборок выбрала программа запуска. В веб-клиенте метода нет, отсюда #Если Не ВебКлиент.Метаданные.РежимСовместимости и Метаданные.Версия доступны только на сервере (и в толстом клиенте) — это свойства конфигурации, к версии платформы они не относятся.СравнитьВерсии сравнивает столько частей, сколько есть в обоих номерах, — так работает маска. Типовая ОбщегоНазначенияКлиентСервер.СравнитьВерсии из БСП требует ровно четыре части и на маске вызовет исключение.ПодобратьВерсию повторяет правило программы запуска для неполного номера: самая свежая из подходящих сборок.ПолучитьВерсию() у АдминистрированиеСервера (с 8.3.16) возвращает версию сервера, нужен запущенный ras. ПолучитьИнформационныеБазы() требует аутентификации администратора кластера (без администраторов — пустые имя и пароль); у агента в ВыполнитьАутентификацию первым идёт пароль, у кластера — имя.Остальные ошибки подключения разобраны в статье об ошибке сервера 1С.
Нет: клиент другой сборки к серверу не подключится. Наоборот можно — поставить новую сборку клиентам заранее и не удалять старую: до обновления сервера будет запускаться старая, после — новая.
Нет. Его меняет поставщик конфигурации в своих релизах, а платформа новее режима — нормальная ситуация. Платформу обновляют до установки релиза, который её требует.
Сколько угодно, каждая — в своём каталоге. Но служба агента на стандартных портах одна: два сервера разных версий одновременно — это второй кластер на других портах.
Старая версия ещё установлена, поэтому откат — то же переключение в обратную сторону: остановить службу, вернуть прежний каталог в строке запуска, запустить. Клиенты, у которых осталась старая сборка, переключатся сами.
Если серверов несколько, есть веб-публикации, обмены через COM и терминальные серверы, а окно обслуживания — одна ночь, обновление лучше доверить тому, кто уже переводил рабочие кластеры. Разместите задачу на площадке — оценка бесплатная, ответ в течение рабочего дня. Остальные направления — на странице услуг.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.