Как исправить ошибку «Неверный реквизит заголовка» при загрузке выписки из Уралсиба в 1С:Бухгалтерия 2.0?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет Финансы и профессиональные услуги
← На главную

Работа со старыми конфигурациями, такими как Бухгалтерия предприятия редакции 2.0, часто преподносит сюрпризы при взаимодействии с современными банковскими сервисами. Одной из типичных проблем является сбой при импорте текстовых файлов выписки (формата 1CClientBankExchange), когда программа начинает выдавать ошибку «Неверный реквизит заголовка» практически на каждую строку файла. Особенно часто это проявляется при переходе на обслуживание в банки, использующие современные платформы (например, iSimpleBank 2.0, который внедрен в банке «Уралсиб»).

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

Анализ причин возникновения ошибки

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

  1. Конфликт кодировок: Современные системы интернет-банкинга могут выгружать файлы в формате ANSI (Windows-1251) или UTF-8, однако механизмы автоматического определения кодировки в старой 1С могут ошибочно принимать их за OEM (DOS-кодировка). В результате символы кириллицы интерпретируются неверно, и программа не может распознать даже стандартные поля заголовка.
  2. Неизвестные теги в заголовке: Стандарт обмена данными с банками эволюционирует. В новых системах (iSimpleBank) в заголовок файла добавляются дополнительные поля, такие как Отправитель=iSimpleBank 2.0 или Получатель=ExternalProg. Обработка загрузки в БП 2.0 жестко настроена на определенный перечень полей. Встретив незнакомое слово, алгоритм выдает ошибку реквизита.
  3. Специфические поля в секциях: Например, тег КодНазПлатежа (используемый для УИН), который отсутствовал в старых версиях формата 1.03, может блокировать чтение документа, если обработка не обучена его игнорировать.

Шаг 1. Диагностика кодировки файла

Прежде чем вносить изменения в код, проанализируем сам файл выписки. Откройте его в текстовом редакторе (например, Notepad++). Посмотрите на верхнюю строку. Если вы видите текст 1CClientBankExchange, но при загрузке в 1С он превращается в ┬хЁёш ╘юЁьрЄр, значит, 1С пытается прочитать файл в кодировке CP866 (DOS), хотя файл сохранен в Windows-1251.

Выясним причину такого поведения. В процедуре импорта 1С часто присутствует условие, которое проверяет переменную Кодировка. Если в настройках обмена (в пользовательском интерфейсе) по умолчанию стоит «DOS», 1С будет применять именно этот метод чтения. Однако иногда даже при установке «Windows» автоматика дает сбой из-за наличия специфических символов в начале файла.

Шаг 2. Программное решение проблемы в модуле объекта

Наиболее надежный способ решить проблему — внести коррективы в модуль объекта обработки КлиентБанк. Нам необходимо принудительно заставить программу использовать нужную кодировку и «вычистить» файл от мешающих тегов перед началом парсинга. Рассмотрим пример модификации функции ПрочитатьФайл.

Проанализируем предложенный ниже код, который позволяет обойти ограничения старой конфигурации:


// Функция читает заголовок файла обмена и исправляет кодировку
Функция ПрочитатьФайл(Файл)
    ФайлЗагр = Новый Файл(Файл);
    Если НЕ ФайлЗагр.Существует Тогда
        Сообщить("Файла " + Файл + " не существует!", СтатусСообщения.Важное);
        Возврат Неопределено;
    КонецЕсли;

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

    // Определяем кодировку. Если программа ошибочно ставит OEM, исправляем принудительно.
    // В данном примере мы привязываемся к имени файла выписки Уралсиба "statement.txt"
    Если Кодировка = "DOS" Тогда
        Кодир = КодировкаТекста.OEM;
    Иначе
        Кодир = КодировкаТекста.ANSI;
    Конецесли;

    // Принудительная установка ANSI для файлов определенного типа
    Если Прав(НРег(Файл), 13) = "statement.txt" Тогда
        Кодир = КодировкаТекста.ANSI;
    КонецЕсли;

    // Перечитываем файл с правильной кодировкой
    ПотокЧтения.Прочитать(Файл, Кодир);

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

    // Очистка текста от тегов, вызывающих ошибку "Неверный реквизит заголовка"
    // Мы заменяем мешающие теги на пустые строки
    ТекстВыгрузки = ПотокЧтения.ПолучитьТекст();
    ТекстВыгрузки = СтрЗаменить(ТекстВыгрузки, "КодНазПлатежа=", "Код="); // Или удаляем совсем
    ТекстВыгрузки = СтрЗаменить(ТекстВыгрузки, "Отправитель=", "ИгнорироватьОтправитель=");
    ТекстВыгрузки = СтрЗаменить(ТекстВыгрузки, "Получатель=", "ИгнорироватьПолучатель=");

    Возврат ТекстВыгрузки;
КонецФункции

Разберем логику исправлений подробнее

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

Во-вторых, обратите внимание на метод СтрЗаменить. Это «хитрый» способ заставить стандартную обработку проигнорировать неизвестные ей поля. Когда 1С встречает в секции заголовка строку Отправитель=..., она пытается найти соответствие в своем внутреннем списке реквизитов заголовка. Если мы переименуем это поле или удалим его из текста перед парсингом, ошибка исчезнет, так как обработка просто не увидит этого реквизита.

Шаг 3. Дополнительная фильтрация строк

Если ошибка «Неверный реквизит» продолжает появляться во второй или третьей строке (где обычно стоят ВерсияФормата и Кодировка), это означает, что проблема с кодировкой не решена до конца. Посмотрим на дополнительное условие, которое можно внедрить для автоматического переключения кодировки:


// Вставим проверку после чтения первой строки
ПерваяСтрока = ПотокЧтения.ПолучитьСтроку(1);
Если СокрЛП(ПерваяСтрока) <> "1CClientBankExchange" Тогда
    // Если первая строка нечитаема, пробуем сменить ANSI на OEM или наоборот
    Если Кодир = КодировкаТекста.ANSI Тогда
        Кодир = КодировкаТекста.OEM;
    Иначе
        Кодир = КодировкаТекста.ANSI;
    КонецЕсли;
    ПотокЧтения.Прочитать(Файл, Кодир);
КонецЕсли;

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

Рекомендации по настройке на стороне банка

Прежде чем приступать к изменению конфигурации (что может затруднить последующие обновления), выясним, можно ли изменить формат на стороне банка Уралсиб. В личном кабинете системы iSimpleBank при экспорте выписки обратите внимание на следующие параметры:

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

← На главную