База 1С на PostgreSQL — это информационная база в кластере сервера 1С плюс база данных в PostgreSQL, где лежат таблицы; связывают их параметры подключения к СУБД. Задача возникает при переезде с файловой базы, при развёртывании тестовой копии рабочей базы и при подготовке базы под обмен или разработку. Ниже — подготовка PostgreSQL, создание базы в консоли кластера и в окне запуска, загрузка .dt, код для развёртывания копий и ошибки аутентификации и кодировки.
Базу данных платформа создаёт сама, если СУБД к этому готова:
mchar, fulleq и fasttrun. Установка — в статье «Установка сервера 1С 8.3».SUPERUSER: подключать расширения сборки, как правило, может только суперпользователь. Отдельная, а не postgres, — чтобы менять её пароль, не трогая служебную.all: при создании платформа подключается к служебной базе, новой ещё нет.listen_addresses — не только localhost, если сервер 1С на другой машине; lc_messages — обязательно с кодировкой.ru_RU.UTF-8, на Windows UTF8 сочетается с любой локалью.Подготовка в psql и минимум в конфигурационных файлах:
-- psql под суперпользователем на сервере PostgreSQL
CREATE ROLE usr1c WITH LOGIN SUPERUSER;
\password usr1c
-- кодировка и локаль: у template0, template1 и новых баз - UTF8 и ru_RU.UTF-8
SELECT datname, pg_encoding_to_char(encoding) AS encoding, datcollate, datctype
FROM pg_database;
SHOW lc_messages; -- значение с кодировкой после точки: ru_RU.UTF-8
SHOW password_encryption; -- в этом формате сохранится пароль, заданный через \password
SELECT pg_reload_conf(); -- перечитать pg_hba.conf и postgresql.conf без перезапуска
-- база данных вручную, если нужны свой владелец или локаль
CREATE DATABASE trade_test OWNER usr1c ENCODING 'UTF8'
LC_COLLATE 'ru_RU.UTF-8' LC_CTYPE 'ru_RU.UTF-8' TEMPLATE template0;
# postgresql.conf
listen_addresses = '*' # по умолчанию 'localhost'; меняется только с перезапуском службы
lc_messages = 'ru_RU.UTF-8' # язык сообщений обязательно с кодировкой
password_encryption = scram-sha-256
# pg_hba.conf: адрес сервера 1С, а не компьютеров пользователей
# TYPE DATABASE USER ADDRESS METHOD
host all usr1c 10.0.0.5/32 scram-sha-256
В консоли «Администрирование серверов 1С Предприятия» раскройте «Центральные серверы 1С:Предприятия 8.3» → сервер → «Кластеры» → кластер и в контекстном меню узла «Информационные базы» выберите «Создать» → «Информационная база». Если в кластере заведены администраторы, консоль спросит их пароль. Версия консоли должна совпадать с версией сервера — подробнее в статье про консоль кластера.
| Поле | Что указать | Пример |
|---|---|---|
| Имя | имя в кластере, по нему подключаются пользователи | trade_test |
| Сервер баз данных | адрес PostgreSQL для сервера 1С, порт — через port= | pg01 port=5433 |
| Тип СУБД | выбрать из списка | PostgreSQL |
| База данных | имя в PostgreSQL, латиница в нижнем регистре | trade_test |
| Пользователь сервера БД, Пароль пользователя БД | роль PostgreSQL | usr1c |
| Разрешить выдачу лицензий сервером 1С:Предприятия | «Да», если лицензии активированы на сервере 1С | Да |
| Смещение дат | 0, смещение 2000 — только для MS SQL Server | 0 |
| Создать базу данных в случае ее отсутствия | если базы данных ещё нет | включено |
| Установить блокировку регламентных заданий | для копии рабочей базы | включено |
После «ОК» сервер 1С создаст базу данных и служебные таблицы. Конфигурации в базе нет — её загружают из .dt или .cf.
srv01 или srv01:2541), «Имя информационной базы в кластере», «Имя базы данных», «Пользователь базы данных» и «Пароль пользователя»; флажки те же.Если в кластере заведены администраторы, окно запуска спросит их пароль. Базу оно сразу добавляет в список; созданную в консоли добавляют вручную: «Добавить…» → «Добавление в список существующей информационной базы».
localhost — машина сервера 1С, а не ваша. Порт пишут через пробел: pg01 port=5433, так в справке ibcmd.Trade в SQL-командах придётся писать в кавычках.Вручную: откройте новую базу в конфигураторе, «Администрирование» → «Загрузить информационную базу…», выберите .dt. Загрузка заменяет конфигурацию, данные и пользователей — дальше входите под пользователями исходной базы. В базу, где работают люди, грузите только после блокировки сеансов.
Из командной строки — три варианта. CREATEINFOBASE с /UseTemplate создаёт базу и загружает .dt одной командой: шаблоном может быть .cf или .dt. DESIGNER /RestoreIB загружает файл в готовую базу. ibcmd пишет данные прямо в PostgreSQL, минуя кластер, — потом базу регистрируют в кластере со снятым флажком «Создать базу данных в случае ее отсутствия».
rem Windows, cmd. Выполняйте в каталоге bin платформы той же версии, что сервер 1С:
rem cd /d "C:\Program Files\1cv8\<версия>\bin"
rem Пароль роли PostgreSQL заранее положите в переменную окружения PGPWD.
rem 1. Зарегистрировать базу в кластере, создать базу данных и загрузить .dt одной командой
1cv8.exe CREATEINFOBASE Srvr="srv01";Ref="trade_test";DBMS="PostgreSQL";DBSrvr="pg01";DB="trade_test";DBUID="usr1c";DBPwd="%PGPWD%";Locale="ru_RU";CrSQLDB="Y";SchJobDn="Y" /UseTemplate "D:\dt\trade.dt" /AddToList "Торговля (тест)" /Out "D:\dt\create.log" /DumpResult "D:\dt\create.txt"
rem 2. Загрузить .dt в уже созданную пустую базу
1cv8.exe DESIGNER /S "srv01\trade_test" /DisableStartupDialogs /RestoreIB "D:\dt\trade.dt" /Out "D:\dt\restore.log" /DumpResult "D:\dt\restore.txt"
rem 3. ibcmd: база данных и загрузка без кластера; -W спросит пароль СУБД в консоли
ibcmd.exe infobase create --dbms=PostgreSQL --db-server="pg01 port=5433" --db-name=trade_test --db-user=usr1c -W --locale=ru_RU --create-database --restore="D:\dt\trade.dt"
Ключ -JobsCount у /RestoreIB задаёт число потоков загрузки, по умолчанию — по числу процессоров. По справке ускорение есть, когда сервер 1С и PostgreSQL на одной машине или связаны каналом от 1 Гбит/с.
Блокировка регламентных заданий — свойство базы в кластере, загрузка .dt её не снимает. Типовые на БСП вдобавок замечают смену строки соединения и показывают окно «Информационная база была перемещена или восстановлена из резервной копии».
Для регулярных тестовых копий удобна внешняя обработка администратора. С версии 8.3.14 кластером управляют объектом АдминистрированиеСервера через службу ras (порт 1545), без COM. Первый листинг регистрирует базу и создаёт базу данных в PostgreSQL.
// Модуль формы внешней обработки «Развертывание копии». Платформа 8.3.14 и новее,
// на сервере 1С запущена служба ras. Пароли берутся из полей формы, в коде их нет.
&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыНовойБазыPostgreSQL()
Настройки = Новый Структура;
// Кластер: адрес службы ras, ее порт и порт менеджера кластера
Настройки.Вставить("АдресRAS", "srv01");
Настройки.Вставить("ПортRAS", 1545);
Настройки.Вставить("ПортКластера", 1541);
Настройки.Вставить("АдминистраторКластера", ""); // пусто, если администраторы не заведены
Настройки.Вставить("ПарольАдминистратораКластера", "");
// Информационная база в кластере и база данных в PostgreSQL
Настройки.Вставить("ИмяВКластере", "trade_test");
Настройки.Вставить("Описание", "Копия торговли для тестов");
Настройки.Вставить("СерверСУБД", "pg01"); // нестандартный порт: "pg01 port=5433"
Настройки.Вставить("ИмяБазыДанных", "trade_test");
Настройки.Вставить("ПользовательСУБД", "usr1c");
Настройки.Вставить("ПарольСУБД", "");
Настройки.Вставить("ЗапретитьРегламентныеЗадания", Истина); // копия не должна слать обмены
Возврат Настройки;
КонецФункции
// Регистрирует базу в кластере и создает базу данных в PostgreSQL. Возвращает имя в кластере.
&НаСервереБезКонтекста
Функция СоздатьБазуВКластере(Знач Настройки)
ПроверитьИмяБазыДанных(Настройки.ИмяБазыДанных);
Агент = Новый АдминистрированиеСервера(Настройки.АдресRAS, Настройки.ПортRAS);
Кластер = Неопределено;
Для Каждого Элемент Из Агент.ПолучитьКластеры() Цикл
Если Элемент.Порт = Настройки.ПортКластера Тогда
Кластер = Элемент;
Прервать;
КонецЕсли;
КонецЦикла;
Если Кластер = Неопределено Тогда
ВызватьИсключение СтрШаблон("Служба ras %1:%2 не видит кластер с портом %3", Настройки.АдресRAS,
Формат(Настройки.ПортRAS, "ЧГ="), Формат(Настройки.ПортКластера, "ЧГ="));
КонецЕсли;
Кластер.ВыполнитьАутентификацию(Настройки.АдминистраторКластера, Настройки.ПарольАдминистратораКластера);
Для Каждого Зарегистрированная Из Кластер.ПолучитьИнформационныеБазы() Цикл
Если НРег(Зарегистрированная.Имя) = НРег(Настройки.ИмяВКластере) Тогда
ВызватьИсключение СтрШаблон("В кластере уже есть база ""%1""", Настройки.ИмяВКластере);
КонецЕсли;
КонецЦикла;
База = Кластер.СоздатьИнформационнуюБазу();
База.Имя = Настройки.ИмяВКластере;
База.Описание = Настройки.Описание;
База.СУБД = "PostgreSQL";
База.СерверБазДанных = Настройки.СерверСУБД;
База.ИмяБазыДанных = Настройки.ИмяБазыДанных;
База.ПользовательБазыДанных = Настройки.ПользовательСУБД;
База.ПарольПользователяБазыДанных = Настройки.ПарольСУБД;
База.КодЯзыка = "ru_RU";
База.СмещениеДат = 0; // 2000 - только для MS SQL Server
База.СоздатьБазуДанных = Истина; // флажок «Создать базу данных в случае ее отсутствия»
База.РазрешитьВыдачуЛицензий = Истина;
База.БлокировкаРегламентныхЗаданий = Настройки.ЗапретитьРегламентныеЗадания;
Попытка
База.Записать(); // в этот момент сервер 1С подключается к PostgreSQL
Исключение
ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ВызватьИсключение ТекстОшибки + Символы.ПС + ПодсказкаПоОшибкеСУБД(ТекстОшибки);
КонецПопытки;
Возврат База.Имя;
КонецФункции
// Только латиница в нижнем регистре, цифры и подчеркивание: платформа передает имя
// в кавычках, и базу "Trade" в SQL-командах пришлось бы всегда писать в кавычках.
&НаСервереБезКонтекста
Процедура ПроверитьИмяБазыДанных(Знач Имя)
Если ПустаяСтрока(Имя) Или СтрДлина(Имя) > 63 Тогда
ВызватьИсключение "Имя базы данных пустое или длиннее 63 символов";
КонецЕсли;
Для Номер = 1 По СтрДлина(Имя) Цикл
Буква = Сред(Имя, Номер, 1);
Если СтрНайти("abcdefghijklmnopqrstuvwxyz0123456789_", Буква) = 0 Тогда
ВызватьИсключение СтрШаблон("Символ ""%1"" в имени базы данных ""%2"": допустимы a-z, 0-9 и _",
Буква, Имя);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Второй превращает текст ошибки СУБД в подсказку — при создании базы и при разборе журнала загрузки.
// Подсказка по тексту ошибки СУБД. Ошибки входа PostgreSQL присылает на языке lc_messages
// сервера, остальные платформа получает на английском, поэтому признаки - на двух языках.
// Порядок правил важен: срабатывает первое совпадение.
&НаКлиентеНаСервереБезКонтекста
Функция ПодсказкаПоОшибкеСУБД(Знач ТекстОшибки)
Правила = Новый Массив;
ДобавитьПравило(Правила, "lc_messages",
"Укажите в postgresql.conf lc_messages с кодировкой ('ru_RU.UTF-8') и выполните SELECT pg_reload_conf().");
ДобавитьПравило(Правила, "pg_hba.conf",
"В pg_hba.conf нет строки для адреса сервера 1С: host all <роль> <IP сервера 1С>/32 scram-sha-256.");
ДобавитьПравило(Правила, "password authentication failed|проверку подлинности",
"Неверный пароль роли. Если пароль верный, а метод scram-sha-256, задайте его заново через \password.");
ДобавитьПравило(Правила, "authentication method 10 not supported|requires libpq version 10",
"Библиотека libpq этой платформы не умеет SCRAM: обновите платформу или временно перейдите на md5.");
ДобавитьПравило(Правила, "connection refused|could not connect|is the server running|timeout expired",
"PostgreSQL не отвечает: проверьте службу, listen_addresses, брандмауэр и порт (pg01 port=5433).");
ДобавитьПравило(Правила, "permission denied|must be superuser|must be owner",
"Роли не хватает прав: для базы данных нужен CREATEDB, для расширений сборки 1С - SUPERUSER.");
ДобавитьПравило(Правила, "mchar|fulleq|fasttrun",
"PostgreSQL без патчей 1С: нужна сборка от фирмы «1С» или Postgres Pro.");
ДобавитьПравило(Правила, "does not match locale|incompatible with the encoding|кодировк",
"Кластер PostgreSQL не в UTF-8: создайте базу данных из template0 с локалью ru_RU.UTF-8.");
ДобавитьПравило(Правила, "does not exist|отсутствует в сервере баз данных",
"Нет базы данных или роли: сверьте имена и флажок «Создать базу данных в случае ее отсутствия».");
ДобавитьПравило(Правила, "администратор кластера не аутентифицирован",
"Передайте имя и пароль администратора кластера.");
ДобавитьПравило(Правила, "уже зарегистрирована|уже существует|already exists",
"Имя уже занято в кластере или в PostgreSQL: выберите другое.");
Текст = НРег(ТекстОшибки);
Для Каждого Правило Из Правила Цикл
Для Каждого Признак Из Правило.Признаки Цикл
Если СтрНайти(Текст, Признак) > 0 Тогда
Возврат Правило.Подсказка;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат "Готовой подсказки нет: смотрите текст после «Ошибка СУБД:» и журнал PostgreSQL.";
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьПравило(Правила, Знач Признаки, Знач Подсказка)
Правила.Добавить(Новый Структура("Признаки, Подсказка", СтрРазделить(НРег(Признаки), "|", Ложь), Подсказка));
КонецПроцедуры
Третий загружает .dt пакетным конфигуратором и читает его журнал.
// Загрузка .dt в пустую серверную базу пакетным конфигуратором на компьютере администратора.
// Платформа 8.3.18+ (Асинх и Ждать). Нужна полная установка с конфигуратором той же версии,
// что сервер 1С; на Linux имя файла - без ".exe".
&НаКлиенте
Асинх Функция ЗагрузитьВыгрузкуАсинх(Знач АдресКластера, Знач ИмяВКластере, Знач ФайлВыгрузки)
ФайлЖурнала = ПолучитьИмяВременногоФайла("log");
ФайлРезультата = ПолучитьИмяВременногоФайла("txt");
// Пользователей в новой базе нет, поэтому ключи /N и /P не нужны
Команда = СтрШаблон("""%1"" DESIGNER /S ""%2\%3"" /DisableStartupDialogs /RestoreIB ""%4"" /Out ""%5"" /DumpResult ""%6""",
КаталогПрограммы() + "1cv8.exe", АдресКластера, ИмяВКластере, ФайлВыгрузки, ФайлЖурнала, ФайлРезультата);
Попытка
КодВозврата = Ждать ЗапуститьПриложениеАсинх(Команда, , Истина);
Исключение
// нет 1cv8.exe: на машине установлен только тонкий клиент
Возврат Новый Структура("Успех, Журнал", Ложь,
"Конфигуратор не запущен: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Результат = Новый Структура("Успех, Журнал", Ложь, "");
Документ = Новый ТекстовыйДокумент;
Попытка
Ждать Документ.ПрочитатьАсинх(ФайлРезультата);
Результат.Успех = (СокрЛП(Документ.ПолучитьТекст()) = "0"); // /DumpResult: 0 - успех
Ждать Документ.ПрочитатьАсинх(ФайлЖурнала, КодировкаТекста.UTF8); // /Out пишет в UTF-8
Результат.Журнал = Документ.ПолучитьТекст();
Исключение
Результат.Журнал = СтрШаблон("Конфигуратор не записал результат (код возврата %1). Проверьте %2",
КодВозврата, КаталогПрограммы() + "1cv8.exe");
КонецПопытки;
Если Не Результат.Успех Тогда
Результат.Журнал = Результат.Журнал + Символы.ПС + ПодсказкаПоОшибкеСУБД(Результат.Журнал);
КонецЕсли;
Для Каждого ИмяФайла Из СтрРазделить(ФайлЖурнала + "|" + ФайлРезультата, "|") Цикл
Попытка
Ждать УдалитьФайлыАсинх(ИмяФайла);
Исключение
// не страшно: временные файлы платформа удалит при следующем запуске
КонецПопытки;
КонецЦикла;
Возврат Результат;
КонецФункции
Четвёртый собирает шаги вместе, его вызывают из команды формы.
// Команда формы: база в кластере -> загрузка .dt -> итог администратору. Настройки берутся
// из ПараметрыНовойБазыPostgreSQL() и заполняются из полей формы, пароли - в полях с режимом пароля.
&НаКлиенте
Асинх Функция РазвернутьКопиюАсинх(Знач Настройки, Знач ФайлВыгрузки)
Попытка
ИмяВКластере = СоздатьБазуВКластере(Настройки);
Исключение
Сообщить("База не создана: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат Ложь;
КонецПопытки;
// Для /S нужен адрес менеджера кластера; здесь он на той же машине, что и ras
АдресКластера = Настройки.АдресRAS;
Если Настройки.ПортКластера <> 1541 Тогда
АдресКластера = АдресКластера + ":" + Формат(Настройки.ПортКластера, "ЧГ=");
КонецЕсли;
Результат = Ждать ЗагрузитьВыгрузкуАсинх(АдресКластера, ИмяВКластере, ФайлВыгрузки);
Если Результат.Успех Тогда
Сообщить(СтрШаблон("База %1 создана, выгрузка загружена. Регламентные задания заблокированы: %2",
ИмяВКластере, Формат(Настройки.ЗапретитьРегламентныеЗадания, "БЛ=нет; БИ=да")));
Иначе
Сообщить("Выгрузка не загружена:" + Символы.ПС + Результат.Журнал);
КонецЕсли;
Возврат Результат.Успех;
КонецФункции
Кластер.ВыполнитьАутентификацию(...) — без неё не работают ПолучитьИнформационныеБазы() и СоздатьИнформационнуюБазу(). У Агент.ВыполнитьАутентификацию (администратор центрального сервера) порядок параметров обратный: сначала пароль, потом имя.СоздатьИнформационнуюБазу() возвращает объект с пустыми свойствами, в кластер он попадает после Записать(). В этот момент сервер 1С подключается к PostgreSQL, поэтому вызов обёрнут в Попытка с подсказкой.СоздатьБазуДанных = Истина — флажок «Создать базу данных в случае ее отсутствия»: существующую базу данных платформа подключает, а не пересоздаёт.БлокировкаРегламентныхЗаданий — обмены и рассылки в копии не запустятся. Об управлении заданиями — в статье про регламентные задания.СтрДлина(Имя) > 63 — предел длины имени в PostgreSQL: длиннее он обрезает./S без /N и /P — в пустой базе нет пользователей. КаталогПрограммы() указывает на каталог тонкого клиента: его версия совпадает с сервером, а 1cv8.exe там есть, если установлена полная платформа./DumpResult пишет 0 при успехе, журнал /Out — в UTF-8, отсюда КодировкаТекста.UTF8.Текст PostgreSQL платформа выводит после слов «Ошибка СУБД:».
no pg_hba.conf entry for host "10.0.0.5", user "usr1c", database … — нет строки для адреса сервера 1С: добавьте её и выполните SELECT pg_reload_conf();.password authentication failed for user "usr1c" (по-русски «…не прошёл проверку подлинности (по паролю)») — неверный пароль. Если он верный, а метод scram-sha-256, пароль мог остаться в md5 после переноса кластера — задайте его заново через \password.authentication method 10 not supported — libpq старого релиза платформы не умеет SCRAM: обновите платформу или временно перейдите на md5.АдминистраторКластера, в CREATEINFOBASE — ключи SUsr и SPwd.permission denied to create database — у роли нет права создавать базы: выдайте SUPERUSER (минимум CREATEDB) или создайте базу данных заранее.lc_messages = 'ru_RU.UTF-8' и перечитайте настройки.encoding "UTF8" does not match locale "ru_RU.CP1251" (в пояснении — The chosen LC_CTYPE setting requires encoding "WIN1251") или new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII) — кластер PostgreSQL не в UTF-8. Создайте базу данных из template0 с локалью ru_RU.UTF-8 (последняя команда в листинге psql) или переинициализируйте кластер, предварительно перенеся рабочие базы.mchar — PostgreSQL без патчей 1С.Connection refused или таймаут — не запущена служба PostgreSQL, listen_addresses ограничен localhost, порт закрыт брандмауэром или указан не через port=.Нет: строки платформа хранит в типах mchar и mvarchar из расширений сборки для 1С. Версию PostgreSQL сверяйте со списком поддерживаемых СУБД для своей версии 1С 8.3 на v8.1c.ru.
Нет, с флажком «Создать базу данных в случае ее отсутствия» платформа создаст её сама. Заранее создают, когда нужны свой владелец, табличное пространство или локаль: укажите это имя при регистрации, и платформа создаст таблицы в готовой базе.
Это механизм БСП: заметив смену строки соединения, он до решения администратора не выполняет по расписанию синхронизацию, отправку почты и другую работу с внешними ресурсами. Для тестовой копии нажмите «Это копия информационной базы», для переезда — «Информационная база перемещена» (так в УТ 11.4 и КА 2.5).
Выгрузите её в .dt («Администрирование» → «Выгрузить информационную базу…»), создайте пустую серверную базу и загрузите файл. До переключения пользователей сформируйте в копии тяжёлые отчёты и проведите документы: на PostgreSQL запросы выполняются иначе, чем в файловой базе.
Если рабочую базу нужно перенести на PostgreSQL за выходные, настроить права и резервное копирование или понять, почему сервер 1С не подключается к СУБД, задачу проще отдать исполнителю. Опишите конфигурацию, версии платформы и PostgreSQL в форме размещения задания — оценка бесплатная, ответ в течение рабочего дня. Другие направления — на странице услуг.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.