При администрировании баз данных на платформе 1С:Предприятие 8.2 и 8.3 (особенно в конфигурациях на обычных формах, таких как «Бухгалтерия предприятия» редакции 2.0) специалисты часто сталкиваются со следующей проблемой. При попытке физического удаления пользователя из справочника Пользователи через стандартную обработку «Поиск и удаление помеченных объектов» система выдает ошибку.
В списке связей отображаются неубиваемые ссылки на справочник Сохраненные настройки с типами НастройкиПользователяНастройкиОтчета и Настройки формы отчета. Попытки очистить кэш на диске в каталогах Local и Roaming, а также удаление пользователя в Конфигураторе не приносят результата. Ссылки на удаляемый объект упорно остаются в базе данных.
В рамках этой статьи мы подробно разберем, почему возникает данная проблема, как устроена механика хранения этих настроек и какими способами можно полностью очистить базу от ссылок на удаляемого пользователя.
Давайте проанализируем внутреннее устройство платформы. Когда любой пользователь работает в системе (даже если он не вводил документы и не проводил операции, а только формировал стандартные отчеты, например, оборотно-сальдовую ведомость), система автоматически сохраняет параметры его работы. К ним относятся:
Все эти параметры записываются в справочник Сохраненные настройки. У этих записей в качестве реквизита Владелец (или в табличной части Пользователи) указывается конкретный элемент справочника Пользователи.
Главная сложность заключается в следующем: когда мы открываем справочник Сохраненные настройки интерактивно под учетной записью администратора, система автоматически и неявно включает жесткий отбор по текущему пользователю. Администратор видит только свои настройки, в то время как настройки удаляемого пользователя остаются скрытыми от просмотра. Именно поэтому обычный поиск в списке справочника ничего не дает.
Кроме того, при попытке открыть карточку такой настройки непосредственно из окна поиска ссылок, кнопка «Удалить текущий» в табличной части «Пользователи» оказывается заблокированной. Это сделано разработчиками конфигурации программно, чтобы пользователи случайно не нарушили внутреннюю логику хранения служебных данных отчетов.
Ниже мы подробно рассмотрим несколько практических способов обхода этого ограничения и полного удаления мешающих настроек.
Это самый простой и быстрый способ, не требующий написания программного кода или использования сторонних обработок. Нам нужно заставить интерфейс 1С показать абсолютно все записи справочника без фильтрации по текущему авторизованному пользователю. Разберем этот процесс по шагам:
Если записей слишком много или ручной поиск в справочнике вызывает затруднения, воспользуемся проверенным универсальным инструментом администратора — встроенной обработкой групповой очистки:
В некоторых случаях (например, при сильном повреждении базы или при автоматизации процесса обслуживания большого количества баз данных) ручные методы не подходят. Тогда мы можем прибегнуть к программной очистке с помощью внешней обработки «Консоль кода» или создав небольшую разовую обработку в конфигураторе.
Рассмотрим пример кода, который выполняет прямое удаление элементов справочника Сохраненные настройки без контроля ссылочной целостности, а также очищает системный кэш настроек пользователя на уровне СУБД:
// 1. Находим ссылку на удаляемого пользователя по его имени
ИмяПользователяДляУдаления = "ИвановИИ";
СсылкаНаПользователя = Справочники.Пользователи.НайтиПоНаименованию(ИмяПользователяДляУдаления);
Если НЕ СсылкаНаПользователя.Пустая() Тогда
// 2. Создаем выборку по справочнику Сохраненные настройки
ВыборкаНастроек = Справочники.СохраненныеНастройки.Выбрать();
КоличествоУдаленных = 0;
Пока ВыборкаНастроек.Следующий() Цикл
// Проверяем заполнение владельца или реквизита Пользователь
Если ВыборкаНастроек.Владелец = СсылкаНаПользователя Тогда
Попытка
ОбъектНастройки = ВыборкаНастроек.ПолучитьОбъект();
// Используем непосредственное удаление для экономии времени
ОбъектНастройки.Удалить();
КоличествоУдаленных = КоличествоУдаленных + 1;
Исключение
Сообщить("Не удалось удалить настройку: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
КонецЕсли;
Loop;
Сообщить("Успешно удалено служебных настроек: " + КоличествоУдаленных);
// 3. Выполняем очистку системных платформенных настроек СУБД
Попытка
ОчиститьНастройкиПользователя(ИмяПользователяДляУдаления);
Сообщить("Системный кэш настроек пользователя успешно очищен.");
Исключение
Сообщить("Ошибка при очистке кэша: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Этот код гарантированно и мгновенно уничтожает любые скрытые связи, позволяя безболезненно удалить сам элемент справочника Пользователи.
Проанализируем ситуацию с точки зрения методологии ведения учета и безопасности данных. Опытные системные архитекторы и ведущие программисты 1С крайне не рекомендуют производить физическое удаление пользователей из справочника, если они работали в базе хотя бы несколько дней.
Даже если данный пользователь не проводил документы лично, он мог выступать в роли:
Если мы физически удалим такого пользователя, то во всех исторических документах, отчетах версионирования и системных логах вместо его имени появится необратимая битая ссылка с надписью <Объект не найден> (уникальный идентификатор GUID). Это существенно усложнит расследование возможных ошибок учета в будущем.
Вместо физического удаления мы рекомендуем использовать следующий алгоритм «архивации» учетной записи:
Пользователи.«Архив_ИвановИИ»).Архивные пользователи и переместим сотрудника туда.Таким образом, мы сохраняем полную ссылочную целостность нашей информационной базы, защищаем исторические отчеты от появления битых ссылок и при этом полностью исключаем несанкционированный доступ бывшего сотрудника к рабочей конфигурации.