Многие технические специалисты 1С сталкиваются с ситуацией, когда файловая база начинает стремительно расти, достигая критических пределов (например, 4 ГБ на таблицу), или клиент-серверная база начинает демонстрировать странные задержки при открытии форм. При анализе размеров таблиц с помощью утилит типа V8TableSizes или Tool_1CD выясняется, что виновником является системная таблица _SYSTEMSETTINGS (Хранилище системных настроек). В некоторых случаях она может занимать до 70–80% объема всей информационной базы. В этой статье мы подробно разберем, почему это происходит и как вернуть базе былую легкость.
Проанализируем, что именно хранится в этой таблице. Согласно документации 1С, таблица _SYSTEMSETTINGS соответствует объекту платформы ХранилищеСистемныхНастроек. В ней сохраняются:
Проблема заключается в том, что в определенных конфигурациях и при использовании конкретных версий Библиотеки стандартных подсистем (БСП), эти записи начинают размножаться в геометрической прогрессии, никогда не удаляясь автоматически.
Рассмотрим конкретный пример, который чаще всего является причиной «пухнущей» базы. Проанализируем работу общей формы ПечатьДокументов, которая входит в состав БСП и используется практически во всех типовых решениях (УТ 11, БП 3.0, ЗУП 3.0, ERP).
Посмотрим на настройки этой формы в конфигураторе:
ПечатьДокументов.АвтоматическоеСохранениеДанныхВНастройках.Выясняется, что в старых и некоторых текущих редакциях БСП для этой формы установлено значение Использовать. Из-за того, что форма печати часто открывается с динамически генерируемыми идентификаторами или навигационными ссылками, платформа при каждом закрытии окна печати создает новую уникальную запись в _SYSTEMSETTINGS. Эти настройки (размер окна, положение) для каждого нового сеанса печати сохраняются как уникальные, но никогда больше не считываются. Если в базе работают 20 пользователей и каждый печатает по 50 документов в день, таблица будет прирастать тысячами бесполезных записей ежедневно.
Первым шагом нам необходимо остановить конвейер по производству мусора. Для этого в конфигурации (или через расширение) следует изменить свойства проблемных форм. Выполним следующие действия:
ОбщаяФорма.ПечатьДокументов установим свойство АвтоматическоеСохранениеДанныхВНастройках в значение Не использовать.ОбщаяФорма.Вопрос. В некоторых версиях БСП она также генерирует уникальные КлючСохраненияПоложенияОкна, что приводит к записи настроек для каждого вызванного диалогового окна.ПриОткрытии или ПриСозданииНаСервере программно устанавливается КлючСохраненияПоложенияОкна = Строка(Новый УникальныйИдентификатор);, этот код следует закомментировать или заменить на статичную строку.После того как мы устранили причину, нужно почистить накопившийся мусор. Мы не можем просто «обнулить» таблицу, так как там хранятся и полезные настройки (например, избранное пользователей или настройки панелей интерфейса). Рассмотрим вариант программного удаления через встроенный язык 1С.
Для удаления можно использовать метод Удалить объекта ХранилищеСистемныхНастроек. Разберем пример кода, который удаляет настройки конкретных форм, вызывающих рост:
Процедура ОчиститьМусорныеНастройки()
// Массив ключей объектов, которые мы хотим вычистить
КлючиДляОчистки = Новый Массив;
КлючиДляОчистки.Добавить("ОбщаяФорма.ПечатьДокументов/НастройкиОкна");
КлючиДляОчистки.Добавить("ОбщаяФорма.Вопрос/НастройкиОкна");
ВыборкаПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей();
Для Каждого Пользователь ИЗ ВыборкаПользователей Цикл
Для Каждого КлючОбъекта ИЗ КлючиДляОчистки Цикл
// Метод Удалить принимает (КлючОбъекта, КлючНастроек, ИмяПользователя)
// Оставляя КлючНастроек пустым, мы удаляем все настройки для этого объекта
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, Неопределено, Пользователь.Имя);
КонецЦикла;
КонецЦикла;
Сообщить("Очистка завершена успешно!");
КонецПроцедуры
Важное замечание: При очень больших объемах данных (сотни тысяч записей) метод ХранилищеСистемныхНастроек.Выбрать() может работать крайне медленно или приводить к зависанию сессии. В таких случаях рекомендуется выполнять удаление порциями, фиксируя транзакции.
Если ваша база работает на MS SQL Server, и вы точно идентифицировали паттерн мусорных записей (например, они содержат GUID и строку "/НастройкиОкна"), можно воспользоваться прямым SQL-запросом. Это на порядок быстрее, чем использование встроенного языка.
Проанализируем структуру запроса для удаления настроек окон с длинными уникальными идентификаторами:
-- Будьте осторожны! Перед выполнением обязательно сделайте бэкап.
DELETE FROM _SystemSettings
WHERE _ObjectKey LIKE '________[_]____[_]____[_]____[_]____________/НастройкиОкна';
Этот запрос удаляет записи, где ключ объекта соответствует маске GUID. При этом настройки стандартных справочников (например, Справочник.Номенклатура.ФормаСписка/НастройкиОкна) затронуты не будут, так как они не подходят под паттерн длины и структуры GUID.
Важно понимать: после того как вы удалили записи из таблицы _SYSTEMSETTINGS, размер файла базы данных (1Cv8.1CD или .mdf) сразу не уменьшится. СУБД просто пометит эти страницы как свободные и будет использовать их для новых данных.
Чтобы физически «сжать» базу, необходимо выполнить следующие действия:
SHRINKDATABASE или SHRINKFILE через SQL Management Studio, а затем перестройте индексы (Rebuild Indexes).VACUUM FULL ANALYZE для всей базы или конкретно для таблицы _systemsettings.Проанализируем другие механизмы, которые могут влиять на размер этой таблицы. В современных УФ-интерфейсах («Такси») платформа сохраняет настройки Динамических списков. Если пользователь часто меняет отборы или условное оформление в крупных списках, количество записей также растет. Рекомендуется периодически (раз в полгода) сбрасывать настройки форм для пользователей, которые давно не заходили в систему.
Также не забывайте про таблицу _UsersWorkHistory (История работы пользователя). Хотя она меньше влияет на _SYSTEMSETTINGS, она также имеет свойство разрастаться. В БСП существуют стандартные регламентные задания для очистки истории, убедитесь, что они включены и настроены на разумный срок хранения (например, 30–60 дней).
К сожалению, на уровне платформы 1С долгое время отказывалась признавать это ошибкой, ссылаясь на то, что это «особенности реализации сохранения состояния интерфейса». Однако в последних версиях БСП разработчики всё же внесли правки в форму печати, установив запрет на автосохранение настроек. Если вы используете старую конфигурацию, описанные выше ручные правки свойств форм являются единственным надежным способом остановить рост базы.
Рассмотрим краткий чек-лист для профилактики:
V8TableSizes.АвтоматическоеСохранениеДанныхВНастройках для вспомогательных и модальных форм.Новый УникальныйИдентификатор).Соблюдение этих правил позволит поддерживать размер информационной базы в адекватных пределах и обеспечит стабильную работу пользователей без необъяснимых задержек при открытии форм.