Как сохранить текстовый файл внутри внешней обработки 1С и прочитать его без использования абсолютных путей?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке внешних обработок (файлы .epf) часто возникает задача сделать инструмент автономным. Например, когда ваша обработка должна содержать в себе справочную информацию, шаблоны документов или списки данных для загрузки, хранение этих данных в отдельном файле на диске (например, C:\Temp\data.txt) крайне неудобно. Это требует передачи вместе с обработкой дополнительных файлов и настройки путей доступа. Рассмотрим, как "вшить" текстовый файл непосредственно в структуру обработки, чтобы она "носила" его с собой.

Способ 1: Использование макета типа «Текстовый документ»

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

  1. Откройте вашу внешнюю обработку в конфигураторе.
  2. Перейдите на закладку Макеты и добавьте новый макет.
  3. Выберите тип макета — Текстовый документ. Дайте ему имя, например, ТекстовыйМакет.
  4. Вставьте ваш текст непосредственно в открывшееся окно макета.

Теперь проанализируем код, который позволит нам прочитать этот текст программно. Поскольку макеты доступны только на стороне сервера, нам необходимо использовать серверную функцию. Рассмотрим пример:


&НаСервере
Функция ПолучитьТекстИзВнутреннегоМакета()
    
    // Получаем объект обработки из реквизита формы
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    
    // Извлекаем макет по его имени
    Макет = ОбработкаОбъект.ПолучитьМакет("ТекстовыйМакет");
    
    // Получаем весь текст из макета
    ТекстИзМакета = Макет.ПолучитьТекст();
    
    // Для удобства последующей работы (например, обхода по строкам) 
    // загрузим строку в объект ТекстовыйДокумент
    ТекстовыйДок = Новый ТекстовыйДокумент;
    ТекстовыйДок.УстановитьТекст(ТекстИзМакета);
    
    Возврат ТекстовыйДок;
    
КонецФункции

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

Способ 2: Хранение больших файлов через «Двоичные данные»

Если ваш текстовый файл действительно огромный (десятки тысяч строк), лучше использовать макет типа Двоичные данные. Это позволит избежать лишней перекодировки текста платформой при открытии макета и даст возможность сжать данные в ZIP-архив для уменьшения размера .epf файла.

Разберем алгоритм работы с двоичными данными:

  1. Создайте макет с типом Двоичные данные и загрузите туда ваш файл.
  2. В коде извлеките эти данные и сохраните их во временный файл на сервере.
  3. Используйте специализированный объект ЧтениеТекста для потоковой обработки, что гораздо эффективнее для 70 000 строк, чем ТекстовыйДокумент.

Посмотрим на пример реализации такого подхода:


&НаСервере
Процедура ОбработатьБольшойФайлНаСервере()
    
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    ДвоичныеДанныеМакета = ОбработкаОбъект.ПолучитьМакет("БольшойФайл");
    
    // Создаем временный файл на диске сервера
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
    ДвоичныеДанныеМакета.Записать(ИмяВременногоФайла);
    
    // Используем ЧтениеТекста для потокового чтения (экономит память)
    ТекстЧтение = Новый ЧтениеТекста(ИмяВременногоФайла, КодировкаТекста.UTF8);
    
    ТекущаяСтрока = ТекстЧтение.ПрочитатьСтроку();
    Пока ТекущаяСтрока <> Неопределено Цикл
        
        // Здесь выполняется логика обработки каждой строки
        // Например: ОбработатьДанные(ТекущаяСтрока);
        
        ТекущаяСтрока = ТекстЧтение.ПрочитатьСтроку();
    КонецЦикла;
    
    ТекстЧтение.Закрыть();
    
    // Удаляем временный файл после использования
    УдалитьФайлы(ИмяВременногоФайла);
    
КонецПроцедуры

Почему не стоит хранить текст прямо в коде модуля?

Иногда возникает искушение просто объявить переменную и присвоить ей многострочную строку через символ переноса |. Выясним причину, почему для 70 000 строк это плохая практика:

Особенности работы в управляемом приложении

Важно помнить, что метод ПолучитьМакет() принадлежит объекту обработки, а не форме. Поэтому, если вы находитесь в модуле формы управляемого приложения, вам необходимо сначала преобразовать РеквизитФормыВЗначение("Объект"), как показано в примерах выше.

Проанализируем ситуацию, когда данные нужны на клиенте. Если вам нужно передать этот текст пользователю (например, открыть его для просмотра), схема будет следующей:

  1. На сервере извлекаем макет.
  2. Помещаем его во временное хранилище с помощью функции ПоместитьВоВременноеХранилище().
  3. Передаем адрес хранилища на клиент.
  4. На клиенте получаем данные и используем метод Показать() для объекта ТекстовыйДокумент.

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

← На главную