Файл Excel «занят» после выгрузки из 1С: как освободить книгу и процесс
Содержание
Чтобы закрыть файл Excel, с которым работала 1С, достаточно в большинстве ситуаций закрыть книгу в самом Excel и повторить действие в 1С. Если Excel на экране не открыт, а файл всё равно «используется другим процессом», значит, его держит скрытый процесс EXCEL.EXE, запущенный обработкой через COM. Такой процесс завершают из кода методами Close и Quit или вручную в Диспетчере задач.
Сначала определите, кто именно держит файл: открытая у пользователя книга, скрытый экземпляр Excel после обработки или сама 1С, которая ещё не закончила редактирование присоединённого файла. От ответа зависит способ: в первом случае хватит одного клика, в третьем нужна команда в карточке файла, во втором придётся поправить код.
Кто держит файл: три разных механизма
Связь «1С — Excel» бывает трёх видов, и блокируют файл они по-разному.
| Как работает | Кто пишет и читает файл | Где может зависнуть |
|---|---|---|
Сохранение отчёта или табличного документа в .xlsx | Сама платформа 1С, Excel не нужен | Файл открыт в Excel у пользователя |
Обработка загрузки через COMОбъект("Excel.Application") | Запущенный 1С экземпляр Excel | Скрытый EXCEL.EXE после ошибки в коде |
| Присоединённый файл в карточке документа или справочника | 1С копирует файл в рабочий каталог, Excel его редактирует | Файл помечен «занят» в 1С |
Первый случай самый частый. Когда вы нажимаете кнопку сохранения у отчёта и выбираете формат «Лист Microsoft Excel 2007» (.xlsx), 1С формирует файл сама. Excel на компьютере для этого может вообще не быть. Ошибка появляется позже: вы открыли файл в Excel, вернулись в 1С и сохранили отчёт с тем же именем. Windows не даёт перезаписать файл, который открыт в другой программе.
Второй случай — COM-соединение. Обработка создаёт объект Excel.Application, и Windows запускает отдельный процесс EXCEL.EXE. По умолчанию окно у него невидимое. Пока процесс жив, он держит все открытые им книги. Если код упал до вызова Quit(), процесс остаётся в памяти до выхода из 1С, а иногда и дольше.
Третий случай — работа с файлами из карточки объекта. Команда редактирования помечает файл как занятый текущим пользователем, а после правки нужно явно завершить редактирование, чтобы 1С забрала изменённую копию обратно в базу.
Как правильно закрыть книгу Excel из кода 1С
Если файл держит обработка, исправлять нужно её код. Правило одно: всё, что открыли, закрываем в обратном порядке, и закрываем даже тогда, когда чтение данных прервалось ошибкой.
Шаблон безопасной работы через COM
Excel = Неопределено;
Книга = Неопределено;
Лист = Неопределено;
ТекстОшибки = "";
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = Ложь;
Excel.Visible = Ложь;
Книга = Excel.Workbooks.Open(ИмяФайла);
Лист = Книга.Worksheets(1);
КоличествоСтрок = Лист.UsedRange.Rows.Count;
Для НомерСтроки = 2 По КоличествоСтрок Цикл
Артикул = Лист.Cells(НомерСтроки, 1).Value;
Количество = Лист.Cells(НомерСтроки, 2).Value;
// обработка значений
КонецЦикла;
Исключение
ТекстОшибки = ОписаниеОшибки();
КонецПопытки;
Если Книга <> Неопределено Тогда
Попытка
Книга.Close(Ложь);
Исключение
КонецПопытки;
КонецЕсли;
Если Excel <> Неопределено Тогда
Попытка
Excel.Quit();
Исключение
КонецПопытки;
КонецЕсли;
Лист = Неопределено;
Книга = Неопределено;
Excel = Неопределено;
Если ЗначениеЗаполнено(ТекстОшибки) Тогда
Сообщить("Не удалось прочитать файл: " + ТекстОшибки);
КонецЕсли;
Что здесь делает каждая строка закрытия:
- 📕
Книга.Close(Ложь)— закрывает книгу без сохранения. ПараметрЛожьнужен, иначе Excel может ждать ответа на вопрос «Сохранить изменения?», а окно невидимое. - 🚪
Excel.Quit()— просит процесс Excel завершиться. - 🧹 Присваивание
Неопределеновсем переменным — освобождает COM-ссылки. Пока в 1С жива хотя бы одна ссылка на лист или диапазон, процесс может не выгрузиться даже послеQuit().
DisplayAlerts = Ложь отключает диалоги Excel. Без этой строки скрытый Excel может «повиснуть» на вопросе о совместимости формата или о пересчёте связей, и никто этого окна не увидит.
Не закрывайте чужой Excel
Иногда в коде встречается ПолучитьCOMОбъект("", "Excel.Application"). Такой вызов подключается к уже запущенному Excel пользователя. Если затем выполнить Quit(), закроются все книги, которые человек держал открытыми, вместе с несохранёнными правками.
Для обработок загрузки используйте Новый COMОбъект("Excel.Application"): он запускает отдельный экземпляр, который можно закрывать без последствий для пользователя.
Ускорение: читать диапазон целиком
Обращение к Cells по одной ячейке медленное: каждое — отдельный вызов между процессами. На файле в 10 000 строк и 5 колонок это 50 000 вызовов. Чем дольше работает цикл, тем выше шанс, что пользователь прервёт обработку и Excel останется висеть.
Быстрее прочитать весь используемый диапазон одним вызовом через Лист.UsedRange.Value: результат приходит в 1С как массив COM (COMSafeArray), его выгружают методом Выгрузить() и дальше работают уже с обычным массивом, а книгу закрывают сразу.
Ошибки при выгрузке и загрузке файлов Excel
Тексты ошибок помогают быстро понять, какой механизм сломался.
Почему сохранение отчёта в Excel «ломает» формулы и форматы
Это уже не блокировка, но жалоба частая. При сохранении в .xlsx платформа переносит значения ячеек, объединения, шрифты и границы. Формулы Excel из отчёта 1С не появляются: в табличном документе их нет, там уже готовые числа. Если нужна книга с формулами, сохраняйте данные и стройте формулы в Excel либо формируйте файл через COM.
Как завершить зависший процесс Excel вручную
Ручной способ нужен, когда код уже отработал с ошибкой, а файл занят прямо сейчас.
Через Диспетчер задач
- Нажмите
Ctrl+Shift+Esc. - Перейдите на вкладку «Подробности».
- Найдите строки
EXCEL.EXE. Колонка «Имя пользователя» покажет, чей это процесс. - Выделите процесс без видимого окна и нажмите «Снять задачу».
Отличить скрытый экземпляр от рабочего помогает вкладка «Процессы»: у видимого Excel есть строка с названием книги, скрытый отображается без окна или только в «Подробностях».
Снятие процесса закрывает все книги этого экземпляра без сохранения. Если вы не уверены, что процесс скрытый, сначала сохраните и закройте свои книги Excel обычным способом.
Через командную строку
Команда снимает все процессы Excel текущего пользователя:
taskkill /IM EXCEL.EXE /F /FI "USERNAME eq %USERNAME%"
Фильтр по имени пользователя важен на терминальном сервере. Без него команда, запущенная от администратора, закроет Excel у всех, кто работает на сервере, и люди потеряют несохранённые таблицы.
Чтобы снять один конкретный процесс, сначала посмотрите его идентификатор:
tasklist /FI "IMAGENAME eq EXCEL.EXE"
taskkill /PID 12345 /F
Число 12345 замените на значение из колонки PID.
Если COM-обработка выполняется на сервере 1С, процессы EXCEL.EXE запускаются от имени пользователя службы сервера 1С. Их видно в Диспетчере задач на сервере, а не на компьютере бухгалтера. Снимать их стоит, когда обработка у пользователей точно не идёт, иначе прервётся чужая загрузка.
Как найти, какой процесс держит файл
Если Excel не запущен, а файл всё равно занят, его может держать другая программа: антивирус, синхронизация облачного диска, сама 1С. Найти виновника можно штатным монитором ресурсов Windows:
- Нажмите
Win+R, введитеresmonи нажмите Enter. - Откройте вкладку «ЦП».
- В блоке «Связанные дескрипторы» введите в поле поиска часть имени файла.
- Список покажет процесс, который держит файл. Его можно завершить из контекстного меню.
Если в результатах 1cv8.exe или 1cv8c.exe, файл держит сама 1С. Обычно это значит, что обработка открыла файл и не закрыла его. Выход из 1С освободит файл гарантированно.
Присоединённые файлы: как закончить редактирование
В типовых конфигурациях к документам и справочникам можно прикладывать файлы. Когда вы открываете такой файл на редактирование, 1С сохраняет его копию в рабочий каталог на компьютере и помечает файл в базе как занятый вами. Другие пользователи видят пометку и не могут его править.
Порядок работы такой:
- Откройте файл на редактирование из списка присоединённых файлов.
- Внесите правки в Excel и сохраните книгу.
- Закройте книгу в Excel, а не только сохраните.
- Вернитесь в 1С и выполните команду завершения редактирования в карточке файла или в списке файлов.
Если пропустить третий шаг, 1С не сможет забрать файл: Excel держит его открытым. Если пропустить четвёртый, файл останется помеченным как занятый, и коллеги не смогут его изменить, пока вы не закончите редактирование.
Когда файл помечен занятым, а пользователь ушёл в отпуск, снять пометку может сам пользователь или администратор в той же карточке файла. Изменения, которые были только в локальной копии на компьютере сотрудника, при этом в базу не попадут.
Как работать с Excel в 1С без COM и без зависаний
Самый надёжный способ не бороться с зависшим Excel — не запускать его вовсе.
Табличный документ вместо Excel
Платформа 1С 8.3 умеет читать и записывать файлы .xlsx сама, через объект ТабличныйДокумент. Excel на компьютере для этого не нужен, процесс EXCEL.EXE не появляется, файл закрывается сразу после чтения.
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла);
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
Артикул = ТабДок.Область(НомерСтроки, 1).Текст;
Количество = ТабДок.Область(НомерСтроки, 2).Текст;
// обработка значений
КонецЦикла;
Запись выполняется методом Записать:
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
Значения из ячеек приходят строками. Числа и даты нужно преобразовать самостоятельно, например через Число() внутри Попытка, чтобы пустая ячейка не обрывала загрузку.
Сравнение способов
| Способ | Нужен ли Excel | Риск зависшего процесса | Когда выбирать |
|---|---|---|---|
| Сохранение отчёта кнопкой | Нет | Нет | Выгрузка для просмотра и отправки |
ТабличныйДокумент.Прочитать и Записать | Нет | Нет | Загрузка простых таблиц, работа на сервере |
| Встроенная загрузка в табличную часть | Нет | Нет | Типовая конфигурация, загрузка строк товаров |
COM Excel.Application | Да | Высокий | Нужны формулы, макросы, сложное оформление |
| Сохранение в CSV | Нет | Нет | Обмен с внешними системами, большие объёмы |
Во многих типовых конфигурациях у табличных частей документов есть команда загрузки строк из файла: она открывает форму, куда таблицу можно вставить из буфера обмена или загрузить из файла. Этот путь не требует ни обработок, ни COM.
Профилактика: чтобы файл не «застревал»
Проблемы с занятыми файлами повторяются, если не менять привычки и код.
Для пользователей:
- 📁 Сохраняйте выгрузку под новым именем, например с датой в конце, а не перезаписывайте вчерашний файл, который может быть открыт.
- ❌ Закрывайте книгу в Excel, прежде чем загружать её в 1С. Даже если COM умеет открыть книгу только для чтения, сторонние обработки этого часто не делают.
- 🌐 Не загружайте файлы прямо из папки облачного диска во время синхронизации: клиент синхронизации может держать файл.
- 🔒 Если в папке рядом с книгой видите файл
~$Имя.xlsx, книга открыта у кого-то в Excel или Excel завершился аварийно. Файл-владелец удаляют только после того, как убедились, что книга нигде не открыта.
Для разработчиков и администраторов:
- 🧩 Переносите загрузку на
ТабличныйДокумент, если не нужны формулы и макросы. - 🖥️ Не запускайте Excel через COM на сервере 1С: служба работает без пользовательского сеанса, и Excel в таком окружении ведёт себя непредсказуемо. Для серверной загрузки передавайте файл двоичными данными и читайте табличным документом.
- ⏱️ Раз в неделю смотрите в Диспетчере задач сервера терминалов, не копятся ли процессы
EXCEL.EXEот пользователей, которые давно вышли. Их рост — сигнал, что какая-то обработка не закрывает Excel.
Частые вопросы
Можно ли выгрузить отчёт из 1С в Excel, если Excel не установлен?
.xlsx. Открыть его можно в любой программе, которая понимает этот формат, в том числе в LibreOffice Calc.