Асинхронная работа с текстовыми файлами в 1С 8.3

28.02.19

Разработка - Механизмы платформы 1С

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

Скачать файлы

Наименование Файл Версия Размер
Асинхронная загрузка-выгрузка текстового файла в 1С 8.3
.epf 6,43Kb
14
.epf 6,43Kb 14 Скачать

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

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

Для работы с текстовыми документами в 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,
                           Символы.ВК + Символы.ПС);
КонецПроцедуры

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

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

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

Оригинал статьи

Ниже выложен пример обработки, где выполняется загрузка и выгрузка текстового файла в немодальном режиме. Обработка тестировалась на версии платформы 8.3.13.1513, ниже приведены несколько скринов этой обработки.

       

 

 

 

 

8.3 немодальный режим асинхронно текстовый файл

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4625    dsdred    53    

73

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5312    YA_418728146    25    

64

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6440    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18508    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12113    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8850    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6290    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    16021    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. lunjio 66 28.02.19 09:41 Сейчас в теме
Спасибо за статью конечно, на статью как таковую и не тянет, как работать с описанием оповещения можно и прекрасно из синтаксис помощника узнать, без такого детального разжевывания, вот если бы вы рассказали как это сделать при любом режиме и начиная с 8.2, тогда да, а так лишь систематизировали свои знания и оттачиваете мастерство написания статьи, практической пользы мало.
2. boln 1040 28.02.19 10:35 Сейчас в теме
(1)
как это сделать при любом режиме и начиная с 8.2
В 8.2 асинхронных вызовов не было. Началось с 8.3.5 (запрет модальности).
3. lunjio 66 28.02.19 10:45 Сейчас в теме
(2) спасибо, в курсе, сам использую на 8.2 асинхронное заполнение, на мобильном приложении использую, к примеру при вызове веб-сервера показываю гифку загрузки страницы, очень прикольно и стабильно работает, на статью нет желания и времени, любой программист при желании спокойно такое может сделать.
LifeRock69; boln; +2 Ответить
4. signum2009 1026 01.03.19 12:41 Сейчас в теме
(1) Спасибо за критику. Удалять уж не буду, мало ли кому пригодится =)
Haast; esqado; +2 Ответить
5. lunjio 66 01.03.19 12:54 Сейчас в теме
(4) Тогда уж давайте я вам дам конфигурацию небольшую мобильную, где у меня асинхронное заполнение используется, скажу где используется, а вы обновите текущую статью и тогда точно кому-нибудь пригодится )
6. signum2009 1026 01.03.19 12:55 Сейчас в теме
(5) хорошо, пишите в личку
7. Barok 24.12.20 14:16 Сейчас в теме
(4), мне как новичку в 1с8 пригодилась статья. Спасибо
Оставьте свое сообщение