Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
12 дек 2024, 07:56

Проблема при запуске чтения txt файла в фоне.

Автор Greiv, 17 мар 2015, 11:40

0 Пользователей и 1 гость просматривают эту тему.

Greiv

Возникает ошибка при попытке прочитать файл в фоне.

Код формы которая передаёт данные в общий модуль:
&НаКлиенте
Процедура Загрузка(Команда)
УникальныйИД  = Новый УникальныйИдентификатор;

ИмяФайла = "";
ВыборФайла(ИмяФайла, НСтр("ru='Выберите файл для загрузки данных'"),РежимДиалогаВыбораФайла.Открытие,"txt");

Если ИмяФайла = "" Тогда
Возврат;
КонецЕсли;
СтруктураЗагрузки = Новый Структура;

СтруктураЗагрузки.Вставить("Хранилище", ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), Новый УникальныйИдентификатор));
РасчетныйСчет = ПредопределенноеЗначение("Справочник.БанковскиеСчетаОрганизаций.ПустаяСсылка");
ВвестиЗначение(РасчетныйСчет,"Расчетный счет организации",Тип("СправочникСсылка.БанковскиеСчетаОрганизаций"));
СтруктураЗагрузки.Вставить("РасчетныйСчет",  РасчетныйСчет);
СтруктураЗагрузки.Вставить("УникальныйИД", УникальныйИД);

ОбменДаннымиСФКР.ПоставитьЗагрузкуФайла(СтруктураЗагрузки);

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


Процедура которая получает структуру в общем модуле, а также постановка задания в фон:
Процедура ПоставитьЗагрузкуФайла(СтруктураЗагрузки) Экспорт
Параметы = Новый Структура;
Параметы.Вставить("Файл", СтруктураЗагрузки.Хранилище);
Параметы.Вставить("РасчетныйСчет", СтруктураЗагрузки.РасчетныйСчет);
Результат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(СтруктураЗагрузки.УникальныйИД, "ОбменДаннымиСФКР.ЗагрузитьФайл",
Параметы, "Загрузка файла банков ФКР");
КонецПроцедуры


Процедуры которые должны выполняться в фоне:
Процедура ЗагрузитьФайл(Параметры, Адрес) Экспорт

Текст = Новый ЧтениеТекста(Параметры.Файл); //Вот тут походу ошибка образуется

СтрокаТекста = Текст.ПрочитатьСтроку();
Пока НЕ СтрокаТекста = Неопределено Цикл

Если Найти(СтрокаТекста,"#")>0 Тогда
СтрокаТекста = Текст.ПрочитатьСтроку();
Продолжить;
КонецЕсли;

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

КонецЦикла;


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

Процедура РазложитьСтрокуНаСервере(СтрокаТекста,РасчетныйСчет)


НоваяЗапись = РегистрыСведений.НачисленияДляОплатПоКассамККМ.СоздатьМенеджерЗаписи();
    НоваяЗапись.РасчетныйСчет = РасчетныйСчет;
СчетчикЦикла = 0;
Пока Истина Цикл



СчетчикЦикла = СчетчикЦикла+1;

РазделительЗначений = Найти(СтрокаТекста,";");

ТекЗначение = Лев(СтрокаТекста,  РазделительЗначений-1);

Если РазделительЗначений = 0 Тогда
ТекЗначение = СтрокаТекста;
КонецЕсли;


ТекстЗамены =  Лев(СтрокаТекста, РазделительЗначений);

Если СчетчикЦикла = 1 Тогда

НоваяЗапись.ФИО = ТекЗначение;

ИначеЕсли СчетчикЦикла = 2 Тогда

НаселенныйПункт = Справочники.НаселенныеПункты.НайтиПоНаименованию(ТекЗначение);

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

НоваяЗапись.НаселенныйПункт = Справочники.НаселенныеПункты.НайтиПоНаименованию(ТекЗначение);

ИначеЕсли СчетчикЦикла = 3 Тогда

Улица = Справочники.Улицы.НайтиПоНаименованию(ТекЗначение);

