Обезличивание базы 1С: что ломается на живых данных и почему движок пришлось трижды адаптировать под разные данные

19.08.26

Администрирование - Информационная безопасность

Список маркеров персональных данных - не настройка, которую пишут один раз. На третьей по счёту базе движок молча пропустил реквизит с живыми номерами физлиц: он назывался так, что ни одна из искомых подстрок в его имя не попала, правило не создалось, и по отчёту база была полностью обезличена. Почти все дыры вскрыла одна база - свежая копия продуктива, а две до неё отработали чисто и убедили меня, что механизм готов. Дальше по тексту: восемь миллионов товарных кодов, принятых за ИНН юрлиц, и почему контроль контрольной суммы пришлось сознательно ослабить; двадцать четыре тысячи имён в словаре на пятьдесят восемь тысяч человек, из-за чего больше половины людей физически не могли получить уникальное ФИО; и гипотеза, на которой стояла вся конструкция и которая оказалась неверной - имя реквизита не говорит о содержимом, причём врёт в обе стороны сразу.

Тестовую базу из продуктива делают все. Не демо-набор из трёх номенклатур, а свежую копию боевой: с её объёмами, её грязью и её пограничными случаями. Иначе не воспроизвести баг, который живёт только на реальных данных.

Вместе с объёмами в копию едет и всё остальное: ФИО, ИНН, адреса, телефоны, банковские реквизиты, зарплатные начисления. Дальше копия расходится по разработчикам и тестовым серверам, иногда доезжает до чьего-то ноутбука, и живёт там месяцами. Знакомая картина?

Я прошёл этот путь на нескольких базах, и вот что оказалось обиднее всего: почти все дыры вскрыла одна из них - свежая копия продуктива. Две базы до неё отработали чисто и убедили меня, что механизм готов. Ниже три дыры, и все три про то, как живая база отказывается быть похожей на представление о ней.

 

Почему нельзя просто затереть

Прежде чем писать своё, я честно перебрал очевидные пути.

Вариант Почему не сработало
Пустая или демо-база Половина задач вслепую не решается: ни объёмов, ни грязи, ни краевых случаев
Доступ к боевой через VPN Данные всё равно перед глазами, плюс администрирование доступов и чужое неудобное окружение
Ручная зачистка полей Повторять на каждую копию, ломается ссылочность, и главное - необратимо
Синтетическая генерация Трудоёмко, и синтетика не воспроизводит те самые краевые случаи, из-за которых баги и возникают

Самый популярный пункт здесь третий, и он же самый неприятный. Затёртые данные назад не вернёшь, а значит результат, полученный на такой базе, потом не с чем сверить: бухгалтерия не проверит расчёт, потому что цифры в базе уже не те. Отсюда требование, с которого всё началось: данные должны становиться бессмысленными для постороннего, но возвращаться обратно.

Инженерно это псевдонимизация, а не обезличивание: пока существует файл соответствий, процесс обратим. Разница не терминологическая. Файл соответствий - это ключ, и хранить его надо как сами данные.

 

Первая дыра: поле, которое никто не искал

Определение класса данных начинается с имени реквизита. Увидел в имени ИНН - завёл правило. На двух базах подряд этого хватало.

На третьей идентификатор физлица звали ИдентификационныйКодЛичности. Ни одной из искомых подстрок в этом имени нет. Правило не создалось, реквизит в разбор не попал, и живые двенадцатизначные номера остались лежать в базе, которая по отчёту была полностью обезличена.

Отчёт при этом не соврал. Он честно перечислил всё, что заменил. Просто у отчёта нет графы «что я не понял».

Отсюда правило для любого, кто обезличивает базу чем угодно, хоть своим скриптом: после прогона надо открыть базу и посмотреть глазами. Не отчёт. Базу.

Та же дыра, только тихая, получается под ограничением доступа на уровне записей. Прогон под неполными правами увидит подмножество строк, обезличит его и отчитается зелёным - а остальное останется как было. Права надо проверять на входе и без полных просто не запускаться.

 

