Почтовый клиент 1С раздул базу: удаляем старые письма, вложения и возвращаем место на диске
Содержание
Почистить почту в 1С можно в три шага: пометить ненужные письма на удаление в списке взаимодействий, удалить их окончательно через Администрирование → Обслуживание → Удаление помеченных объектов и затем сжать базу, иначе место на диске не освободится. Если писем десятки тысяч, вместо ручной пометки используют обработку, которая ставит пометку по дате.
Ручной способ подходит, когда нужно убрать сотню-другую писем. Обработка нужна, когда почту годами получали в базу без фильтров. Вложения иногда весят больше самих писем: их чистят вместе с письмами или выносят в тома на диске. Сжатие нужно всегда, если цель — уменьшить размер файла 1Cv8.1CD или базы на SQL-сервере.
Речь о встроенном почтовом клиенте конфигураций на Библиотеке стандартных подсистем (подсистема «Взаимодействия»): УТ 11, КА 2, ERP, 1С:CRM. Механизм общий, отличаются только разделы, где лежит список писем.
Где почта занимает место и как это измерить
Прежде чем что-то удалять, проверьте, что база выросла именно из-за почты. Часто виноваты журнал регистрации, присоединённые файлы к документам или версии объектов.
Что хранится в базе при получении письма
- 📨 Документ письма. Входящие —
Документ.ЭлектронноеПисьмоВходящее, исходящие —Документ.ЭлектронноеПисьмоИсходящее. Внутри — текст письма и его HTML-версия. HTML с вшитыми картинками легко весит 1–3 МБ. - 📎 Вложения. Хранятся как присоединённые файлы письма. Если в настройках не включено хранение в томах, двоичные данные лежат прямо в базе.
- 🗂 Служебные записи. Привязка к предметам, папкам, контактам, статусы «прочтено». Они лёгкие, но при удалении их тоже придётся чистить.
Как посмотреть размер в файловой базе
Файловая база — это один файл 1Cv8.1CD в каталоге базы. Его размер видно в проводнике. Разбивку по таблицам штатно не получить, поэтому ориентируйтесь на динамику: сколько писем приходит в день и с какими вложениями.
С платформы 8.3.15 есть функция ПолучитьРазмерДанныхБазыДанных(). Через неё во внешней обработке можно узнать, сколько байт занимают конкретные объекты:
&НаСервере
Функция РазмерПочты()
Имена = Новый Массив;
Имена.Добавить("Документ.ЭлектронноеПисьмоВходящее");
Имена.Добавить("Документ.ЭлектронноеПисьмоИсходящее");
Возврат ПолучитьРазмерДанныхБазыДанных(, Имена);
КонецФункции
Результат — в байтах. Разделите на 1 048 576, чтобы получить мегабайты.
Как посмотреть размер в базе на MS SQL и PostgreSQL
На SQL-сервере видно точный размер каждой таблицы. Для MS SQL:
SELECT TOP 20 t.name AS table_name,
SUM(p.reserved_page_count) * 8 / 1024 AS size_mb
FROM sys.dm_db_partition_stats p
JOIN sys.tables t ON p.object_id = t.object_id
GROUP BY t.name
ORDER BY size_mb DESC;
Для PostgreSQL:
SELECT relname,
pg_size_pretty(pg_total_relation_size(relid)) AS size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 20;
Имена таблиц будут вида _Document245 или _Reference118. Чтобы понять, что за объект скрывается за номером, вызовите в обработке ПолучитьСтруктуруХраненияБазыДанных(): она возвращает соответствие имён метаданных и таблиц СУБД.
Удаление писем вручную из списка взаимодействий
Ручной способ хорош для точечной уборки: рассылки, спам, дубли, письма уволенных сотрудников.
Шаги
- Откройте список писем. В УТ 11 и ERP он в разделе
CRM и маркетинг → Взаимодействия. В других конфигурациях ищите в разделах команду «Взаимодействия» или «Почта». - Выберите папку слева: «Входящие», «Отправленные» или конкретную пользовательскую папку.
- Отберите письма. Удобнее всего — по дате: включите в списке отбор по периоду или отсортируйте по колонке даты.
- Выделите письма.
Shift+ клик выделяет диапазон,Ctrl+ клик — отдельные строки,Ctrl+A— всё, что видно в списке с учётом отбора. - Нажмите
Deleteили команду удаления в командной панели.
Удалённое из списка письмо не исчезает из базы. Оно получает пометку удаления и перемещается в папку «Удаленные». В этот момент база не уменьшается ни на байт.
Окончательное удаление
- Откройте
Администрирование → Обслуживание → Удаление помеченных объектов. - Выберите режим с ручным выбором объектов, чтобы видеть, что именно удаляется.
- Оставьте в списке только письма и их присоединённые файлы, остальное снимите.
- Запустите удаление.
Программа проверяет ссылки на каждый объект. Письмо, к которому привязан документ-предмет, удалится, а сам документ останется. Если на письмо ссылается другое письмо из цепочки, оно может попасть в список «не удалено»: пометьте на удаление всю цепочку.
Удаление помеченных на большой базе занимает часы. Запускайте его вечером или в выходные. Пользователи могут работать, но процесс заметно тормозит базу.
Пакетное удаление старых писем обработкой
Если писем 50–100 тысяч, выделять их мышью неудобно: список тормозит, а Ctrl+A в динамическом списке иногда выделяет не все строки. Типовой обработки «удалить письма старше N месяцев» в конфигурациях нет, её пишут как внешнюю.
Ниже пример серверной процедуры для внешней обработки. Она ставит пометку удаления на входящие и исходящие письма старше 12 месяцев:
&НаСервере
Процедура ПометитьСтарыеПисьма(КоличествоМесяцев)
Граница = ДобавитьМесяц(НачалоДня(ТекущаяДатаСеанса()), -КоличествоМесяцев);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ Письма.Ссылка КАК Ссылка
|ИЗ Документ.ЭлектронноеПисьмоВходящее КАК Письма
|ГДЕ Письма.Дата < &Граница И НЕ Письма.ПометкаУдаления
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ Письма.Ссылка
|ИЗ Документ.ЭлектронноеПисьмоИсходящее КАК Письма
|ГДЕ Письма.Дата < &Граница И НЕ Письма.ПометкаУдаления";
Запрос.УстановитьПараметр("Граница", Граница);
Выборка = Запрос.Выполнить().Выбрать();
Счетчик = 0;
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.УстановитьПометкуУдаления(Истина);
Счетчик = Счетчик + 1;
КонецЦикла;
Сообщить(СтрШаблон("Помечено писем: %1", Формат(Счетчик, "ЧГ=0")));
КонецПроцедуры
Как пользоваться:
- Создайте внешнюю обработку в Конфигураторе, добавьте форму, на неё — поле «Количество месяцев» и кнопку.
- Вставьте процедуру в модуль формы, вызовите её из обработчика кнопки.
- Сохраните
.epfи откройте черезФайл → Открытьв пользовательском режиме под пользователем с полными правами. - Сначала попробуйте на копии базы и сравните, сколько писем помечено.
- После пометки запустите «Удаление помеченных объектов», как в разделе выше.
Хотите оставить важную переписку? Добавьте в запрос условие по папке или по контрагенту. Ещё проще — перед запуском перенести нужные письма в отдельную папку и исключить её отбором.
Пометка через УстановитьПометкуУдаления() проходит штатные проверки и подписки конфигурации. Прямое удаление методом Удалить() быстрее, но обходит контроль ссылок: оставит битые ссылки в предметах и цепочках. Для почты лучше не экономить время.
Вложения и хранилище файлов
Вложения — главный кандидат на уборку: один прайс в PDF на 8 МБ, разосланный 200 клиентам, даёт 1,6 ГБ исходящих.
Удаляем вложения вместе с письмами
Присоединённые файлы письма — подчинённые объекты. Когда письмо помечено на удаление, его вложения попадают в «Удаление помеченных объектов» вместе с ним. Проверьте, что в списке удаления есть и письма, и файлы: если файлы не помечены, они останутся в базе.
Переносим файлы в тома на диске
Если письма нужны, а вложения раздувают базу, включите хранение файлов вне базы:
- В разделе
Администрированиеоткройте настройки работы с файлами и включите хранение файлов в томах на диске. - Создайте том хранения файлов: укажите сетевой путь вида
\\fileserver\1c_files\, доступный серверу 1С (для клиент-серверной базы — от имени пользователя службы сервера). - Перенесите уже накопленные файлы из базы в том. В БСП для этого есть отдельная команда переноса файлов рядом с настройками томов.
После переноса таблица хранения файлов в базе пустеет, а сами файлы лежат на диске и попадают в обычный бэкап файлового сервера.
Том должен входить в резервное копирование
. Бэкап базы
.dt файлы из томов не содержит.
Архив переписки перед удалением
Удалённые письма не восстановить без резервной копии. Решите заранее, где будет жить архив.
| Способ | Когда подходит | Ограничения |
|---|---|---|
Выгрузка базы в .dt до чистки | Нужен полный слепок «как было» | Чтобы найти письмо, базу придётся развернуть |
| Копии писем на почтовом сервере | Учётная запись работает по IMAP или POP3 с оставлением копий | Срок хранения зависит от почтового провайдера |
| Сохранение важных вложений в файлы | Нужно несколько договоров и сканов | Ручная работа, теряется связь с письмом |
Выгрузка: Конфигуратор → Администрирование → Выгрузить информационную базу. Монопольный доступ для выгрузки не нужен, но делайте её в тихие часы: процесс нагружает сервер.
Сохранить отдельное вложение можно из формы письма: откройте письмо, выделите файл в списке вложений и сохраните его на диск через контекстное меню.
Сжатие базы после очистки почты
После удаления данных файл базы не уменьшается сам. Освободившееся место остаётся внутри файла и будет переиспользовано под новые данные. Чтобы вернуть его диску, базу сжимают.
Файловая база
- Сделайте копию каталога базы.
- Попросите всех выйти. Тестированию и исправлению нужен монопольный доступ, открытые сеансы прервать придётся.
- Откройте
Конфигуратор → Администрирование → Тестирование и исправление. - Отметьте только «Сжатие таблиц информационной базы», остальные пункты снимите.
- Нажмите «Выполнить».
Для базы на 10–20 ГБ это обычно минуты, для 50 ГБ и больше — заметно дольше. Есть и обходной путь: выгрузить базу
в .dt и загрузить в новую пустую. Файл получится компактным, но загрузка .dt полностью заменяет данные целевой базы, поэтому грузите только в новую.
Клиент-серверная база
На SQL-сервере сжатие делает СУБД, а не 1С.
- MS SQL. Сжатие файла данных:
DBCC SHRINKFILE. Это долгая операция, после неё индексы фрагментированы — запланируйте перестроение индексов. Регулярно сжимать базу не нужно: место вернётся под новые данные. - PostgreSQL. Обычный
VACUUMпомечает место для переиспользования, но не отдаёт его системе. Вернуть место можетVACUUM FULLпо конкретной таблице:
VACUUM FULL VERBOSE _document245;
VACUUM FULL и DBCC SHRINKFILE нагружают сервер, а VACUUM FULL ещё и блокирует таблицу целиком. Пользователи, которые откроют почту в этот момент, будут ждать или получат ошибку блокировки. Запускайте ночью, предупредив людей.
Как не допустить разрастания почты снова
Разовая чистка без настройки вернёт базу к тем же размерам за полгода.
- ⚙️ Настройте учётную запись. В карточке учётной записи электронной почты задайте, оставлять ли копии на сервере и через сколько дней удалять их. Для общих ящиков подумайте, нужно ли вообще получать их в 1С.
- 📥 Получайте только нужное. Ящик для рассылок, уведомлений банка и маркетплейсов не стоит подключать к 1С: тысячи писем в месяц, ценности для учёта ноль.
- 🗄 Включите тома для файлов. Тогда вложения сразу уходят на диск, а не в базу.
- 🗓 Чистите по графику. Раз в квартал запускайте обработку из раздела про пакетное удаление со сроком 12–24 месяца, следом удаление помеченных.
- 📏 Следите за динамикой. Раз в месяц записывайте размер базы или таблиц почты. Резкий скачок — повод проверить, какой ящик начал сыпать письмами.