Почтовый клиент 1С раздул базу: удаляем старые письма, вложения и возвращаем место на диске

· 9 мин

Содержание

Почистить почту в 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. Чтобы понять, что за объект скрывается за номером, вызовите в обработке ПолучитьСтруктуруХраненияБазыДанных(): она возвращает соответствие имён метаданных и таблиц СУБД.

Что показала проверка размера?

Удаление писем вручную из списка взаимодействий

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

Шаги

  1. Откройте список писем. В УТ 11 и ERP он в разделе CRM и маркетинг → Взаимодействия. В других конфигурациях ищите в разделах команду «Взаимодействия» или «Почта».
  2. Выберите папку слева: «Входящие», «Отправленные» или конкретную пользовательскую папку.
  3. Отберите письма. Удобнее всего — по дате: включите в списке отбор по периоду или отсортируйте по колонке даты.
  4. Выделите письма. Shift + клик выделяет диапазон, Ctrl + клик — отдельные строки, Ctrl+A — всё, что видно в списке с учётом отбора.
  5. Нажмите Delete или команду удаления в командной панели.

Удалённое из списка письмо не исчезает из базы. Оно получает пометку удаления и перемещается в папку «Удаленные». В этот момент база не уменьшается ни на байт.

Окончательное удаление

  1. Откройте Администрирование → Обслуживание → Удаление помеченных объектов.
  2. Выберите режим с ручным выбором объектов, чтобы видеть, что именно удаляется.
  3. Оставьте в списке только письма и их присоединённые файлы, остальное снимите.
  4. Запустите удаление.

Программа проверяет ссылки на каждый объект. Письмо, к которому привязан документ-предмет, удалится, а сам документ останется. Если на письмо ссылается другое письмо из цепочки, оно может попасть в список «не удалено»: пометьте на удаление всю цепочку.

Удаление помеченных на большой базе занимает часы. Запускайте его вечером или в выходные. Пользователи могут работать, но процесс заметно тормозит базу.

Пакетное удаление старых писем обработкой

Если писем 50–100 тысяч, выделять их мышью неудобно: список тормозит, а Ctrl+A в динамическом списке иногда выделяет не все строки. Типовой обработки «удалить письма старше N месяцев» в конфигурациях нет, её пишут как внешнюю.

Ниже пример серверной процедуры для внешней обработки. Она ставит пометку удаления на входящие и исходящие письма старше 12 месяцев:

&НаСервере
Процедура ПометитьСтарыеПисьма(КоличествоМесяцев)

    Граница = ДобавитьМесяц(НачалоДня(ТекущаяДатаСеанса()), -КоличествоМесяцев);

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ Письма.Ссылка КАК Ссылка
    |ИЗ Документ.ЭлектронноеПисьмоВходящее КАК Письма
    |ГДЕ Письма.Дата < &Граница И НЕ Письма.ПометкаУдаления
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ Письма.Ссылка
    |ИЗ Документ.ЭлектронноеПисьмоИсходящее КАК Письма
    |ГДЕ Письма.Дата < &Граница И НЕ Письма.ПометкаУдаления";
    Запрос.УстановитьПараметр("Граница", Граница);

    Выборка = Запрос.Выполнить().Выбрать();
    Счетчик = 0;
    Пока Выборка.Следующий() Цикл
        Объект = Выборка.Ссылка.ПолучитьОбъект();
        Объект.УстановитьПометкуУдаления(Истина);
        Счетчик = Счетчик + 1;
    КонецЦикла;

    Сообщить(СтрШаблон("Помечено писем: %1", Формат(Счетчик, "ЧГ=0")));

КонецПроцедуры

Как пользоваться:

  1. Создайте внешнюю обработку в Конфигураторе, добавьте форму, на неё — поле «Количество месяцев» и кнопку.
  2. Вставьте процедуру в модуль формы, вызовите её из обработчика кнопки.
  3. Сохраните .epf и откройте через Файл → Открыть в пользовательском режиме под пользователем с полными правами.
  4. Сначала попробуйте на копии базы и сравните, сколько писем помечено.
  5. После пометки запустите «Удаление помеченных объектов», как в разделе выше.

