Я как разработчик 1С в последнее время все сильнее и сильнее сталкиваюсь с живыми примерами импортозамещения. И во многом они связаны с используемой в организациях СУБД. Что говорит клиент:
- У нас MS SQL Server, но что-то дорого на новые сервера его закупать, говорят что 1С работает с PostgreSQL, а он, получается, вроде как дешевле. Давай на нем попробуем поработать! — вот как все чаще и чаще стали говорить наши клиенты. На мой взгляд, происходит это потому, что крупный бизнес подстраивается под текущие реалии, в которых традиционное "коммерческое" ПО замещается свободным open source, которое гораздо более приспособлено под задачи бизнеса, в которых основная суть - усиление клиентоориентированности и, логично, наращивание финансового эффекта от этого. Open source ПО открывает широкие возможности при решении такого рода задач, так как, по сути, не имеет границ при горизонтальном масштабировании ИТ - инфраструктуры. И нам под эти реалии также приходится подстраиваться.
Все разработки мы должны вести на очень похожей программной инфраструктуре как у клиента, чтобы затем, в продакшене, ничего плохого не вылезло. Например, у клиента СУБД PostgreSQL, а мы разработку ведем в архитектуре, где в качестве СУБД используется MS SQL. Что может произойти при таком подходе? Да много чего... Например, некоторые запросы будут вести себя совершенно по-другому. То, что MS SQL обрабатывает за пару секунд, PostgreSQL может обрабатывать за пару минут. И наоборот.
Итак, давайте на практических кейсах посмотрим, чем же PostgreSQL может быть полезна разработчику 1С (и, возможно не только...). В качестве операционной системы, на которой рассматриваются примеры, будет служить MS Windows, поскольку является самой массовой и любимой ОС разработчиков 1С. Но и в случае с Linux based системами, описанные в данной статье примеры, без особых проблем, так же осуществимы (с некоторыми модификациями, которые в данной статье рассмотрены не будут).
Начнем с того, что эффект от использования PostgreSQL сразу же проявляется в ходе установки самой СУБД. Достаточно зайти на https://postgrespro.ru/products/1c и скачать последнюю версию с поддержкой 1С. Установщик занимает порядка 50 mb, и не требует при установке загрузки из интернета дополнительных установочных модулей, что значительно уменьшает скорость установки, которая и так занимает порядка пары минут в режиме "Далее - Далее - Готово". Возможно, потребуется указать каталог «Data», где будет располагаться кластер СУБД с данными баз. Для этого желательно указать достаточно производительный диск. Так же необходимо задать пароль для доступа к кластеру. Помимо того, что PostgreSQL выигрывает у MS SQL Server в размере установщика и времени установки, для работы самой СУБД не требуется большой объем оперативной памяти, что для разработчика 1С несомненный плюс, особенно когда речь идет о разработке на достаточно требовательных к ресурсам машины конфигурациям типа ERP. В дополнении к этому, установленная СУБД не имеет ограничений на число ядер и объем используемой оперативной памяти.
Давайте перейдем непосредственно к кейсам:
1. Необходимо быстро развернуть тестовую базу из рабочей базы минуя процесс создания файла резервной копии рабочей базы.
PostgreSQL позволяет сделать «снимок» базы, обеспечив её транзакционную целостность. В командной консоли MS Windows существует возможность перенаправления вывода результата выполнения команды в поток c использованием операторов перенаправления "|". Команда будет выглядеть следующим образом:
pg_dump -h product_server -U postgres workbase | psql -h test_server -U postgres workbase_copy
здесь: product_server и test_server - имена серверов PostgreSQL, workbase и workbase_copy - имена баз на серверах PostgreSQL
Важный момент - база, в которую загружаете копию, должна существовать и должна быть чистой! Это лучше делать руками, чтобы случайно не лишить разработчиков их тестовой базы. Они могут обидеться.
Инструмент, которым все это можно проделать будет упомянут в кейсе №4. А как создать чистую базу или очистить существующую - этой информации полно на просторах интернета.
Какая практическая польза с этого:
- мы не нагружаем излишне диски, все данные передается через сетевой интерфейс с одного сервера на другой, задействуя лишь небольшой дисковый буфер
- экономим место на дисках
- значительно экономим время развертывания базы в тестовом контуре. По нашим замерам, эффект от использования такой команды - увеличение скорости развертывания в 1,5 раза! Можно гораздо быстрее приступить к любимой разработке на тестовой базе со свежими данными рабочей базы.
2. Возможность изменения положения предопределенных табличных пространств
С версии платформы 8.3.1 появилась возможность использовать отдельные табличные пространства для индексов (пространство v81c_index) и данных (пространство v81c_data) в СУБД PostrgeSQL. (https://its.1c.ru/db/v8310doc#bookmark:cs:TI000000194)
Но почему-то этой возможностью мало кто пользуется либо просто о ней забыли. Я не видел ни одной базы на серверах клиентов в которой бы использовались данные табличные пространства. Что из себя представляют – эти табличные пространства?
Прежде всего, табличные пространства позволяют организовать логику размещения файлов объектов базы данных в файловой системе.
Платформа уже из коробки при работе с СУБД PostgreSQL понимает 2 табличных пространства: v81c_index и v81c_data. Причем, сама СУБД PostgreSQL хранит индексы и данные в разных таблицах, даже кластерный индекс – так же храниться в отдельной таблице. Такой подход позволяет нам организовать хранение информации вообще на разных физических ресурсах. Самое главное что платформа 1С при реструктуризации учтет проделанную нами настройку и ничего не будет нарушено.
Табличные пространства не создаются автоматически и должны быть созданы администратором базы данных. Если дополнительных табличных пространств не создано — используется табличное пространство по умолчанию (pg_default).
После того, как табличные пространства созданы, платформа при развертывании всех новых добавляемых в кластер СУБД баз будет разделять их физическое хранение для данных и для индексов.
«В чем же польза для разработчика?» —спросите Вы. Я для себя нашел хороший пример применения такой фичи. У меня на рабочей машине 3 жестких диска, один из которых SSD, а два оставшиеся HDD по 250 ГБ. Сделав 2 табличных пространства для индексов и для данных на данных 2х HDD я тем самым увеличил суммарный объем дискового пространства, в котором я могу размещать базы для разработки.
Как это выглядит в действительности (рис 1, рис 2):
Рис 1. Размещение таблиц данных в табличном пространстве v81c_data
Рис 2. Размещение таблиц индексов в табличном пространстве v81c_index
Как создать и использовать табличные пространства – посмотрим на примере следующего кейса, так как он является логическим продолжением текущего кейса, но из «коробки» платформа не будет понимать, то, что я предлагаю реализовать.
3. Перенос файла конфигурации на более быстрые диски, например SSD
Данный кейс можно применить, когда у вас огромная тестовая база, в который вы что-то дорабатываете. В этом случае, можно выиграть пару-тройку минут при открытии, сохранении конфигурации (рис 3).
Рис 3. Перенос файла конфигурации в другое табличное пространство.
При реструктуризации все останется на своих местах, файлы конфигурации останутся там, куда мы их поместили.
Для меня данная фича оказалась очень полезной, так как на дисках, на которых была база, конфигурация открывалась очень долго, так же долго происходил процесс сохранения конфигурации, после переноса на SSD данные операции стали выполняться в раза 3 быстрее. Появилось даже некоторое ощущение что "все летает". Такие же изменения можно сделать и для таблицы, в которой храниться конфигурация расширения. Вот перечень таблиц, которые я обычно перемещаю на SSD диски, чтобы процесс разработки шел «бодрее».
Рис 4. Вынесенные таблицы в новое табличное пространство
Описание таблиц, к чему они относятся – можно найти на сайте ИТС: https://its.1c.ru/db/metod8dev#content:1798:hdoc:_top:configcas
Можно ли такое проделать и на MS SQL? Такая возможность там тоже имеется. Но меня удивило, что в случае с PostgreSQL — это делается двумя кликами мыши.
Будет ли это являться нарушением лицензионного соглашения фирмы «1С»? По моему мнению - нет не будет. Мы не затрагиваем данных и процесс реструктуризации не влияет на наши изменения.
4. Удаленный доступ с любого устройства (если на нем есть интернет).
Данный кейс, возможно даже и не совсем разработчикам, а администраторам СУБД, но, на мой взгляд, может оказаться полезным как для одних, так и для других.
Одно время я был озадачен вопросом - можно ли подключиться к серверу СУБД с мобильного устройства. Например, я в дороге, в командировке, но на почту мне приходят данные со счетчиков системы мониторинга, судя по которым на СУБД происходит какая-то беда. Хотелось, не устанавливая RDP клиента для мобильного устройства открыть браузер, перейти на нужную защищенную страничку и попасть в админку сервера СУБД. Можно ли так сделать в случае с MS SQL? Нет, нельзя. А жаль. А можно ли такое проделать такое с PostgreSQL? Можно! Только слегка придется использовать командную строку и подправить пару строк в модулях pgAdmin. На самом деле - все просто.
Первым делом необходимо установить pgAdmin 4 последней версии. В чем особенность 4 редакции? Она работает в режиме веб приложения. Конечно, по умолчанию, из коробки при запуске pgAdmin изначально стартует некий сервер, а затем открывается браузер, в котором открывается клиентская часть. Выглядит это примерно так (рис 5):
Рис 5. Админка pgAdmin. Локальный веб доступ.
Сервер, который запущен, позволяет организовать работу pgAdmin только в рамках конкретной локальной машины, на которой он же и запущен. Но нам нужно больше, мы хотим, чтобы из любой точки мира можно было управлять сервером СУБД. Выполним по шагам действия чтобы все заработало:
1. Ставим последний Python
https://www.python.org/downloads/
При установке важно указать галочку, которая означает что пути питона будут прописаны в стандартные переменные окружения. Это позволит использовать команды питона через командную консоль, не указывая полный путь до исполняемого файла команды (рис 6):
Рис 6. Настройки при установке Python
1.1. Обновляем pip (система управления пакетами).
Используем командную строку
python -m pip install --upgrade pip
2. Выполняем в командной строке установку пакета "mod_wsgi", он превратит наш pgAdmin в веб приложение.
pip install mod_wsgi
3. Выполняем
mod_wsgi-express module-config
Будет выдано сообщение примерно такого вида, его необходимо будет скопировать в буфер обмена.
LoadFile "c:/users/v.fominykh/appdata/local/programs/python/python37-32/python37
.dll"
LoadModule wsgi_module "c:/users/v.fominykh/appdata/local/programs/python/python
37-32/lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win32.pyd"
WSGIPythonHome "c:/users/v.fominykh/appdata/local/programs/python/python37-32"
4. Устанавливаем Apache web server
Его можно скачать, например, здесь https://www.apachelounge.com/
Используя конфигурационный файл, необходимо указать нужный порт и имя сервера (как это сделать - в интернете полно информации).
Далее установим Apache в качестве службы с помощью команды (из каталога bin установленного Apache):
httpd.exe -k install
5. Дополнительно скачиваем и устанавливаем через PIP необходимые оставшиеся пакеты.
Без них, к сожалению, ничего не получиться.
pip install flask
pip install flask_babelex
pip install flask_login
pip install flask_mail
pip install flask_paranoid
pip install flask_security
pip install flask_sqlalchemy
pip install simplejson
pip install python-dateutil
pip install flask_migrate
pip install psycopg2
pip install Crypto (возможно стоит удалить pycrypto)
easy_install pycryptodome
pip install sshtunnel
pip install flask_gravatar
pip install psutil
pip install sqlparse
pip install flask_htmlmin
6. Затем, необходимо ознакомиться с руководством установки pgAdmin в качестве сервера.
https://www.pgadmin.org/docs/pgadmin4/dev/server_deployment.html
Если кратко, то в установленном каталоге pgAdmin в подпапке "web" рядом с файликом config.py нужно создать файл config_local.py со следующим содержанием:
LOG_FILE = 'C:/web/srv/var/log/pgadmin4/pgadmin4.log'
SQLITE_PATH = 'C:/web/srv/var/log/pgadmin4/pgadmin4.db'
SESSION_DB_PATH = 'C:/web/srv/var/log/pgadmin4/sessions'
STORAGE_DIR = 'C:/web/srv/var/log/pgadmin4/storage'
На каталог "C:/web" необходимо дать полные права пользователю, под которым будет запущена служба сервера Apache, а также выполнить следующую команду, чтобы создать базу данных конфигурации:
python setup.py
После этого в конфигурационный файл Apache необходимо добавить строки, которые мы ранее скопировали в буфер обмена (рис 7)
Рис 7. Добавляем в httpd.conf указанные строки
а также в самый конец того же конфигурационного файла вставить следующий текст, где port - номер порта сервера.
<VirtualHost *:port>
ServerName localhost
WSGIScriptAlias / "C:\Program Files (x86)\pgAdmin 4\v3\web\pgAdmin4.wsgi"
<Directory "C:\Program Files (x86)\pgAdmin 4\v3\web">
Require all granted
</Directory>
</VirtualHost>
Сохраняем конфигурацию и запускаем службу сервера Apache.
7. Заходим по адресу http://localhost:port
Если все нормально и при вводе пароля при добавлении сервера СУБД никаких ошибок нет. То все отлично! В противном случае необходимо немного поменять модули питона.
Меняем строки в следующих двух файлах:
- C:\Program Files (x86)\pgAdmin 4\v3\web\pgadmin\browser\server_groups\servers\__init__.py
- C:\Program Files (x86)\pgAdmin 4\v3\web\pgadmin\utils\driver\psycopg2
В первом файле строки
password = data['password']
password = encrypt(password, current_user.password)
на
password = bytes(data['password'], 'utf-8')
password = encrypt(password, bytes(current_user.password, 'utf-8'))
и
password = encrypt(password, user.password)
на
password = encrypt(bytes(password, 'utf-8'), bytes(user.password, 'utf-8'))
Во втором файле строки
password = decrypt(encpass, user.password)
на
password = decrypt(encpass, bytes(user.password, 'utf-8'))
Перезапускаем службу Apache. Убеждаемся через браузер что все работает (рис 8):
Рис 8. Доступ из любой точки мира и любого браузера, допустим, с ноутбука
Если ты в пути и сервер СУБД лег, то доступ из любой точки мира с мобильного будет весьма нелишним (рис 9).
Рис 9. Доступ с мобильных устройств.
Надеюсь, что данные кейсы окажутся действительно полезными для Вас и найдут применение в повседневной работе!