Разбор от сообщества: Файловая система без БСП | infolimp.ru

Разбор от сообщества: Файловая система без БСП

25 июля 2026 · infolimp.ru

Библиотека стандартных подсистем (БСП) давно стала стандартом де-факто для большинства конфигураций на платформе 1С. Однако существуют проекты, где БСП не используется: самописные конфигурации, legacy-системы, решения с жёсткими требованиями к производительности. В таких случаях разработчику приходится вручную реализовывать работу с файловой системой. И здесь его ждут грабли, которые в БСП уже давно обезврежены. Разберём, какие именно.

Контекст и ситуация

Работа с файлами — одна из самых частых операций в прикладных решениях: выгрузка отчётов, обмен данными, загрузка справочников. БСП предоставляет унифицированные функции ОбщегоНазначения.ЗаписатьТекстВФайл, ОбщегоНазначения.ПрочитатьТекстИзФайла и другие, которые уже содержат обработку кодировок, блокировки, логирование ошибок. Когда БСП нет, каждый разработчик пишет свой код, и, как показывает практика, в 80% случаев допускает одни и те же ошибки.

Технический разбор: что скрывается за простыми операциями

На первый взгляд, чтение файла — это три строки:

Чтение = Новый ЧтениеТекста(ИмяФайла);
Текст = Чтение.Прочитать();
Чтение.Закрыть();

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

Ловушки при работе с файлами без БСП

1. Кодировки текстовых файлов

Самая частая проблема. БСП автоматически определяет кодировку по BOM или анализирует содержимое. В собственном коде разработчики часто опускают указание кодировки, полагаясь на умолчания. Платформа использует системную кодировку (ANSI), что приводит к нечитаемому тексту при открытии файлов, созданных в UTF-8.

// Неправильно: кодировка не указана
Чтение = Новый ЧтениеТекста(ИмяФайла);
Текст = Чтение.Прочитать();
Чтение.Закрыть();

// Правильно: явно указываем UTF-8
Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
Текст = Чтение.Прочитать();
Чтение.Закрыть();
Если файл может быть в разных кодировках, необходимо реализовать определение по BOM или предоставить пользователю выбор. Без БСП это ложится на плечи разработчика.

2. Временные файлы и конфликты имён

БСП использует функцию ПолучитьИмяВременногоФайла с префиксом, гарантирующим уникальность. Разработчики без БСП часто хардкодят имя временного файла:

// Опасный подход
ИмяФайла = КаталогВременныхФайлов() + "export.tmp";
// Если два пользователя одновременно запустят процедуру, файл будет перезаписан или возникнет ошибка доступа.

// Правильный подход
ИмяФайла = ПолучитьИмяВременногоФайла("tmp");

Кроме того, забывают удалять временные файлы после использования, что засоряет диск. БСП предоставляет механизм автоочистки, в своей реализации нужно не забыть вызвать УдалитьФайлы(ИмяФайла).

3. Обработка ошибок и логирование

БСП централизованно обрабатывает исключения и пишет их в журнал регистрации с нужным контекстом. В коде без БСП часто видны «голые» Попытка…Исключение без записи ошибки:

Попытка
    Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
    Запись.ЗаписатьСтроку(Текст);
    Запись.Закрыть();
Исключение
    // Ошибка молча проглатывается
КонецПопытки;

Правильно хотя бы записывать информацию в журнал:

Попытка
    Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
    Запись.ЗаписатьСтроку(Текст);
    Запись.Закрыть();
Исключение
    ЗаписьЖурналаРегистрации("Ошибка", УровеньЖурналаРегистрации.Ошибка,,,
        "Не удалось записать файл: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Сравнение подходов: БСП vs собственная реализация

Ключевые отличия

БСП не просто ускоряет разработку — она кодирует лучшие практики, собранные сообществом за годы. Рассмотрим ключевые различия:

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

Практическое руководство

Чек-лист при реализации файловых операций без БСП

  1. Всегда указывайте кодировку при создании ЧтениеТекста или ЗаписьТекста.
  2. Для временных файлов используйте ПолучитьИмяВременногоФайла и удаляйте их после использования (УдалитьФайлы).
  3. Оборачивайте операции в Попытка…Исключение с записью в ЗаписьЖурналаРегистрации.
  4. Перед записью проверяйте существование каталога (СоздатьКаталог).
  5. Учитывайте ограничение длины пути (260 символов). Для длинных путей используйте префикс \\?\.
  6. Не используйте жёстко закодированные пути; применяйте КаталогВременныхФайлов() или КаталогПрограммы().
  7. Закрывайте файлы после чтения/записи в блоке Попытка…Исключение…КонецПопытки или через Попытка…Исключение…Попытка…КонецПопытки для гарантии закрытия.

Типичные ошибки

Механика под капотом

Детали реализации

Платформа 1С при работе с файлами использует системные API Win32 (на Windows) или POSIX (на Linux). Объект ЧтениеТекста открывает файл с флагом FILE_SHARE_READ, позволяя другим процессам читать файл, но блокируя запись. ЗаписьТекста открывает файл с эксклюзивной блокировкой. Если не указать кодировку, платформа использует кодировку по умолчанию для текущей локали ОС (Windows-1251 для русской Windows).

Функция ПолучитьИмяВременногоФайла генерирует имя на основе GUID, что гарантирует уникальность даже при интенсивной многопользовательской работе. Временные файлы создаются в каталоге, возвращаемом КаталогВременныхФайлов(), который обычно соответствует системной переменной TEMP.

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

В итоге, работа с файловой системой без БСП требует повышенного внимания к деталям. Однако, вооружившись знанием типовых ловушек и используя приведённый чек-лист, вы сможете реализовать надёжный и производительный код. А если проект позволяет — подключите БСП, это сэкономит часы отладки.

Расширение «НОПик» для 1С — встраиваемый коннектор к внешнему AI с интеллектуальным поиском по базе. Задавайте вопросы обычными словами - AI сам найдёт нужное. 45 дней бесплатно.

Попробовать НОПик →