Внешние нормативные БД для 1С:Смета

Добавлено 18 окт 2017 в 16:31
Внешние нормативные БД для 1С:Смета

Задача:
При составлении смет в 1С требуется получить нормативы для региона, где ведется строительство. Нормативные БД по регионам хранятся во внешней БД. Нужна внешняя компонента 1С, которая их оттуда достанет, позволит пользователю найти и выбрать нужные нормативы, и передаст их в 1С.

Дополнительные сложности:
1. Внешняя нормативная БД - коммерческий продукт, поэтому ее данные должны быть защищены от копирования.
2. Пользователь может купить несколько БД с данными по разным регионам. Периодически (раз в квартал) эти данные обновляются. Поэтому нужна простая процедура обновления/добавления БД.
3. Защита осуществляется средствами HASP.
Для каждой нормативно БД ключ HASP определяет количество пользователей, имеющих право на работу с ней.
4. Исходные данные по нормативам приходят от разных поставщиков, в разных форматах. Нам, естественно, нужно единообразное их использование, т.е. один формат и одна структура.

Реализация: /для тех, кому интересны технические детали/
Региональные БД
Исходные данные от поставщика копируются в нашу БД формата FireBird или MS SQL Server. БД хранит данные в шифрованном виде, поэтому копировать (воровать) ее бесполезно - для расшифровки нужна специальная программа, которая будет обращаться к БД после проверки прав посредством ключа HASP.
Копирование исходных данных в поставляемую БД делается специальной программой - см. Универсальный копировщик.
После копирования делается архив БД, поставляемый пользователю.
Для установки БД у пользователя используется программа - установщик БД, восстанавливающая их из архивов средствами СУБД. Также установка может быть сделана из 1С через вызовы Службы ВНБ.
Таким образом, каждому пользователю можно предоставить свой набор региональных БД, легко добавить в него новую БД или обновить имеющуюся.

Служба ВНБ
Осуществляет доступ к данным региональных БД, поиск нужных нормативов, их расшифровку и выдачу клиентской программе.
Для каждого клиента (пользователь --> 1С --> внешняя компонента) создается свой сеанс службы. Этот сеанс уже определяет, какие БД доступны данному пользователю. Контроль прав доступа производится с помощью ключей HASP.
Помимо этого, служба осуществляет управление набором региональных БД: добавление и удаление используемых БД.
Может работать как в режиме службы WIndows, так и в виде консольного приложения (используется в основном для отладки и тестирования).

Поиск нормативов.
Можно вести поиск по коду, по наименованию, по части кода или части наименования; также можно вести поиск в наименованиях используемых ресурсов. Поиск позволяет выбрать нормы как из указанной БД, так и из всех доступных БД.

Использование ORM и обновление структуры БД
В ходе эксплуатации системы не только исправляются ее ошибки, но и дорабатывается функционал; при этом могут вноситься изменения в структуру БД.
Это приводит у двум проблемам:
1. Необходимость согласовывать SQL-запросы со структурой БД - как при разработке, так и при изменениях в программе или БД (что особенно часто ведет к ошибкам).
При этом компилятор, обычно обнаруживающий мелкие описки програмиста в наименованиях переменных и процедур, оказывается неспособен выявить ошибки в написании полей и таблиц - поскольку структура БД ему недоступна, а SQL-запрос, представляющий собой текст, им также не контролируется.
Эта проблема решается за счет использования ORM с идеологией Code-First. /Суть идеологии в том, что структура БД не проектируется какими-то отдельными инструментами, а оределяется в коде программы в виде классов и их свойств; далее, при запуске программа сама создает БД описанной структуры; таким образом, структура БД становится доступной для проверки компилятором./
Это гарантирует соответствие структуры БД ожиданиям пртграммы, а также позволяет существенно упростить доступ к объектам, хранимым в БД, заменив множество SQL-запросов одним вызовом функции, вытаскивающей объект из БД по идентификатору (особенно актуально для чтения сложных объектов, чьи данные хранятся в нескольких таблицах).
Сложные запросы с отбором и сортировкой данных производятся посредством языка LINQ - который также доступен для проверки компилятором.
(По поводу эффективности такого подхода, скорости доступа к данным, выбора ORM - здесь писать не буду, предпочитаю спорить со специалистом и спорить предметно.)
2. При обновлении программы у пользователя бывает необходимо также обновить структуру уже работающих у него баз данных - приведя их в соответствие с изменениями в программе.
Используемая ORM позволяет решить и эту задачу, автоматически приводя структуру БД в соответствие ожиданиям програмы.
В подавляющем большинстве случаев это делается минимальными усилиями программиста. Во всяком случае, за три года эксплуатации и пользователей (их несколько сотен в разных организациях) ни разу не возникло вопросов - собственно, они даже не догадываются, что структура их БД иногда обновляется.

Использование БД разного формата
За счет использования ORM и отказа от написания SQL-запросов можно сравнительно легко перейти к использованию другого сервера БД.
В настоящее время система работает в двух вариантах - под FireBird и под MS SQL.

Внешняя компонента 1С
Для доступа из 1С к данным внешней БД используется специальная внешняя компонента.
Компонента представляет собой COM-объект, для реализации вызовов 1С используется механизм Reflection, что существенно упрощает поддержку и добавление новых функций (в настоящий момент их несколько десятков).
БОльшая часть ее функционала - трансляция запросов от 1С к службе, получение данных и передача их в 1С в виде XML. (1С не умеет работать с переменными сложной структуры, поэтому проще передать ей XML и разобрать ее средствами.)
Также компонента позволяет из 1С управлять установкой и удалением нормативных БД. На время выполнения этих операций обслуживание запросов к данным прекращается.
Также в компоненте реализована интерактивная форма для отбора и поиска нормативов. (Ее оказалось проще разработать на C#.)
17954a2d38 Dac8b82f7d