Как исправить строку файла загрузки из Банк-Клиента?

1. pentanom 30 11.01.22 11:24 Сейчас в теме
Из банка пришел файл, в котором назначение платежа написано в таком виде:
НазначениеПлатежа=оплата по счету №1 от 10.01.2021 г. покупка (4 шт.)
Сумма: 40900-00, в т.ч. НДС(20.00%): 6816-67.
т.е. назначение платежа записано в две строки разделенный символом ПС.
При загрузке в УТ 10.3 обработка "Клиент банка" ругается на вторую часть назначения платежа
Нарушена структура платежного документа, строка 273 : Сумма: 40900-00, в т.ч. НДС(20.00%): 6816-67.
Вручную поправить это можно, а как это можно сделать программно?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 81 11.01.22 11:32 Сейчас в теме
(1)ээээ.....
НазначениеПлатежа = СтрЗаменить(НазначениеПлатежа, Симполы.ПС, "");


Но так понимаю, проблема несколько глубже, т.к. чтение файла происходит построчно. Необходимо править сам алгоритм чтения файла.
4. pentanom 30 11.01.22 12:00 Сейчас в теме
(2)
Но так понимаю, проблема несколько глубже, т.к. чтение файла происходит построчно. Необходимо править сам алгоритм чтения файла.
В том-то и дело, что построчно. Надо как-то понять, что следующая строка - это продолжение предыдущей.
5. nomad_irk 81 11.01.22 12:02 Сейчас в теме
(4)если в строке нет символа "=", то это продолжение предыдущей строки
6. pentanom 30 11.01.22 12:06 Сейчас в теме
(5)
(4)если в строке нет символа "=", то это продолжение предыдущей строки
или Нарушена структура платежного документа.
7. nomad_irk 81 11.01.22 12:07 Сейчас в теме
(6)Типовой алгоритм не знает, что нужно проверять на наличие "=" в строке.
8. pentanom 30 11.01.22 12:11 Сейчас в теме
(7)
(6)Типовой алгоритм не знает, что нужно проверять на наличие "=" в строке.
Знает:
Функция РазобратьТеговуюСтроку(СтрокаРазбора, Тег, Значение)
	
	ПозицияПрисваивания = Найти(СтрокаРазбора, "=");
	Если ПозицияПрисваивания = 0 Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Тег = ВРЕГ(СокрЛП(Лев(СтрокаРазбора, ПозицияПрисваивания - 1)));
	Значение = СокрЛП(Сред(СтрокаРазбора, ПозицияПрисваивания + 1));
	
	Возврат НЕ ПустаяСтрока(Тег);
	
КонецФункции
Показать
9. nomad_irk 81 11.01.22 12:17 Сейчас в теме
(8) функция на вход получает одну строку вместо двух, что вы хотите от нее?
говорю же: необходимо менять алгоритм чтения файла с построчного на "по тэговый".
12. tolyan_ekb 80 11.01.22 12:28 Сейчас в теме
(1) может предварительно прогонять файл через новую обработку, которая будет формировать одну строку из нескольких
3. NatalyaVP 11.01.22 11:40 Сейчас в теме
10. pentanom 30 11.01.22 12:18 Сейчас в теме
Интересно, что Блокнот и WordPat по-разному отображают эту строку. Вероятно, в середине строки стоит ПС, а в конце ПС+ВК. Или что-то в этом роде...
Прикрепленные файлы:
11. nomad_irk 81 11.01.22 12:24 Сейчас в теме
(10)потому что блокнот "реагирует" на символ CR(перевод каретки), а WordPad - и на LF(окончание строки)
13. pentanom 30 11.01.22 12:37 Сейчас в теме
(11)
(10)потому что блокнот "реагирует" на символ CR(перевод каретки), а WordPad - и на LF(окончание строки)
Значит и делить на строки нужно так, как это делает Блокнот. Правильно?
14. nomad_irk 81 11.01.22 12:43 Сейчас в теме
(13)Правильно. Но типовой алгоритм не знает о том, что символ LF - не всегда обозначает конец строки.
Возможно, дело выправится указанием разделителя строк Символы.ВК + Символы.ПС в параметрах метода ЧтениеТекста()
15. pentanom 30 11.01.22 14:29 Сейчас в теме
(14)
(13)Правильно. Но типовой алгоритм не знает о том, что символ LF - не всегда обозначает конец строки.
Возможно, дело выправится указанием разделителя строк Символы.ВК + Символы.ПС в параметрах метода ЧтениеТекста()
Текст файла читается в функции
// Процедура читает заголовок файла обмена
//
Функция ПрочитатьФайл(Файл)
	
	ФайлЗагр = Новый Файл(Файл);
	Если ФайлЗагр.Существует() = Ложь Тогда
		Сообщить("Файла "+Файл+" не существует!");
		Возврат Неопределено;
	КонецЕсли;
	
	ПотокЧтения = Новый ТекстовыйДокумент();
	Попытка
		ПотокЧтения.Прочитать(Файл);
	Исключение
		Сообщить("Файл не прочитан.", СтатусСообщения.Внимание);
		Возврат Неопределено;
	КонецПопытки;
	
	Если Кодировка = "DOS" Тогда
		Кодир = КодировкаТекста.OEM;
	Иначе
		Кодир = КодировкаТекста.ANSI;
	Конецесли;

	ПотокЧтения.Прочитать(Файл,Кодир);

	Если ПотокЧтения.КоличествоСтрок()<1 Тогда
		Сообщить("В файл нет данных!");
		Возврат Неопределено;
	КонецЕсли;

	Если СокрЛП(ПотокЧтения.ПолучитьСтроку(1))<>"1CClientBankExchange" Тогда
		Сообщить("Указанный файл не является файлом обмена или неверно указана кодировка!");
		Возврат Неопределено;
	КонецЕсли;

	Возврат ПотокЧтения.ПолучитьТекст();

