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