Вторая дыра: восемь миллионов кодов, похожих на ИНН

Обратная ошибка того же механизма, и вылезла она из оценки времени. Сканер набрал десятки таблиц и честно показал до старта: работы примерно на сто часов. Четверо суток. Срок волновал меньше. Интересовало, откуда столько.

Больше восьми миллионов записей дал один справочник товарных кодов. Персональных данных там нет ни одной. Он попал в работу из-за десятизначных кодов вида 3202900001, которые формально выглядят как ИНН юрлица.

Лечится контрольной суммой: у настоящего ИНН она сходится, у товарного кода обычно нет. Именно обычно - контрольная цифра одна, и случайное десятизначное число проходит её примерно в одном случае из десяти. То есть сумма снимает девять десятых шума. Оставшуюся десятую добирает уже проверка содержимого.

Но ровно здесь пришлось принять решение, которым я до сих пор не доволен.

// Слишком строго - пропустим настоящие персональные данные: в живых базах
// номер с опечаткой не редкость, а он всё равно остаётся номером человека.
// Слишком мягко - обезличим товарные коды.
//
// Разводим по длине. 12 цифр - формат ИНН физлица, посторонние коды такой
// длины встречаются редко, берём даже с несошедшейся суммой.
// 10 цифр - формат ИНН юрлица, но именно в эту длину попадают товарные
// и складские коды, поэтому здесь требуем контрольную сумму.
Если СтрДлина(Цифры) = 12 Тогда
	Возврат Истина;
КонецЕсли;

Возврат КонтрольнаяСуммаСходится(Цифры);

То есть для двенадцатизначных контроль сознательно ослаблен. Считаю, что размен правильный: лишняя подмена стоит мусора в тестовой базе, пропуск стоит утечки.

Слабое место этого решения нашлось быстро, и не там, где я ждал. Штрихкод UPC-A - ровно двенадцать цифр, и лежит он в справочнике штрихкодов любой торговой базы сотнями тысяч записей. Так что «посторонние коды такой длины встречаются редко» - утверждение, которое живёт ровно до первой розничной конфигурации. Отдельной галочки, чтобы выключить подмену двенадцатизначных, я не сделал, и это, наверное, зря.

 

Третья дыра: двенадцать тысяч имён на пятьдесят восемь тысяч человек

Эта нашлась не как ошибка. Она нашлась как «что-то сломалось»: на справочнике физлиц скорость упала в шесть раз и дальше не восстанавливалась.

Ничего не сломалось. Кончился словарь. Генератор ФИО собирал значение из конечного набора: 30 фамилий на 20 имён на 20 отчеств. Двенадцать тысяч комбинаций на пол, двадцать четыре на всю базу - при 58 124 живых людях в справочнике.

Дальше арифметика неумолимая. Больше половины людей в базе физически не могли получить уникальное имя. Генератор честно пытался: пересоливал значение и проверял снова, до полусотни попыток на человека. А после пятидесятой молча отдавал занятое имя второму человеку. До двенадцати одинаковых ФИО на разных людей в одной базе.

Обратимость от этого не страдала - журнал хранит связь по каждому объекту, вернулось всё. Страдало правдоподобие. А вместе с ним доверие: разработчик, который видит в справочнике двенадцать одинаковых Ковалёвых, начинает подозревать всю копию целиком.

Вывод шире, чем про словари. Качество синтетики - это инженерная задача. Словарь я расширил, и при исчерпании теперь добавляется видимый различитель («Ковалёв Алексей Фёдорович 2») вместо тихого дубля. Выглядит искусственно, зато разные люди остаются разными людьми.

 

Что из этого следует: имя реквизита врёт

Три истории выше - один и тот же дефект в трёх видах. Вся конструкция стояла на допущении, что имя реквизита достаточно надёжно говорит о содержимом. Допущение экономное, и на первых базах оно держалось.

