1С 8.3 Заполнение формул из 1С в файлах Excel (без COM)
Данные > Примеры кода 1С > 1С 8.3 Excel
Перейти в раздел примеры кода 1С 8.3:
Код представляет собой библиотеку для программной работы с файлами формата Excel (XLSX) в среде 1С. Основная задача это модификация формул в Excel-файлах через манипуляции с их внутренней структурой, поскольку XLSX-файлы являются ZIP-архивами с XML-содержимым.
Авторство и исходник: https://infostart.ru/1c/articles/2516501/
Модуль обработки Excel‑файлов через ZIP/XML: автоматическое заполнение формул 1С 8.3 (модифицированный вариант):
#Область ПрограммныйИнтерфейс
// Процедура - Заполнить формулы в Excel-файл, в зависимости от имени макета вызывает соответствующую процедуру обработки
// Параметры:
// ИмяМакета - Строка - имя макета печатной формы
// ПутьФайла - Строка - путь к Excel-файлу (архив .xlsx)
Процедура ЗаполнитьФормулыВФайлеExcel(ИмяМакета, ПутьФайла) Экспорт
Если ИмяМакета = "НазваниеМакетаВашейПечатнойФормы" Тогда
ЗаполнитьФормулыВФайлеНазваниеВашейПечатнойФормы(ПутьФайла);
КонецЕсли;
КонецПроцедуры
// Процедура - Извлечь архив, распаковывает ZIP-архив в указанный каталог
Процедура ИзвлечьАрхив(ПутьФайла, ПутьКаталога) Экспорт
ДДФайла = Новый ДвоичныеДанные(ПутьФайла);
Поток = Новый ПотокВПамяти(ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДДФайла));
Попытка
Архив = Новый ЧтениеZipФайла(Поток);
Архив.ИзвлечьВсе(ПутьКаталога, РежимВосстановленияПутейФайловZIP.Восстанавливать);
Архив.Закрыть();
Исключение
Сообщить("Ошибка при извлечении архива: " + ПутьФайла);
КонецПопытки;
Поток.Закрыть();
КонецПроцедуры
// Процедура - Собрать архив, упаковывает файлы из каталога в ZIP-архив
Процедура СобратьАрхив(ПутьКаталога, ПутьФайла) Экспорт
Архив = Новый ЗаписьZipФайла(ПутьФайла);
Архив.Добавить(ПутьКаталога + "\*.*",
РежимСохраненияПутейZIP.СохранятьОтносительныеПути,
РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
Архив.Записать();
КонецПроцедуры
// Функция - Получить DOM-документ из XML-файла, возвращает XML-файл как DOM-модель
Функция ПолучитьDOMДокументИзXMLФайла(ПутьXMLФайла) Экспорт
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьXMLФайла);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
ЧтениеXML.Закрыть();
Возврат ДокументDOM;
КонецФункции
// Процедура - Сохранить DOM-документ как XML-файл, записывает DOM в указанный файл
Процедура СохранитьDOMДокументКАКXMLФайл(ДокументDOM, ПутьXMLФайла) Экспорт
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.ОткрытьФайл(ПутьXMLФайла);
ЗаписьDOM = Новый ЗаписьDOM();
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
ЗаписьXML.Закрыть();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Процедура - Заполнить формулы в файле конкретной печатной формы
// Алгоритм: распаковать .xlsx → изменить sheet1.xml → собрать обратно
Процедура ЗаполнитьФормулыВФайлеНазваниеВашейПечатнойФормы(ПутьДоФайла)
ВременныйКаталог = КаталогВременныхФайлов() + "\excel_temp\";
ПроверкаКаталога = Новый Файл(ВременныйКаталог);
Если НЕ ПроверкаКаталога.Существует() Тогда
Сообщить("Каталог по пути "+ПроверкаКаталога+" не существует. Создаю!");
СоздатьКаталог(ВременныйКаталог);
КонецЕсли;
ИзвлечьАрхив(ПутьДоФайла, ВременныйКаталог); // Распаковка исходного файла
ПутьДоXMLФайлаЛист1 = ВременныйКаталог + "xl\worksheets\sheet1.xml"; // Путь к XML листа 1
ДокументDOM = ПолучитьDOMДокументИзXMLФайла(ПутьДоXMLФайлаЛист1); // Чтение XML в DOM
ВсеЯчейки = ДокументDOM.ПолучитьЭлементыПоИмени("c");
Для Каждого Ячейка Из ВсеЯчейки Цикл // Обход ячеек и заполнение формул
ИмяЯчейки = Ячейка.ПолучитьАтрибут("r");
Если ИмяЯчейки = Неопределено Тогда
Продолжить;
КонецЕсли;
ИмяСтолбца = Сред(ИмяЯчейки, 1, 1); // Пример: "A1" → столбец A, строка 1
ИмяСтроки = Сред(ИмяЯчейки, 2);
НомерСтроки = Число(ИмяСтроки);
Формула = "=A1+B2"; // Здесь реализуется собственный алгоритм генерации формулы
Пока Ячейка.ЕстьДочерниеУзлы() Цикл // Очистка содержимого ячейки
Ячейка.УдалитьДочерний(Ячейка.ПервыйДочерний);
КонецЦикла;
ЭлФормула = ДокументDOM.СоздатьЭлемент("f"); // Добавление формулы
ЭлФормула.ТекстовоеСодержимое = Формула;
Ячейка.ДобавитьДочерний(ЭлФормула);
КонецЦикла;
СохранитьDOMДокументКАКXMLФайл(ДокументDOM, ПутьДоXMLФайлаЛист1); // Сохранение изменений
УдалитьФайлы(ПутьДоФайла);
СобратьАрхив(ВременныйКаталог, ПутьДоФайла); // Пересборка архива
УдалитьФайлы(ВременныйКаталог); // Очистка временного каталога
КонецПроцедуры
#КонецОбласти
// Процедура - Заполнить формулы в Excel-файл, в зависимости от имени макета вызывает соответствующую процедуру обработки
// Параметры:
// ИмяМакета - Строка - имя макета печатной формы
// ПутьФайла - Строка - путь к Excel-файлу (архив .xlsx)
Процедура ЗаполнитьФормулыВФайлеExcel(ИмяМакета, ПутьФайла) Экспорт
Если ИмяМакета = "НазваниеМакетаВашейПечатнойФормы" Тогда
ЗаполнитьФормулыВФайлеНазваниеВашейПечатнойФормы(ПутьФайла);
КонецЕсли;
КонецПроцедуры
// Процедура - Извлечь архив, распаковывает ZIP-архив в указанный каталог
Процедура ИзвлечьАрхив(ПутьФайла, ПутьКаталога) Экспорт
ДДФайла = Новый ДвоичныеДанные(ПутьФайла);
Поток = Новый ПотокВПамяти(ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ДДФайла));
Попытка
Архив = Новый ЧтениеZipФайла(Поток);
Архив.ИзвлечьВсе(ПутьКаталога, РежимВосстановленияПутейФайловZIP.Восстанавливать);
Архив.Закрыть();
Исключение
Сообщить("Ошибка при извлечении архива: " + ПутьФайла);
КонецПопытки;
Поток.Закрыть();
КонецПроцедуры
// Процедура - Собрать архив, упаковывает файлы из каталога в ZIP-архив
Процедура СобратьАрхив(ПутьКаталога, ПутьФайла) Экспорт
Архив = Новый ЗаписьZipФайла(ПутьФайла);
Архив.Добавить(ПутьКаталога + "\*.*",
РежимСохраненияПутейZIP.СохранятьОтносительныеПути,
РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
Архив.Записать();
КонецПроцедуры
// Функция - Получить DOM-документ из XML-файла, возвращает XML-файл как DOM-модель
Функция ПолучитьDOMДокументИзXMLФайла(ПутьXMLФайла) Экспорт
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьXMLФайла);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
ЧтениеXML.Закрыть();
Возврат ДокументDOM;
КонецФункции
// Процедура - Сохранить DOM-документ как XML-файл, записывает DOM в указанный файл
Процедура СохранитьDOMДокументКАКXMLФайл(ДокументDOM, ПутьXMLФайла) Экспорт
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.ОткрытьФайл(ПутьXMLФайла);
ЗаписьDOM = Новый ЗаписьDOM();
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
ЗаписьXML.Закрыть();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Процедура - Заполнить формулы в файле конкретной печатной формы
// Алгоритм: распаковать .xlsx → изменить sheet1.xml → собрать обратно
Процедура ЗаполнитьФормулыВФайлеНазваниеВашейПечатнойФормы(ПутьДоФайла)
ВременныйКаталог = КаталогВременныхФайлов() + "\excel_temp\";
ПроверкаКаталога = Новый Файл(ВременныйКаталог);
Если НЕ ПроверкаКаталога.Существует() Тогда
Сообщить("Каталог по пути "+ПроверкаКаталога+" не существует. Создаю!");
СоздатьКаталог(ВременныйКаталог);
КонецЕсли;
ИзвлечьАрхив(ПутьДоФайла, ВременныйКаталог); // Распаковка исходного файла
ПутьДоXMLФайлаЛист1 = ВременныйКаталог + "xl\worksheets\sheet1.xml"; // Путь к XML листа 1
ДокументDOM = ПолучитьDOMДокументИзXMLФайла(ПутьДоXMLФайлаЛист1); // Чтение XML в DOM
ВсеЯчейки = ДокументDOM.ПолучитьЭлементыПоИмени("c");
Для Каждого Ячейка Из ВсеЯчейки Цикл // Обход ячеек и заполнение формул
ИмяЯчейки = Ячейка.ПолучитьАтрибут("r");
Если ИмяЯчейки = Неопределено Тогда
Продолжить;
КонецЕсли;
ИмяСтолбца = Сред(ИмяЯчейки, 1, 1); // Пример: "A1" → столбец A, строка 1
ИмяСтроки = Сред(ИмяЯчейки, 2);
НомерСтроки = Число(ИмяСтроки);
Формула = "=A1+B2"; // Здесь реализуется собственный алгоритм генерации формулы
Пока Ячейка.ЕстьДочерниеУзлы() Цикл // Очистка содержимого ячейки
Ячейка.УдалитьДочерний(Ячейка.ПервыйДочерний);
КонецЦикла;
ЭлФормула = ДокументDOM.СоздатьЭлемент("f"); // Добавление формулы
ЭлФормула.ТекстовоеСодержимое = Формула;
Ячейка.ДобавитьДочерний(ЭлФормула);
КонецЦикла;
СохранитьDOMДокументКАКXMLФайл(ДокументDOM, ПутьДоXMLФайлаЛист1); // Сохранение изменений
УдалитьФайлы(ПутьДоФайла);
СобратьАрхив(ВременныйКаталог, ПутьДоФайла); // Пересборка архива
УдалитьФайлы(ВременныйКаталог); // Очистка временного каталога
КонецПроцедуры
#КонецОбласти
1
комментарий
Андрей
10 дек 2025
Крутой метод, недавно сталкивался с подобной задачей, но сделал через COM-интерфейс. Спасибо огромное!
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник