При разработке внешних обработок (файлы .epf) часто возникает задача сделать инструмент автономным. Например, когда ваша обработка должна содержать в себе справочную информацию, шаблоны документов или списки данных для загрузки, хранение этих данных в отдельном файле на диске (например, C:\Temp\data.txt) крайне неудобно. Это требует передачи вместе с обработкой дополнительных файлов и настройки путей доступа. Рассмотрим, как "вшить" текстовый файл непосредственно в структуру обработки, чтобы она "носила" его с собой.
Это самый простой и наглядный способ для хранения текстовых данных. В этом случае текст хранится внутри конфигурации или внешней обработки как отдельный объект-макет. Разберем по шагам, как это реализовать:
ТекстовыйМакет.Теперь проанализируем код, который позволит нам прочитать этот текст программно. Поскольку макеты доступны только на стороне сервера, нам необходимо использовать серверную функцию. Рассмотрим пример:
&НаСервере
Функция ПолучитьТекстИзВнутреннегоМакета()
// Получаем объект обработки из реквизита формы
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
// Извлекаем макет по его имени
Макет = ОбработкаОбъект.ПолучитьМакет("ТекстовыйМакет");
// Получаем весь текст из макета
ТекстИзМакета = Макет.ПолучитьТекст();
// Для удобства последующей работы (например, обхода по строкам)
// загрузим строку в объект ТекстовыйДокумент
ТекстовыйДок = Новый ТекстовыйДокумент;
ТекстовыйДок.УстановитьТекст(ТекстИзМакета);
Возврат ТекстовыйДок;
КонецФункции
Этот метод идеально подходит, если объем текста невелик. Однако, как было отмечено в обсуждении, если файл содержит 70 000 строк и более, загрузка всего текста в память одной строкой может привести к замедлению работы системы.
Если ваш текстовый файл действительно огромный (десятки тысяч строк), лучше использовать макет типа Двоичные данные. Это позволит избежать лишней перекодировки текста платформой при открытии макета и даст возможность сжать данные в ZIP-архив для уменьшения размера .epf файла.
Разберем алгоритм работы с двоичными данными:
ЧтениеТекста для потоковой обработки, что гораздо эффективнее для 70 000 строк, чем ТекстовыйДокумент.Посмотрим на пример реализации такого подхода:
&НаСервере
Процедура ОбработатьБольшойФайлНаСервере()
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ДвоичныеДанныеМакета = ОбработкаОбъект.ПолучитьМакет("БольшойФайл");
// Создаем временный файл на диске сервера
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
ДвоичныеДанныеМакета.Записать(ИмяВременногоФайла);
// Используем ЧтениеТекста для потокового чтения (экономит память)
ТекстЧтение = Новый ЧтениеТекста(ИмяВременногоФайла, КодировкаТекста.UTF8);
ТекущаяСтрока = ТекстЧтение.ПрочитатьСтроку();
Пока ТекущаяСтрока <> Неопределено Цикл
// Здесь выполняется логика обработки каждой строки
// Например: ОбработатьДанные(ТекущаяСтрока);
ТекущаяСтрока = ТекстЧтение.ПрочитатьСтроку();
КонецЦикла;
ТекстЧтение.Закрыть();
// Удаляем временный файл после использования
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
Иногда возникает искушение просто объявить переменную и присвоить ей многострочную строку через символ переноса |. Выясним причину, почему для 70 000 строк это плохая практика:
Важно помнить, что метод ПолучитьМакет() принадлежит объекту обработки, а не форме. Поэтому, если вы находитесь в модуле формы управляемого приложения, вам необходимо сначала преобразовать РеквизитФормыВЗначение("Объект"), как показано в примерах выше.
Проанализируем ситуацию, когда данные нужны на клиенте. Если вам нужно передать этот текст пользователю (например, открыть его для просмотра), схема будет следующей:
ПоместитьВоВременноеХранилище().Показать() для объекта ТекстовыйДокумент.Таким образом, использование макетов — это наиболее профессиональный и надежный способ сделать вашу обработку по-настоящему автономной и удобной для конечного заказчика.