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