КонецФункции
Показать
Нужно что-то добавить в ПотокЧтения.Прочитать(Файл,Кодир) в качестве разделителя строк, но не понятно что :(
16. nomad_irk 81 11.01.22 14:32 Сейчас в теме
(15)а в Синтаксис-помощник глянуть?


ТекстовыйДокумент (TextDocument)
Прочитать (Read)
Вариант синтаксиса: Из файла
Синтаксис:
Прочитать(<ИмяФайла>, <ТипФайла>, <РазделительСтрок>)
Параметры:
<ИмяФайла> (обязательный)
Тип: Строка.
Имя текстового файла.
<ТипФайла> (необязательный)
Тип: КодировкаТекста, Строка.
Указывается кодировка текста в открываемом файле.
В случае, если параметр не задан, формат текста будет определен автоматически (если он хранится в файле с сигнатурой BOM в начале). Если автоматически определить формат файла не удается, файл будет открыт в кодировке UTF8.

Тип файла может быть задан как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки.
Поддерживаемые названия кодировок:
UTF-8
UTF-16
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
UTF16_PlatformEndian
UTF16_OppositeEndian
UTF32_PlatformEndian
UTF32_OppositeEndian
UTF-7
IMAP-mailbox-name
SCSU
BOCU-1
CESU-8
ISO-8859-1
US-ASCII
gb18030
IBM367
iso-8859-2
iso-8859-3
iso-8859-4
iso-8859-5
iso-8859-6
iso-8859-7
iso-8859-8
iso-8859-9
iso-8859-13
iso-8859-15
cp932
Shift_JIS
EUC-JP
cp33722
windows-950
Big5
cp950
Big5-HKSCS
cp1386
GBK
GB2312
GB_2312-80
cp964
cp949
cp949c
EUC-KR
ibm-971
KSC_5601
ibm-1363
windows-949
windows-874
cp874
ibm-1162
cp437
cp737
cp775
cp850
cp851
cp852
cp855
cp856
cp857
cp858
cp860
cp861
cp862
cp863
cp864
cp865
cp866
ibm-867
CP868
cp869
KOI8-R
ibm-901
ibm-902
cp922
KOI8-U
ibm-4909
windows-1250
windows-1251
windows-1252
windows-1253
windows-1254
windows-1255
windows-1256
windows-1257
windows-1258
macintosh
x-mac-greek
x-mac-cyrillic
x-mac-centraleurroman
x-mac-turkish
hp-roman8
Adobe-Standard-Encoding
cp1006
cp1098
cp1124
cp1125
ibm-1129
cp1131
ibm-1133
ISO-2022-JP
JIS_Encoding
ISO-2022-JP-2
ISO_2022,locale=ja,version=3
ISO_2022,locale=ja,version=4
ISO-2022-KR
ISO_2022,locale=ko,version=1
ISO-2022-CN
ISO-2022-CN-EXT
HZ-GB-2312
windows-57002
windows-57003
windows-57011
windows-57010
windows-57007
windows-57004
windows-57005
windows-57008
windows-57009
LMBCS-1
LMBCS-2
LMBCS-3
LMBCS-4
LMBCS-5
LMBCS-6
LMBCS-8
LMBCS-11
LMBCS-16
LMBCS-17
LMBCS-18
LMBCS-19
IBM037
ebcdic-de
ebcdic-dk
IBM278
IBM280
IBM284
IBM285
IBM290
IBM297
IBM420
IBM424
IBM500
ibm-803
IBM-Thai
IBM870
IBM871
cp875
IBM918
cp930
cp933
cp935
cp937
cp939
cp1025
IBM1026
IBM1047
cp1097
cp1112
cp1122
cp1123
ibm-1130
ibm-1132
ibm-1137
IBM01140
IBM01141
IBM01142
IBM01143
IBM01144
IBM01145
IBM01146
IBM01147
IBM01148
IBM01149
ibm-1153
ibm-1154
ibm-1155
ibm-1156
ibm-1157
ibm-1158
ibm-1160
ibm-1164
ibm-1364
ibm-1371
ibm-1388
ibm-1390
ibm-1399
ibm-5123
ibm-8482
ibm-16684
ibm-4899
ibm-4971
ebcdic-he
ebcdic-ar
ibm-37_P100-1995,swaplfnl
ibm-1047_P100-1995,swaplfnl
ibm-1140_P100-1997,swaplfnl
ibm-1142_P100-1997,swaplfnl
ibm-1143_P100-1997,swaplfnl
ibm-1144_P100-1997,swaplfnl
ibm-1145_P100-1997,swaplfnl
ibm-1146_P100-1997,swaplfnl
ibm-1147_P100-1997,swaplfnl
ibm-1148_P100-1997,swaplfnl
ibm-1149_P100-1997,swaplfnl
ibm-1153_P100-1999,swaplfnl
ibm-12712_P100-1998,swaplfnl
ibm-16804_X110-1999,swaplfnl
ebcdic-xml-us
<РазделительСтрок> (необязательный)
Тип: Строка.
Задается строка, являющаяся разделителем строк, из которой при чтении файла будет сформирован символ ПС.
Если строка пустая, то разделители строк при чтении не конвертируются.
Допустимые варианты разделителей строк:
ВК;
ПС;
ВК + ПС (значение по умолчанию - может не указываться).
При использовании других строк в качестве разделителей будет вызвано исключение.
Значение по умолчанию: ВК + ПС.
Описание варианта метода:
Считывает текстовый документ из файла.
Вариант синтаксиса: Из потока
Синтаксис:
Прочитать(<Поток>, <ТипФайла>, <РазделительСтрок>)
Параметры:
<Поток> (обязательный)
Тип: Поток, ПотокВПамяти, ФайловыйПоток.
Поток для чтения.
<ТипФайла> (необязательный)
Тип: КодировкаТекста, Строка.
Указывается кодировка текста в потоке.
В случае, если параметр не задан, формат текста будет определен автоматически (если он хранится в файле с сигнатурой BOM в начале). Если автоматически определить формат файла не удается, файл будет открыт в кодировке UTF8.

Тип файла может быть задан как в виде значения перечисления КодировкаТекста, так и в виде строки с указанием названия кодировки.
Поддерживаемые названия кодировок:
UTF-8
UTF-16
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
UTF16_PlatformEndian
UTF16_OppositeEndian
UTF32_PlatformEndian
UTF32_OppositeEndian
UTF-7
IMAP-mailbox-name
SCSU
BOCU-1
CESU-8
ISO-8859-1
US-ASCII
gb18030
IBM367
iso-8859-2
iso-8859-3
iso-8859-4
iso-8859-5
iso-8859-6
iso-8859-7
iso-8859-8
iso-8859-9
iso-8859-13
iso-8859-15
cp932
Shift_JIS
EUC-JP
cp33722
windows-950
Big5
cp950
Big5-HKSCS
cp1386
GBK
GB2312
GB_2312-80
cp964
cp949
cp949c
EUC-KR
ibm-971
KSC_5601
ibm-1363
windows-949
windows-874
cp874
ibm-1162
cp437
cp737
cp775
cp850
cp851
cp852
cp855
cp856
cp857
cp858
cp860
cp861
cp862
cp863
cp864
cp865
cp866
ibm-867
CP868
cp869
KOI8-R
ibm-901
ibm-902
cp922
KOI8-U
ibm-4909
windows-1250
windows-1251
windows-1252
windows-1253
windows-1254
windows-1255
windows-1256
windows-1257
windows-1258
macintosh
x-mac-greek
x-mac-cyrillic
x-mac-centraleurroman
x-mac-turkish
hp-roman8
Adobe-Standard-Encoding
cp1006
cp1098
cp1124
cp1125
ibm-1129
cp1131
ibm-1133
ISO-2022-JP
JIS_Encoding
ISO-2022-JP-2
ISO_2022,locale=ja,version=3
ISO_2022,locale=ja,version=4
ISO-2022-KR
ISO_2022,locale=ko,version=1
ISO-2022-CN
ISO-2022-CN-EXT
HZ-GB-2312
windows-57002
windows-57003
windows-57011
windows-57010
windows-57007
windows-57004
windows-57005
windows-57008
windows-57009
LMBCS-1
LMBCS-2
LMBCS-3
LMBCS-4
LMBCS-5
LMBCS-6
LMBCS-8
LMBCS-11
LMBCS-16
LMBCS-17
LMBCS-18
LMBCS-19
IBM037
ebcdic-de
ebcdic-dk
IBM278
IBM280
IBM284
IBM285
IBM290
IBM297
IBM420
IBM424
IBM500
ibm-803
IBM-Thai
IBM870
IBM871
cp875
IBM918
cp930
cp933
cp935
cp937
cp939
cp1025
IBM1026
IBM1047
cp1097
cp1112
cp1122
cp1123
ibm-1130
ibm-1132
ibm-1137
IBM01140
IBM01141
IBM01142
IBM01143
IBM01144
IBM01145
IBM01146
IBM01147
IBM01148
IBM01149
ibm-1153
ibm-1154
ibm-1155
ibm-1156
ibm-1157
ibm-1158
ibm-1160
ibm-1164
ibm-1364
ibm-1371
ibm-1388
ibm-1390
ibm-1399
ibm-5123
ibm-8482
ibm-16684
ibm-4899
ibm-4971
ebcdic-he
ebcdic-ar
ibm-37_P100-1995,swaplfnl
ibm-1047_P100-1995,swaplfnl
ibm-1140_P100-1997,swaplfnl
ibm-1142_P100-1997,swaplfnl
ibm-1143_P100-1997,swaplfnl
ibm-1144_P100-1997,swaplfnl
ibm-1145_P100-1997,swaplfnl
ibm-1146_P100-1997,swaplfnl
ibm-1147_P100-1997,swaplfnl
ibm-1148_P100-1997,swaplfnl
ibm-1149_P100-1997,swaplfnl
ibm-1153_P100-1999,swaplfnl
ibm-12712_P100-1998,swaplfnl
ibm-16804_X110-1999,swaplfnl
ebcdic-xml-us
<РазделительСтрок> (необязательный)
Тип: Строка.
Задается строка, являющаяся разделителем строк, из которой при чтении потока будет сформирован символ ПС.
Если строка пустая, то разделители строк при чтении не конвертируются.
Допустимые варианты разделителей строк:
ВК;
ПС;
ВК + ПС (значение по умолчанию - может не указываться).
При использовании других строк в качестве разделителей будет вызвано исключение.
Значение по умолчанию: ВК + ПС.
Описание варианта метода:
Считывает текстовый документ из потока.
Описание:
Считывает текстовый документ из файла.
Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение.
Пример:
// вариант 1

ТекстДок.Прочитать("catalog.txt");

// вариант 2

ТекстДок.Прочитать("catalog.txt","cp866");
Использование в версии:
Доступен, начиная с версии 8.0.
Показать
17. pentanom 30 11.01.22 14:50 Сейчас в теме
(16)
(15)а в Синтаксис-помощник глянуть?
Глянул и ничего не подобрал :(
18. nomad_irk 81 11.01.22 14:52 Сейчас в теме
(17)значит проблема не решается "малой кровью".
Необходимо вместо ТекстовыйДокумент использовать ЧтениеТекста, например, но это повлечет за собой переделывание остальных механизмов.

Хотя, если замена разделителя строк не решила проблему, то, думаю, ничего не поменяется при использовании ЧтениеТекста.
Сам текст необходимо обработать перед тем, как "скормить" его "парсеру"
19. pentanom 30 11.01.22 15:19 Сейчас в теме
(18)
(17)значит проблема не решается "малой кровью".
Тогда "малой кровью" получится искать проблемное место в файле и исправлять файл вручную. Что я сегодня и сделал !
20. nomad_irk 81 11.01.22 15:20 Сейчас в теме
(19)если это единичный случай - да
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот