Как 1С:Предприятие 8 работает с Excel и Word из MS Office 2010 и что для этого подготовить
Содержание
Под «расширением MS Office 2010 для 1С:Предприятие 8» обычно понимают не отдельную программу, а связку: установленный Office 2010 регистрирует в Windows COM-объекты Excel.Application и Word.Application, и 1С управляет через них таблицами и документами. Отдельно ставить ничего не нужно — достаточно Office на том компьютере, где выполняется код. Для обычной выгрузки отчёта в Excel Office не нужен вовсе: платформа 8.3 сама сохраняет табличный документ в .xlsx.
Связка нужна там, где 1С должна именно управлять Office: открыть чужую книгу и прочитать ячейки, заполнить шаблон Word с закладками, построить в Excel сводную таблицу или диаграмму. Ниже — как это устроено, что настроить на клиенте и на сервере, какие ошибки встречаются и чем заменить COM.
Как 1С обращается к Excel и Word: механизм COM
COM — стандартный механизм Windows, через который одна программа запускает другую и вызывает её методы. В языке 1С за это отвечает конструктор Новый COMОбъект("…"). Строка в скобках — имя класса, которое Office записал в реестр при установке.
Основные классы, которые используют в 1С:
- 📗
Excel.Application— сам Excel: книги, листы, ячейки, формулы, сохранение в нужном формате; - 📘
Word.Application— Word: открыть шаблон, подставить текст в закладки, сохранить как.docxили.pdf; - 🗄
ADODB.Connection— не часть Office, а компонент Windows; вместе с провайдеромMicrosoft.ACE.OLEDB.12.0читает лист Excel как таблицу базы данных; - 📧
Outlook.Application— отправка писем через почтовый профиль пользователя.
Excel и Word запускаются отдельными процессами. Если открыть Диспетчер задач во время выгрузки, вы увидите EXCEL.EXE даже при невидимом окне. Отсюда главное правило: процесс нужно закрывать явно, иначе после каждого запуска обработки он остаётся висеть в памяти.
Минимальный пример — открыть книгу и прочитать значение ячейки A2:
Excel = Новый COMОбъект("Excel.Application");
Excel.Visible = Ложь;
Excel.DisplayAlerts = Ложь;
Книга = Excel.Workbooks.Open("C:\Обмен\Прайс.xlsx");
Лист = Книга.Worksheets(1);
Значение = Лист.Cells(2, 1).Value;
Книга.Close(Ложь); // закрыть без сохранения
Excel.Quit(); // завершить процесс EXCEL.EXE
Excel = Неопределено;
Свойство DisplayAlerts = Ложь отключает диалоги Excel вроде «Сохранить изменения?». Без него невидимый Excel ждёт ответа, а 1С «зависает» на вызове.
Где выполняется код: клиент или сервер
COM-объект создаётся на том компьютере, где работает конкретная процедура. От этого зависит, где должен стоять Office.
| Режим | Где создаётся объект | Где нужен Office |
|---|---|---|
Процедура &НаКлиенте, тонкий клиент Windows | На компьютере пользователя | У пользователя |
Процедура &НаСервере, файловая база | На компьютере пользователя (сервер — тот же процесс) | У пользователя |
Процедура &НаСервере, клиент-серверная база | На сервере 1С, под учётной записью службы | На сервере 1С |
| Веб-клиент, клиент на Linux или macOS | COM недоступен | — |
Последняя строка частая причина сюрпризов: обработка работает в файловой базе, а после перевода на сервер падает. Код не менялся, просто COM-объект теперь создаётся на сервере, где Office нет.
Подготовка рабочего места: Office, разрядность, проверка
Перед тем как запускать обработку, проверьте окружение. Это займёт несколько минут и снимет большую часть «необъяснимых» ошибок.
- Убедитесь, что установлен полный Office или хотя бы Excel. Бесплатный просмотрщик Excel Viewer и веб-версия Office COM-объектов не регистрируют.
- Запустите Excel вручную один раз под тем пользователем, под которым работает 1С. Первый запуск показывает окно активации и настройки — пока его не закрыть, автоматизация может не стартовать.
- Проверьте активацию. Неактивированный Office в режиме ограниченной функциональности открывает файлы только для чтения, и сохранение из 1С завершится ошибкой.
- Выясните разрядность. Office 2010 — первая версия, у которой есть 64-разрядный выпуск. Посмотреть можно в Excel:
Файл → Справка, справа указано «32-разрядная» или «64-разрядная». - Проверьте класс без 1С. Создайте файл
test.vbsс одной строкой и запустите двойным щелчком:
Set x = CreateObject("Excel.Application") : MsgBox x.Version : x.Quit
Если появится окно с числом 14.0 — Excel 2010 зарегистрирован и откликается. Ошибка в этой проверке значит, что проблема в Office, а не в 1С.
Когда разрядность важна, а когда нет
Excel.Application и Word.Application работают как отдельный процесс. Поэтому 32-разрядный клиент 1С спокойно управляет 64-разрядным Excel, и наоборот.
С провайдером Microsoft.ACE.OLEDB.12.0 иначе: он загружается внутрь процесса 1С. Разрядность провайдера должна совпадать с разрядностью клиента или сервера 1С. Провайдер ставится вместе с Office или отдельным пакетом Microsoft Access Database Engine 2010 Redistributable нужной разрядности. Поставить рядом 32- и 64-битный пакет штатно не получится — установщик откажет, если разрядность не совпадает с уже установленным Office.
Если на компьютере 32-битный Office, а 1С 64-битная и нужно ADO-чтение Excel, проще перевести чтение на COM Excel.Application или на встроенный ТабличныйДокумент.Прочитать, чем переустанавливать Office.
Ошибки при выгрузке в Excel и как их читать
Сообщения COM 1С показывает с шестнадцатеричным кодом. По коду причина находится быстрее, чем по тексту.
Висящие процессы EXCEL.EXE
Самая массовая проблема — десятки процессов EXCEL.EXE в Диспетчере задач через неделю работы. Причина почти всегда в коде: при ошибке выполнение прервалось до строки Excel.Quit().
Решение — обернуть работу в Попытка … Исключение, а закрытие вынести и в ветку исключения:
Excel = Новый COMОбъект("Excel.Application");
Попытка
Книга = Excel.Workbooks.Open(ПутьКФайлу);
// ... чтение или заполнение
Книга.Close(Ложь);
Исключение
Excel.Quit();
Excel = Неопределено;
ВызватьИсключение;
КонецПопытки;
Excel.Quit();
Excel = Неопределено;
Завершать «лишние» EXCEL.EXE через Диспетчер задач на сервере 1С или терминальном сервере можно только когда выгрузки не идут. Иначе вы оборвёте чужую обработку и пользователь получит ошибку RPC.
Медленная выгрузка
Запись ячеек по одной через COM — это тысячи межпроцессных вызовов. Таблица на 10 000 строк и 10 колонок даёт 100 000 обращений и может выгружаться несколько минут.
Что ускоряет в разы:
- 🚀 сформировать данные в табличном документе 1С и сохранить его в
.xlsxвстроенным методом, а Excel открыть уже для оформления; - 🚀 отключить пересчёт и обновление экрана:
Excel.ScreenUpdating = Ложь,Excel.Calculation = -4135(ручной пересчёт), в конце вернуть-4105; - 🚀 читать диапазон целиком через
Лист.UsedRange.Valueи разбирать полученный массив, а не обращаться к каждой ячейке.
Выгрузка в Excel без COM и без установленного Office
Для большинства задач Office на компьютере вообще не обязателен. Платформа 8.3 умеет записывать и читать файлы Excel сама.
Ручное сохранение отчёта
Любой отчёт или печатную форму можно сохранить в Excel без программирования. В открытом табличном документе нажмите кнопку сохранения (значок дискеты на панели формы или команду Сохранить как в главном меню программы) и выберите тип файла «Лист Microsoft Excel 2007-…» (.xlsx) или «Лист Microsoft Excel 97» (.xls).
Для списков документов и справочников есть Ещё → Вывести список…: список выводится в табличный документ, который сохраняется тем же способом.
Программная запись и чтение
Записать табличный документ в файл — одна строка:
ТабДок.Записать("C:\Выгрузка\Отчет.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Метод работает и на клиенте, и на сервере, в том числе на сервере 1С под Linux. Office ему не нужен.
Прочитать готовую книгу в табличный документ можно методом ТабличныйДокумент.Прочитать(ПутьКФайлу), после чего значения берутся через ТабДок.Область(Строка, Колонка, Строка, Колонка).Текст.
Сравнение способов
| Способ | Нужен Office | Когда подходит | Ограничения |
|---|---|---|---|
ТабличныйДокумент.Записать | Нет | Выгрузка отчётов, реестров, прайсов | Нет формул Excel, сводных, макросов |
ТабличныйДокумент.Прочитать | Нет | Загрузка простых таблиц | Сложное форматирование теряется |
COM Excel.Application | Да, на месте выполнения кода | Шаблоны с формулами, диаграммы, сводные | Только Windows, процессы надо закрывать |
| ADO + ACE OLEDB | Провайдер ACE нужной разрядности | Быстрое чтение больших листов | Капризен к типам данных в колонках |
COM LibreOffice (com.sun.star.ServiceManager) | Нет, нужен LibreOffice | Замена Office без покупки лицензий | Другая объектная модель, код пишется заново |
| Типовая загрузка из файла | Нет | Загрузка строк в документы БП, УТ | Только там, где команда предусмотрена |
В типовых конфигурациях многие табличные части документов (например, товары в поступлении) заполняются командой загрузки из файла прямо в форме документа. Если такой команды нет, есть внешняя обработка «Загрузка данных из табличного документа», которая распространяется для подписчиков ИТС.
Для печатных форм в Word типовые конфигурации на БСП умеют использовать макеты формата Office Open XML (.docx): документ собирается без запуска Word, и такие формы работают на любом сервере.
Права доступа и безопасность при работе с Office
Связка 1С и Office затрагивает права в трёх местах: в самой 1С, в Windows и в настройках сервера 1С.
Права в 1С
- 🔐 Пользователю, который запускает внешнюю обработку с COM-вызовами, нужно право на интерактивное открытие внешних обработок. В типовых конфигурациях оно выдаётся через профиль групп доступа.
- 🛡 С платформы 8.3.10 у пользователя есть свойство «Защита от опасных действий». При открытии внешней обработки система предупреждает о возможной угрозе, и запуск нужно подтвердить.
- 🧱 Внешние обработки, подключённые в безопасном режиме, не могут создавать COM-объекты. Это сделано намеренно: COM даёт коду полный доступ к компьютеру.
Права на сервере 1С
В клиент-серверной базе COM-объект на сервере создаётся под учётной записью службы агента сервера, по умолчанию USR1CV8. Чтобы Excel запустился под ней, настраивают DCOM:
- Запустите
dcomcnfgот имени администратора. - Откройте
Службы компонентов → Компьютеры → Мой компьютер → Настройка DCOM. - Найдите «Microsoft Excel Application», откройте свойства.
- На вкладке «Безопасность» в разделах разрешений на запуск и доступ добавьте учётную запись службы 1С с разрешением локального запуска и локальной активации.
- На вкладке «Удостоверение» выберите запуск от имени конкретного пользователя, если Excel под системной учётной записью не стартует.
Есть ещё один приём, о котором знают практики. Office под служебной учётной записью ищет папку рабочего стола профиля и без неё не открывает книги. Создайте пустые папки:
mkdir C:\Windows\System32\config\systemprofile\Desktop
mkdir C:\Windows\SysWOW64\config\systemprofile\Desktop
Вторая нужна для 32-разрядного Office на 64-разрядной Windows.
Изменения DCOM и учётной записи службы 1С применяются после перезапуска службы агента сервера. Перезапуск обрывает сеансы всех пользователей — делайте его вне рабочего времени.
Microsoft официально не поддерживает автоматизацию Office в серверных службах без интерактивного пользователя. Схема работает, но при нагрузке нескольких одновременных выгрузок начинаются сбои. Для серверной выгрузки надёжнее использовать встроенную запись в xlsx, а COM оставить на клиенте.
Если в кластере включены профили безопасности, для информационной базы может быть запрещено создание COM-объектов. Тогда код на сервере упадёт даже при правильно настроенном DCOM — проверьте профиль базы в консоли администрирования кластера.
Безопасность самих файлов
- 📎 Книги с макросами (
.xlsm) при открытии через COM запускают макросы по настройкам центра управления безопасностью Office. Не открывайте из 1С файлы, полученные от контрагентов, без проверки. - 📁 Папку обмена с Excel-файлами размещайте там, куда у учётной записи службы есть права на запись. Сетевой путь
\\server\shareдля службы работает только при правах доступа к ресурсу у этой учётной записи.
Какая версия Office подходит для задач 1С
Объектная модель Excel почти не менялась с 2007 года. Код для Office 2010 без правок работает в 2013, 2016, 2019, 2021 и Microsoft 365. Разница — в форматах, разрядности и поддержке.
| Версия | Номер в Version | Форматы по умолчанию | 64-битный выпуск | Что учесть |
|---|---|---|---|---|
| Office 2007 | 12.0 | xlsx, docx | Нет | Поддержка давно завершена |
| Office 2010 | 14.0 | xlsx, docx | Есть, впервые | Поддержка Microsoft завершена в октябре 2020 года |
| Office 2013 | 15.0 | xlsx, docx | Есть | Поддержка завершена |
| Office 2016–2021 | 16.0 | xlsx, docx | Есть | Одинаковый номер версии у всех трёх |
| Microsoft 365 | 16.0 | xlsx, docx | Есть, ставится по умолчанию | Обновляется сам, нужна действующая подписка |
Ограничения листа одинаковы с 2007 года: 1 048 576 строк и 16 384 столбца в .xlsx. В старом формате .xls — 65 536 строк и 256 столбцов. Если выгружаете в .xls реестр больше 65 536 строк, хвост будет отрезан.
Практический вывод для 1С:
- ✅ Office 2010 по-прежнему работает со связкой, но не получает исправлений безопасности. Для новых рабочих мест его не ставят.
- ✅ Если код проверяет версию, сравнивайте число из
Excel.Version: «номер не ниже 12» значит, что формат.xlsxдоступен. - ✅ На терминальном сервере держите одну разрядность Office у всех пользователей, иначе ADO-загрузка будет работать у одних и падать у других.