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

28.02.19

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Асинхронная загрузка-выгрузка текстового файла в 1С 8.3
.epf 6,43Kb
15
15 Скачать (1 SM) Купить за 1 850 руб.

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

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

Для работы с текстовыми документами в 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 немодальный режим асинхронно текстовый файл

См. также

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

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7443    bayselonarrend    20    

154

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

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5942    dsdred    16    

80

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

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

24.01.2024    17663    YA_418728146    26    

71

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

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

11.12.2023    11221    dsdred    44    

130

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

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

06.10.2023    23756    SeiOkami    48    

135

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

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

14.09.2023    18828    human_new    27    

80

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

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

28.08.2023    14729    YA_418728146    7    

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