Сжатие изображений в 1С 8.3: уменьшаем картинки и размер базы

· 9 мин

Содержание

Уменьшить картинку в 1С проще всего до загрузки: скан в 300 dpi, сохранённый в JPG с качеством 75–85%, весит 200–500 КБ вместо 3–8 МБ в PNG или TIFF. Для уже загруженных файлов работают три способа: вынести файлы в тома на диске, пересжать изображения обработкой и затем сжать таблицы базы.

Частая ошибка — запустить «Сжатие таблиц информационной базы» в конфигураторе и ждать, что картинки станут легче. Не станут. Эта команда убирает пустое место, оставшееся после удаления данных, но сами изображения не трогает. Сначала нужно уменьшить или удалить файлы, и только потом сжимать таблицы.

Где база держит картинки и сколько они занимают

Прежде чем что-то сжимать, выясните, что именно раздуло базу. В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3, УТ 11) картинки — это присоединённые файлы: сканы первичных документов, фото номенклатуры, логотипы, факсимиле подписей. Их двоичные данные лежат в отдельных таблицах базы, а не в самих документах.

Типичные источники «тяжёлых» картинок:

  • 📄 сканы входящих документов, загруженные с телефона (фото 12 Мп ≈ 4–6 МБ каждое);
  • 🖼️ изображения номенклатуры, выгруженные с сайта поставщика в исходном размере;
  • ✍️ логотип и факсимиле в карточке организации, которые печатаются в каждом счёте;
  • 📨 вложения писем, если в базе ведётся встроенная почта;
  • 🗂️ файлы, помеченные на удаление, но не удалённые окончательно.

Как найти самые большие таблицы

В клиент-серверной базе на MS SQL размер таблиц показывает запрос в SQL Server Management Studio:

SELECT t.name AS table_name,
       SUM(a.total_pages) * 8 / 1024 AS size_mb
FROM sys.tables t
JOIN sys.indexes i ON t.object_id = i.object_id
JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
JOIN sys.allocation_units a ON p.partition_id = a.container_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;

Имена таблиц будут вида _Reference123 или _InfoRg456. Чтобы понять, какой это справочник или регистр, выполните в конфигураторе или внешней обработке код:

Структура = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
Для Каждого Строка Из Структура Цикл
    Сообщить(Строка.ИмяТаблицыХранения + " — " + Строка.ИмяТаблицы);
КонецЦикла;

Если в верхних строках оказались справочники с окончанием ПрисоединенныеФайлы или регистр с двоичными данными файлов — проблема именно в картинках. Если наверху регистры бухгалтерии, журнал регистрации или версии объектов, сжатие изображений почти ничего не даст.

В файловой базе быстрый ориентир — размер файла 1Cv8.1CD. Если он вырос скачком после того, как сотрудники начали прикладывать сканы, причина почти наверняка в них.

Настройки сканирования: сжатие картинок ещё до загрузки

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

Что выставить:

ПараметрРекомендацияПочему
Разрешение200–300 dpiТекст читается, файл в 2–4 раза легче, чем при 600 dpi
ЦветностьОттенки серого или чёрно-белоеЦвет нужен только для печатей и подписей синим
ФорматJPG для фото и цветных сканов, PNG для схемTIFF и BMP без сжатия весят в разы больше
Качество JPG70–85%Ниже 60% появляются артефакты вокруг букв
Многостраничный документОдин PDF вместо пачки картинокМеньше записей в базе, проще искать

Если сотрудники фотографируют документы на телефон, договоритесь о сжатии на стороне телефона. Большинство приложений-сканеров умеют сохранять в PDF с уменьшением размера. Фото в 4000×3000 точек для счёта-фактуры избыточно — хватает 1600 точек по длинной стороне.

Настройки сканирования действуют только на новые файлы. Уже загруженные картинки они не уменьшат.

Логотип и факсимиле

Отдельный случай — картинки в карточке организации, раздел «Логотип и печать». Они не раздувают базу, но тормозят формирование печатных форм и увеличивают каждый PDF, который уходит контрагенту по почте.

Подготовьте их заранее:

  1. Откройте логотип в любом графическом редакторе.
  2. Уменьшите ширину до 300–400 точек.
  3. Сохраните в PNG с прозрачным фоном. Для факсимиле подписи и печати — тоже PNG.
  4. Загрузите заново в карточку организации.

Нормальный размер такого файла — 20–80 КБ. Если логотип весит 2 МБ, каждый счёт в PDF будет весить не меньше.

Тома на диске: вынести файлы из базы

Если сканов много и удалять их нельзя, их можно хранить не в базе, а в папке на диске или сетевом ресурсе. База при этом хранит только ссылку. Картинки останутся прежнего размера, но база станет компактной, а резервная копия — быстрой.

Порядок действий в Бухгалтерии 3.0 и других конфигурациях на БСП:

  1. Откройте Администрирование → Общие настройки, группа присоединённых файлов.
  2. Включите хранение файлов в томах на диске.
  3. Откройте список томов хранения файлов и создайте том: укажите путь к папке, для клиент-серверного варианта — путь, доступный пользователю, от имени которого работает сервер 1С.
  4. Задайте максимальный размер тома, если хотите разбивать хранилище на части.
  5. Перенесите уже загруженные файлы в том командой переноса из списка томов (название команды может отличаться в зависимости от версии БСП).

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

Тома — правильное решение для архива сканов. Но если задача именно в том, чтобы уменьшить сами картинки, переходите к пересжатию.

Сторонние программы и обработки для уменьшения картинок

