Для иллюстрации возможностей работы с текстовым файлом (с использованием объекта ТекстовыйДокумент и поля формы вида ПолеТекстовогоДокумента) добавим в нашу демонстрационную обработку реквизит ТД типа ТекстовыйДокумент и реквизит СтрокаРазделителя, в котором будет храниться разделитель между значениями текстового файла. Перетащим их в окно элементов формы.
Затем добавим команду ЗаписатьДанныеСотрудников. Обработчик команды заполним следующим образом (листинг 6.29).
Листинг 6.29. Обработчик команды «ЗаписатьДанныеСотрудников»
&НаКлиенте
Процедура ЗаписатьДанныеСотрудников(Команда)
НовыйТД = Новый ТекстовыйДокумент;
// Установить кодировку документа UTF8. Это кодировка по умолчанию.
НовыйТД.УстановитьТипФайла(КодировкаТекста.UTF8);
Если ПустаяСтрока(СтрокаРазделителя) Тогда
СтрокаРазделителя = ",";
КонецЕсли;
Текст = ПолучитьСтрокиСотрудников(СтрокаРазделителя);
Текст = СформироватьЗаголовок("ООО Быстрее, выше, сильнее") + Символы.ПС + Текст;
НовыйТД.УстановитьТекст(Текст);
НовыйТД.НачатьЗапись(, "c:\temp\doc_text.txt");
КонецПроцедуры
В этом обработчике мы создаем объект ТекстовыйДокумент и устанавливаем тип кодировки этого документа.
Затем вызываем функцию ПолучитьСтрокиСотрудников(), в которую передаем строку разделителя значений (см. листинг 6.30). Эта функция выполняется на сервере. В ней в цикле обхода выборки элементов справочника Сотрудники мы формируем строки с данными сотрудников и в виде одной большой строки возвращаем в процедуру ЗаписатьДанныеСотрудников(). Для объединения данных мы используем функцию глобального контекста СтрСоединить().
После этого в полученную строку мы добавляем заголовок файла обмена. Для получения заголовка используется функция СформироватьЗаголовок(), см. листинг 6.31. Затем методом УстановитьТекст() объекта ТекстовыйДокумент мы устанавливаем эту строку в виде текста в текстовый документ и записываем документ в текстовый файл методом НачатьЗапись().
Функции СформироватьЗаголовок() и ПолучитьСтрокиСотрудников() реализуют достигнутые при переговорах «договоренности» о формате файла обмена.
Листинг 6.30. Функция «ПолучитьСтрокиСотрудников()»
&НаСервере
Функция ПолучитьСтрокиСотрудников(Разделитель)
СтрокаСотрудника = Новый Массив();
МассивСтрокСотрудников = Новый Массив();
Выборка = Справочники.Сотрудники.Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаСотрудника.Очистить();
СтрокаСотрудника.Добавить(Выборка.Код);
СтрокаСотрудника.Добавить(Выборка.Наименование);
СтрокаСотрудника.Добавить(Формат(Выборка.ДатаРождения, "ДЛФ=D"));
СтрокаСотрудника.Добавить(Выборка.КоличествоДетей);
Данные = СтрСоединить(СтрокаСотрудника, Разделитель);
МассивСтрокСотрудников.Добавить(Данные);
КонецЦикла;
Возврат СтрСоединить(МассивСтрокСотрудников, Символы.ПС);
КонецФункции
Листинг 6.31. Функция «СформироватьЗаголовок()»
&НаКлиенте
Функция СформироватьЗаголовок(НаименованиеКомпании)
Возврат СокрЛП(НаименованиеКомпании) + "-" + Формат(ТекущаяДата(), "ДЛФ=D");
КонецФункции
Для чтения данных из полученного файла добавим команду ПрочитатьДанныеСотрудников. Обработчик команды заполним следующим образом (листинг 6.32).
Листинг 6.32. Обработчик команды «ПрочитатьДанныеСотрудников»
Процедура ПрочитатьДанныеСотрудников(Команда)
ТД.НачатьЧтение(Новый ОписаниеОповещения("ПрочитатьДанныеЗавершение", ЭтотОбъект), "c:\temp\doc_text.txt");
КонецПроцедуры
В этом обработчике мы начинаем чтение из записанного ранее текстового файла методом НачатьЧтение() объекта ТекстовыйДокумент. В результате содержимое текстового файла полностью загружается в реквизит ТД, находящийся в нашей демонстрационной обработке. В метод НачатьЧтение() первым параметром мы передаем имя процедуры-обработчика оповещения ПрочитатьДанныеЗавершение(), которая будет выполнена, после того как текстовый файл будет прочитан (листинг 6.33).
Листинг 6.33. Процедура «ПрочитатьДанныеЗавершение()»
&НаКлиенте
Процедура ПрочитатьДанныеЗавершение(Дополнительно) Экспорт
Сообщение = Новый СообщениеПользователю();
ЗаголовокФайла = ТД.ПолучитьСтроку(1);
СтрокаЗаголовка = СтрРазделить(ЗаголовокФайла, "-");
НазваниеОтправителя = СтрокаЗаголовка[0];
Сообщение.Текст = НазваниеОтправителя;
Сообщение.Сообщить();
ДатаТекстом = СтрокаЗаголовка[1];
Сообщение.Текст = ДатаТекстом;
Сообщение.Сообщить();
Для ТекущаяСтрока = 2 По ТД.КоличествоСтрок() Цикл
ПрочитаннаяСтрока = ТД.ПолучитьСтроку(ТекущаяСтрока);
СтрокиСотрудников = СтрРазделить(ПрочитаннаяСтрока, СтрокаРазделителя);
Для Каждого Строка Из СтрокиСотрудников Цикл
Если НЕ ПустаяСтрока(Строка) Тогда
Сообщение.Текст = Строка;
Сообщение.Сообщить();
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Содержимое прочитанного файла мы получаем с помощью метода ПолучитьСтроку() текстового документа. Строку заголовка, согласно договоренности, мы получаем в первой строке документа. Остальные строки с данными сотрудников получаем в цикле обхода строк текстового документа.
Для разбора строк мы используем функцию глобального контекста СтрРазделить().