При работе с базами данных 1С многие администраторы и программисты сталкиваются с проблемой быстрого роста объема информационной базы. Одним из стандартных решений является перенос присоединенных файлов (сканов, картинок, документов) из базы данных в «Тома хранения файлов» на диске. Однако после этой процедуры часто перестают работать самописные или внешние печатные формы: вместо красивого штампа организации пользователь видит ошибку «двоичные данные файла были удалены» или просто пустую область. Рассмотрим подробно, почему это происходит и как это исправить.
Проанализируем ситуацию: когда файлы хранятся внутри базы данных, они находятся в реквизитах типа ХранилищеЗначения. Программный код печатной формы обращается к этому реквизиту и получает двоичные данные картинки напрямую. После выполнения обработки «Перенос файлов в тома», система копирует файл на жесткий диск, а поле в базе данных очищается. Вместо самих данных там остается только ссылка и информация о том, в каком томе на диске лежит файл.
Ошибка «двоичные данные файла были удалены» возникает в тот момент, когда код печатной формы пытается прочитать старое место хранения, которое теперь пусто. Если при этом используются механизмы БСП (Библиотеки стандартных подсистем), система пытается найти файл на диске, но может столкнуться с ограничениями прав доступа или «Безопасного режима».
Это самая частая причина проблемы для внешних обработок. По умолчанию внешние печатные формы в 1С регистрируются в безопасном режиме. В этом режиме системе запрещены любые операции с файловой системой (чтение или запись файлов на диск сервера).
Пока картинки (печать и логотип) лежали внутри базы данных, 1С доставала их как объекты базы, что разрешено. Как только они «переехали» в тома на диск, безопасный режим блокирует попытку 1С прочитать файл из папки. Выясним, как это исправить:
СведенияОВнешнейОбработке().Посмотрим на пример кода, который отключает безопасный режим при регистрации обработки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
// ... другие параметры ...
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); // Это ключевая строка
Возврат ПараметрыРегистрации;
КонецФункции
После внесения изменений в код, необходимо перезагрузить файл обработки в справочнике. Это позволит системе свободно обращаться к жесткому диску для получения картинок печати.
Если отключение безопасного режима не помогло, проанализируем ситуацию с точки зрения операционной системы. Сервер 1С:Предприятие работает от имени определенного пользователя Windows (или Linux). Часто это учетная запись USR1CV8 или LocalSystem.
Рассмотрим пошагово проверку прав:
Важный момент: Если тома расположены на сетевом ресурсе (NAS или другой сервер), убедитесь, что сервер 1С запущен не под локальной системной учетной записью, а под доменным пользователем, имеющим доступ к сетевой шаре.
Зачастую в старых или самописных формах используется прямой запрос к таблицам или обращение к устаревшим функциям. Проанализируем фрагмент кода, который вызывает ошибку:
// Опасный метод, который может вернуть ошибку при переносе в тома
ДанныеПечать = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные(СведенияОДокументе.Организация.ФайлПечать);
Для корректной работы с файлами, которые могут находиться как в базе, так и в томах, рекомендуется использовать стандартные механизмы БСП. Разберем правильный подход с использованием привилегированного режима, чтобы обойти возможные ограничения прав пользователя 1С:
УстановитьПривилегированныйРежим(Истина);
// Получаем ссылку на файл печати из реквизитов организации
СсылкаНаФайл = СведенияОДокументе.Организация.ФайлПечать;
Если ЗначениеЗаполнено(СсылкаНаФайл) Тогда
// Используем универсальный метод БСП для получения двоичных данных
ДвоичныеДанныеПечати = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаФайл);
Если ТипЗнч(ДвоичныеДанныеПечати) = Тип("ДвоичныеДанные") Тогда
ОбластьМакетаПодвал.Рисунки.Печать.Картинка = Новый Картинка(ДвоичныеДанныеПечати);
КонецЕсли;
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
Использование метода РаботаСФайлами.ДвоичныеДанныеФайла() является предпочтительным, так как эта функция внутри себя уже содержит логику определения местоположения файла. Она «знает», нужно ли идти в хранилище значений или обращаться к диску через том.
Выясним причину избирательной работы печати. В типовых конфигурациях (например, Бухгалтерия предприятия 3.0) для печати Счетов на оплату или Актов используются стандартные функции общего модуля УправлениеПечатьюБП или ФормированиеПечатныхФорм. Эти модули регулярно обновляются фирмой «1С» и уже адаптированы под работу с томами.
Если же ваша форма ТОРГ-12 или специфический договор были созданы давно или скопированы в отдельную внешнюю обработку, они хранят в себе старую логику. В такой логике может отсутствовать проверка наличия файла в томах, или же обработка может «застрять» в безопасном режиме, о чем мы говорили в первом решении.
Подводя итог, если вы столкнулись с отсутствием картинок после оптимизации объема базы, выполните следующие действия:
УстановитьПривилегированныйРежим(Истина) и универсальные функции БСП, такие как РаботаСФайлами.ДвоичныеДанныеФайла().Соблюдение этих правил позволит вам эффективно использовать тома хранения файлов, сохраняя базу данных компактной и обеспечивая бесперебойную работу печатных форм.