При автоматизации обмена данными между 1С и Microsoft Excel через COM-объект разработчики нередко сталкиваются с ситуацией, когда на этапе вызова метода Open выполнение кода прерывается модальным окном с сообщением: «Имя не может совпадать со встроенным именем. Старое имя: _filterDatabase». Если файл открывается в фоновом режиме или на сервере без интерактивного взаимодействия, процесс просто зависает либо аварийно завершается с ошибкой.
Разберем детально, почему возникает эта коллизия, как устроен механизм встроенных имен в Excel и какими практическими способами можно решить проблему — от доработки кода 1С до программной и ручной очистки структуры поврежденной книги.
Выясним внутреннюю механику работы табличного процессора, приводящую к ошибке:
_FilterDatabase. В штатном режиме это имя имеет локальную область видимости (Worksheet Scope), привязанную строго к текущему листу._FilterDatabase ошибочно копируется на уровень всей книги (Workbook Scope) или дублируется с некорректными идентификаторами листов. При последующем открытии книги встроенный валидатор Excel обнаруживает попытку определить зарезервированное имя на глобальном уровне и блокирует открытие запросом на ручное переименование.Проанализируем стандартный сценарий открытия книги через 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 автоматически принять имя по умолчанию или проигнорировать предупреждение, что позволяет успешно продолжить чтение или запись документа без остановки алгоритма.
Если файл используется регулярно множеством внешних систем и ссылок, целесообразно устранить причину ошибки внутри самого файла раз и навсегда. Для этого откроем файл в 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 вручную и сохраним книгу.
Файлы с расширением .xlsx представляют собой упакованные ZIP-архивы стандартизированной структуры OpenXML. Устранить ошибку можно прямым редактированием внутреннего содержимого без запуска Excel.
Разберем процедуру по шагам:
.xlsx на .zip.xl/.workbook.xml и откроем его в текстовом редакторе.<definedNames>, содержащий перечень именованных диапазонов.<definedName name="_FilterDatabase" ...>...</definedName>, у которых отсутствует атрибут localSheetId (именно они определены на глобальном уровне книги и вызывают сбой).workbook.xml, обновим файл в архиве и вернем исходное расширение .xlsx.Если файлов немного, а доступ к макросам заблокирован политиками безопасности предприятия, применим обходной маневр: сохраним файл в формате Excel 97-2003 (расширение .xls). При понижении версии формата устаревший обработчик сбрасывает поврежденные таблицы OpenXML и очищает некорректные области видимости имен. После этого открываем полученный .xls и сохраняем его обратно в современный формат .xlsx.
Использование COM-соединения через Excel.Application имеет существенные недостатки: привязку к установленной разрядности офисного пакета, медленную скорость обработки больших объемов и нестабильность в серверных регламентных заданиях. Рассмотрим альтернативные варианты:
ТабличныйДокумент и его метод Прочитать(ПутьКФайлу). Платформа считывает разметку напрямую собственным парсером, полностью игнорируя конфликты встроенных системных имен Excel. Однако следует учитывать, что метод Записать() не умеет дописывать информацию в существующий файл без его полной перезаписи.Microsoft.ACE.OLEDB позволяет читать и добавлять строки стандартными SQL-запросами к COM-объекту ADODB.Connection. В этом сценарии Excel как отдельное приложение не запускается, а внутренние системные диапазоны фильтрации не влияют на выполнение операций.