Фиксация колонок при сохранении Excel файла из 1С

22.06.23

Разработка - Механизмы платформы 1С

Решение давно наболевшего вопроса о потере фиксации колонок при сохранении табличного документа в 1С штатными средствами.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Фиксация колонок при сохранении Excel файла из 1С.:
.cfe 8,51Kb
5 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Открывая отчет в 1С, мы можем насладиться многими удобствами просмотра, среди которых и фиксирование шапки отчета, которое дает понимание, какие данные мы видим в ячейках. Но как только мы добавляем отчет в рассылку, большинство удобств пропадает. И если отсутствие расшифровки и возможности сразу открыть документ понятно, то пропажа фиксации шапки отчета не выглядит логичным в тех вариантах, где это должно работать. И тут каждый начинает искать решение по форумам и после изобретает свой велосипед. Сегодня рассмотрим два велосипеда, работающих с самыми распространенным форматом Excel.

 

 

 

Вариант первый. Самый распространенный

Вариант требует установленного Excel на компьютере, на котором будет выполняться. Из-за запуска всего приложения Excel работает медленнее и при не корректном кодировании может приводить к невозможности выполнения операций и пожиранию им памяти. Плюс этого варианта в том, что он работает с форматами XLS и XLSX. Кроме того, на сервере требует дополнительной настройки безопасности. Инструкция по настройке. 

Функция, реализующая данный алгоритм.
 

// Добавляет в файл XLSX фиксацию колонок с помощью "Excel.Application"
//
// Параметры:
//  ИмяФайла  - Строка - Имя обрабатываемого файла
//  ФиксацияСверху  - Число - Количество зафиксированных строк
//  ФиксацияСлева  - Число - Количество зафиксированных колонок
//
Процедура ФиксацияШапкиЛистаXlsxExcel(ИмяФайла, Знач ФиксацияСверху, Знач ФиксацияСлева) Экспорт
	
	Попытка
		
		ФиксЭ_Эксель = Новый COMОбъект("Excel.Application");
		ФиксЭ_Эксель.MergeInstances		 = Ложь;
		ФиксЭ_Эксель.DisplayAlerts		 = Ложь;
		ФиксЭ_Эксель.DefaultSaveFormat	 = 50;
		
		ФиксЭ_Книга = ФиксЭ_Эксель.Workbooks.Open(ИмяФайла);
		
		ФиксЭ_Окно				 = ФиксЭ_Книга.Windows(1);
		ФиксЭ_Окно.SplitRow		 = ФиксацияСверху;
		ФиксЭ_Окно.SplitColumn	 = ФиксацияСлева;
		ФиксЭ_Окно.FreezePanes	 = Истина;
		
		ФиксЭ_Книга.Save();
		ФиксЭ_Книга.Close();
		
		ФиксЭ_Окно	 = Неопределено;
		ФиксЭ_Книга	 = Неопределено;
		ФиксЭ_Эксель.Quit();
		ФиксЭ_Эксель = Неопределено;
		
	Исключение
		
		ФиксЭ_Окно	 = Неопределено;
		ФиксЭ_Книга	 = Неопределено;
		Если ФиксЭ_Эксель <> Неопределено Тогда 
			ФиксЭ_Эксель.Quit();
		КонецЕсли;
		ФиксЭ_Эксель = Неопределено;
		
		ФиксЭ_СтруктураСобытий = Новый Структура("ИмяСобытия, ПредставлениеУровня, Комментарий, ДатаСобытия");
		
		ФиксЭ_СтруктураСобытий.ИмяСобытия 			 = "Не возможно установить фиксацию колонок";
		ФиксЭ_СтруктураСобытий.ПредставлениеУровня	 = "Предупреждение";
		ФиксЭ_СтруктураСобытий.Комментарий 			 = "Не возможно установить фиксацию колонок, возможно не установлен Excel на сервере";
		ФиксЭ_СтруктураСобытий.ДатаСобытия 			 = ТекущаяДата();
		
		ФиксЭ_СобытияДляЖурналаРегистрации = Новый СписокЗначений();
		ФиксЭ_СобытияДляЖурналаРегистрации.Добавить(ФиксЭ_СтруктураСобытий);
		
		ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(ФиксЭ_СобытияДляЖурналаРегистрации);
		
	КонецПопытки;

