При разработке сложных инструментов на платформе 1С:Предприятие 8 программисты часто сталкиваются с необходимостью включения во внешние обработки (файлы .epf) или отчеты (файлы .erf) дополнительных данных: макетов с двоичными данными, огромных классификаторов, драйверов оборудования или даже изображений. В этой статье мы подробно разберем, какие существуют технические лимиты на размер таких файлов, почему они возникают и как избежать аварийного завершения работы системы.
Рассмотрим внутреннюю структуру файлов 1С. Внешние обработки по своей сути являются структурированными хранилищами (Compound Files). Формат этого контейнера использует 32-битные смещения для адресации объектов внутри файла. Это накладывает жесткое теоретическое ограничение на размер — 2 ГБ (0x7FFFFFFF байт).
Проанализируем этот лимит подробнее. Даже если вы попытаетесь создать файл большего размера, платформа 1С или операционная система могут выдать ошибку при попытке записи заголовка или описания внутренних файлов контейнера. В реальных условиях «потолок» оказывается еще ниже из-за необходимости резервирования места под служебную информацию платформы.
Разберем ситуацию, когда размер файла приближается к критическим отметкам, с точки зрения архитектуры клиентского приложения:
Недостаточно памяти и аварийному закрытию программы.Выясним, как большой размер файла влияет на повседневную работу пользователя. Размер обработки напрямую коррелирует со следующими факторами:
Скорость открытия: При каждом запуске внешнего файла платформа выполняет проверку целостности контейнера и контрольных сумм. Если файл весит сотни мегабайт, пользователь будет наблюдать существенную задержку (песочные часы) перед появлением формы.
Компиляция модулей: Если внутри обработки находятся объемные текстовые макеты или модули с десятками тысяч строк кода, время компиляции при каждом вызове функций будет ощутимым. Платформа тратит ресурсы на парсинг и подготовку кода к исполнению.
Сетевая нагрузка: Проанализируем ситуацию, когда обработка запускается из сетевой папки. При каждом открытии файл должен быть полностью передан по сети во временный каталог локального компьютера. В условиях нестабильного соединения или низкой пропускной способности сети это превращает работу в мучение.
Когда мы загружаем внешнюю обработку в информационную базу (типовой механизм БСП), она сохраняется в таблице базы данных в поле типа ХранилищеЗначения. Рассмотрим, к чему это приводит в клиент-серверном варианте:
max_allowed_packet в MySQL или ограничения в PostgreSQL/MS SQL) на максимальный размер пакета данных. Если размер вашей обработки превышает этот лимит, загрузка просто оборвется с ошибкой соединения.На основе опыта разработчиков сформируем шкалу критичности размеров файлов .epf / .erf:
Посмотрим на способы, которые позволяют обойти ограничения платформы без потери функциональности:
1. Использование сжатия. Если вам необходимо хранить внутри обработки большие текстовые данные или классификаторы, не храните их в «сыром» виде в текстовых макетах. Используйте программное сжатие в ZIP-архив перед добавлением в макет. Рассмотрим пример кода для распаковки таких данных «на лету»:
// Пример распаковки данных из макета
Архив = Новый ЧтениеZipФайла(МакетСДанными.Получить());
ПутьРаспаковки = КаталогВременныхФайлов() + "MyData/";
Архив.ИзвлечьВсе(ПутьРаспаковки, РежимВосстановленияПутейФайловZip.НеВосстанавливать);
Архив.Закрыть();
2. Внешнее хранение данных. Вместо того чтобы «впендюривать» (как выразились на форуме) КЛАДР или ФИАС внутрь обработки, организуйте их хранение во внешних файлах на диске или в облачном хранилище. Обработка должна лишь скачивать или подключать эти файлы по мере необходимости.
3. Дробление логики. Проанализируем возможность разделения одной гигантской обработки на несколько мелких. Одна «мастер-обработка» может вызывать другие вспомогательные файлы .epf, передавая им параметры. Это существенно повысит стабильность системы.
Вывод: Хотя платформа 1С позволяет создавать файлы размером до 2 ГБ, здравый смысл и технические ограничения оперативной памяти диктуют свои правила. Старайтесь держать размер внешней обработки в пределах 50-100 МБ, используя внешние ресурсы для хранения тяжелых данных.