Удаление файлов в 1С: пользователю и разработчику

· 9 мин

Содержание

Пользователь удаляет файл в 1С через форму присоединённых файлов: выделить файл → Ещё → Пометить на удаление (или клавиша Del), а затем запустить удаление помеченных объектов. Разработчик удаляет файл с диска методом глобального контекста УдалитьФайлы(Путь, Маска). На клиенте он работает с диском пользователя, на сервере — с диском сервера 1С.

Отсюда и большинство проблем. Файл «не удаляется», потому что код выполняется не на том компьютере, у учётной записи нет прав или файл занят другой программой. Ниже — оба сценария: из режима 1С:Предприятия и программный, с примерами кода для 1С 8.3.

Где лежит файл в 1С и что значит «удалить» его

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

Где хранитсяПримерЧем удалять
📎 Присоединённый файл в информационной базеСкан договора у контрагентаПометка удаления + удаление помеченных
💾 Присоединённый файл в томе на дискеТот же скан, но база хранит файлы в томахПометка удаления; файл в томе чистит сама подсистема
🖥️ Файл на компьютере пользователяВыгрузка C:\Обмен\выгрузка.xmlУдалитьФайлы на клиенте
🗄️ Файл на сервере 1С или в общей папке\\fs01\obmen\in\*.xmlУдалитьФайлы на сервере
📦 Реквизит типа ХранилищеЗначенияКартинка в справочнике номенклатурыОчистить реквизит и записать объект
⏳ Временное хранилищеАдрес из ПоместитьВоВременноеХранилищеУдалитьИзВременногоХранилища

Главное правило для разработчика: процедура с директивой &НаКлиенте видит диск пользователя, &НаСервере — диск сервера. В файловом варианте базы это часто один компьютер, поэтому ошибка в выборе контекста всплывает только после перехода на клиент-серверный вариант.

Пути на сервере под Linux чувствительны к регистру и пишутся через /. Чтобы код работал на обеих ОС, собирайте путь через ПолучитьРазделительПути().

Как удалить присоединённый файл в режиме 1С:Предприятия

В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3, УТ 11, ERP) файлы прикрепляются к документам и справочникам через кнопку со скрепкой. Удаляются они в два этапа.

Шаг 1. Пометить файл на удаление

  1. Откройте документ или элемент справочника, к которому прикреплён файл.
  2. Нажмите кнопку со скрепкой или откройте список присоединённых файлов в панели навигации формы.
  3. Выделите нужный файл в списке.
  4. Нажмите Del или выберите Ещё → Пометить на удаление / Снять пометку.
  5. Подтвердите действие. Строка файла станет перечёркнутой.

На этом этапе файл ещё в базе. Пометку можно снять тем же способом, если удалили не тот файл.

Шаг 2. Удалить помеченные объекты

Окончательно файл исчезает после обработки удаления помеченных объектов. В типовых конфигурациях она находится в разделе Администрирование → Обслуживание.

  1. Откройте обработку «Удаление помеченных объектов».
  2. Выберите выборочное удаление и отметьте только нужные файлы, если не хотите чистить всю базу сразу.
  3. Запустите удаление и дождитесь результата.

Удаление помеченных объектов необратимо. Сделайте резервную копию базы перед запуском, особенно если удаляете всё сразу, а не выборочно.

Почему файл не помечается на удаление

  • 🔒 Файл занят для редактирования. Если вы или коллега открыли файл на редактирование, его сначала нужно «освободить» или «завершить редактирование» в карточке файла.
  • 🚫 Нет прав. Права на удаление присоединённых файлов задаются профилями групп доступа. Пользователь без прав на изменение объекта-владельца обычно не может трогать и его файлы.
  • 📑 Документ проведён и закрыт датой запрета изменения. Редактирование файлов закрытого периода может быть ограничено настройками.

Программное удаление файла на клиенте

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

Синхронный вариант: УдалитьФайлы

Подходит для толстого клиента и конфигураций, где синхронные вызовы разрешены.

