Файл Excel «занят» после выгрузки из 1С: как освободить книгу и процесс

· 10 мин

Содержание

Чтобы закрыть файл 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 вручную

Ручной способ нужен, когда код уже отработал с ошибкой, а файл занят прямо сейчас.

Через Диспетчер задач

  1. Нажмите Ctrl+Shift+Esc.
  2. Перейдите на вкладку «Подробности».
  3. Найдите строки EXCEL.EXE. Колонка «Имя пользователя» покажет, чей это процесс.
  4. Выделите процесс без видимого окна и нажмите «Снять задачу».

Отличить скрытый экземпляр от рабочего помогает вкладка «Процессы»: у видимого 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:

  1. Нажмите Win+R, введите resmon и нажмите Enter.
  2. Откройте вкладку «ЦП».
  3. В блоке «Связанные дескрипторы» введите в поле поиска часть имени файла.
  4. Список покажет процесс, который держит файл. Его можно завершить из контекстного меню.

Если в результатах 1cv8.exe или 1cv8c.exe, файл держит сама 1С. Обычно это значит, что обработка открыла файл и не закрыла его. Выход из 1С освободит файл гарантированно.

Присоединённые файлы: как закончить редактирование

В типовых конфигурациях к документам и справочникам можно прикладывать файлы. Когда вы открываете такой файл на редактирование, 1С сохраняет его копию в рабочий каталог на компьютере и помечает файл в базе как занятый вами. Другие пользователи видят пометку и не могут его править.

Порядок работы такой:

  1. Откройте файл на редактирование из списка присоединённых файлов.
  2. Внесите правки в Excel и сохраните книгу.
  3. Закройте книгу в Excel, а не только сохраните.
  4. Вернитесь в 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.
Проверка обработки загрузки из Excel
Выполнено: 0 / 6

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

Можно ли выгрузить отчёт из 1С в Excel, если Excel не установлен?
Да. Платформа сама формирует файл .xlsx. Открыть его можно в любой программе, которая понимает этот формат, в том числе в LibreOffice Calc.
Почему после выхода из 1С процесс EXCEL.EXE исчезает сам?
При завершении сеанса 1С освобождает все COM-ссылки. Excel, у которого не осталось клиентов, завершается. Поэтому выход из программы — крайний, но рабочий способ освободить файл.
Что делать, если файл занят в сетевой папке, а коллега не отвечает?
Попросите администратора файлового сервера посмотреть открытые файлы в оснастке управления общими ресурсами и закрыть сеанс. Изменения коллеги в этой книге при этом могут потеряться.
Можно ли открыть в 1С файл Excel только для чтения, не закрывая его в Excel?
Табличный документ обычно читает книгу, открытую в Excel, если Excel не заблокировал её на чтение. Надёжнее сохранить копию файла под другим именем и загружать её.
Почему загрузка через COM работает у одного пользователя и не работает у другого?
COM использует Excel, установленный на конкретном компьютере. Разные версии, отсутствие Excel или незавершённая активация Office дают разное поведение. Табличный документ от этого не зависит.