Анонимизация базы 1С, в том числе регистров сведений (паспортные данные, телефоны, ИНН)
Администрирование - Информационная безопасность
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
1. Задача
Передаём копию рабочей базы наружу: разработчикам на доработку, подрядчикам на интеграцию, вендору на воспроизведение проблемы. Требование простое: в базе не должно остаться упоминаний реальных контрагентов, сотрудников, их ФИО, телефонов, адресов и прочих персональных данных. Но база при этом нужна «живая» - чтобы отчёты, обмены и интеграции действительно проверялись, а не падали на пустых справочниках.
2. Почему «удалить всё лишнее» - плохая идея
Разберём реальный случай. В базе, которую готовили к передаче, анонимизацию сделали так: у справочников подменили Наименование на «тип + код» (Организация 00-000023 59a29a4a, Физ.лицо 00-00-0224), а часть документов просто удалили. Внешне - красота. Что показала проверка:
- 4 188 значений с живым текстом более чем в двухстах полях. Перс.данные остались в отдельных реквизитах:
Справочник.КонтактныеЛица.Фамилия/Имя/Отчество(5 049 записей) - при том чтоНаименованиетам честно заменено на<FIO_n>, Должность. Названия организаций уцелели вОрганизации.НаименованиеСокращенное, поставщики - вНоменклатура.Комментарий, фамилии - в именах присоединённых файлов и в комментариях регистров согласования. - 5 378 присоединённых файлов (сканы, договоры, счета, ведомости) — их содержимое не обезличивалось вообще. Самый вероятный канал утечки.
- ≈4,39 млн битых ссылок. Удаление документов не почистило регистры:
РегистрСведений.бит_ДополнительныеАналитики.Объект- 1 429 624 битых из 2 536 023 записей,РегистрСведений.бит_УстановленныеВизы.Объект- 444 590 из 615 620,РегистрСведений.ДанныеПервичныхДокументов.Документ- 191 670.
Такую базу отдавать нельзя, и дело не только в перс. данных: на 4 миллионах битых ссылок любая интеграция будет выдавать ошибки, которые разработчик примет за дефекты своей доработки.
Вывод: данные нужно заменять, а не удалять, и обязательно проверять ссылочную целостность.
3. Как искать «живые» данные
Схема обезличивания почти всегда оставляет узнаваемый след: в подменённом значении есть код или хеш-суффикс. Значит «живым» можно считать значение, в котором нет ни одной цифры и нет пары угловых скобок (второе - для плейсхолдеров вида Иванов Андрей Анатольевич).
Главное — делать это на стороне СУБД, а не выгружать таблицы в код:
Выражение = "ВЫРАЗИТЬ(Т." + ИмяПоля + " КАК СТРОКА(255))";
Условие = "(" + Выражение + " <> """" И НЕ " + Выражение + " ПОДОБНО ""%<%>%""";
Если НЕ ЗаменятьЦифровые Тогда
Условие = Условие + " И НЕ " + Выражение + " ПОДОБНО ""%[0-9]%""";
КонецЕсли;
Количество кандидатов по объекту собирается одним запросом: колонка на каждое строковое поле, всё через
СУММА(ВЫБОР КОГДА <условие> ТОГДА 1 ИНАЧЕ 0 КОНЕЦ)
ЧастиЗапроса.Добавить("ЕСТЬNULL(СУММА(ВЫБОР КОГДА " + УсловиеКандидата(ИмяПоля, ЗаменятьЦифровые)
+ " ТОГДА 1 ИНАЧЕ 0 КОНЕЦ), 0) КАК П" + Строка(ЧастиЗапроса.Количество()));
На базу из ~1 400 объектов метаданных анализ укладывается в пару минут, при этом показываются не только счётчики, но и примеры значений - чтобы решение «прятать или нет» принимал человек, а не эвристика.
4. Универсальность: только метаданные, ни одного имени конфигурации
Обработка не знает, где она запущена. Список коллекций задаётся данными, а не кодом:
Описания.Добавить(Новый Структура("Коллекция,Вид,Регистр,Обезличивается", "Справочники", "Справочник", Ложь, Истина));
Описания.Добавить(Новый Структура("Коллекция,Вид,Регистр,Обезличивается", "РегистрыСведений", "РегистрСведений", Истина, Истина));
// ... Документы, РегистрыНакопления, РегистрыБухгалтерии, ПланыВидовХарактеристик
Для Каждого Описание Из ОписанияКоллекций() Цикл
Для Каждого МД Из Метаданные[Описание.Коллекция] Цикл
Дальше всё тоже динамически: имя таблицы - Вид + "." + МД.Имя, менеджер - Справочники[Имя] или РегистрыСведений[Имя], объект - Ссылка.ПолучитьОбъект(), поля - обход метаданных (Реквизит.Тип.СодержитТип(Тип("Строка"))), плюс стандартное Наименование, измерения и ресурсы регистров, табличные части. Именно поэтому обработка завелась без правок в БП, УТ 11, ЗУП и в конфигурации с БИТ.ФИНАНС (сильно доработанная и сильно старая).
5. Что и чем заменяется
| Поле | Чем заменяется |
|---|---|
Наименование |
«синоним объекта метаданных + код элемента»: Контрагенты 000123. Если кода у объекта нет - <Контрагенты_1> |
Фамилия, Имя, Отчество, ФИО |
<ФИО_N> |
Телефон |
<ТЕЛ_N> |
Почта, Email, АдресЭП, Логин, Пароль |
<ПОЧТА_N> |
Адрес, Улица, Город, Квартира, Индекс, Регион, НаселенныйПункт, Район |
<АДРЕС_N> |
Паспорт, СНИЛС, Документ, Удостоверение |
<ДОК_N> |
Комментарий, Описание, Содержание, Назначение, Примечание |
<КОММ_N> |
| остальные строковые реквизиты | <ТЕКСТ_N> |
Категория выбирается по имени поля, поэтому таблица расширяется без правки логики. Внутри одного объекта одинаковые исходные значения получают одинаковый токен (ведётся соответствие «исходное → токен»): различимость данных сохраняется, а прочитать их уже нельзя. Ссылочные, числовые и датовые реквизиты не трогаются.
Отдельная галочка «Заменять также числовые» расширяет правило на значения с цифрами — ИНН, КПП, телефоны, коды. Предопределённые элементы по умолчанию пропускаются, чтобы не ломать код, ищущий их по имени.
6. Отчёт: сжатый, а не миллион строк
Отчёт устроен так, чтобы его можно было прочитать глазами:
- шапка: конфигурация, дата, пользователь, режим (запись включена или это только отчёт), опции;
- итоги: сколько объектов проанализировано, сколько записей просмотрено, сколько значений-кандидатов и сколько заменено, сколько битых ссылок;
- до 60 строк по объектам с находками: объект, записей, кандидатов, заменено, битых ссылок и пример значения (либо состояние, если объектов больше);
- топ-10 объектов по битым ссылкам с расшифровкой, что это ломает;
- памятка про присоединённые файлы.
Полный список объектов с любыми числами — в таблице на форме, где по каждому объекту есть галочка «обезличивать» и кнопки «Отметить всё», «Обезличить выбранные (все разом)», «Обезличить следующую» (поочерёдный режим — удобно, когда нужно контролировать результат после каждого объекта).
7. Битые ссылки
Считаются тем же проходом по метаданным: на каждый реквизит-ссылку - LEFT JOIN и агрегат по NULL:
Выражение = "ВЫРАЗИТЬ(Т." + Реквизит.Имя + " КАК " + ПолноеИмя + ")";
Соединения = Соединения + " ЛЕВОЕ СОЕДИНЕНИЕ " + ПолноеИмя + " КАК С" + Строка(КоличествоСоединений)
+ " ПО " + Выражение + " = С" + Строка(КоличествоСоединений) + ".Ссылка";
Поля = Поля + "ЕСТЬNULL(СУММА(ВЫБОР КОГДА " + Выражение + " <> ЗНАЧЕНИЕ(" + ПолноеИмя + ".ПустаяСсылка)"
+ " И С" + Строка(КоличествоСоединений) + ".Ссылка ЕСТЬ NULL ТОГДА 1 ИНАЧЕ 0 КОНЕЦ), 0) КАК Б" + ...
8. Порядок работы
- Сделать копию базы и работать только с ней.
- Открыть обработку и нажать «Анализ базы» (режим «Только отчёт (без записи)» включён по умолчанию - база не меняется).
- Посмотреть таблицу: где есть находки, какие именно примеры. Отметить галками то, что нужно спрятать.
- Прогнать в режиме «только отчёт» и сверить числа с ожиданием.
- Снять галку «Только отчёт» и выполнить обезличивание - все разом или поочерёдно.
- Кнопкой «Битые ссылки» (или галкой «проверять при анализе») получить картину по ссылочной целостности и включить её в отчёт для заказчика.
- Отдельно решить судьбу присоединённых файлов и журнала регистрации, затем прогнать «Тестирование и исправление» и повторить анализ: кандидатов быть не должно.
9. Ограничения, о которых честнее сказать сразу
- Присоединённые файлы не обезличиваются. Справочники
*ПрисоединенныеФайлыи тома хранения содержат бинарное содержимое; обработка их не трогает, это отдельная задача (удалить тома или заменить файлы синтетическими). - Регистры накопления и бухгалтерии - только анализ. Их перезапись может испортить учёт, поэтому в колонке «Что делает» для них так и написано.
- Регистры сведений обезличиваются через наборы записей с отбором по измерениям (плюс период и регистратор, если они есть) - по одной записи за раз, на больших регистрах это медленно, есть «Ограничение записей».
- Журнал регистрации хранит имена пользователей и компьютеров отдельно, обработка к нему не относится.
- Отчёт сохраняется на сервере. Файловые операции в тонком клиенте недоступны, поэтому диалог выбора пути только выбирает путь, а пишет файл сервер: в клиент-серверной базе путь указывается с точки зрения сервера.
- Битые ссылки показаны только для информации что с ними делать думать отдельно.
11. Проверено на
БП 3.0, БИТ.ФИНАНС, УТ 11, ЗУП - открывается и работает без изменений в коде; на базе с 11 925 контрагентами, 2 460 физлицами и 5 049 контактными лицами анализ проходит за пару минут.
Пример анонимизации в УТ11 регистр документы и справочник Физические лица:
Вроде говорят, что есть такая типовая обработка, но отзывы не очень, хотя возможно они устарели, не проверяла, но возможно, идеального механизма для такой задачи не существует.
Если кто-то будет пользоваться и обнаружит ошибки, то дайте знать, постараюсь оперативно исправить.
Проверено на следующих конфигурациях и релизах:
- Управление торговлей, редакция 11, релизы 11.5.27.81
- Зарплата и управление персоналом, редакция 3.1, релизы 3.1.38.92
- Бухгалтерия предприятия, редакция 3.0, релизы 3.0.206.19
Вступайте в нашу телеграмм-группу Инфостарт