Оно неверно, и врёт в обе стороны сразу:

  • ИдентификационныйКодЛичности - по имени не догадаешься, внутри персональные данные;
  • справочник товарных кодов - по имени тоже не догадаешься, зато содержимое по формату прошло как ИНН;
  • справочник новостей с реквизитом, в имени которого есть «ИНН», а внутри идентификатор записи;
  • НаименованиеПолное у контрагента-юрлица - имя обещает имя человека, внутри название организации. Синтетика превратила две компании в граждан с нормальными фамилиями.

Правильный признак - заглянуть внутрь. Взять из реквизита сотню значений и посмотреть, на что они похожи: если это цифры с точками, короткие и без пробелов, то перед нами коды, и класс имён назначать нельзя, как бы реквизит ни назывался.

Но честно скажу, где эта конструкция всё ещё дырявая. Заглядывание внутрь спасает от ложных срабатываний, а от пропуска не спасает: значения смотрят только у тех реквизитов, которые уже прошли отбор по имени. То есть первую дыру я закрыл дописав пять строк в тот самый список маркеров, который только что объявил ненадёжным. Никакой новой архитектуры. Честнее было бы читать содержимое всех строковых реквизитов подряд, но на базе в сто тысяч объектов это другая цена прогона, и я на неё пока не пошёл.

И ещё одно место, где я сделал прямо противоположное собственному правилу. Маркеры СерияДокумента и НомерДокумента пришлось из списка убрать: они цеплялись за НомерДокументаМодернизации у основных средств, а номер хозяйственного документа подменять нельзя, он часть учёта. Только серия и номер документа - это ещё и паспорт. Одно ложное срабатывание я разменял на класс настоящих персональных данных, и правильное решение тут - исключение по конкретному объекту метаданных. Удалять маркер целиком было ошибкой, и пока она не исправлена.

 

Двадцать две секунды

Самая дорогая по времени отладки история дня оказалась не про данные вовсе.

Прогон отработал, а вердикт был красный: файлы соответствий «не найдены». Их не было по тому пути, который обработка сама же показала пользователю. На диске при этом всё лежало - в соседнем каталоге, отличавшемся на 22 секунды: на экране ...154420, на диске ...154442.

Имя рабочей папки вычислялось дважды, из текущего времени, в двух разных местах кода. Между вычислениями прошли те самые 22 секунды. Если путь показывается пользователю, он должен быть вычислен один раз и запомнен, иначе показанный путь и фактический - разные вещи, и расходятся они ровно тогда, когда что-то идёт не так.

Рядом стоит история страшнее. Рабочая копия файла соответствий на сервере затиралась после выгрузки на клиент, а признаком успешной выгрузки считался непустой результат вызова. Проверять надо было по факту: существуют ли файлы и не нулевого ли они размера. Единственный ключ к данным нельзя удалять по косвенному признаку.

Из той же оперы главный инвариант, до которого я дошёл не сразу: соответствие «исходное - псевдоним» пишется до фиксации транзакции, которая ставит псевдоним в базу. Порядок выбран так, чтобы при обрыве в журнале соответствий оставались лишние строки. Такое чинится дедупликацией при возобновлении. Обратная ошибка - псевдоним в базе без записи в журнале - не чинится ничем. Полной гарантии тут, впрочем, не даст никто - буферизация файла и журнал транзакций СУБД живут своей жизнью, и на разных машинах в клиент-серверной схеме тем более. Но направление ошибки выбирается сознательно, и это половина дела.

 

Чего обезличивание не закрывает в принципе

Суммы, количества и даты остаются настоящими. Иначе база перестаёт быть похожей на себя, оборотно-сальдовая не сходится, и работать с копией нельзя. Но отсюда следует, что идентификация по совокупности косвенных признаков остаётся возможной: у кого ещё в этом месяце была ровно такая начисленная сумма.