КонецПроцедуры // ФиксацияШапкиЛистаXlsxExcel()

В параметрах передаются полный путь к сохраненному файлу, и сколько строк/столбцов зафиксировать.

Список констант для свойства "DefaultSaveFormat".

 

Вариант второй. Редкий, но меткий

Этот вариант работает только с форматом XLSX. Не требует дополнительных настрое и программ. Использует особенность формата XLSX, в том, что он является zip-архивом XML-файлов. Возможность работы с zip-архивами в самой платформе 1C, а для удобства работы с XML-файлами используем компонент системы Msxml2.DOMDocument. Это не потребует запуска тяжелого приложения Excel, и вообще его наличия на компьютере. Исполняется быстрее, и при ошибках влечет меньшие последствия.

Будем напрямую редактировать нужный нам XML-файл, после разархивирования файла XLSX он находится по относительному пути "\xl\worksheets\sheet1.xml". Нас интересует нода "sheetView". В нее нам нужно добавить ноду "pane" с атрибутами для фиксации шапки. Атрибуты "xSplit" и "ySplit" содержат количество фиксируемых колонок и строк. Атрибут "topLeftCell" содержит адрес первой не зафиксированной ячейки, адрес должен быть в формате "А3", "С6", при указании ячейки в формате "RxCx" Excel при открытии файла ругается на ошибки формата.

Вот и сама функция этого алгоритма.

