Часто перед разработчиками встает специфическая задача — быстрая выгрузка данных из базы 1С с фильтрацией (аналогом RLS) или массовая замена строковых реквизитов для деперсонификации (обезличивания) данных. Использование штатных средств платформы может быть слишком медленным, поэтому возникает потребность работать с СУБД напрямую. Разберем по шагам, какие инструменты и методы существуют для решения этой задачи, учитывая, что по лицензионному соглашению прямой доступ к таблицам не рекомендуется, но в некоторых тестовых и интеграционных сценариях без него не обойтись.
Если нам необходимо писать запросы в привычном синтаксисе платформы, но выполнять их напрямую на СУБД, рассмотрим применение трансляторов. Посмотрим на несколько доступных решений:
1С 7.7 широко применялась компонента 1C++, имеющая встроенный транслятор. Также существует продукт SELTA, который на лету транслирует запросы T-SQL (MS SQL) в pl/pgSQL (PostgreSQL).Объект.Записать() или выполнении обычного запроса 1С.Проанализируем ситуацию: нам нужно быстро обезличить базу, и на сохранность связности объектов нам «пофиг» (как указано в исходной задаче). В этом случае логично использовать средства самой базы данных.
Для PostgreSQL (а также форков типа Platform V Pangolin) мы можем использовать специальное расширение postgresql_anonymizer. Оно позволяет настроить правила маскирования прямо в БД. При выгрузке дампа утилита сама заменяет ФИО, телефоны и другие чувствительные данные на сгенерированный шум. Структура базы при этом остается неизменной.
Если мы работаем с MS SQL Server, рассмотрим использование встроенного механизма Dynamic Data Masking. Он позволяет скрыть данные от пользователей, не имеющих прав на чтение реальных значений. В качестве альтернативы можно написать SQL-скрипты для массового выполнения UPDATE, используя функции рандомизации строк.
Для быстрой выгрузки данных в обход сервера 1С рассмотрим специализированные коннекторы и ETL-инструменты (например, Apache NiFi, Loginom или скрипты на Python). Выясним причину их высокой скорости: они подключаются напрямую к SQL-базе и тянут сырые данные параллельными потоками.
Однако таблицы в SQL имеют нечитаемые имена (например, _Reference85). Чтобы не искать нужные поля вручную, применяют парсеры метаданных. Они читают таблицу Params (или файл 1Cv8.1CD), строят карту структуры БД и создают SQL-представления (Views) с понятными русскими именами. Эмуляция RLS в таком случае прописывается прямо в этих Views с помощью конструкции WHERE.
Если мы хотим написать обработку прямо в 1С, которая будет выполнять быстрые операции на уровне SQL, мы используем технологию ADO. Разберем небольшой пример того, как это делается через COM-объект ADODB.Connection.
Посмотрим на пример кода, который выполняет прямой запрос на изменение данных (внимание, перед использованием такого подхода обязательно делайте бекап!):
СоединениеSQL = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "Provider=SQLOLEDB.1;Password=ВашПароль;Persist Security Info=True;User ID=ВашПользователь;Initial Catalog=ИмяБазы;Data Source=ИмяСервера";
Попытка
СоединениеSQL.Open(СтрокаПодключения);
Исключение
Сообщить("Ошибка подключения к SQL: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
КомандаSQL = Новый COMОбъект("ADODB.Command");
КомандаSQL.ActiveConnection = СоединениеSQL;
// Выполняем прямую замену реквизита в физической таблице справочника
КомандаSQL.CommandText = "UPDATE _Reference85 SET _Description = 'Обезличено' WHERE _Description LIKE '%Секретно%'";
КомандаSQL.Execute();
СоединениеSQL.Close();
Важное замечание: При прямой записи в СУБД (особенно в MS SQL) может происходить блокировка таблиц целиком или на уровне страниц. Кроме того, сервер 1С активно использует кэширование. Если мы меняем данные в обход платформы, 1С об этом не узнает. Поэтому после таких манипуляций потребуется сброс серверного кэша платформы.
Как мы видим, задача прямого доступа имеет множество решений: от низкоуровневых инструментов вроде Query Analyzer (Management Studio) до продвинутых парсеров метаданных и расширений СУБД для автоматической деперсонификации. Выбор конкретного инструмента зависит от архитектуры вашей инфраструктуры и используемой СУБД.