Для написания статьи я создал форму обработки, на которой разместил реквизит «РеквизитСтрока» с типом Строка, а так же две команды: ЗагрузитьТекстовыйФайл и СохранитьТекстовыйФайл. Реквизит и команды я поместил на форму, у поля, которое связанно с реквизитом «РеквизитСтрока», выбрал тип «Поле текстового документа».
В пользовательском приложении должна получиться такая форма:
Для работы с текстовыми документами в 1С: Предприятии есть специальный объект ТекстовыйДокумент, который создается при помощи конструктора Новый. Решим следующую задачу: будем при выполнении команды СохранитьТекстовыйФайл сохранять текст из реквизита «РеквизитСтрока» в определенный файл, а при выполнении команды ЗагрузитьТекстовыйДокумент будем загружать текст из определенного файла.
При сохранении, код в обработчике команды будет следующий:
&НаКлиенте
Процедура СохранитьТекстовыйФайл(Команда)
ТекстДок = Новый ТекстовыйДокумент; //1
ТекстДок.УстановитьТекст(РеквизитСтрока); //2
ТекстДок.НачатьЗапись(,"N:Files ext.txt",КодировкаТекста.ANSI,Символы.ВК + Символы.ПС);//3
КонецПроцедуры
В этом коде мы создаем объект ТекстовыйДокумент (строка //1), и при помощи метода этого объекта УстановитьТекст помещаем в данный объект текст из реквизита «РеквизитСтрока» (строка //2).
А дальше нам необходимо записать текстовый документ в файл, для этого мы используем метод НачатьЗапись, который нужно применять в случае немодального использования конфигурации. Он имеет следующий синтаксис
НачатьЗапись(<ОписаниеОповещения>, <ИмяФайла>, <ТипФайла>, <РазделительСтрок>)
Первый параметр — ОписаниеОповещения содержит имя процедуры, которая вызывается после записи. Можно не указывать, что мы и делаем в строк //3.
ИмяФайла – полное имя файла.
Смысл остальных параметром можете узнать в справочной информации.
Отмечу только, что разделитель я указал, как Символы.ВК + Символы.ПС, потому что такой набор символов используется по умолчанию при загрузке текстового файла.
Теперь напишем загрузку текстового файла.
&НаКлиенте
Процедура ЗагрузитьТекстовыйФайл(Команда)
ТекстДок = Новый ТекстовыйДокумент; //1
ПараметрыЧтения = Новый Структура("ТекстДок",ТекстДок);//2
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЧтенияФайла",
ЭтаФорма,
ПараметрыЧтения); //3
ТекстДок.НачатьЧтение(ОписаниеОповещения,"N:Files ext.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.2, тогда да, а так лишь систематизировали свои знания и оттачиваете мастерство написания статьи, практической пользы мало.
(1)
В 8.2 асинхронных вызовов не было. Началось с 8.3.5 (запрет модальности).
(2) спасибо, в курсе, сам использую на 8.2 асинхронное заполнение, на мобильном приложении использую, к примеру при вызове веб-сервера показываю гифку загрузки страницы, очень прикольно и стабильно работает, на статью нет желания и времени, любой программист при желании спокойно такое может сделать.
(1) Спасибо за критику. Удалять уж не буду, мало ли кому пригодится =)
(4) Тогда уж давайте я вам дам конфигурацию небольшую мобильную, где у меня асинхронное заполнение используется, скажу где используется, а вы обновите текущую статью и тогда точно кому-нибудь пригодится )
(5) хорошо, пишите в личку