Часть данных лежит в двоичном виде. Версии объектов, история данных, содержимое присоединённых файлов, секреты в безопасном хранилище - подменить там нечего, можно только удалить, и обратного хода по ним не будет.

Журнал регистрации средствами встроенного языка не чистится. Совсем. Это ручной шаг администратора: остановить сервер и удалить файлы журнала. Оговорка важная: журнал живёт отдельными файлами в каталоге кластера, а не внутри базы, поэтому в бэкапе СУБД и в выгрузке dt его нет. Риск возникает, только если копию отдают каталогом целиком - но тогда вместе с ней уезжают имена и действия живых пользователей.

 

Когда база уходит наружу

Всё выше про тестовую базу внутри периметра. Отдельная история начинается, когда копия уезжает подрядчику, и там обратимость перестаёт быть удобством.

Тестовую базу вы в конце просто удаляете. А доработку, сделанную внешней командой, надо принять: проверить расчёт на настоящих цифрах, сверить итоги, показать бухгалтерии. Если данные затёрты, сверять не с чем - вы принимаете работу на суррогате и надеетесь, что на боевых всё повторится. Обратимость превращает приёмку из «поверим» в «проверим».

И утечку ищут у того, чьё имя стоит на базе, а не у того, кто её потерял. Подрядчик может быть сколь угодно аккуратным, разбираться будете вы. Поэтому вопрос решается на входе - тем, что вообще уезжает наружу.

Практический минимум при передаче:

  • файл соответствий не уезжает вместе с копией, никогда, ни в том же архиве, ни следом;
  • пароль на него нигде не хранится - потеряли пароль, потеряли обратный ход;
  • перед отправкой копию открывают и смотрят глазами;
  • прогон повторяется на каждую новую копию: старый файл соответствий к новой копии не подойдёт;
  • и прямой ход, и возврат гоняются в монопольном режиме, с выключенными регламентными заданиями. Объект, который кто-то поменял между двумя ходами, вернуть уже нечем.

Всё описанное выше делает обработка, она лежит отдельной публикацией: Анонимизатор базы данных PRO. Сразу про деньги, чтобы карточка не открывалась в ожидании файла за стартмани: это Маркетплейс, 42 700 руб. с НДС, что входит в цену и как продлеваются обновления - написано там же. Внутри ровно то, что разобрано выше: проход по всей базе, подмена персональных данных правдоподобной синтетикой с сохранением длин и контрольных сумм, журнал соответствий и обратный ход по нему. Ограничения из раздела "Чего обезличивание не закрывает в принципе" действуют и для неё, я их не обхожу.

 

Другие наши инструменты диагностики 1С:

Вступайте в нашу телеграмм-группу Инфостарт

обезличивание базы 1С псевдонимизация 1С анонимизация персональных данных 1С тестовая база из продуктива передача базы подрядчику персональные данные в 1С обезличить копию базы обратимое обезличивание ИНН контрольная сумма маскирование данных 1С подготовка базы для аутсорса датасет соответствий восстановление данных после обезличивания карта персональных данных 1С

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы, интерфейс 8.5. Может выполнять свертку одновременно в несколько потоков, а также без непосредственного участия пользователя. Решение в Реестре отечественного ПО.

24900 руб.

20.08.2024    77346    389    171    

331

Информационная безопасность Поиск данных ServiceDesk, HelpDesk Журналы и реестры данных 1С 8.3 Россия Бухгалтерский учет Бюджетный учет Налоговый учет Управленческий учет Платные (руб)

Полный контроль над изменениями в 1С без нагрузки на вашу базу. Мгновенный доступ к истории изменений, удобное сравнение и откат данных в один клик. Простой отчет с визуальным отображением изменений Откат на любую версию объекта в два клика История изменения данных хранится во внешней базе

180000 руб.

05.09.2025    5338    2    1    

4