Платформа 1С не умеет пересжимать JPG с выбором качества встроенными средствами — для этого нужна внешняя программа. Варианты:

  • 🛠️ ImageMagick — бесплатная консольная утилита для Windows и Linux. Удобна для пакетной обработки и вызова из 1С.
  • 🧰 Пакетные режимы графических редакторов — подойдут, если файлы уже лежат в томе на диске и их можно обработать прямо в папке.
  • 📦 Внешние обработки от сторонних разработчиков — перед запуском на рабочей базе проверьте их на копии и прочитайте код: обработка получает полный доступ к данным.

Команда ImageMagick, которая уменьшает изображение до 1600 точек по длинной стороне и пересохраняет в JPG с качеством 80%:

magick input.jpg -resize "1600x1600>" -quality 80 output.jpg

Знак > означает «уменьшать только если картинка больше». Маленькие изображения не будут растянуты.

Пакетная обработка всех JPG в папке тома (Windows, командная строка):

for %%f in (D:\1C_Files\*.jpg) do magick "%%f" -resize "1600x1600>" -quality 80 "%%f"

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

Сжатие таблиц и SQL: вернуть место на диске

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

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

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

Альтернатива — выгрузить базу в .dt и загрузить обратно в новую пустую базу. Результат тот же, но заодно проверяется целостность данных.

Клиент-серверная база

На MS SQL после удаления больших объёмов данных место освобождают командой сжатия файла данных:

DBCC SHRINKFILE (N'имя_логического_файла', 0);

На PostgreSQL для конкретной таблицы:

VACUUM FULL _inforg456;

Обе операции блокируют таблицы и сильно нагружают диск. Пользователи в это время получат ошибки блокировок или зависания. Запускайте ночью или в выходной, предупредив сотрудников. После SHRINKFILE на MS SQL обязательно перестройте индексы регламентным заданием — сжатие их фрагментирует.

Массовое пересжатие кодом 1С

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

  1. Запросом выбрать присоединённые файлы с расширениями jpg, jpeg, png и размером больше порога, например 500 КБ.
  2. Для каждого получить двоичные данные функцией БСП РаботаСФайлами.ДвоичныеДанныеФайла.
  3. Записать во временный файл и сжать внешней утилитой.
  4. Если новый файл хотя бы на 30% меньше — записать его обратно в присоединённый файл методом обновления файла из общего модуля РаботаСФайлами.

Фрагмент для шагов 2–3:

ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаФайл);
ИмяИсходного = ПолучитьИмяВременногоФайла("jpg");
ИмяСжатого = ПолучитьИмяВременногоФайла("jpg");
ДвоичныеДанные.Записать(ИмяИсходного);

Команда = "magick """ + ИмяИсходного + """ -resize ""1600x1600>"" -quality 80 """ + ИмяСжатого + """";
ЗапуститьПриложение(Команда, , Истина);

Файл = Новый Файл(ИмяСжатого);
Если Файл.Существует() И Файл.Размер() < ДвоичныеДанные.Размер() * 0.7 Тогда
    НовыеДанные = Новый ДвоичныеДанные(ИмяСжатого);
    // запись в присоединённый файл методом обновления файла БСП
КонецЕсли;

УдалитьФайлы(ИмяИсходного);
УдалитьФайлы(ИмяСжатого);

Параметры метода обновления файла различаются между версиями БСП. Откройте общий модуль РаботаСФайлами в конфигураторе и посмотрите описание метода — там перечислены поля структуры с информацией о файле.

Пишите через методы БСП, а не напрямую в регистр с двоичными данными. Иначе разъедутся размер файла в карточке, дата изменения и версии файла.

Код выполняется на сервере, поэтому ImageMagick должен быть установлен на сервере 1С, а не на компьютере пользователя.

План массовой обработки: как не потерять сканы

Пересжатие тысяч файлов — операция необратимая. Исходное качество не вернуть. Поэтому порядок такой:

Перед массовым пересжатием картинок
Выполнено: 0 / 7

Что ещё учесть:

  • 🔁 Версии файлов. Если в базе включено хранение версий, при каждом обновлении создаётся новая версия, а старая остаётся. Место не освободится, пока старые версии не удалены.
  • 🗑️ Пометка на удаление. Файл, помеченный на удаление, продолжает занимать место. Его нужно окончательно удалить через удаление помеченных объектов.
  • 🔐 Юридически значимые документы. Сканы с электронной подписью пересжимать нельзя — подпись перестанет проходить проверку, потому что изменятся данные файла.
  • 📊 Контроль результата. Запомните размер базы и таблицы файлов до начала и сравните после сжатия таблиц. Реалистичный результат для базы со сканами с телефона — уменьшение в 3–5 раз по таблице файлов.

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

Можно ли уменьшить картинку прямо в форме 1С без сторонних программ?
В типовых конфигурациях встроенного редактора изображений с выбором качества нет. Картинку уменьшают до загрузки или пересжимают внешней утилитой.
Примет ли налоговая сжатый скан при истребовании документов?
Да, если документ читается полностью: реквизиты, суммы, подписи и печати. Разрешения 200–300 dpi для этого достаточно.
Почему после удаления сканов файл базы не уменьшился?
Освобождённое место остаётся внутри файла базы. Его возвращают сжатием таблиц в конфигураторе, выгрузкой-загрузкой .dt или средствами СУБД.
Что выгоднее: тома на диске или пересжатие?
Тома уменьшают базу и ускоряют бэкап, но не экономят место на диске. Пересжатие экономит место везде. Часто делают оба шага.
Какой размер скана считать нормальным?
Одна страница A4 в оттенках серого при 300 dpi в JPG — около 150–400 КБ. Больше 1 МБ на страницу — повод проверить настройки сканирования.