Если Улица.Пустая() Тогда
НоваяУлица = Справочники.Улицы.СоздатьЭлемент();
НоваяУлица.Наименование = ТекЗначение;
НоваяУлица.Записать();
Улица = НоваяУлица.Ссылка;
КонецЕсли;

НоваяЗапись.Улица = Улица;

ИначеЕсли СчетчикЦикла = 4 Тогда

НоваяЗапись.НомерДома = ТекЗначение;

ИначеЕсли СчетчикЦикла = 5 Тогда

НоваяЗапись.НомерКвартиры = ТекЗначение;

ИначеЕсли СчетчикЦикла = 6 Тогда

ЛицевойСчет = Справочники.ЛицевыеСчета.НайтиПоКоду(ТекЗначение);

НомерЛицевогСчета = СтрЗаменить(СокрЛП(ТекЗначение),Символы.НПП,"");
        ЛицевойСчет       = Справочники.ЛицевыеСчета.НайтиПоКоду(НомерЛицевогСчета);
        Если ЛицевойСчет.Пустая() Тогда
           
            ОбъектЛС = Справочники.ЛицевыеСчета.СоздатьЭлемент();
            ОбъектЛС.Код          = НомерЛицевогСчета;
            ОбъектЛС.Наименование = "Л/С № "+НомерЛицевогСчета;
            ОбъектЛС.Записать();
            ЛицевойСчет = ОбъектЛС.Ссылка;

        КонецЕсли;



НоваяЗапись.ЛицевойСчет = ЛицевойСчет;

ИначеЕсли СчетчикЦикла = 7 Тогда
НоваяЗапись.ВсегоКОплате = Число(ТекЗначение);
ИначеЕсли СчетчикЦикла = 8 Тогда

РасчетныйПериодСтрокой = СокрЛП(ТекЗначение);

МесяцЧислом  = Число(Лев(РасчетныйПериодСтрокой,2));     
Месяц        = Перечисления.Месяца[МесяцЧислом-1];
Год          = Прав(РасчетныйПериодСтрокой,4);
ГодЧислом    = Число(Год);
ПериодШтрихКод =Лев(РасчетныйПериодСтрокой,2)+Прав(РасчетныйПериодСтрокой,2);
КонецПериода = КонецМесяца(Дата(ГодЧислом,МесяцЧислом,01));

НаименованиеПериода = Строка(Месяц) + " "+Год+" г.";

РасчетныйПериод = Справочники.Периоды.НайтиПоНаименованию(НаименованиеПериода);

Если РасчетныйПериод.Пустая() Тогда

ОбъектПериод = Справочники.Периоды.СоздатьЭлемент();
ОбъектПериод.Год           = Год;
ОбъектПериод.Месяц         = Месяц;
ОбъектПериод.КонецПериода  = КонецПериода;
ОбъектПериод.Наименование  = НаименованиеПериода;
ОбъектПериод.ПериодСтрокой = РасчетныйПериодСтрокой;
ОбъектПериод.ПериодШтрихКод = ПериодШтрихКод;
ОбъектПериод.Записать();
РасчетныйПериод = ОбъектПериод.Ссылка;

КонецЕсли;
НоваяЗапись.РасчетныйПериод = РасчетныйПериод;
Иначе
Прервать;
КонецЕсли;

СтрокаТекста =  Сред(СтрокаТекста, РазделительЗначений+1);

КонецЦикла;

НоваяЗапись.Записать(Истина);


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


Сразу как начинается фоновое задание вылазиет ошибка:
{ОбщийМодуль.ОбменДаннымиСФКР.Модуль(169)}: Ошибка при вызове конструктора (ЧтениеТекста)
Не знаю в чём причина, может я где то ошибку не заметил?

blackmoon89

Наверное потому, что процедура выполняется на сервере, а вы задаете локальный путь к файлу. Т.е. Вы задаете (допустим) d:\test\МойФайл.txt

А на сервере диска D может нет вообще. Нужно указывать пути относительно локальных директорий сервера, ну соответственно файлик туда положить.

