Неверное содержание платежа при импорте через клиент-банк BDConverter

Задача: при импорте платежей из УкрСибБанк при помощи обработки Bank Data Converter содержание платежа не всегда верно импортируется (вместо полного содержания подтягивается несколько символов)

Не верное содержание платежа при импорте с помощью обработки "Клиент-банк"

Смотрим исходный код. В "Bank Data Converter" импорт из банковских выписок осуществляется с помощью внешних подключаемых обработок. Для УкрСибБанка используется самописная ukrsib_csv.ert. Основная работа происходит в функции "ИмпортTXT". С помощью функции СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок строку "ТекСтрока" пребразуют в массив "МассивПодСтрок" по разделителю ";".

ТекСтрока = ФайлTXT.ПолучитьСтроку(Н); 
МассивПодСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТекСтрока, ";");		
Значение.Содержание = МассивПодСтрок[15];

Проблема в том, что реквизит "Содержание платежа" в выписке может содержать кавычки внутри которых есть символы ";", которые надо не учитывать в качестве разделителя. Очевидно, что стандартная реализация фунции СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок нас не устраивает. Необходимо создать свою реализацию этого вызова.

После изучения ее исходного кода принято решение оставить ее код практически идентичным, заменив только вызовы функции глобального контекста "Найти" на самописную "НайтиСтроку".

Решение: добавляем в обработку ukrsib_csv.ert две дополнительный функции (листинг ниже) и заменяем СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок на вызов локальной функции РазложитьСтрокуВМассивПодстрок.

//Модифированная функция Глобального контекста "Найти", которая учитывает наличие кавычек в строке
Функция НайтиСтроку(Строка, Разделитель)
	
	ИщемЗакрывающуюКавычку = ложь; //Флаг указывающий режим поиска закрывающей кавычки
	
	Для Индекс = 1 По СтрДлина(Строка) Цикл
		Символ = Сред(Строка, Индекс, 1);
		
		Если Символ = """" Тогда
			ИщемЗакрывающуюКавычку = НЕ ИщемЗакрывающуюКавычку; //Инвертируем булево значение	
		КонецЕсли; 
		
		Если Символ = Разделитель И НЕ ИщемЗакрывающуюКавычку Тогда //Если нашли Разделитель и не включен режим поиска закрывающей кавычки
			Возврат Индекс;	
		КонецЕсли; 
	КонецЦикла;
	
	Возврат 0;
КонецФункции

//СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок
//в котором вызовы функции Глобального контекста Найти заменены на вызов "НайтиСтроку"
Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, СокращатьНепечатаемыеСимволы = Ложь)
	
	Результат = Новый Массив;
	
	// для обеспечения обратной совместимости
	Если ПропускатьПустыеСтроки = Неопределено Тогда
		ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
		Если ПустаяСтрока(Строка) Тогда 
			Если Разделитель = " " Тогда
				Результат.Добавить("");
			КонецЕсли;
			Возврат Результат;
		КонецЕсли;
	КонецЕсли;
	//
	
	Позиция = НайтиСтроку(Строка, Разделитель);
	Пока Позиция > 0 Цикл
		Подстрока = Лев(Строка, Позиция - 1);
		Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
			Если СокращатьНепечатаемыеСимволы Тогда
				Результат.Добавить(СокрЛП(Подстрока));
			Иначе
				Результат.Добавить(Подстрока);
			КонецЕсли;
		КонецЕсли;
		Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
		Позиция = НайтиСтроку(Строка, Разделитель);
	КонецЦикла;
	
	Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
		Если СокращатьНепечатаемыеСимволы Тогда
			Результат.Добавить(СокрЛП(Строка));
		Иначе
			Результат.Добавить(Строка);
		КонецЕсли;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции 


Похожие материалы

Комментарии