Заполнение формул в файлах Excel (кроссплатформенное решение)

30.10.25

Интеграция - Загрузка и выгрузка в Excel

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

Вдохновением послужила статья Выгрузка данных в Excel с добавлением формул (нюансы формирования формул), а также отсутствие в интернете описанного подхода по работе с формулами.

Основная идея в том, что файл Excel по сути является zip-архивом с файлами внутри. Файлы, в свою очередь, можно редактировать с помощью объекта платформы ДокументDOM.

В данном примере приводится заполнение формул со стилем ссылок "по умолчанию", так называемый ссылочный стиль A1. Например: "=A1+B2".

Важно: Предварительно, сам файл должен быть корректно сформирован (корректный формат данных в ячейках).

Есть куча статей, в которых описано, как это сделать для числовых значений (настройка в макете).

 

Итак, алгоритм действий следующий:

1. Распаковка файла Excel как zip-архива

ВременныйКаталог = КаталогВременныхФайлов() + "\excel_temp\";
	
СоздатьКаталог(ВременныйКаталог);
	
ИзвлечьАрхив(ПутьДоФайла, ВременныйКаталог);

2. Работа с XML файлом листа документа Excel и заполнение формул

ПутьДоXMLФайлаЛист1 = ВременныйКаталог + "xl\worksheets\sheet1.xml";

// Чтение распакованного xml-файла листа 1 в ДокументDOM
ДокументDOM = ПолучитьDOMДокументИзXMLФайла(ПутьДоXMLФайлаЛист1);
	
ВсеЯчейки = ДокументDOM.ПолучитьЭлементыПоИмени("c");
ВсеСтроки = ДокументDOM.ПолучитьЭлементыПоИмени("row");
ВсегоСтрок = ВсеСтроки.Количество();

// Обход ячеек и определение формул по произвольному алгоритму
Для Каждого Ячейка Из ВсеЯчейки Цикл
	Формула = Неопределено;
		
	ИмяЯчейки = Ячейка.ПолучитьАтрибут("r");
	Если ИмяЯчейки = Неопределено Тогда
		Продолжить;
	КонецЕсли;
		
	ИмяСтолбца = Сред(ИмяЯчейки, 1, 1);
	ИмяСтроки = Сред(ИмяЯчейки, 2);
		
	НомерСтроки = Число(ИмяСтроки);
	
	// Сборка формулы по условиям для ячейки в формате "=A1+B2"
	// Тут необходимо прописать логику по определению формулы
	Формула = "=A1+B2";
		
	Если Формула = Неопределено Тогда
		Продолжить;
	КонецЕсли;
		
	Пока Ячейка.ЕстьДочерниеУзлы() Цикл
		Ячейка.УдалитьДочерний(Ячейка.ПервыйДочерний);
	КонецЦикла;
		
	// Заполнение формулы
	ЭлФормула = ДокументDOM.СоздатьЭлемент("f");
	ЭлФормула.ТекстовоеСодержимое = Формула;
	
	Ячейка.ДобавитьДочерний(ЭлФормула);
	
КонецЦикла;
	
// Запись модифицированного объекта ДокументDOM в xml-файл листа 1
СохранитьDOMДокументКАКXMLФайл(ДокументDOM, ПутьДоXMLФайлаЛист1);

3. Запаковка измененных файлов обратно в архив (Excel-файл) и удаление временных файлов

УдалитьФайлы(ПутьДоФайла);
	
СобратьАрхив(ВременныйКаталог, ПутьДоФайла);
	
УдалитьФайлы(ВременныйКаталог);

Для удобства, все вынесено в отдельный общий модуль, привожу его листинг:

 
 Листинг общего модуля

Вступайте в нашу телеграмм-группу Инфостарт

Excel Формулы Экспорт Linux Windows кроссплатформенность ZIP XML ДокументDOM

См. также

SALE! 10%

Загрузка и выгрузка в Excel Оптовая торговля Бухгалтер Пользователь 1С v8.3 Управляемые формы 1C v8.2 1С:Бухгалтерия 2.0 1С:Бухгалтерия 3.0 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Комплексная автоматизация 1.х 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 10 1С:Управление торговлей 11 1С:Розница 2 1С:Розница 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С. Забудьте о ручном вводе: загружайте документы из Excel в 1С за секунды! Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл эксель, документ 1С и нажимаете кнопку "Загрузить"

8000 руб.

09.11.2016    262334    1160    940    

1087

Загрузка и выгрузка в Excel Маркетплейсы Программист Бухгалтер Пользователь 1С v8.3 Бухгалтерский учет 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)

Реальный помощник, с помощью которого Вы преобразуете необходимые документы для Wildberries, OZON, ЯндексМаркет, Мегамаркет, Aliexpress, Детский мир, Магнит Маркет (быв.МагнитЭкспресс), Лемана про, ЭНФАНТА (Акушерство), ЛаМода, Летуаль, Твой дом, Золотое Яблоко в документы "Отчет комиссионера (агента) о продажах" и другие. Работает в 1С:БП 3.0, 1С:БП 3.0 КОРП, 1С:УТ 11, 1С:УНФ, 1С:ERP Управление предприятием.

5400 руб.

12.08.2021    42895    499    71    

202

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Системный администратор Программист 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка номенклатуры из файлов Excel (xls, xlsx, ods, csv, mxl) в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

12240 руб.

29.10.2014    226685    712    528    

481

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Бухгалтер Пользователь 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 17.11.2025, версия 9.13 - 10.5)

19200 руб.

20.11.2015    168984    420    389    

539

Загрузка и выгрузка в Excel Маркетплейсы Программист Бухгалтер Пользователь 1С v8.3 Бухгалтерский учет Оперативный учет 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Бухгалтерский учет Платные (руб)

Обработки загрузки данных о продажах WildBerries предназначены для следующих конфигураций: Бухгалтерия предприятия, редакция 3.0; Управление нашей фирмой, редакция 3.0; Розница, редакция 3.0; Управление торговлей, редакция 11; Управление торговлей, редакция 10.3

6000 руб.

11.12.2019    62755    1067    3    

284

Загрузка и выгрузка в Excel Маркетплейсы Программист Бухгалтер Пользователь 1С v8.3 Бухгалтерский учет 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Загружает данные по Акту приемки товара от ООО «Вайлдберриз» (поставок), полученный из личного кабинета в формате *.xlsx или API (FBO, FBS) в документ "Реализация (акты, накладные, УПД)" для конфигурации: Бухгалтерия предприятия, редакция 3.0; Управление торговлей, редакция 11; Комплексная автоматизация 2; ERP 2 Управление предприятием и Управление нашей фирмой 3.0

6000 руб.

24.01.2021    23188    106    0    

51
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Трактор 1274 30.10.25 10:55 Сейчас в теме
Добавил в избранное. Благодарю за публикацию. Зело красиво.
XilDen; Abysswalker; +2 Ответить
2. XilDen 748 30.10.25 15:42 Сейчас в теме
Отличное решение, спасибо, что поделились!
3. partizand 141 30.10.25 18:51 Сейчас в теме
Осторожнее с Dom в 1с. Он может прочитать не все корректно, и записать немножечко не такой XML, который ожидает office.
ЧтениеXml в этом плане надёжно, работает даже с битыми файлами. Но неудобно
4. Abysswalker 38 30.10.25 21:41 Сейчас в теме
(3) Спасибо, буду наблюдать за поведением.
Были попытки с ФабрикаXDTO, но быстро не получилось и пришлось отказаться от этого пути
5. Mdanko 03.11.25 09:20 Сейчас в теме
А если ячеек с формула и несколько тысяч, это получается все формулы писать в коде? А когда документ меняется несколько раз за год. Такое себе решение.
Пишем формулы как текст в формате А1, потом в Excel делаем замена = на =, для Р7 плагин перекладывающий текст в формулы.
6. Abysswalker 38 03.11.25 10:42 Сейчас в теме
(5) Это не готовое решение, а лишь описание подхода (шаблон)
7. Mdanko 05.11.25 11:29 Сейчас в теме

Процедура ЗаполнитьФормулыВФайлеНазваниеВашейПечатнойФормы(ПутьДоФайла)
	
	ВременныйКаталог = КаталогВременныхФайлов() + "\excel_temp\";
	
	СоздатьКаталог(ВременныйКаталог);
	
	ИзвлечьАрхив(ПутьДоФайла, ВременныйКаталог);
	
	ПутьДоXMLФайлаЛист1 = ВременныйКаталог + "xl\worksheets\sheet1.xml";

	// Чтение распакованного xml-файла листа 1 в ДокументDOM
	ДокументDOM = ПолучитьDOMДокументИзXMLФайла(ПутьДоXMLФайлаЛист1);
    СтроковыеЗначения = ПолучитьDOMДокументИзXMLФайла(ВременныйКаталог + "xl\sharedStrings.xml");
	
	ВсеЯчейки = ДокументDOM.ПолучитьЭлементыПоИмени("c");
	ВсеСтроки = ДокументDOM.ПолучитьЭлементыПоИмени("row");
	ВсегоСтрок = ВсеСтроки.Количество();
    ВсеСтроковыеЗначения = СтроковыеЗначения.ЭлементДокумента.ДочерниеУзлы;
    
	// Обход ячеек и определение формул по произвольному алгоритму
	Для Каждого Ячейка Из ВсеЯчейки Цикл
		
		ИмяЯчейки = Ячейка.ПолучитьАтрибут("r");
		Если ИмяЯчейки = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		ИмяСтолбца = Сред(ИмяЯчейки, 1, 1);
		ИмяСтроки = Сред(ИмяЯчейки, 2);
		
		НомерСтроки = Число(ИмяСтроки);
	
        ТипЯчейки = Ячейка.ПолучитьАтрибут("t");
        Если ТипЯчейки="s" Тогда 
           // здесь лежит какое-то значение  
           Если Ячейка.ПервыйДочерний.ИмяУзла = "v" Тогда 
           // надо найти значение в строках SharedStrings    
              ЗначениеЯчейки = ВсеСтроковыеЗначения[Число(Ячейка.ПервыйДочерний.ТекстовоеСодержимое)];
                	//	Формула начинается с "="
                    ЭтоФормула=СтрНачинаетсяС(ЗначениеЯчейки.ТекстовоеСодержимое,"=");
                    Если ЭтоФормула Тогда 
                        формула=ЗначениеЯчейки.ТекстовоеСодержимое;
                		Пока Ячейка.ЕстьДочерниеУзлы() Цикл
                			Ячейка.УдалитьДочерний(Ячейка.ПервыйДочерний);
                		КонецЦикла;
                		
                		// Заполнение формулы
                		ЭлФормула = ДокументDOM.СоздатьЭлемент("f");
                		ЭлФормула.ТекстовоеСодержимое = Формула;
                	
                		Ячейка.ДобавитьДочерний(ЭлФормула);
                    КонецЕсли;
           КонецЕсли;
        КонецЕсли;
	КонецЦикла;
	
	// Запись модифицированного объекта ДокументDOM в xml-файл листа 1
	СохранитьDOMДокументКАКXMLФайл(ДокументDOM, ПутьДоXMLФайлаЛист1);
	
	УдалитьФайлы(ПутьДоФайла);
	
	СобратьАрхив(ВременныйКаталог, ПутьДоФайла);
	
	УдалитьФайлы(ВременныйКаталог);
	
КонецПроцедуры
Показать


Немного поправил процедуру, перекладывает формулы из текста в формулу.
Имена функций должны быть написаны на английском СУММ(SUM), иначе будет ошибка #ИМЯ.
Могут быть ещё нюансы, но так уже более менее терпимо.
Для отправки сообщения требуется регистрация/авторизация