Чистка данных Системный администратор Программист 1С:Предприятие 8 1C:Бухгалтерия 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Update 2026: добавили многопоточное удаление данных по организациям. Ускорение х6 по сравнению с однопоточным алгоритмом! Позволяет удалить организации из любых из информационных баз 1С на управляемых формах (БП 3.0, УТ 11, КА 2, ERP 2, ЗУП 3, УНФ, Розница 3.0 и пр.). Главное требование - программа должна содержать справочник "Организации". Реализован самый быстрый алгоритм непосредственного удаления объектов. Работает даже на базах большого размера. Для ускорения работы алгоритма не запускается проверка контроля ссылочной целостности. Проверку учета можно запустить отдельно с помощью дополнительной обработки. Необходимо перед удалением самостоятельно проверить базу на наличие перекрестных ссылок разных организаций в одном документе. Эту дополнительную обработку проверки перекрестных ссылок по запросу предоставляем бесплатно нашим покупателям.

12139 руб.

16.03.2015    282003    265    84    

297

Информационная безопасность Инструменты администратора БД Инструментарий разработчика Учет документов Системный администратор Программист Бизнес-аналитик Бухгалтер Пользователь Руководитель проекта 1С 8.3 1С 8.5 Розничная и сетевая торговля (FMCG) Платные (руб)

Контроль ввода данных в 1С: проверка заполнения реквизитов, обязательные поля, контроль перед записью и проведением, запрет проведения документа. Позволяет настраивать любые проверки данных в 1С 8.3/8.5 от обязательных полей до сложных условий – без открытия конфигуратора и написания кода. Готовое расширение, которое подключается и работает сразу.

6000 руб.

15.04.2026    3171    5    0    

21

Чистка данных Системный администратор Программист 1С:Предприятие 8 1C:Бухгалтерия 1С:Бухгалтерия 1.6 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 10 1С:Управление торговлей 11 1С:Розница 2 1С:Розница 3.0 Платные (руб)

Данные обработки помогут Вам легко и, главное быстро, выполнить удаление любых данных в Ваших базах 1С на платформах 8.1-8.3. Обработки помогут легко просмотреть связи ссылок в виде дерева, выбрать что удалять, а что нет, используя любые отборы. Это позволит уменьшить объем лишней и не нужной информации в справочниках и документах, планах видов характеристик и др. объектах и облегчит работу с данными пользователям и Вам. Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. (Обновление от 26.02.2026, версия 4.5, 4.6.0)

14640 руб.

22.02.2013    148237    293    155    

461

Оптовая торговля Логистика, склад и ТМЦ Чистка данных Программист Бухгалтер Пользователь 1С:Предприятие 8 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Если вы начали работать в программном продукте Управление Торговлей, редакция 11 или Комплексная Автоматизация редакция 2 и включили механизм учёта серий, то перейти обратно в учёт без серий будет не так-то просто. Сложность заключается в том, что нужно очистить серии в табличной части документа, например, Реализация Товаров и услуг. Предлагаем алгоритм перехода на учет без серий для программного продукта УТ11. (Очистка серий.)

5084 руб.

09.04.2019    32456    50    15    

53

Чистка данных Программист Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Платные (руб)

Обработка позволяет удобно и выборочно удалить данные из базы 1С на управляемых формах например БП 3.0, УТ 11, КА 2, ERP, УНФ, ЗУП 3, Розница и др. Это могут быть неактуальные организации или другие перечни объектов. При этом есть возможность провести анализ пересечений документов с другими организациями и таким образом уберечься от того, что при удалении обороты по другой организации изменятся. Объекты нужно выбирать вручную и после этого запускать команду удаления. Будут удалены все ссылки на них.

5000 руб.

28.11.2019    30989    83    21    

98

Чистка данных Системный администратор Программист Бухгалтер Пользователь 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)

Решение по удалению дублей позволяет определить связанные элементы в двух синхронизированных базах в качестве оригиналов и избежать необходимости ручного сравнения объектов в базах перед синхронизацией.

6100 руб.

27.06.2018    21173    17    3    

20
Для отправки сообщения требуется регистрация/авторизация