Удаление файлов в 1С: пользователю и разработчику
Содержание
Пользователь удаляет файл в 1С через форму присоединённых файлов: выделить файл → Ещё → Пометить на удаление (или клавиша Del), а затем запустить удаление помеченных объектов. Разработчик удаляет файл с диска методом глобального контекста УдалитьФайлы(Путь, Маска). На клиенте он работает с диском пользователя, на сервере — с диском сервера 1С.
Отсюда и большинство проблем. Файл «не удаляется», потому что код выполняется не на том компьютере, у учётной записи нет прав или файл занят другой программой. Ниже — оба сценария: из режима 1С:Предприятия и программный, с примерами кода для 1С 8.3.
Где лежит файл в 1С и что значит «удалить» его
Прежде чем удалять, выясните, где физически хранится файл. От этого зависит способ.
| Где хранится | Пример | Чем удалять |
|---|---|---|
| 📎 Присоединённый файл в информационной базе | Скан договора у контрагента | Пометка удаления + удаление помеченных |
| 💾 Присоединённый файл в томе на диске | Тот же скан, но база хранит файлы в томах | Пометка удаления; файл в томе чистит сама подсистема |
| 🖥️ Файл на компьютере пользователя | Выгрузка C:\Обмен\выгрузка.xml | УдалитьФайлы на клиенте |
| 🗄️ Файл на сервере 1С или в общей папке | \\fs01\obmen\in\*.xml | УдалитьФайлы на сервере |
📦 Реквизит типа ХранилищеЗначения | Картинка в справочнике номенклатуры | Очистить реквизит и записать объект |
| ⏳ Временное хранилище | Адрес из ПоместитьВоВременноеХранилище | УдалитьИзВременногоХранилища |
Главное правило для разработчика: процедура с директивой &НаКлиенте видит диск пользователя, &НаСервере — диск сервера. В файловом варианте базы это часто один компьютер, поэтому ошибка в выборе контекста всплывает только после перехода на клиент-серверный вариант.
Пути на сервере под Linux чувствительны к регистру и пишутся через /. Чтобы код работал на обеих ОС, собирайте путь через ПолучитьРазделительПути().
Как удалить присоединённый файл в режиме 1С:Предприятия
В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3, УТ 11, ERP) файлы прикрепляются к документам и справочникам через кнопку со скрепкой. Удаляются они в два этапа.
Шаг 1. Пометить файл на удаление
- Откройте документ или элемент справочника, к которому прикреплён файл.
- Нажмите кнопку со скрепкой или откройте список присоединённых файлов в панели навигации формы.
- Выделите нужный файл в списке.
- Нажмите
Delили выберитеЕщё → Пометить на удаление / Снять пометку. - Подтвердите действие. Строка файла станет перечёркнутой.
На этом этапе файл ещё в базе. Пометку можно снять тем же способом, если удалили не тот файл.
Шаг 2. Удалить помеченные объекты
Окончательно файл исчезает после обработки удаления помеченных объектов. В типовых конфигурациях она находится в разделе Администрирование → Обслуживание.
- Откройте обработку «Удаление помеченных объектов».
- Выберите выборочное удаление и отметьте только нужные файлы, если не хотите чистить всю базу сразу.
- Запустите удаление и дождитесь результата.
Удаление помеченных объектов необратимо. Сделайте резервную копию базы перед запуском, особенно если удаляете всё сразу, а не выборочно.
Почему файл не помечается на удаление
- 🔒 Файл занят для редактирования. Если вы или коллега открыли файл на редактирование, его сначала нужно «освободить» или «завершить редактирование» в карточке файла.
- 🚫 Нет прав. Права на удаление присоединённых файлов задаются профилями групп доступа. Пользователь без прав на изменение объекта-владельца обычно не может трогать и его файлы.
- 📑 Документ проведён и закрыт датой запрета изменения. Редактирование файлов закрытого периода может быть ограничено настройками.
Программное удаление файла на клиенте
Для файлов на компьютере пользователя есть синхронный метод и асинхронные варианты. Выбор зависит от свойства конфигурации «Режим использования синхронных вызовов расширений платформы и внешних компонент».
Синхронный вариант: УдалитьФайлы
Подходит для толстого клиента и конфигураций, где синхронные вызовы разрешены.
&НаКлиенте
Процедура УдалитьВыгрузку(Команда)
ПутьКФайлу = "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держат файл до вызоваЗакрыть(). Удаление сразу после записи без закрытия упадёт. - 🔁 Удаление в цикле без попытки. Одна ошибка обрывает цикл, остальные файлы остаются. Попытка — внутри цикла, как в примере выше.
- 🧭 Путь без завершающей проверки. Перед удалением каталога сверьте, что путь не пустой и указывает внутрь нужной папки.
- 🧾 Ошибки без следа. На сервере
Сообщитьникто не увидит, если код работает в регламентном задании. Пишите в журнал регистрации.
Подробный текст ошибки получайте через ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) — там есть модуль и строка, где упал код.