Как исправить ошибку «Имя не может совпадать со встроенным именем» (_filterDatabase) при открытии файла Excel в 1С?

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

При автоматизации обмена данными между 1С и Microsoft Excel через COM-объект разработчики нередко сталкиваются с ситуацией, когда на этапе вызова метода Open выполнение кода прерывается модальным окном с сообщением: «Имя не может совпадать со встроенным именем. Старое имя: _filterDatabase». Если файл открывается в фоновом режиме или на сервере без интерактивного взаимодействия, процесс просто зависает либо аварийно завершается с ошибкой.

Разберем детально, почему возникает эта коллизия, как устроен механизм встроенных имен в Excel и какими практическими способами можно решить проблему — от доработки кода 1С до программной и ручной очистки структуры поврежденной книги.

Причины возникновения коллизии _filterDatabase

Выясним внутреннюю механику работы табличного процессора, приводящую к ошибке:

  1. Системный диапазон автофильтра: когда пользователь включает автофильтр или расширенный фильтр на листе Excel, программа автоматически создает именованный диапазон с зарезервированным системным идентификатором _FilterDatabase. В штатном режиме это имя имеет локальную область видимости (Worksheet Scope), привязанную строго к текущему листу.
  2. Дублирование и конфликт областей видимости: если лист с активным фильтром копируют, перемещают или объединяют с другой книгой, механизм Excel дает сбой. Имя _FilterDatabase ошибочно копируется на уровень всей книги (Workbook Scope) или дублируется с некорректными идентификаторами листов. При последующем открытии книги встроенный валидатор Excel обнаруживает попытку определить зарезервированное имя на глобальном уровне и блокирует открытие запросом на ручное переименование.
  3. Скрытый статус имени: обычное отключение фильтров на листе не решает проблему, поскольку созданная запись сохраняется в метаданных документа. При этом в стандартном окне «Диспетчер имен» Excel данное имя не отображается, так как для него по умолчанию установлен атрибут скрытия.

Решение 1. Подавление интерактивных предупреждений в коде 1С

Проанализируем стандартный сценарий открытия книги через COM-объект. Чтобы процесс не зависал в ожидании реакции пользователя на модальный диалог, необходимо отключить вывод системных предупреждений приложения Excel с помощью свойства DisplayAlerts.

Посмотрим на пример правильной инициализации и последующей программной очистки конфликтного имени:


ExcelПриложение = Новый COMОбъект("Excel.Application");
ExcelПриложение.Visible = Ложь;
ExcelПриложение.DisplayAlerts = Ложь; // Отключаем интерактивные окна и диалоги конфликта имен

Попытка
    Книга = ExcelПриложение.WorkBooks.Open(ПутьКФайлу);
Исключение
    ExcelПриложение.Quit();
    ВызватьИсключение "Не удалось открыть файл Excel: " + ОписаниеОшибки();
КонецПопытки;

// Пробуем программно удалить сбойное имя из коллекции книги
Попытка
    Книга.Names.Item("_FilterDatabase").Delete();
Исключение
    // Имя отсутствует на глобальном уровне или уже очищено
КонецПопытки;

// Выполняем требуемые операции с данными
// ...

Книга.Save();
Книга.Close(Ложь);
ExcelПриложение.Quit();

Отключение DisplayAlerts заставляет Excel автоматически принять имя по умолчанию или проигнорировать предупреждение, что позволяет успешно продолжить чтение или запись документа без остановки алгоритма.

Решение 2. Очистка скрытых имен с помощью макроса в Excel

Если файл используется регулярно множеством внешних систем и ссылок, целесообразно устранить причину ошибки внутри самого файла раз и навсегда. Для этого откроем файл в Excel и выполним короткий VBA-макрос, удаляющий все скрытые коллизии.

Рассмотрим код макроса для полного удаления конфликтующих записей фильтров:


Sub RemoveFilterDatabaseNames()
    Dim n As Name
    For Each n In ActiveWorkbook.Names
        If InStr(n.Name, "_FilterDatabase") > 0 Then
            On Error Resume Next
            n.Delete
        End If
    Next n
End Sub

Если требуется просмотреть все скрытые имена книги через стандартный интерфейс (сочетание клавиш Ctrl + F3), сделаем их видимыми:


Sub MakeNamesVisible()
    Dim n As Name
    For Each n In ActiveWorkbook.Names
        n.Visible = True
    Next n
End Sub

После отображения скрытых диапазонов удалим дублирующие строки с именем _FilterDatabase вручную и сохраним книгу.

Решение 3. Исправление структуры XML внутри файла XLSX

Файлы с расширением .xlsx представляют собой упакованные ZIP-архивы стандартизированной структуры OpenXML. Устранить ошибку можно прямым редактированием внутреннего содержимого без запуска Excel.

Разберем процедуру по шагам:

  1. Изменим расширение проблемного файла с .xlsx на .zip.
  2. Откроем архив любой программой-архиватором и перейдем во внутренний каталог xl/.
  3. Извлечем файл workbook.xml и откроем его в текстовом редакторе.
  4. Найдем тег <definedNames>, содержащий перечень именованных диапазонов.
  5. Найдем и удалим узлы вида <definedName name="_FilterDatabase" ...>...</definedName>, у которых отсутствует атрибут localSheetId (именно они определены на глобальном уровне книги и вызывают сбой).
  6. Сохраним изменения в workbook.xml, обновим файл в архиве и вернем исходное расширение .xlsx.

Решение 4. Пересохранение через промежуточный формат

Если файлов немного, а доступ к макросам заблокирован политиками безопасности предприятия, применим обходной маневр: сохраним файл в формате Excel 97-2003 (расширение .xls). При понижении версии формата устаревший обработчик сбрасывает поврежденные таблицы OpenXML и очищает некорректные области видимости имен. После этого открываем полученный .xls и сохраняем его обратно в современный формат .xlsx.

Альтернативные подходы к работе с файлами в 1С

Использование COM-соединения через Excel.Application имеет существенные недостатки: привязку к установленной разрядности офисного пакета, медленную скорость обработки больших объемов и нестабильность в серверных регламентных заданиях. Рассмотрим альтернативные варианты:

  1. Чтение средствами платформы 1С: если из файла необходимо только получить данные, используем объект ТабличныйДокумент и его метод Прочитать(ПутьКФайлу). Платформа считывает разметку напрямую собственным парсером, полностью игнорируя конфликты встроенных системных имен Excel. Однако следует учитывать, что метод Записать() не умеет дописывать информацию в существующий файл без его полной перезаписи.
  2. Подключение через ADO/OLE DB: обращение к листам книги через провайдер Microsoft.ACE.OLEDB позволяет читать и добавлять строки стандартными SQL-запросами к COM-объекту ADODB.Connection. В этом сценарии Excel как отдельное приложение не запускается, а внутренние системные диапазоны фильтрации не влияют на выполнение операций.
← На главную