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

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Часто при обмене данными между банковским приложением и конфигурацией 1С:Управление торговлей 10.3 мы сталкиваемся с неприятной ситуацией. Файл формата 1CClientBankExchange оказывается поврежденным из-за того, что поле «Назначение платежа» принудительно разбивается на несколько строк. Стандартная процедура загрузки 1С ожидает, что каждая новая строка начинается с нового ключа (например, Сумма=, Дата=), и при натыкании на «лишний» перенос строки выдает ошибку: «Нарушена структура платежного документа».

Давайте разберем, почему это происходит и как мы можем решить эту задачу программными средствами, не прибегая к ручной правке каждого файла.

Анализ причины проблемы

Типовой алгоритм загрузки 1С использует функцию РазобратьТеговуюСтроку, которая ищет символ «=» в строке. Если символ не найден, стандартная логика считает, что возникла ошибка. Однако в реальности это не ошибка структуры, а просто «длинное» описание, перенесенное на следующую строку символами ПС (перевод строки) или ВК+ПС. Чтобы исправить это, нам необходимо изменить способ чтения файла.

Решение 1: Анализ строки на наличие признака тэга

Самый простой подход — реализовать логику «склеивания» строк до передачи их в парсер. Суть метода заключается в проверке: если строка не содержит знака равенства =, значит, это продолжение предыдущего поля. Давайте рассмотрим, как это реализовать:

При чтении файла построчно, мы должны отслеживать состояние переменной, хранящей текущий тэг. Если текущая строка не содержит «=», мы просто добавляем её содержимое к значению предыдущего тэга через пробел.


Функция РазобратьТеговуюСтроку(СтрокаРазбора, Тег, Значение)
    ПозицияПрисваивания = Найти(СтрокаРазбора, "=");
    Если ПозицияПрисваивания = 0 Тогда
        Возврат Ложь; // Это признак того, что строка не содержит тэга
    КонецЕсли;
    Тег = ВРЕГ(СокрЛП(Лев(СтрокаРазбора, ПозицияПрисваивания - 1)));
    Значение = СокрЛП(Сред(СтрокаРазбора, ПозицияПрисваивания + 1));
    Возврат НЕ ПустаяСтрока(Тег);
КонецФункции

Мы можем модифицировать цикл чтения файла так, чтобы при получении Ложь от этой функции, мы не выдавали ошибку, а присоединяли строку к последнему успешно прочитанному значению.

Решение 2: Настройка разделителей при чтении файла

Иногда проблема кроется в неверной интерпретации символов переноса строки (CR/LF). Если мы используем объект ТекстовыйДокумент или ЧтениеТекста, можно попробовать явно указать параметры разделителей.

Разберем детально процесс чтения через ТекстовыйДокумент:


ПотокЧтения = Новый ТекстовыйДокумент;
Попытка
    // Указываем кодировку и явно работаем с разделителями
    ПотокЧтения.Прочитать(ИмяФайла, КодировкаТекста.ANSI); 
Исключение
    Сообщить("Ошибка при чтении файла!");
КонецПопытки;

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

Решение 3: Предварительная очистка файла (Препроцессинг)

Если вы не хотите вносить изменения в типовой код конфигурации (чтобы сохранить возможность обновления 1С), лучше создать вспомогательную обработку. Эта обработка будет выполнять роль «чистильщика»:

  1. Читаем исходный файл целиком в массив строк.
  2. Итерируемся по массиву: если строка начинается не с ключевых слов (или не содержит «=»), склеиваем её с предыдущим элементом массива.
  3. Записываем «очищенный» файл во временную директорию.
  4. Передаем путь к «чистому» файлу в штатную процедуру загрузки 1С.

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

Заключение

Мы выяснили, что ошибка «Нарушена структура платежного документа» — это следствие жесткого построчного парсинга. Для решения задачи мы рекомендуем реализовать механизм «предварительной сборки» строк. Это наиболее надежный путь, так как он изолирует логику исправления ошибок от основной бизнес-логики загрузки банковских выписок.

Попробуйте внедрить проверку на наличие символа = в начале итерации цикла чтения. Это позволит вашей обработке «Клиент банка» корректно проглатывать любые разрывы строк, присылаемые банком, и сделает ваш процесс обмена данными гораздо стабильнее.

← На главную