Как исправить ошибку «Неизвестный формат картинки» при аварийном завершении 1С при экспорте в Excel?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При активной работе с прайс-листами, каталогами товаров или любыми другими отчетами, содержащими изображения номенклатуры, пользователи и разработчики часто сталкиваются с неприятной ситуацией. На экране формируется красивый отчет, все картинки отображаются корректно (или на их месте выводятся пустые рамки), но при попытке сохранить документ в формате Excel через стандартное меню «Файл — Сохранить как...» программа аварийно завершает работу. На экране появляется критическая ошибка: «Неизвестный формат картинки», после чего платформа 1С предлагает завершить работу или перезапустить сеанс.

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

Выясняем причину: почему падает платформа 1С?

Для того чтобы решить проблему, проанализируем внутреннее поведение платформы. Когда мы выводим отчет на экран, 1С задействует стандартный механизм отрисовки табличного документа. Если файл картинки поврежден или имеет неподдерживаемый формат, платформа может просто проигнорировать отрисовку или показать пустой квадрат.

Однако при конвертации в формат Excel (будь то устаревший XLS или современный XLSX) запускается внутренний транслятор платформы. Этот транслятор считывает двоичные данные каждого изображения, пытается их пережать и внедрить в итоговый документ. Если вместо валидного файла изображения (например, стандартного JPEG или PNG) в базе данных хранится:

  1. Файл нулевого размера;
  2. Битый поток данных, состоящий только из нулевых байтов (последовательность вида 00 00 00 00...);
  3. Файл стороннего формата (например, документ PDF, текстовый файл TXT или архив ZIP), которому вручную изменили расширение на .jpg или .png при загрузке;
  4. Изображение с поврежденными заголовками метаданных (структура файла нарушена при сетевой передаче или сбое СУБД).

Парсер конвертера спотыкается на некорректном файле, вызывает необрабатываемое исключение, и весь процесс 1С аварийно завершается. Особенно остро эта проблема проявляется на более старых версиях платформы (линейка 8.2 и ранние релизы 8.3).

Рассмотрим подробнее методы решения этой задачи — от простых ручных приемов до профессионального программного кода.

Метод 1. Ручной поиск битых картинок методом декомпозиции

Если ошибка возникла разово, а объем номенклатуры в отчете не превышает нескольких сотен позиций, мы можем локализовать проблемный товар вручную.

Разберем этот процесс по шагам:

  1. Сформируем отчет не целиком, а частями. Разделим список номенклатуры по группам или по алфавиту (например, сначала по позициям на буквы А-К, затем Л-Я).
  2. Попробуем сохранить каждую часть отчета по отдельности через меню «Файл — Сохранить как...».
  3. Определим, на каком именно сегменте товаров происходит аварийное завершение работы 1С.
  4. Будем сужать диапазон проверки (делить проблемную группу пополам), пока не найдем конкретную карточку товара, содержащую битое изображение.
  5. Откроем карточку этой номенклатуры, удалим поврежденную картинку и загрузим корректную заново.

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

Метод 2. Выгрузка всех файлов во временную папку

Если первый метод кажется слишком долгим, можно использовать альтернативный вариант диагностики. Нам потребуется выгрузить все присоединенные изображения из справочника во внешнюю папку на жестком диске с помощью любой стандартной обработки (например, групповой обработки справочников и документов).

После выгрузки файлов в папку выполним следующие действия:

  1. Откроем папку в проводнике Windows и переключим режим отображения в значение «Крупные значки».
  2. Прокрутим список файлов. Проводник операционной системы автоматически пытается построить эскизы изображений. Те файлы, которые вместо картинок будут отображаться как стандартные серые иконки или выдавать ошибку при попытке их открыть в стандартном просмотрщике, и являются «виновниками» сбоя.
  3. Обратим внимание на размер файлов. Файлы с размером 0 КБ или подозрительно маленькие файлы (менее 100 байт) сразу должны попасть под подозрение.
  4. Зафиксируем имена поврежденных файлов (обычно они совпадают с кодом номенклатуры или уникальным идентификатором GUID картинки в базе данных) и исправим их в 1С.

Метод 3. Программный поиск поврежденных картинок (для разработчиков)

Для автоматизации этого процесса мы можем написать небольшую внешнюю обработку. Проблема заключается в том, что стандартный конструктор Новый Картинка(ДвоичныеДанные) не вызывает ошибку при создании объекта из битых данных. Он успешно создает объект, даже если внутри находится мусор.

Тем не менее, мы можем использовать обходные пути для валидации изображений прямо в коде 1С. Рассмотрим три эффективных способа программной проверки.

Способ А. Проверка свойства «Формат()»

У объекта Картинка есть метод Формат(), который возвращает тип изображения. Если данные повреждены или не являются графическим файлом, метод вернет системное перечисление ФорматКартинки.НеизвестныйФормат или значение Неопределено. Напишем функцию для проверки:


Функция КартинкаКорректна(ДвоичныеДанныеКартинки) Экспорт
    
    Попытка
        ТестоваяКартинка = Новый Картинка(ДвоичныеДанныеКартинки);
        ТекущийФормат = ТестоваяКартинка.Формат();
        
        Если ТекущийФормат = ФорматКартинки.НеизвестныйФормат Или ТекущийФормат = Неопределено Тогда
            Возврат Ложь;
        КонецЕсли;
        
        Возврат Истина;
    Исключение
        Возврат Ложь;
    КонецПопытки;
    
КонецФункции

Способ Б. Метод принудительного преобразования формата