Greiv

Цитата: blackmoon89 от 17 мар 2015, 11:50
Наверное потому, что процедура выполняется на сервере, а вы задаете локальный путь к файлу. Т.е. Вы задаете (допустим) d:\test\МойФайл.txt

А на сервере диска D может нет вообще. Нужно указывать пути относительно локальных директорий сервера, ну соответственно файлик туда положить.

Если посмотрите внимательно то там файл обрабатывается процедурой ВыборФайла, и затем помещается в хранилище целиком и только потом передаётся в структуре на сервер.

blackmoon89

Цитата: Greiv от 17 мар 2015, 13:06
Цитата: blackmoon89 от 17 мар 2015, 11:50
Наверное потому, что процедура выполняется на сервере, а вы задаете локальный путь к файлу. Т.е. Вы задаете (допустим) d:\test\МойФайл.txt

А на сервере диска D может нет вообще. Нужно указывать пути относительно локальных директорий сервера, ну соответственно файлик туда положить.

Если посмотрите внимательно то там файл обрабатывается процедурой ВыборФайла, и затем помещается в хранилище целиком и только потом передаётся в структуре на сервер.
Если посмотрите внимательно на справку о ЧтениеТекста, то увидите, что там нужен путь к файлу на диске, а теперь взгляните, что присылаете вы.

ЧтениеТекста (TextReader)
По имени файла
Синтаксис:

Новый ЧтениеТекста(<ИмяФайла>, <Кодировка>, <РазделительСтрок>, <КонвертируемыйРазделительСтрок>, <МонопольныйРежим>)
Параметры:

<ИмяФайла> (обязательный)

Тип: Строка.
Имя текстового файла для чтения.
<Кодировка> (необязательный)

Тип: КодировкаТекста; Строка.
Определяет кодировку текста читаемого текстового файла (согласован с текстовым документом). Если параметр не задан, формат текста будет определен автоматически по сигнатуре BOM в начале файла; если сигнатура BOM в файле отсутствует, файл будет открыт в кодировке ANSI.

Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки.

Добавлено: 17 мар 2015, 13:35


Файл сохраните на диск из хранилища, а потом вызывайте чтение с параметром пути к этому файлу.

Greiv

Цитата: blackmoon89 от 17 мар 2015, 13:33
Цитата: Greiv от 17 мар 2015, 13:06
Цитата: blackmoon89 от 17 мар 2015, 11:50
Наверное потому, что процедура выполняется на сервере, а вы задаете локальный путь к файлу. Т.е. Вы задаете (допустим) d:\test\МойФайл.txt

А на сервере диска D может нет вообще. Нужно указывать пути относительно локальных директорий сервера, ну соответственно файлик туда положить.

Если посмотрите внимательно то там файл обрабатывается процедурой ВыборФайла, и затем помещается в хранилище целиком и только потом передаётся в структуре на сервер.
Если посмотрите внимательно на справку о ЧтениеТекста, то увидите, что там нужен путь к файлу на диске, а теперь взгляните, что присылаете вы.

ЧтениеТекста (TextReader)
По имени файла
Синтаксис:

Новый ЧтениеТекста(<ИмяФайла>, <Кодировка>, <РазделительСтрок>, <КонвертируемыйРазделительСтрок>, <МонопольныйРежим>)
Параметры:

<ИмяФайла> (обязательный)

Тип: Строка.
Имя текстового файла для чтения.
<Кодировка> (необязательный)

Тип: КодировкаТекста; Строка.
Определяет кодировку текста читаемого текстового файла (согласован с текстовым документом). Если параметр не задан, формат текста будет определен автоматически по сигнатуре BOM в начале файла; если сигнатура BOM в файле отсутствует, файл будет открыт в кодировке ANSI.

Кодировка может быть задана как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки.

Добавлено: 17 мар 2015, 13:35


Файл сохраните на диск из хранилища, а потом вызывайте чтение с параметром пути к этому файлу.

Понял попробую может и правда в этом причина.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск