Столкнулся с неприятной ошибкой во время работы с сервером администрирования 1С в связке с PostgreSQL. Сразу скажу, что данная связка сулит много нюансов и подводных камней, так что без крайней необходимости не рекомендую с ней связываться, если нет хорошего опыта работы с postgresql. Либо придется учиться по ходу дела.
Теоретический курс по основам сетевых технологий. Позволит системным администраторам упорядочить и восполнить пробелы в знаниях. Цена очень доступная, есть бесплатный доступ. Все подробности по . Можно пройти тест на знание сетей, бесплатно и без регистрации.
Суть проблемы вот в чем. Я установил postgresql 10 от postgresqlpro примерно по той же схеме, что описана у меня в статье про установку и настройку postgresql для работы с 1с. После установки выполнил инициализацию кластера простой командой:
# pg-setup initdb
Затем из дампа залил базу и какое-то время все это без проблем работало. Потом стало нужно создать новую базу. Я создал через консоль postgresql базу:
$ create database panda with owner = usr1cv8 ENCODING = 'UTF8' LC_COLLATE = 'ru_RU.UTF-8' LC_CTYPE = 'ru_RU.UTF-8';
И пошел создавать базу через панель администрирования 1с. У меня этого не получилось, вылезла ошибка.
Ошибка при создании информационной базы: Ошибка операции администрирования Ошибка СУБД: ERROR: type "mvarchar" does not exist LINE 1: create table Config (FileName mvarchar(128) not null, Creati...^
Начал искать информацию на эту тему. Понял, что создавать базу из консоли нельзя, необходимо это делать через панель администрирования 1С. ОК, удалил базу через консоль:
$ drop database panda;
Пошел в панель администрирования, но создать базу не получилось. К сожалению, не заскринил ошибку. Но суть в том, что база создавалась не в той кодировке. Сейчас поясню. Смотрим список баз на сервере:
root@sql:/opt/pgpro/1c-10/bin# ./psql -U postgres -l Список баз данных Имя | Владелец | Кодировка | LC_COLLATE | LC_CTYPE | Права доступа ------------+----------+-----------+-------------+-------------+----------------------- enterprise | usr1cv8 | UTF8 | ru_RU.utf8 | ru_RU.utf8 | =Tc/usr1cv8 + | | | | | usr1cv8=CTc/usr1cv8 panda | usr1cv8 | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres
База enterprise была залита из дампа и имеет правильную кодировку. Базу panda создает 1С через консоль администрирования, и у нее кодировка LC_COLLATE и LC_CTYPE en_US.UTF-8, а должна быть ru_RU.UTF-8. Это при том, что консоль сервера в момент настройки postgresql была правильная.
# locale LANG=ru_RU.UTF-8 LANGUAGE= LC_CTYPE="ru_RU.UTF-8" LC_NUMERIC="ru_RU.UTF-8" LC_TIME="ru_RU.UTF-8" LC_COLLATE="ru_RU.UTF-8" LC_MONETARY="ru_RU.UTF-8" LC_MESSAGES="ru_RU.UTF-8" LC_PAPER="ru_RU.UTF-8" LC_NAME="ru_RU.UTF-8" LC_ADDRESS="ru_RU.UTF-8" LC_TELEPHONE="ru_RU.UTF-8" LC_MEASUREMENT="ru_RU.UTF-8" LC_IDENTIFICATION="ru_RU.UTF-8" LC_ALL=
Я думал, что пропатченой сборки postgresql и нужной консоли достаточно, чтобы все было в порядке с кодировкой. Но ошибся. Раньше не припоминаю, чтобы сталкивался с подобной ошибкой. Получается, я попал в тупик. Я могу руками создать базу данных с нужными кодировками, но она не будет работать, так как 1С должна базу создать сама. Если же я создаю базу через 1С, выбираются дефолтные шаблоны с неподходящей кодировкой и ничего не работает.
Я нашел один вариант решения — проинициализировать заново кластер, явно указав кодировки:
# initdb --locale=ru_RU.UTF-8 --lc-collate=ru_RU.UTF-8 --lc-ctype=ru_RU.UTF-8 --encoding=UTF8
Как я понял, все текущие базы дропнутся. Возможно понял не правильно, но проверять не захотелось, так как текущая база там на 80 гигов и заливать дамп очень долго. Нашел другой способ — замена шаблона. Вот последовательность действий в консоли postgresql для удаления текущего шаблона и создания нового с нужными кодировками.
$ update pg_database set datistemplate = false where datname='template1'; $ drop database template1; $ create database template1 ENCODING = 'UTF8' LC_COLLATE = 'ru_RU.UTF-8' LC_CTYPE = 'ru_RU.UTF-8' template=template0; $ update pg_database set datistemplate = true where datname='template1';
После этого получилось через консоль 1С создать базу и начать с ней работать. Список баз стал выглядеть вот так:
root@sql:/opt/pgpro/1c-10/bin# ./psql -U postgres -l Список баз данных Имя | Владелец | Кодировка | LC_COLLATE | LC_CTYPE | Права доступа ------------+----------+-----------+-------------+-------------+----------------------- enterprise | usr1cv8 | UTF8 | ru_RU.utf8 | ru_RU.utf8 | =Tc/usr1cv8 + | | | | | usr1cv8=CTc/usr1cv8 panda | usr1cv8 | UTF8 | ru_RU.UTF-8 | ru_RU.UTF-8 | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | ru_RU.UTF-8 | ru_RU.UTF-8 |
Ошибок больше не было.
Онлайн курс «DevOps практики и инструменты»
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.
Проверьте себя на вступительном тесте и смотрите программу детальнее по .
Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!
Помогла статья? Подписывайся на telegram канал автора
Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.