Часто при обмене данными между банковским приложением и конфигурацией 1С:Управление торговлей 10.3 мы сталкиваемся с неприятной ситуацией. Файл формата 1CClientBankExchange оказывается поврежденным из-за того, что поле «Назначение платежа» принудительно разбивается на несколько строк. Стандартная процедура загрузки 1С ожидает, что каждая новая строка начинается с нового ключа (например, Сумма=, Дата=), и при натыкании на «лишний» перенос строки выдает ошибку: «Нарушена структура платежного документа».
Давайте разберем, почему это происходит и как мы можем решить эту задачу программными средствами, не прибегая к ручной правке каждого файла.
Типовой алгоритм загрузки 1С использует функцию РазобратьТеговуюСтроку, которая ищет символ «=» в строке. Если символ не найден, стандартная логика считает, что возникла ошибка. Однако в реальности это не ошибка структуры, а просто «длинное» описание, перенесенное на следующую строку символами ПС (перевод строки) или ВК+ПС. Чтобы исправить это, нам необходимо изменить способ чтения файла.
Самый простой подход — реализовать логику «склеивания» строк до передачи их в парсер. Суть метода заключается в проверке: если строка не содержит знака равенства =, значит, это продолжение предыдущего поля. Давайте рассмотрим, как это реализовать:
При чтении файла построчно, мы должны отслеживать состояние переменной, хранящей текущий тэг. Если текущая строка не содержит «=», мы просто добавляем её содержимое к значению предыдущего тэга через пробел.
Функция РазобратьТеговуюСтроку(СтрокаРазбора, Тег, Значение)
ПозицияПрисваивания = Найти(СтрокаРазбора, "=");
Если ПозицияПрисваивания = 0 Тогда
Возврат Ложь; // Это признак того, что строка не содержит тэга
КонецЕсли;
Тег = ВРЕГ(СокрЛП(Лев(СтрокаРазбора, ПозицияПрисваивания - 1)));
Значение = СокрЛП(Сред(СтрокаРазбора, ПозицияПрисваивания + 1));
Возврат НЕ ПустаяСтрока(Тег);
КонецФункции
Мы можем модифицировать цикл чтения файла так, чтобы при получении Ложь от этой функции, мы не выдавали ошибку, а присоединяли строку к последнему успешно прочитанному значению.
Иногда проблема кроется в неверной интерпретации символов переноса строки (CR/LF). Если мы используем объект ТекстовыйДокумент или ЧтениеТекста, можно попробовать явно указать параметры разделителей.
Разберем детально процесс чтения через ТекстовыйДокумент:
ПотокЧтения = Новый ТекстовыйДокумент;
Попытка
// Указываем кодировку и явно работаем с разделителями
ПотокЧтения.Прочитать(ИмяФайла, КодировкаТекста.ANSI);
Исключение
Сообщить("Ошибка при чтении файла!");
КонецПопытки;
Если автоматическое определение не помогает, нам следует перейти на использование объекта ЧтениеТекста. Этот инструмент предоставляет гораздо больше контроля над потоком данных. Вы можете считывать файл не целиком, а порциями, анализируя каждый символ переноса.
Если вы не хотите вносить изменения в типовой код конфигурации (чтобы сохранить возможность обновления 1С), лучше создать вспомогательную обработку. Эта обработка будет выполнять роль «чистильщика»:
Важное примечание: при склеивании строк всегда добавляйте пробел, иначе слова, находившиеся на стыке строк, сольются в одно, что исказит информацию в платежном поручении.
Мы выяснили, что ошибка «Нарушена структура платежного документа» — это следствие жесткого построчного парсинга. Для решения задачи мы рекомендуем реализовать механизм «предварительной сборки» строк. Это наиболее надежный путь, так как он изолирует логику исправления ошибок от основной бизнес-логики загрузки банковских выписок.
Попробуйте внедрить проверку на наличие символа = в начале итерации цикла чтения. Это позволит вашей обработке «Клиент банка» корректно проглатывать любые разрывы строк, присылаемые банком, и сделает ваш процесс обмена данными гораздо стабильнее.