Это самый надежный «трюк» среди разработчиков 1С. Если мы заставим платформу переконвертировать картинку во внутренний формат (например, PNG), встроенный графический движок начнет парсить бинарный поток. Если данные повреждены, этот метод гарантированно вызовет исключение, которое мы перехватим блоком Попытка...Исключение:


Функция ПроверитьКартинкуНаБитыеДанные(ДвоичныеДанныеКартинки) Экспорт
    
    Попытка
        ТестоваяКартинка = Новый Картинка(ДвоичныеДанныеКартинки);
        // Принудительно запускаем конвертацию в PNG
        ТестоваяКартинка.Преобразовать(ФорматКартинки.PNG);
        Возврат Истина; // Картинка успешно прошла проверку
    Исключение
        // Если конвертация вызвала ошибку, файл поврежден
        Возврат Ложь;
    КонецПопытки;
    
КонецФункции

Способ В. Чтение физических характеристик файла

Попытка прочитать геометрические размеры картинки (ширину или высоту) у битого файла также вызывает ошибку среды выполнения. Мы можем использовать этот факт для проверки:


Функция ПроверитьРазмерыИзображения(ДвоичныеДанныеКартинки) Экспорт
    
    Попытка
        ТестоваяКартинка = Новый Картинка(ДвоичныеДанныеКартинки);
        // Обращение к свойствам вызовет ошибку, если файл битый
        ШиринаКартинки = ТестоваяКартинка.Ширина();
        ВысотаКартинки = ТестоваяКартинка.Высота();
        
        Если ШиринаКартинки = 0 Или ВысотаКартинки = 0 Тогда
            Возврат Ложь;
        КонецЕсли;
        
        Возврат Истина;
    Исключение
        Возврат Ложь;
    КонецПопытки;
    
КонецФункции

Пишем полную обработку для очистки базы данных

Теперь объединим наши знания и напишем полноценную процедуру для обхода справочника номенклатуры (или регистра сведений, где хранятся файлы). Эта процедура найдет все некорректные изображения, выведет отчет в окно сообщений и очистит неверные ссылки, чтобы отчеты снова начали сохраняться в Excel без сбоев.

В качестве примера рассмотрим логику работы с регистром сведений или справочником присоединенных файлов (в зависимости от вашей конфигурации, например, УТ 10.3 или УПП):


Процедура ПоискИОчисткаБитыхКартинок()
    
    Выборка = Справочники.НоменклатураПрисоединенныеФайлы.Выбрать();
    КоличествоБитых = 0;
    
    Пока Выборка.Следующий() Цикл
        
        // Получаем двоичные данные файла из хранилища значений
        ДвоичныеДанные = Выборка.ФайлХранилище.Получить();
        
        Если ТипЗнч(ДвоичныеДанные) <> Тип("ДвоичныеДанные") Тогда
            Продолжить; // Пропускаем пустые записи
        КонецЕсли;
        
        // Запускаем нашу функцию глубокой проверки
        Если Не ПроверитьКартинкуНаБитыеДанные(ДвоичныеДанные) Тогда
            
            КоличествоБитых = КоличествоБитых + 1;
            Сообщить("ВНИМАНИЕ! Обнаружен поврежденный файл: " + Выборка.Наименование 
                + " (Ссылка: " + Выборка.Ссылка + ")", СтатусСообщения.Важное);
            
            // При необходимости очищаем или помечаем на удаление
            Попытка
                ОбъектФайла = Выборка.Ссылка.ПолучитьОбъект();
                // Вариант 1: Очищаем двоичные данные, сохраняя карточку
                ОбъектФайла.ФайлХранилище = Новый ХранилищеЗначения(Неопределено);
                ОбъектФайла.Записать();
                Сообщить("Файл успешно очищен в базе данных.");
            Исключение
                Сообщить("Не удалось записать изменения: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
            КонецПопытки;
            
        КонецЕсли;
        
    КонецЦикла;
    
    Сообщить("Проверка завершена. Всего найдено и исправлено поврежденных картинок: " + КоличествоБитых);
    
КонецПроцедуры

Как предотвратить появление битых картинок в будущем?

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

  1. Валидация при интерактивной загрузке: В процедуру добавления картинки в карточку товара (в форму элемента или форму загрузки файлов) обязательно внедрите вызов функции проверки формата через Попытка...Исключение. Если пользователь пытается загрузить переименованный PDF или поврежденный файл, система должна блокировать запись файла и выдавать предупреждение: «Выбранный файл не является корректным изображением!».
  2. Валидация при интеграции с сайтом (Bitrix и др.): Очень часто некорректные файлы приходят в 1С в процессе автоматического обмена с интернет-магазином или внешними поставщиками по API. Настройте проверку входящих бинарных данных непосредственно в коде обработки обмена перед записью нового элемента в базу данных.
  3. Смена формата выгрузки: Если отчет нужно сохранить прямо сейчас, а времени на поиск картинок нет, попробуйте сменить формат файла в диалоге сохранения. Например, если при сохранении в XLS платформа падает, попробуйте выбрать формат XLSX (или наоборот). Поскольку для генерации этих форматов платформа использует разные программные механизмы, в одном из режимов конвертация может завершиться успешно.
  4. Обновление технологической платформы: В более новых релизах платформы (начиная с 8.3.18 и выше) разработчики фирмы «1С» значительно улучшили стабильность работы конвертеров файлов. Ошибки парсинга картинок теперь обрабатываются более корректно и редко приводят к полному краху сеанса работы пользователя.

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

← На главную