Как программно читать и записывать файлы в 1С с помощью БСП

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Архитектура подсистемы и выбор модулей

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

Важное правило: никогда не используйте общие модули с постфиксом Служебный (например, ПрисоединенныеФайлыСлужебныйКлиент) для решения прикладных задач. Как справедливо отмечено в обсуждении, эти модули предназначены только для внутреннего использования разработчиками БСП, и их API может измениться или вовсе исчезнуть при очередном обновлении библиотеки. Для программной работы мы будем использовать надежные серверные модули: РаботаСФайлами и ПрисоединенныеФайлы.

Программное создание (запись) файла

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

Выполним следующие шаги:

  1. Подготовим данные в формате ДвоичныеДанные.
  2. Сформируем структуру параметров.
  3. Вызовем метод записи.

Посмотрим на пример кода:


// 1. Подготовка данных (например, преобразуем строку в двоичные данные)
ТекстДляФайла = "Это содержимое программно созданного файла.";
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(ТекстДляФайла);
ТекстовыйДокумент.Записать(ИмяВременногоФайла, КодировкаТекста.UTF8);
ДанныеФайла = Новый ДвоичныеДанные(ИмяВременногоФайла);

// 2. Подготовка параметров для БСП
ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
ПараметрыФайла.Вставить("ИмяБезРасширения", "Отчет_Автоматический");
ПараметрыФайла.Вставить("Расширение", "txt");
ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", ТекущаяДатаСеанса());

// 3. Добавление файла к владельцу
СсылкаНаФайл = РаботаСФайлами.ДобавитьФайл(СсылкаНаВладельца, ПараметрыФайла, ДанныеФайла);

// Удаляем временный файл после использования
УдалитьФайлы(ИмяВременногоФайла);

В данном примере СсылкаНаВладельца — это ссылка на объект, к которому мы «пришиваем» файл. Метод возвращает ссылку на созданный элемент справочника файлов.

Чтение содержимого файла

Теперь выясним, как получить данные файла обратно. В БСП файлы могут храниться как в базе, так и в томах на диске. Чтобы не писать сложную логику проверки места хранения, используем стандартный метод РаботаСФайлами.ДвоичныеДанныеФайла.

Проанализируем процесс чтения:


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

Если вам нужно получить только метаданные (имя, размер, расширение), используйте метод РаботаСФайлами.ДанныеФайла(СсылкаНаФайл), который возвращает структуру с описанием объекта без вычитки самого «тела» файла, что значительно быстрее.

Обновление информации и версионирование

В подсистеме БСП реализован механизм версионирования. Если вы просто перезапишете реквизиты справочника Файлы через ПолучитьОбъект(), это может нарушить целостность данных подсистемы (например, не обновится индекс полнотекстового поиска или информация о размере).

Для программного обновления содержимого файла правильно использовать создание новой версии. Рассмотрим, как это сделать:


ПараметрыВерсии = Новый Структура;
ПараметрыВерсии.Вставить("Автор", Пользователи.ТекущийПользователь());
ПараметрыВерсии.Вставить("Комментарий", "Программное обновление данных");

// Новые двоичные данные для записи
НовыеДанные = ПолучитьНовыеДвоичныеДанные(); 

РаботаСФайлами.ДобавитьВерсию(СсылкаНаФайл, ПараметрыВерсии, НовыеДанные);

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

Особенности работы в версии 2.2.3

Стоит учитывать, что в старых версиях БСП (таких как 2.2.3) некоторые функции могут иметь меньше параметров, чем в современных 3.1+. Однако базовые методы ДобавитьФайл и ДвоичныеДанныеФайла являются стабильными и присутствуют во всех релизах.

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

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

← На главную