// Добавляет в файл XLSX фиксацию колонок с помощью "Msxml2.DOMDocument"
//
// Параметры:
//  ИмяФайла  - Строка - Имя обрабатываемого файла
//  ФиксацияСверху  - Число - Количество зафиксированных строк
//  ФиксацияСлева  - Число - Количество зафиксированных колонок
//
Процедура ФиксацияШапкиЛистаXlsxXml(ИмяФайла, Знач ФиксацияСверху, Знач ФиксацияСлева) Экспорт

	Каталог = ПолучитьИмяВременногоФайла("");
	
	Попытка
		
		// Разархивируем XSLX
		ФайлZIP = Новый ЧтениеZipФайла(ИмяФайла);
		ФайлZIP.ИзвлечьВсе(Каталог);
		
		// Путь до файла с параметрами фиксации
		ПутьФайла = Каталог + "\xl\worksheets\sheet1.xml";
		
		// Читаем XML документ
		ХМЛДокумент = Новый COMОбъект("Msxml2.DOMDocument");
		ХМЛДокумент.validateOnParse = true;  
		ХМЛДокумент.load(ПутьФайла);
		
		// Схема по умолчанию
		XMLNS = ХМЛДокумент.selectSingleNode("//worksheet").getAttribute("xmlns");
		
		// Получаем родительскую ноду ноду документа для параметров фиксации
		ХМЛНоде = ХМЛДокумент.selectSingleNode("//sheetView");
		
		// Создаем ноду с параметрами фиксации
		НоваяХМЛНода = ХМЛДокумент.createNode(1, "pane", XMLNS);
		
		// Фиксация по горизонтали
		ФиксацияСлева = ?(ФиксацияСлева > 25, 25, ФиксацияСлева); 
		Если ФиксацияСлева > 0 Тогда
			НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "xSplit", XMLNS);
			НовыйХМЛАттрибут.value = Строка(ФиксацияСлева);
			НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		КонецЕсли;
		
		// Фиксация по вертикали
		Если ФиксацияСверху > 0 Тогда
			НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "ySplit", XMLNS);
			НовыйХМЛАттрибут.value = Строка(ФиксацияСверху);
			НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		КонецЕсли;
		
		// Фиксация ячейка
		БуквыДляКонвертации = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
		БукваКолонки = Сред(БуквыДляКонвертации, ФиксацияСлева + 1, 1);
		АдресЯчейки = Сред(БуквыДляКонвертации, ФиксацияСлева + 1, 1) + Строка(ФиксацияСверху + 1);
		НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "topLeftCell", XMLNS);
		НовыйХМЛАттрибут.value = АдресЯчейки;
		НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		
		// Фиксация направление
		НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "activePane", XMLNS);
		НовыйХМЛАттрибут.value = "bottomLeft";
		НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		
		// Фиксация включена
		НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "state", XMLNS);
		НовыйХМЛАттрибут.value = "frozen";
		НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		
		// Добавляем в родительскую ноду подготовленную ноду с параметрами фиксации
		ХМЛНоде.appendChild(НоваяХМЛНода);
		
		ХМЛДокумент.save(ПутьФайла);
		
		// Архивируем XLSX
		ФайлZIP = Новый ЗаписьZipФайла(ИмяФайла, , , МетодСжатияZIP.Сжатие);
		ФайлZIP.Добавить(Каталог + "\[Content_Types].xml", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
		ФайлZIP.Добавить(Каталог + "\xl\", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
		ФайлZIP.Добавить(Каталог + "\_rels\", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
		ФайлZIP.Записать();
		
		УдалитьФайлы(Каталог);
		
	Исключение
		УдалитьФайлы(Каталог);
	КонецПопытки;
	
КонецПроцедуры // ФиксацияШапкиЛистаXlsxXml()

Параметры такие же, как и в первом варианте.

 

А что же у нас с рассылкой отчетов

Для того, чтобы это работало при рассылке отчетов, нам нужно добавить код в функцию "ПередСохранениемТабличногоДокументаВФормат" модуля "РассылкаОтчетовПереопределяемый". Или добавить ее в расширение.

&После("ПередСохранениемТабличногоДокументаВФормат")
Процедура ФиксЭ_ПередСохранениемТабличногоДокументаВФормат(СтандартнаяОбработка, ТабличныйДокумент, Формат, ПолноеИмяФайла)
	
	Если ОбщегоНазначения.ЭтоWindowsСервер() И Формат = Перечисления.ФорматыСохраненияОтчетов.XLSX И (ТабличныйДокумент.ФиксацияСверху > 0 Или ТабличныйДокумент.ФиксацияСлева > 0) Тогда
		
		ТабличныйДокумент.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
		ФиксЭ_ОбработкаФайловЭксель.ФиксацияШапкиЛистаXlsxXml(ПолноеИмяФайла, ТабличныйДокумент.ФиксацияСверху, ТабличныйДокумент.ФиксацияСлева);
		СтандартнаяОбработка = Ложь;
		
	КонецЕсли;
	
КонецПроцедуры

 

Вот теперь стало выглядеть лучше

 

 

Расширение

В расширении реализованы оба эти варианта решения в модуле "ФиксЭ_ОбработкаФайловЭксель". И переопределение процедуры сохранения отчета в формате XLSX. Расширение реализовано для 1С:ERP Управление предприятием 2. Проверено на версии  2.5.10.52, 2.5.12.53.

В остальных типовых конфигурациях, содержащих подсистему "Рассылка отчетов", реализуется аналогично.

К сожалению, в стандартной общей форме отчета не реализована возможность переопределения функции сохранения отчета в файл, поэтому тут все еще каждый будет изобретать свой велосипед. Но я надеюсь, что теперь это будет гораздо проще сделать.

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

фиксация колонок Excel

См. также

Загрузка и выгрузка в Excel Маркетплейсы Программист Бухгалтер Пользователь 1С:Предприятие 8 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.

5490 руб.

12.08.2021    46380    586    71    

222

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

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

12444 руб.

29.10.2014    233216    752    536    

501

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

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

6100 руб.

24.01.2021    25076    122    0    

63

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Бухгалтер Пользователь 1С:Предприятие 8 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 форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 14.05.2026, версия 9.3.1 - 10.7.2)

20740 руб.

20.11.2015    175706    427    397    

544
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. nadrey24 12.03.25 18:16 Сейчас в теме
Добрый день, подскажите пожалуйста есть у вас пример как по второму варианту добавить фильтры на столбцы? Заранее спасибо.
2. e-rogov 8 17.05.26 16:29 Сейчас в теме
немного упростил
&НаКлиенте
Асинх Функция ТабДок_СохрФиксОбласть(ТабДок, Знач ПолнИмяФайла) Экспорт
	#Если Сервер И НЕ Сервер Тогда // Ctrl+Space
		ТабДок = Новый ТабличныйДокумент();
	#КонецЕсли
	Если НЕ СтрЗаканчиваетсяНа(ВРег(ПолнИмяФайла), ".XLSX") Тогда
		ПолнИмяФайла = ПолнИмяФайла + ".XLSX";
	КонецЕсли;
	КатталВремФайл = Ждать КаталогВременныхФайловАсинх() + Новый УникальныйИдентификатор();
	СохрУдачно = Ждать ТабДок.ЗаписатьАсинх(ПолнИмяФайла, ТипФайлаТабличногоДокумента.XLSX, );
	Если (ТабДок.ФиксацияСверху) ИЛИ (ТабДок.ФиксацияСлева) Тогда
		// Разархивируем XSLX
		ФайлZIP = Новый ЧтениеZipФайла(ПолнИмяФайла);
		ФайлZIP.ИзвлечьВсе(КатталВремФайл);
		// Путь до файла с параметрами фиксации
		ПутьФайла = КатталВремФайл + "\xl\worksheets\sheet1.xml";
		// Читаем XML документ
		ХМЛДокумент = Новый COMОбъект("Msxml2.DOMDocument");
		ХМЛДокумент.validateOnParse = true;  
		ХМЛДокумент.load(ПутьФайла);
		// Схема по умолчанию
		XMLNS = ХМЛДокумент.selectSingleNode("//worksheet").getAttribute("xmlns");
		// Получаем родительскую ноду ноду документа для параметров фиксации
		ХМЛНоде = ХМЛДокумент.selectSingleNode("//sheetView");
		// Создаем ноду с параметрами фиксации
		НоваяХМЛНода = ХМЛДокумент.createNode(1, "pane", XMLNS);
		// Фиксация по горизонтали
		НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "xSplit", XMLNS);
		НовыйХМЛАттрибут.value  = Формат(0 + ТабДок.ФиксацияСлева, "ЧН=0; ЧГ=0");
		НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		// Фиксация по вертикали
		НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "ySplit", XMLNS);
		НовыйХМЛАттрибут.value  = Формат(0 + ТабДок.ФиксацияСверху, "ЧН=0; ЧГ=0");
		НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		// Фиксация ячейка
		НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "topLeftCell", XMLNS);
		НовыйХМЛАттрибут.value  = Символ(КодСимвола("A") + ТабДок.ФиксацияСлева) + Формат(1 + ТабДок.ФиксацияСверху, "ЧН=0; ЧГ=0");
		НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		// Фиксация направление
		НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "activePane", XMLNS);
		НовыйХМЛАттрибут.value  = "bottomLeft";
		НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		// Фиксация включена
		НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "state", XMLNS);
		НовыйХМЛАттрибут.value  = "frozen";
		НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		// Добавляем в родительскую ноду подготовленную ноду с параметрами фиксации
		ХМЛНоде.appendChild(НоваяХМЛНода);
		ХМЛДокумент.save(ПутьФайла);
		// Архивируем XLSX
		ФайлZIP = Новый ЗаписьZipФайла(ПолнИмяФайла, , , МетодСжатияZIP.Сжатие);
		ФайлZIP.Добавить(КатталВремФайл + "\[Content_Types].xml", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
		ФайлZIP.Добавить(КатталВремФайл + "\xl\", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
		ФайлZIP.Добавить(КатталВремФайл + "\_rels\", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
		ФайлZIP.Записать();
	КонецЕсли;
	Ждать УдалитьФайлыАсинх(КатталВремФайл);
	Возврат СохрУдачно;	
КонецФункции// ТабДок_СохрФиксОбласть
Показать
3. e-rogov 8 23.05.26 00:19 Сейчас в теме
Вариант с фильтром до фиксированной части

&НаКлиенте
Асинх Функция ТабДок_СохрФиксОбласть(ТабДок, Знач ПолнИмяФайла, УбратьСтильСсылокR1C1 = Истина) Экспорт
	#Если Сервер И НЕ Сервер Тогда // Ctrl+Space
		ТабДок = Новый ТабличныйДокумент();
	#КонецЕсли
	Если НЕ СтрЗаканчиваетсяНа(ВРег(ПолнИмяФайла), ".XLSX") Тогда
		ПолнИмяФайла = ПолнИмяФайла + ".XLSX";
	КонецЕсли;
	КатталВремФайл = Ждать КаталогВременныхФайловАсинх() + Новый УникальныйИдентификатор();
	СохрУдачно = Ждать ТабДок.ЗаписатьАсинх(ПолнИмяФайла, ТипФайлаТабличногоДокумента.XLSX, );
	Если (ТабДок.ФиксацияСверху) ИЛИ (ТабДок.ФиксацияСлева) Тогда
		// Разархивируем XSLX
		ФайлZIP = Новый ЧтениеZipФайла(ПолнИмяФайла);
		ФайлZIP.ИзвлечьВсе(КатталВремФайл);
		Если (УбратьСтильСсылокR1C1) Тогда
			// Путь к workbook.xml
			ПутьФайла = КатталВремФайл + "\xl\workbook.xml";
			// Загружаем XML через Msxml2.DOMDocument
			ХМЛДокумент = Новый COMОбъект("Msxml2.DOMDocument");
			ХМЛДокумент.validateOnParse = Ложь;
			ХМЛДокумент.load(ПутьФайла);
			Если ХМЛДокумент.parseError.errorCode <> 0 Тогда
				ВызватьИсключение "Ошибка загрузки XML: " + ХМЛДокумент.parseError.reason;
			КонецЕсли;
			// Получаем пространство имён
			XMLNS = ХМЛДокумент.selectSingleNode("//workbook").getAttribute("xmlns");
			// Ищем ноду <calcPr>
			НодаCalcPr = ХМЛДокумент.selectSingleNode("//calcPr");
			Если (НодаCalcPr = Неопределено) Тогда
				// Если нода не найдена, создаём её
				НодаCalcPr = ХМЛДокумент.createNode(1, "calcPr", XMLNS);
			КонецЕсли;
			// Устанавливаем атрибут refMode="A1"
			НодаCalcPr.setAttribute("refMode", "A1");
			// Если ноды не было, добавляем её в документ
			Если (НодаCalcPr.parentNode = Неопределено) Тогда
				РодительскаяНода = ХМЛДокумент.selectSingleNode("//workbook");
				Если (РодительскаяНода <> Неопределено) Тогда
					РодительскаяНода.appendChild(НодаCalcPr);
				Иначе
					ВызватьИсключение "Не найдена нода <workbook> для добавления <calcPr>";
				КонецЕсли;
			КонецЕсли;
			// Сохраняем изменённый XML
			ХМЛДокумент.save(ПутьФайла);
		КонецЕсли;
		// Путь до файла с параметрами фиксации
		ПутьФайла = КатталВремФайл + "\xl\worksheets\sheet1.xml";
		// Читаем XML документ
		ХМЛДокумент = Новый COMОбъект("Msxml2.DOMDocument");
		ХМЛДокумент.validateOnParse = true;  
		ХМЛДокумент.load(ПутьФайла);
		Если (ТабДок.ФиксацияСверху) Тогда
			МаксБукваФильтра = Символ(КодСимвола("A") - 1 + Мин(ТабДок.ШиринаТаблицы, КодСимвола("Z")-КодСимвола("A")));
			// Находим все ноды ячеек (<c>) для определения ширины таблицы
			ВсеЯчейкиЛиста = ХМЛДокумент.selectNodes("//sheetData/row/c");
			Для Каждого Ячейка1 Из ВсеЯчейкиЛиста Цикл
				// Получаем атрибут r (адрес ячейки, например A1, BZ25)
				АдресЯчейки1 = Ячейка1.getAttribute("r");
				Если (АдресЯчейки1 <> Неопределено) Тогда
					// Извлекаем буквенную часть (обозначение колонки)
					БуквыКолонки = СтрСоединить(СтрРазделить(АдресЯчейки1,"0123456789"));
					Если (СтрДлина(БуквыКолонки) > СтрДлина(МаксБукваФильтра)) ИЛИ (БуквыКолонки > МаксБукваФильтра) Тогда
						МаксБукваФильтра = БуквыКолонки;
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;			
			XMLNS = ХМЛДокумент.selectSingleNode("//worksheet").getAttribute("xmlns");
			Нода_autoFilter = ХМЛДокумент.createNode(1, "autoFilter", XMLNS);
			Нода_autoFilter.setAttribute("ref", "A" + ТабДок.ФиксацияСверху + ":" + МаксБукваФильтра + ТабДок.ФиксацияСверху);
			// Вставляем ноду сразу после <sheetData>
			НодаSheetData = ХМЛДокумент.selectSingleNode("//sheetData");
			Если (НодаSheetData.nextSibling = Неопределено) Тогда
				// Если <sheetData> — последний элемент, просто добавляем в конец
				НодаSheetData.parentNode.appendChild(Нода_autoFilter);
			Иначе
				// Вставляем перед следующим элементом (т.е. сразу после <sheetData>)
				НодаSheetData.parentNode.insertBefore(Нода_autoFilter, НодаSheetData.nextSibling);
			КонецЕсли;
		КонецЕсли; //autoFilter 
		// Схема по умолчанию
		XMLNS = ХМЛДокумент.selectSingleNode("//worksheet").getAttribute("xmlns");
		// Получаем родительскую ноду ноду документа для параметров фиксации
		ХМЛНоде = ХМЛДокумент.selectSingleNode("//sheetView");
		// Создаем ноду с параметрами фиксации
		НоваяХМЛНода = ХМЛДокумент.createNode(1, "pane", XMLNS);
		// Фиксация по горизонтали
		НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "xSplit", XMLNS);
		НовыйХМЛАттрибут.value  = Формат(0 + ТабДок.ФиксацияСлева, "ЧН=0; ЧГ=0");
		НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		// Фиксация по вертикали
		НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "ySplit", XMLNS);
		НовыйХМЛАттрибут.value  = Формат(0 + ТабДок.ФиксацияСверху, "ЧН=0; ЧГ=0");
		НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		// Фиксация ячейка
		НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "topLeftCell", XMLNS);
		НовыйХМЛАттрибут.value  = Символ(КодСимвола("A") + ТабДок.ФиксацияСлева) + Формат(1 + ТабДок.ФиксацияСверху, "ЧН=0; ЧГ=0");
		НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		// Фиксация направление
		НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "activePane", XMLNS);
		НовыйХМЛАттрибут.value  = "bottomLeft";
		НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		// Фиксация включена
		НовыйХМЛАттрибут = ХМЛДокумент.createNode(2, "state", XMLNS);
		НовыйХМЛАттрибут.value  = "frozen";
		НоваяХМЛНода.setAttributeNode(НовыйХМЛАттрибут);
		// Добавляем в родительскую ноду подготовленную ноду с параметрами фиксации
		ХМЛНоде.appendChild(НоваяХМЛНода);
		ХМЛДокумент.save(ПутьФайла);
		// Архивируем XLSX
		ФайлZIP = Новый ЗаписьZipФайла(ПолнИмяФайла, , , МетодСжатияZIP.Сжатие);
		ФайлZIP.Добавить(КатталВремФайл + "\[Content_Types].xml", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
		ФайлZIP.Добавить(КатталВремФайл + "\xl\", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
		ФайлZIP.Добавить(КатталВремФайл + "\_rels\", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
		ФайлZIP.Записать();
	КонецЕсли;
	Ждать УдалитьФайлыАсинх(КатталВремФайл);
	Возврат СохрУдачно;	
КонецФункции// ТабДок_СохрФиксОбласть
Показать
Для отправки сообщения требуется регистрация/авторизация