При разработке внешних генераторов отчетов или интеграций часто возникает необходимость обращения напрямую к базе данных 1С на уровне MS SQL. Основными причинами становятся высокая нагрузка на сервер приложений, нехватка клиентских лицензий или необходимость объединения данных из разных систем. В этой статье мы подробно разберем, как найти нужные таблицы в 1С:ЗУП, как обойти лицензионные ограничения и почему архитектурный подход имеет решающее значение.
Первая и самая главная сложность заключается в том, что имена таблиц в MS SQL (например, _Reference125 или _AccumRg1042) генерируются платформой динамически. Они индивидуальны для каждой конкретной информационной базы и могут измениться при реструктуризации (например, после обновления конфигурации или выполнения ТИС). Чтобы выяснить, какая таблица отвечает за справочник физических лиц или регистр начислений, проанализируем встроенную функцию 1С.
Для получения актуальной карты соответствия объектов метаданных и таблиц SQL воспользуемся методом ПолучитьСтруктуруХраненияБазыДанных(). Рассмотрим пример кода, который выгружает эту структуру:
СтруктураБД = ПолучитьСтруктуруХраненияБазыДанных();
Для Каждого СтрокаТаблицы Из СтруктураБД Цикл
Если СтрокаТаблицы.ИмяМетаданных = "Справочник.ФизическиеЛица" Тогда
Сообщить("Таблица справочника ФизЛица в SQL: " + СтрокаТаблицы.ИмяТаблицыХранения);
КонецЕсли;
КонецЦикла;
Эта функция возвращает таблицу значений, содержащую колонки ИмяМетаданных (как в конфигураторе) и ИмяТаблицыХранения (как в SQL). Проанализировав результат, мы сможем точно сопоставить объекты 1С:ЗУП с их физическим воплощением в базе данных.
В конфигурации Зарплата и Управление Персоналом 3.1 данные хранятся нелинейно. Выясним причину: 1С хранит историю изменений практически для всех ключевых реквизитов.
ФИОФизическихЛиц. В SQL это будет таблица вида _InfoRgXXXX. Чтобы получить фамилию на конкретную дату, необходимо делать запрос к этой таблице, выбирая запись с максимальным периодом, меньшим или равным дате отчета._CalculRg). Однако для построения аналитических отчетов гораздо удобнее использовать Регистры накопления, такие как НачисленияУдержанияПоСотрудникам (таблицы _AccumRg). В них данные уже приведены к плоскому виду и их легче суммировать через GROUP BY в SQL-запросе.Часто программисты пытаются уйти в прямой SQL из-за нехватки клиентских лицензий (например, когда 500 сотрудников хотят одновременно увидеть свои расчетные листки, а ключей всего 100). Разберем по шагам, какие существуют альтернативы прямому чтению БД, которые не нарушают лицензионную политику "1С" и работают эффективно.
Создание HTTP-сервиса внутри 1С — это современный и правильный путь. Рассмотрим, как это работает: внешний сайт или приложение делает запрос к 1С через HTTP-протокол. Платформа 8.3 выделяет сеанс для обработки запроса. Хотя технически это занимает лицензию, сеанс HTTP-сервиса живет ничтожно мало (доли секунды), после чего лицензия мгновенно возвращается в пул. Это позволяет обслуживать сотни пользователей при минимальном количестве свободных лицензий.
Проанализируем самый стабильный и безопасный метод — создание промежуточной базы данных. Выясним причину, почему это лучше прямого доступа к боевой базе:
Для реализации этого метода создадим в 1С регламентное задание, которое по расписанию (например, раз в час или ночью) будет выгружать готовые, "очищенные" данные в отдельную таблицу MS SQL:
// Пример логики выгрузки данных во внешнюю БД через COM или ADO
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open("Provider=SQLOLEDB;Data Source=ServerName;Initial Catalog=ReportsDB;User ID=user;Password=pass;");
ТекстЗапросаSQL = "INSERT INTO AggregatedSalary (FIO, Amount, Period) VALUES ('" + Данные.ФИО + "', " + Данные.Сумма + ", '" + Формат(Данные.Период, "ДФ=yyyyMMdd") + "')";
Connection.Execute(ТекстЗапросаSQL);
Если вы все же решили писать запросы напрямую к таблицам 1С, учтите три критических фактора:
WHERE всегда делайте поправку DATEADD(year, -2000, DateColumn).binary(16)). Чтобы превратить их в читаемое ФИО, вам придется делать JOIN со справочником физических лиц по полю _IDRRef.VARBINARY или IMAGE. Разобрать их чистым SQL практически невозможно без использования программного кода 1С.Подведем итог: Прямой доступ к MS SQL для получения данных из ЗУП — задача технически выполнимая, но требующая постоянной поддержки из-за динамической структуры таблиц. Рассмотренный нами метод с HTTP-сервисами или выгрузкой в промежуточную таблицу является более надежным и масштабируемым решением для систем с большим количеством пользователей.