Как программно реализовать выбор каталога и сохранение текстового лога в 1С

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

При разработке различных механизмов обмена данными, синхронизации или длительных обработок программисту часто требуется выводить результаты работы в отдельный файл — лог. Чтобы сделать решение гибким, важно предоставить пользователю возможность самостоятельно выбирать место сохранения этого файла. В данной статье мы подробно разберем, как связать диалоговое окно выбора пути с объектами записи текста в 1С.

Постановка задачи и выбор инструментов

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

Для решения этой задачи в среде «1С:Предприятие 8» мы будем использовать два основных объекта:

  1. ДиалогВыбораФайла — для взаимодействия с файловой системой операционной системы.
  2. ТекстовыйДокумент — для формирования строк текста и их физической записи на диск.

Вариант 1: Использование режима сохранения файла

Рассмотрим наиболее правильный с точки зрения UX (пользовательского опыта) подход. Мы открываем диалог в режиме сохранения. Это позволяет пользователю не только выбрать папку, но и сразу ввести имя нового файла или выбрать существующий для перезаписи.

Проанализируем программный код, который реализует эту логику:


Процедура ВывестиЛогДобавленийИИзменений()
    
    // 1. Инициализируем диалог выбора файла
    ДиалогСохранения = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    ДиалогСохранения.Заголовок = "Выберите файл для сохранения лога";
    ДиалогСохранения.Фильтр = "Текстовые файлы (*.txt)|*.txt|Все файлы (*.*)|*.*";
    ДиалогСохранения.ПолноеИмяФайла = "Log_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".txt";
    
    // 2. Показываем диалог пользователю
    Если ДиалогСохранения.Выбрать() Тогда
        
        ПутьКФайлу = ДиалогСохранения.ПолноеИмяФайла;
        
        // 3. Формируем текстовый документ
        ТекстовыйФайл = Новый ТекстовыйДокумент;
        
        // Пример заполнения данными из ЛогМассивИнформация
        Для Каждого ЭлементМассива Из ЛогМассивИнформация Цикл
            СтрокаЛога = СтрШаблон("%1: %2 - объект: %3", 
                                  ТекущаяДата(), 
                                  ЭлементМассива.СтатусСостояния, 
                                  ЭлементМассива.ОбъектСинх);
            ТекстовыйФайл.ДобавитьСтроку(СтрокаЛога);
        КонецЦикла;
        
        // 4. Записываем файл по выбранному пути
        Попытка
            ТекстовыйФайл.Записать(ПутьКФайлу, КодировкаТекста.UTF8);
            Сообщить("Лог успешно сохранен: " + ПутьКФайлу);
        Исключение
            Предупреждение("Ошибка при записи файла! Возможно, нет прав доступа.");
        КонецПопытки;
        
    КонецЕсли;

КонецПроцедуры

В этом примере мы использовали метод Записать() объекта ТекстовыйДокумент. Критически важный момент, который часто упускают начинающие разработчики: путь к файлу, полученный из диалога, нужно передать в качестве первого параметра этого метода.

Вариант 2: Выбор только каталога

Иногда требуется, чтобы пользователь выбрал только папку, а имя файла программа генерировала автоматически. В этом случае мы используем режим РежимДиалогаВыбораФайла.ВыборКаталога. Разберем, как правильно сконструировать итоговый путь.


Режим = РежимДиалогаВыбораФайла.ВыборКаталога; 
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим); 
ДиалогОткрытия.Заголовок = "Выберите каталог для хранения логов"; 

Если ДиалогОткрытия.Выбрать() Тогда 
    // Получаем путь к папке
    ПутьККаталогу = ДиалогОткрытия.Каталог; 
    
    // Формируем полное имя файла программно
    // Важно проверить наличие разделителя в конце пути
    Разделитель = "\"; // Для Windows
    Если Прав(ПутьККаталогу, 1) = Разделитель Тогда
        ПолныйПуть = ПутьККаталогу + "my_log.txt";
    Иначе
        ПолныйПуть = ПутьККаталогу + Разделитель + "my_log.txt";
    КонецЕсли;
    
    ТекстовыйДокумент.Записать(ПолныйПуть);
КонецЕсли;

Разбор важных нюансов

1. Кодировка текста. При записи логов мы рекомендуем всегда явно указывать КодировкаТекста.UTF8. Это гарантирует, что кириллические символы (названия контрагентов, статусы) будут корректно отображаться в любом текстовом редакторе, независимо от региональных настроек операционной системы.

2. Объект ЗаписьТекста против ТекстовыйДокумент. Выясним причину, почему для больших логов лучше использовать ЗаписьТекста. Объект ТекстовыйДокумент хранит все строки в оперативной памяти до момента вызова метода Записать(). Если лог содержит сотни тысяч строк, это может привести к значительному потреблению памяти. ЗаписьТекста работает как «поток», записывая данные на диск сразу по мере их поступления.

Посмотрим на пример использования ЗаписьТекста:


ТекстДляЗаписи = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
Для Каждого Строка Из МассивДанных Цикл
    ТекстДляЗаписи.ЗаписатьСтроку(Строка);
КонецЦикла;
ТекстДляЗаписи.Закрыть(); // Файл физически создается и закрывается здесь

3. Асинхронность в управляемых формах. Проанализируем ситуацию с современными версиями 1С. В управляемом интерфейсе (веб-клиент, тонкий клиент) синхронный вызов метода Выбрать() может быть запрещен. В таких случаях следует использовать асинхронный метод Показать().

Рассмотрим, как это выглядит в современном стиле 1С:


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

&НаКлиенте
Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    
    Если ВыбранныеФайлы <> Неопределено Тогда
        Путь = ВыбранныеФайлы[0];
        // Здесь вызываем процедуру записи лога, передавая путь
        ЗаписатьЛогНаДиск(Путь);
    КонецЕсли;
    
КонецПроцедуры

Заключение

Мы изучили механизмы взаимодействия 1С с файловой системой. Подведем итог: для реализации выбора пути сохранения необходимо создать объект ДиалогВыбораФайла, настроить его фильтры и режим, а после получения пути от пользователя — использовать его в методах записи (Записать для текстового документа или Открыть для записи текста). Обращайте внимание на обработку ошибок с помощью конструкции Попытка...Исключение, так как запись на диск часто может быть заблокирована антивирусами или настройками прав доступа.

← На главную