Сжатие изображений в 1С 8.3: уменьшаем картинки и размер базы
Содержание
Уменьшить картинку в 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 без сжатия весят в разы больше |
| Качество JPG | 70–85% | Ниже 60% появляются артефакты вокруг букв |
| Многостраничный документ | Один PDF вместо пачки картинок | Меньше записей в базе, проще искать |
Если сотрудники фотографируют документы на телефон, договоритесь о сжатии на стороне телефона. Большинство приложений-сканеров умеют сохранять в PDF с уменьшением размера. Фото в 4000×3000 точек для счёта-фактуры избыточно — хватает 1600 точек по длинной стороне.
Настройки сканирования действуют только на новые файлы. Уже загруженные картинки они не уменьшат.
Логотип и факсимиле
Отдельный случай — картинки в карточке организации, раздел «Логотип и печать». Они не раздувают базу, но тормозят формирование печатных форм и увеличивают каждый PDF, который уходит контрагенту по почте.
Подготовьте их заранее:
- Откройте логотип в любом графическом редакторе.
- Уменьшите ширину до 300–400 точек.
- Сохраните в PNG с прозрачным фоном. Для факсимиле подписи и печати — тоже PNG.
- Загрузите заново в карточку организации.
Нормальный размер такого файла — 20–80 КБ. Если логотип весит 2 МБ, каждый счёт в PDF будет весить не меньше.
Тома на диске: вынести файлы из базы
Если сканов много и удалять их нельзя, их можно хранить не в базе, а в папке на диске или сетевом ресурсе. База при этом хранит только ссылку. Картинки останутся прежнего размера, но база станет компактной, а резервная копия — быстрой.
Порядок действий в Бухгалтерии 3.0 и других конфигурациях на БСП:
- Откройте
Администрирование → Общие настройки, группа присоединённых файлов. - Включите хранение файлов в томах на диске.
- Откройте список томов хранения файлов и создайте том: укажите путь к папке, для клиент-серверного варианта — путь, доступный пользователю, от имени которого работает сервер 1С.
- Задайте максимальный размер тома, если хотите разбивать хранилище на части.
- Перенесите уже загруженные файлы в том командой переноса из списка томов (название команды может отличаться в зависимости от версии БСП).
После переноса файлы в папке тома становятся частью базы. Их нужно включить в резервное копирование. Копия одной только базы без папки тома — это база с битыми ссылками на сканы.
Тома — правильное решение для архива сканов. Но если задача именно в том, чтобы уменьшить сами картинки, переходите к пересжатию.
Сторонние программы и обработки для уменьшения картинок
Платформа 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: вернуть место на диске
После удаления или пересжатия файлов база физически не уменьшится сама. Освобождённое место остаётся внутри файла базы и будет заполняться новыми данными. Чтобы вернуть его операционной системе, нужен отдельный шаг.
Файловая база
- Сделайте резервную копию:
Администрирование → Выгрузить информационную базув конфигураторе. - Попросите всех пользователей выйти — для тестирования нужен монопольный доступ.
- Откройте
Администрирование → Тестирование и исправление. - Оставьте отмеченным только пункт «Сжатие таблиц информационной базы».
- Нажмите «Выполнить».
Альтернатива — выгрузить базу
в .dt и загрузить обратно в новую пустую базу. Результат тот же, но заодно проверяется целостность данных.
Клиент-серверная база
На MS SQL после удаления больших объёмов данных место освобождают командой сжатия файла данных:
DBCC SHRINKFILE (N'имя_логического_файла', 0);
На PostgreSQL для конкретной таблицы:
VACUUM FULL _inforg456;
Обе операции блокируют таблицы и сильно нагружают диск. Пользователи в это время получат ошибки блокировок или зависания. Запускайте ночью или в выходной, предупредив сотрудников. После SHRINKFILE на MS SQL обязательно перестройте индексы регламентным заданием — сжатие их фрагментирует.
Массовое пересжатие кодом 1С
Если тома не используются и файлы лежат в базе, их можно пересжать обработкой. Схема работы:
- Запросом выбрать присоединённые файлы с расширениями
jpg,jpeg,pngи размером больше порога, например 500 КБ. - Для каждого получить двоичные данные функцией БСП
РаботаСФайлами.ДвоичныеДанныеФайла. - Записать во временный файл и сжать внешней утилитой.
- Если новый файл хотя бы на 30% меньше — записать его обратно в присоединённый файл методом обновления файла из общего модуля
РаботаСФайлами.
Фрагмент для шагов 2–3:
ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаФайл);
ИмяИсходного = ПолучитьИмяВременногоФайла("jpg");
ИмяСжатого = ПолучитьИмяВременногоФайла("jpg");
ДвоичныеДанные.Записать(ИмяИсходного);
Команда = "magick """ + ИмяИсходного + """ -resize ""1600x1600>"" -quality 80 """ + ИмяСжатого + """";
ЗапуститьПриложение(Команда, , Истина);
Файл = Новый Файл(ИмяСжатого);
Если Файл.Существует() И Файл.Размер() < ДвоичныеДанные.Размер() * 0.7 Тогда
НовыеДанные = Новый ДвоичныеДанные(ИмяСжатого);
// запись в присоединённый файл методом обновления файла БСП
КонецЕсли;
УдалитьФайлы(ИмяИсходного);
УдалитьФайлы(ИмяСжатого);
Параметры метода обновления файла различаются между версиями БСП. Откройте общий модуль РаботаСФайлами в конфигураторе и посмотрите описание метода — там перечислены поля структуры с информацией о файле.
Пишите через методы БСП, а не напрямую в регистр с двоичными данными. Иначе разъедутся размер файла в карточке, дата изменения и версии файла.
Код выполняется на сервере, поэтому ImageMagick должен быть установлен на сервере 1С, а не на компьютере пользователя.
План массовой обработки: как не потерять сканы
Пересжатие тысяч файлов — операция необратимая. Исходное качество не вернуть. Поэтому порядок такой:
Что ещё учесть:
- 🔁 Версии файлов. Если в базе включено хранение версий, при каждом обновлении создаётся новая версия, а старая остаётся. Место не освободится, пока старые версии не удалены.
- 🗑️ Пометка на удаление. Файл, помеченный на удаление, продолжает занимать место. Его нужно окончательно удалить через удаление помеченных объектов.
- 🔐 Юридически значимые документы. Сканы с электронной подписью пересжимать нельзя — подпись перестанет проходить проверку, потому что изменятся данные файла.
- 📊 Контроль результата. Запомните размер базы и таблицы файлов до начала и сравните после сжатия таблиц. Реалистичный результат для базы со сканами с телефона — уменьшение в 3–5 раз по таблице файлов.
Частые вопросы
Можно ли уменьшить картинку прямо в форме 1С без сторонних программ?
Примет ли налоговая сжатый скан при истребовании документов?
Почему после удаления сканов файл базы не уменьшился?
.dt или средствами СУБД.