При работе с конфигурацией 1С:Управление нашей фирмой (УНФ), особенно после обновления версии программы или платформы 1С:Предприятие, пользователи часто сталкиваются с неприятной ошибкой при попытке загрузить выписку из банка. Текст ошибки гласит: «В файле не найден обязательный идентификатор конца файла. Возможно, неверно указана кодировка файла». Ситуация осложняется тем, что предпросмотр документов в списке может работать корректно, но на этапе окончательного разбора данных система выдает отказ.
В этой статье мы подробно разберем, почему возникает эта проблема, как она связана с клиент-серверным режимом работы и какие конкретные шаги нужно предпринять для ее решения. Мы проанализируем ситуацию с точки зрения системного администрирования и программирования в среде 1С.
Рассмотрим механику процесса загрузки. Когда 1С взаимодействует с банком (особенно через сервис Директ-Банк), она получает данные в виде потока, который затем сохраняется во временный текстовый файл на стороне сервера. После этого программные механизмы библиотеки стандартных подсистем (БСП) пытаются прочитать этот файл. Ошибка «идентификатор конца файла не найден» означает, что парсер ожидает увидеть определенную структуру (например, закрывающий тег в формате XML или метку EOF), но из-за некорректной записи файла или неверно определенной кодировки не находит её.
Проанализируем основные факторы, провоцирующие эту ошибку:
8.3.18 имела специфические особенности работы с методом Найти() и чтением текстовых потоков в памяти.Первым делом проверим наличие установленных исправлений (патчей) в вашей базе данных. Разработчики фирмы «1С» оперативно выпускают патчи для критических ошибок, не дожидаясь выхода нового релиза конфигурации. Для данной проблемы ключевым является патч EF_30175764. Для регулярного контроля и установки таких исправлений можно использовать автоматическое обновление и тестирование баз 1С в фоновом режиме.
Разберем, как его установить:
EF_30175764. Если его нет, загрузим его из центра обновлений.EF_00142643 (исправляет определение кодировки входящего потока) и EF_60000155 (устраняет проблемы с длинными путями временных файлов).Если проблема наблюдается только в клиент-серверном варианте, а в файловой копии всё работает исправно, причину следует искать в окружении пользователя, от имени которого запущена служба 1C:Enterprise 8.3 Server Agent. Обычно это пользователь USR1CV8.
Выполним следующие шаги для настройки ОС на сервере:
Russian (Russia), установим галочку Экран приветствия и системные учетные записи, чтобы скопировать текущие настройки (предварительно убедившись, что у текущего пользователя стоит «Русский»).Это гарантирует, что методы ЧтениеТекста и ЗаписьТекста на стороне сервера будут корректно использовать кириллические кодировки по умолчанию.
Если вы загружаете выписку не через Директ-Банк, а из файла, полученного из клиент-банка, попробуем изменить его кодировку вручную. Иногда банки отдают файлы в кодировке UTF-8 с BOM, которую парсер 1С может интерпретировать некорректно.
Проделаем следующее:
UTF-8, попробуем перекодировать файл в ANSI (Windows-1251).Посмотрим на пример кода, который часто вызывает сбой, если в конфигурации не установлены последние патчи. Проблема обычно кроется в использовании объекта ЧтениеТекста без явного указания параметров разделителей или кодировки.
// Пример проблемного участка кода в неисправных релизах
ТекстовыйДокумент = Новый ЧтениеТекста;
ТекстовыйДокумент.Открыть(ПутьКФайлу, КодировкаТекста.UTF8);
// Если файл записан с ошибкой позиционирования,
// метод Прочитать() может не найти маркер конца файла
Содержимое = ТекстовыйДокумент.Прочитать();
ТекстовыйДокумент.Закрыть();
Для диагностики мы можем программно проверить, что именно видит сервер при попытке чтения. Если при выполнении кода на сервере Содержимое оказывается пустым или обрывается, значит, проблема в правах доступа к папке временных файлов или в блокировке файла антивирусом.
Рассмотрим вариант программного обхода ошибки через явное указание кодировки Windows-1251, если автоматическое определение дает сбой:
Функция ПрочитатьВыпискуБезОшибок(ПутьКФайлу)
Попытка
Чтение = Новый ЧтениеТекста(ПутьКФайлу, "windows-1251");
СтрокаВыписки = Чтение.Прочитать();
Чтение.Закрыть();
Возврат СтрокаВыписки;
Исключение
ЗаписьЖурналаРегистрации("ЗагрузкаВыписки", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
ВызватьИсключение "Ошибка при чтении файла выписки. Проверьте права и локаль сервера.";
КонецПопытки;
КонецФункции
В некоторых случаях ошибка сохраняется даже после применения патчей из-за «зависших» данных в сеансовых данных сервера. Проанализируем состояние серверного кэша. Рекомендуется выполнить полную очистку каталога snccntx, который находится внутри папки регистрации кластера (обычно srvinfo). Перед очисткой необходимо остановить службу сервера 1С.
Также не забудем проверить настройки антивирусного ПО на сервере. Процесс rphost.exe создает множество временных файлов. Если антивирус начинает сканировать такой файл в момент его записи, 1С может получить отказ в доступе или прочитать «пустой» хвост файла, что и приведет к ошибке «идентификатор конца файла не найден».
Подводя итог, наиболее эффективным решением для УНФ 1.6.24 является установка патча EF_30175764 и приведение региональных настроек сервера к единому стандарту (русская локаль). Это устраняет корень проблемы, связанный с некорректным формированием временных файлов в клиент-серверной архитектуре.