1С 8.3 Заполнение формул из 1С в файлах Excel (без COM) - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Заполнение формул из 1С в файлах Excel (без COM)

Код представляет собой библиотеку для программной работы с файлами формата 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);   // Сохранение изменений
   УдалитьФайлы(ПутьДоФайла);
   СобратьАрхив(ВременныйКаталог, ПутьДоФайла);  // Пересборка архива
   УдалитьФайлы(ВременныйКаталог);  // Очистка временного каталога

КонецПроцедуры

#КонецОбласти
1
комментарий
Андрей
10 дек 2025
Крутой метод, недавно сталкивался с подобной задачей, но сделал через COM-интерфейс. Спасибо огромное!
____________________
Copyright©, «Программист 1С в г.Минске», 09.12.2025
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Назад к содержимому