Работа с текстовыми файлами в 1С 8.3 (немодальные вызовы)

В этой статье я рассмотрю основные моменты работы с текстовым файлом в 1С 8.3. в режиме отключенной модальности.

Для написания статьи я создал форму обработки, на которой разместил реквизит «РеквизитСтрока» с типом Строка, а так же две команды: ЗагрузитьТекстовыйФайл и СохранитьТекстовыйФайл. Реквизит и команды я поместил на форму, у поля, которое связанно с реквизитом, выбрал тип «Поле текстового документа».

В пользовательском приложении должна получиться такая форма:

Для команд были созданы клиентские обработчики:

&НаКлиенте
Процедура СохранитьТекстовыйФайл(Команда)

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

&НаКлиенте
Процедура ЗагрузитьТекстовыйФайл(Команда)

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

 

Для работы с текстовыми документами в 1С: Предприятии есть специальный объект ТекстовыйДокумент, который вызывается при помощи конструктора Новый. Решим следующую задачу: будем при выполнении команды СохранитьТекстовыйДокумент сохранять текст из реквизита «РеквизитСтрока» в определенный файл, а при выполнении команды ЗагрузитьТекстовыйДокумент будем загружать текст из определенного файла.

При сохранении, код в обработчике команды будет следующий
 

&НаКлиенте
Процедура СохранитьТекстовыйФайл(Команда)

ТекстДок = Новый ТекстовыйДокумент; //1
ТекстДок.УстановитьТекст(РеквизитСтрока); //2
ТекстДок.НачатьЗапись(,"N:\Files\text.txt",КодировкаТекста.ANSI,Символы.ВК + Символы.ПС);//3

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

 
В этом коде мы создаем объект ТекстовыйДокумент (строка //1), и при помощи метода этого объекта УстановитьТекст помещаем в данный объект текст из реквизита «РеквизитСтрока» (строка //2).

А дальше нам необходимо записать текстовый документ в файл,  для этого мы используем метод НачатьЗапись, который нужно применять в случае немодального использования конфигурации. Он имеет следующий синтаксис

НачатьЗапись(<ОписаниеОповещения>, <ИмяФайла>, <ТипФайла>, <РазделительСтрок>)

Первый параметр — ОписаниеОповещения  содержит имя процедуры, которая вызывается после записи. Можно не указывать, что мы и делаем в строк //3.

ИмяФайла – полное имя файла.
Смысл остальных параметром можете узнать в справочной информации.

Отмечу только, что разделитель я указал, как Символы.ВК + Символы.ПС, потому что такой набор символов используется по умолчанию при загрузке текстового файла.

Посмотрим, как работает наша команда

Теперь напишем загрузку текстового файла.

 

&НаКлиенте
Процедура ЗагрузитьТекстовыйФайл(Команда)

       ТекстДок = Новый ТекстовыйДокумент;   //1
       ПараметрыЧтения = Новый Структура("ТекстДок",ТекстДок);//2
       ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЧтенияФайла",
                                                                                         ЭтаФорма,
                                                                                         ПараметрыЧтения); //3

       ТекстДок.НачатьЧтение(ОписаниеОповещения,"N:\Files\text.txt",
                                           КодировкаТекста.ANSI,
                                           Символы.ВК + Символы.ПС);  //4

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

&НаКлиенте
Процедура ПослеЧтенияФайла(Параметры) Экспорт

       РеквизитСтрока = Параметры.ТекстДок.ПолучитьТекст();

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

 