&НаКлиенте
Процедура УдалитьВыгрузку(Команда)

    ПутьКФайлу = "C:\Обмен\выгрузка.xml";
    Файл = Новый Файл(ПутьКФайлу);

    Если Не Файл.Существует() Тогда
        Сообщить("Файл не найден: " + ПутьКФайлу);
        Возврат;
    КонецЕсли;

    Попытка
        УдалитьФайлы(ПутьКФайлу);
    Исключение
        Сообщить("Не удалось удалить файл: " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

Параметры метода УдалитьФайлы:

ВызовЧто удалится
УдалитьФайлы("C:\Обмен\выгрузка.xml")Один файл
УдалитьФайлы("C:\Обмен", "*.xml")Файлы .xml в каталоге C:\Обмен
УдалитьФайлы("C:\Обмен", "*.*")Все файлы в каталоге, сам каталог останется
УдалитьФайлы("C:\Обмен")Каталог целиком со всем содержимым

Последний вариант удаляет папку вместе с вложенными каталогами. Никогда не передавайте в УдалитьФайлы путь без маски, если он собран из переменных: пустая переменная или опечатка могут указать на каталог выше, чем вы рассчитывали. Проверяйте путь до вызова.

Асинхронный вариант для веб-клиента и современных конфигураций

Если синхронные вызовы запрещены, УдалитьФайлы на клиенте вызовет ошибку. На платформе 8.3.18 и выше удобнее всего конструкция Асинх / Ждать:

&НаКлиенте
Асинх Процедура УдалитьВыгрузку(Команда)

    ПутьКФайлу = "C:\Обмен\выгрузка.xml";
    Файл = Новый Файл(ПутьКФайлу);

    Если Не Ждать Файл.СуществуетАсинх() Тогда
        Сообщить("Файл не найден");
        Возврат;
    КонецЕсли;

    Попытка
        Ждать УдалитьФайлыАсинх(ПутьКФайлу);
    Исключение
        Сообщить("Не удалось удалить файл: " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

На более старых платформах используется метод с обработчиком оповещения:

&НаКлиенте
Процедура УдалитьВыгрузку(Команда)
    Оповещение = Новый ОписаниеОповещения("ПослеУдаленияФайла", ЭтотОбъект);
    НачатьУдалениеФайлов(Оповещение, "C:\Обмен\выгрузка.xml");
КонецПроцедуры

&НаКлиенте
Процедура ПослеУдаленияФайла(ДополнительныеПараметры) Экспорт
    Сообщить("Файл удалён");
КонецПроцедуры

Веб-клиент: без расширения диск недоступен

Браузер не даёт сайту доступ к файлам пользователя. В веб-клиенте 1С работает с локальным диском только через расширение для работы с файлами. Подключите его перед удалением:

Подключено = Ждать ПодключитьРасширениеРаботыСФайламиАсинх();
Если Не Подключено Тогда
    Ждать УстановитьРасширениеРаботыСФайламиАсинх();
КонецЕсли;

Если расширение не установлено, пользователь увидит предложение установить его. Без расширения удалить файл с его компьютера из веб-клиента нельзя.

Удаление файлов на сервере 1С и в общей сетевой папке

Обмены, загрузки банковских выписок, формирование отчётов в файлы — всё это обычно работает на сервере. Код тот же, УдалитьФайлы, но условия другие.

Временные файлы

Самый частый серверный сценарий: создать временный файл, поработать с ним и сразу удалить. Удаление ставьте так, чтобы оно выполнилось и при ошибке:

&НаСервереБезКонтекста
Функция ДанныеОтчетаXLSX(ТабДок)

    ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
    Попытка
        ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
        Данные = Новый ДвоичныеДанные(ИмяФайла);
    Исключение
        УдалитьФайлы(ИмяФайла);
        ВызватьИсключение;
    КонецПопытки;

    УдалитьФайлы(ИмяФайла);
    Возврат Данные;

КонецФункции

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

В конфигурациях на БСП 3.x есть общий модуль ФайловаяСистема с функциями для создания и удаления временных файлов и каталогов. Если пишете доработку типовой, используйте их — так код будет однообразен с остальной конфигурацией.

Чистка папки обмена по возрасту файлов

Пример регламентного задания: удалить из каталога файлы старше 30 дней.

Процедура ОчиститьКаталогОбмена() Экспорт

    Каталог = "\\fs01\obmen\archive";
    ГраницаДата = ТекущаяДатаСеанса() - 30 * 86400;

    Для Каждого Файл Из НайтиФайлы(Каталог, "*.xml", Ложь) Цикл
        Если Файл.ЭтоФайл() И Файл.ПолучитьВремяИзменения() < ГраницаДата Тогда
            Попытка
                УдалитьФайлы(Файл.ПолноеИмя);
            Исключение
                ЗаписьЖурналаРегистрации("ОчисткаКаталогаОбмена",
                    УровеньЖурналаРегистрации.Ошибка, , Файл.ПолноеИмя, ОписаниеОшибки());
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

30 × 86400 = 2 592 000 секунд, то есть ровно 30 суток. Ошибку по одному файлу пишем в журнал регистрации и идём дальше, а не обрываем всю чистку.

Права на общую папку

Серверный код выполняется от имени учётной записи, под которой запущена служба сервера 1С (по умолчанию это локальная учётная запись USR1CV8). Отсюда типичная картина: в файловой базе всё удаляется, на сервере — «Доступ запрещён».

  • 👤 Локальная учётная запись не имеет прав на сетевые ресурсы. Для работы с \\fs01\obmen службу запускают от доменной учётной записи.
  • 🔑 Этой учётной записи нужны права на изменение (удаление) в папке, а не только на чтение.
  • 🧱 Если в кластере включены профили безопасности, доступ к каталогу должен быть разрешён в профиле.
  • 🔐 Внешние обработки в безопасном режиме к файловой системе не обращаются вовсе.

Смена учётной записи службы сервера 1С требует её перезапуска. Все сеансы пользователей при этом оборвутся — делайте это вне рабочего времени и предупредите людей заранее.

Хранилище значений, временное хранилище и тома

Не каждый «файл» в 1С — это файл на диске. Часто это двоичные данные внутри базы.

Реквизит типа ХранилищеЗначения

Картинку товара или скан в реквизите типа ХранилищеЗначения удаляют записью пустого значения:

Объект = Ссылка.ПолучитьОбъект();
Объект.ФайлСкана = Новый ХранилищеЗначения(Неопределено);
Объект.Записать();

После записи данные из базы уходят, размер таблицы со временем уменьшится (для файловой базы — после сжатия при тестировании и исправлении).

Временное хранилище

Файл, переданный с клиента через ПоместитьВоВременноеХранилище, живёт до конца сеанса или до закрытия формы-владельца. Если данные большие, не ждите — освободите память сразу после обработки:

УдалитьИзВременногоХранилища(АдресФайла);

Тома хранения файлов

Базы на БСП могут хранить присоединённые файлы не в таблицах, а в томах — каталогах на диске. Удалять такие файлы из каталога вручную, через проводник, нельзя: карточка файла останется в базе и будет ссылаться на пустоту. Правильный путь — пометка на удаление и удаление помеченных объектов, как в разделе для пользователя. Физический файл в томе подсистема удалит сама.

Если файлы в томе всё же «потерялись», в типовых есть служебная проверка целостности томов. Ищите её в настройках работы с файлами в разделе Администрирование.

Ошибки при удалении файла и их обработка

Любой вызов УдалитьФайлы оборачивайте в Попытка … Исключение. Без этого одна заблокированная выгрузка обрушит всю процедуру обмена.

Диагностика: выберите симптом

Частые ошибки в коде и как их избежать

  • 📄 Не закрыли запись. ЗаписьXML, ЗаписьТекста, ЧтениеXML держат файл до вызова Закрыть(). Удаление сразу после записи без закрытия упадёт.
  • 🔁 Удаление в цикле без попытки. Одна ошибка обрывает цикл, остальные файлы остаются. Попытка — внутри цикла, как в примере выше.
  • 🧭 Путь без завершающей проверки. Перед удалением каталога сверьте, что путь не пустой и указывает внутрь нужной папки.
  • 🧾 Ошибки без следа. На сервере Сообщить никто не увидит, если код работает в регламентном задании. Пишите в журнал регистрации.

Подробный текст ошибки получайте через ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) — там есть модуль и строка, где упал код.

Частые вопросы

Можно ли восстановить удалённый в 1С файл?
Метод УдалитьФайлы удаляет файл мимо корзины Windows. Вернуть его можно только из резервной копии. Присоединённый файл после удаления помеченных объектов тоже восстанавливается только из копии базы.
Удаляет ли УдалитьФайлы файлы во вложенных папках?
Без маски метод удаляет каталог целиком вместе со всеми вложенными папками. С маской рассчитывайте на файлы в указанном каталоге и перед массовой чисткой проверяйте результат на тестовой папке.
Как удалить файл на компьютере пользователя из серверного кода?
Никак: сервер видит только свою файловую систему. Передайте путь на клиент и вызовите удаление в процедуре с директивой НаКлиенте.
Почему в файловой базе удаление работает, а после перехода на сервер — нет?
В файловом варианте код сервера выполняется на компьютере пользователя с его правами. На сервере 1С он работает от учётной записи службы, у которой другие права и другие сетевые доступы.
Удаляется ли файл из тома, если удалить карточку файла?
Да, при удалении помеченных объектов подсистема работы с файлами удаляет и физический файл в томе. Ручное удаление из каталога тома, наоборот, ломает целостность.