Хотите оставить важную переписку? Добавьте в запрос условие по папке или по контрагенту. Ещё проще — перед запуском перенести нужные письма в отдельную папку и исключить её отбором.

Пометка через УстановитьПометкуУдаления() проходит штатные проверки и подписки конфигурации. Прямое удаление методом Удалить() быстрее, но обходит контроль ссылок: оставит битые ссылки в предметах и цепочках. Для почты лучше не экономить время.

Вложения и хранилище файлов

Вложения — главный кандидат на уборку: один прайс в PDF на 8 МБ, разосланный 200 клиентам, даёт 1,6 ГБ исходящих.

Удаляем вложения вместе с письмами

Присоединённые файлы письма — подчинённые объекты. Когда письмо помечено на удаление, его вложения попадают в «Удаление помеченных объектов» вместе с ним. Проверьте, что в списке удаления есть и письма, и файлы: если файлы не помечены, они останутся в базе.

Переносим файлы в тома на диске

Если письма нужны, а вложения раздувают базу, включите хранение файлов вне базы:

  1. В разделе Администрирование откройте настройки работы с файлами и включите хранение файлов в томах на диске.
  2. Создайте том хранения файлов: укажите сетевой путь вида \\fileserver\1c_files\, доступный серверу 1С (для клиент-серверной базы — от имени пользователя службы сервера).
  3. Перенесите уже накопленные файлы из базы в том. В БСП для этого есть отдельная команда переноса файлов рядом с настройками томов.

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

Том должен входить в резервное копирование . Бэкап базы .dt файлы из томов не содержит.

Архив переписки перед удалением

Удалённые письма не восстановить без резервной копии. Решите заранее, где будет жить архив.

СпособКогда подходитОграничения
Выгрузка базы в .dt до чисткиНужен полный слепок «как было»Чтобы найти письмо, базу придётся развернуть
Копии писем на почтовом сервереУчётная запись работает по IMAP или POP3 с оставлением копийСрок хранения зависит от почтового провайдера
Сохранение важных вложений в файлыНужно несколько договоров и скановРучная работа, теряется связь с письмом

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

Сохранить отдельное вложение можно из формы письма: откройте письмо, выделите файл в списке вложений и сохраните его на диск через контекстное меню.

Сжатие базы после очистки почты

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

Файловая база

  1. Сделайте копию каталога базы.
  2. Попросите всех выйти. Тестированию и исправлению нужен монопольный доступ, открытые сеансы прервать придётся.
  3. Откройте Конфигуратор → Администрирование → Тестирование и исправление.
  4. Отметьте только «Сжатие таблиц информационной базы», остальные пункты снимите.
  5. Нажмите «Выполнить».

Для базы на 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 месяца, следом удаление помеченных.
  • 📏 Следите за динамикой. Раз в месяц записывайте размер базы или таблиц почты. Резкий скачок — повод проверить, какой ящик начал сыпать письмами.
Регламент чистки почты
Выполнено: 0 / 5

Частые вопросы

Почему письма удалены, а размер базы не изменился?
Удаление освобождает место внутри файла базы, но не уменьшает сам файл. Нужно сжатие: для файловой базы — через тестирование и исправление, для SQL — средствами СУБД.
Удалятся ли письма из почтового ящика на сервере, если удалить их в 1С?
Удаление в 1С касается только копии в базе. Письмо на почтовом сервере живёт по своим правилам: зависит от протокола и настройки хранения копий в учётной записи.
Можно ли восстановить письмо после «Удаления помеченных объектов»?
Только из резервной копии. Разверните бэкап в отдельную базу, найдите письмо и сохраните нужные вложения вручную.
Пропадут ли документы, к которым было привязано письмо?
Нет. Письмо ссылается на предмет, а не наоборот. Сделка, заказ или контрагент останутся, исчезнет только связь с перепиской.
Можно ли почистить почту одного пользователя, не трогая остальных?
Да. Добавьте в отбор списка или в запрос обработки условие по учётной записи электронной почты этого сотрудника.