В этом  случае, код будет немного сложнее, чем при записи.  Мы используем метод НачатьЧтение объекта текстовый документ (строка //4), но в этот раз передаем в него описание оповещения (создали в строке //3), где указываем процедуру ПослеЧтенияФайла, а в описание оповещения передаем в процедуру ПослеЧтенияФайла параметр, в котором указали созданный текстовый документ (строка //2). И уже в процедуре ПослеЧтенияФайла реквизиту РеквизитСтрока присваиваем текст, который содержится в текстовом документе, при помощи метода текстового документа ПолучитьТекст.

Почему мы извлекаем текст именно в процедуре оповещения ПослеЧтенияФайла? Потому что она вызывается именно тогда, когда завершено чтение файла. Если Вы попытаетесь прочитать текст, после строки //4, то ни чего не получится. Это одна из особенностей работы асинхронных методов 1С 8.3.

Сейчас мы спокойно сможем сохранить текст в файл, путь к которому указан в качестве первого параметра метода НачатьЗапись.  Но, иногда бывает  нужно, что бы пользователь сам выбирал, в какой файл сохранить текст. Переделаем наш код записи текста: будем вызывать окно, в котором пользователь укажет каталог, куда будет записан файл, и само название файла.

 

&НаКлиенте
Процедура СохранитьТекстовыйФайл(Команда)

       Режим = РежимДиалогаВыбораФайла.Сохранение;
       ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
       ДиалогОткрытия.ПолноеИмяФайла = "";
       Фильтр = НСтр("ru = ‘Текст'") + "(*.txt)|*.txt";
       ДиалогОткрытия.Фильтр = Фильтр;
       ДиалогОткрытия.МножественныйВыбор = Ложь;
       ДиалогОткрытия.Заголовок = "Выберете файл для сохранения";

       ОписаниеОповещения = Новый ОписаниеОповещения("ПослеСохраненияФайла",ЭтаФорма);

       ДиалогОткрытия.Показать(ОписаниеОповещения);

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

&НаКлиенте
Процедура ПослеСохраненияФайла(ВыбранныеФайлы, Параметры) Экспорт
      Если Не ЗначениеЗаполнено(ВыбранныеФайлы) Тогда
           Возврат;
      КонецЕсли;
      ТекстДок = Новый ТекстовыйДокумент;
      ТекстДок.УстановитьТекст(РеквизитСтрока);
      ТекстДок.НачатьЗапись(,ВыбранныеФайлы[0],
                                            КодировкаТекста.ANSI,
                                            Символы.ВК + Символы.ПС);
КонецПроцедуры

 

В этом случае мы вызываем диалог выбора файла с режимом сохранения, заполняем нужные параметры этого объекта, и в конце используем метод Показать. В качестве единственного параметра этого метода нужно указать обработчик оповещения, который мы создали строкой ранее, с процедурой, которая выполнится после сохранения файла (после нажатия на кнопку «Сохранить» диалога). А вот уже в обработчике оповещения ПослеСохраненияФайла мы создаем текстовый документ, устанавливаем в него текст из реквизита и записываем в файл, путь которого указан в массиве – параметре процедуры ВыбранныеФайлы. В первом параметре процедуры обработки оповещения содержится массив полных путей к выбранным файлам (в случае множественного выбора). Если Вы посмотрите на переменную ВыбранныеФайлы в отладке, то увидите путь к этому массиву.

Посмотрим, как работает наш код.

 

Теперь выполним обратную задачу: будем загружать текст из файла в реквизит на форме. Переделаем обработчик команды ЗагрузитьТекстовыйФайл.

 

&НаКлиенте
Процедура ЗагрузитьТекстовыйФайл(Команда)

     Режим = РежимДиалогаВыбораФайла.Открытие;
     ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);  
     ДиалогОткрытия.ПолноеИмяФайла = "";
     Фильтр = НСтр("ru = ‘Текст'") + "(*.txt)|*.txt";
     ДиалогОткрытия.Фильтр = Фильтр;
     ДиалогОткрытия.МножественныйВыбор = Ложь;
     ДиалогОткрытия.Заголовок = "Выберете файл для загрузки";

     ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗагрузкиФайла",ЭтаФорма);

     ДиалогОткрытия.Показать(ОписаниеОповещения);

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

&НаКлиенте
Процедура ПослеЗагрузкиФайла(ВыбранныеФайлы, Параметры) Экспорт

     Если Не ЗначениеЗаполнено(ВыбранныеФайлы) Тогда
        Возврат;
     КонецЕсли;

     ТекстДок = Новый ТекстовыйДокумент;
     ПараметрыЧтения = Новый Структура("ТекстДок",ТекстДок);
     ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЧтенияФайла",
                                                   ЭтаФорма,
                                                   ПараметрыЧтения);
     ТекстДок.НачатьЧтение(ОписаниеОповещения,
                           ВыбранныеФайлы[0],
                           КодировкаТекста.ANSI,
                           Символы.ВК + Символы.ПС);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЧтенияФайла(Параметры) Экспорт
 
     РеквизитСтрока = Параметры.ТекстДок.ПолучитьТекст();

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

 

В этом случае, в обработчике ЗагрузитьТекстовыйФайл мы так же используем объект ДиалогВыбораФайл, который создаем в режиме Открытия, заполняем параметры этого диалога и используем метод Показать, где в качестве параметра используется описание оповещения, с процедурой, которая выполнится после выбора файла (после нажатия на кнопку «Открыть» диалога). А в процедуре ПослеЗагрузкиФайла, которая указана в оповещение, мы загружаем в текстовый файл по пути, который указан в массиве  — параметре процедуры ВыбранныеФайл. В этом случае алгоритм действий точно такой же, как и в том случае, когда мы путь к файлу указывали жестко.

Посмотрим, как работает наша загрузка файла

 

Книга «Программировать в 1С за 11 шагов»

Изучите программирование в 1С с помощью моей книги «Программировать в 1С за 11 шагов»

  1. Без сложных технических терминов.
  2. Более 700 страниц практического материала.
  3. Каждое задание сопровождается рисунком (скриншот).
  4. Сборник задач для домашней проработки.
  5. Книга написана понятным и простым языком — для новичка.
  6. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!

Книга «Основы разработки в 1С: Такси»

Эта книга подойдёт тем, кто уже начал программировать и испытывает определенные сложности с этой темой и тем, кто уже давно программирует, но ни разу еще не работал с управляемыми формами 1С

  1. Без сложных технических терминов;
  2. Более 600 страниц практического материала;
  3. Каждый пример сопровождается рисунком (скриншот);
  4. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!

Промо-код на скидку в 15% — 48PVXHeYu


Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:

можно оплатить вручную:

Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

One Reply to “Работа с текстовыми файлами в 1С 8.3 (немодальные вызовы)”

  1. Нужно было установить у реквизита формы РеквизитСтрока тип ТекстовыйДокумент. Это позволило бы обойтись без преобразований, т.е. вместо
    ТекстДок = Новый ТекстовыйДокумент;
    ТекстДок.УстановитьТекст(РеквизитСтрока);
    ТекстДок.НачатьЗапись(,ВыбранныеФайлы[0],
    КодировкаТекста.ANSI,
    Символы.ВК + Символы.ПС);

    Было бы просто
    РеквизитСтрока.НачатьЗапись(,ВыбранныеФайлы[0],
    КодировкаТекста.ANSI,
    Символы.ВК + Символы.ПС);

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *