Имя: Пароль:
1C
1С v8
Удаление диапазона колонок в файле Excel программно.
0 lirt82
 
19.11.25
09:54
Всем привет, есть самописный отчет который выгружает данные из базы 1С в установленный шаблон файла Excel, файл состоит из нескольких листов. Чтобы данные в файл корректно записывались, пользователь перед формированием отчета редактирует файл excel, а именно удаляет ненужные колонки с данными на определенных листах.
В коде формирования отчета есть фрагмент удаления диапазона колонок (нужно удалить колонки начиная с 5 до 20 включительно) с определенных листов файла excel. Код отрабатывает но удаляет колонку через одну, как это исправить? на первом снимке с 5-ой колонки я внес числа по возрастанию, на втором снимке результат выполнения кода. Колонки удалены через одну.
Фрагмент кода

ВремяНачала = ТекущаяДата();
    Состояние("Отчет формируется...", , , БиблиотекаКартинок.ДлительнаяОперация48);  
    
    Попытка
        ДанныеОтчета = ПолучитьДанныеНаСервере();
    Исключение
        Сообщить("Произошла ошибка при получении данных: "+ОписаниеОшибки());
        Excel.Workbooks.Application.DisplayAlerts = Ложь;
        Excel.Quit();
        Excel = 0; //Закрытие Excel и освобождение памяти
        Возврат;
    КонецПопытки;
        
    //удаление колонок, для корректности расчета колонки "Всего"
    МассивЛистовExcel = Новый Массив;
    МассивЛистовExcel.Добавить(Excel.Sheets(4));
    МассивЛистовExcel.Добавить(Excel.Sheets(5));
    МассивЛистовExcel.Добавить(Excel.Sheets(6));
    МассивЛистовExcel.Добавить(Excel.Sheets(7));
    МассивЛистовExcel.Добавить(Excel.Sheets(8));
    МассивЛистовExcel.Добавить(Excel.Sheets(9));
    МассивЛистовExcel.Добавить(Excel.Sheets(10));
    МассивЛистовExcel.Добавить(Excel.Sheets(11));
    МассивЛистовExcel.Добавить(Excel.Sheets(12));
    МассивЛистовExcel.Добавить(Excel.Sheets(13));
    
    Для Каждого Элемент Из МассивЛистовExcel Цикл
        Для НомерУдаляемойКолонки = 5 по 20 Цикл
            Элемент.Columns(НомерУдаляемойКолонки).Delete();
        КонецЦикла;
    КонецЦикла;
1 maxab72
 
19.11.25
09:51
ты удалил 5-ую колонку, 6-ая стала 5-ой, ее пропускаем, та как теперь удаляем новую 6-ую колонку - бывшую 7-ую.
2 Мультук
 
гуру
19.11.25
09:52
Наверное, всё же,  сверху вниз

Для НомерУдаляемойКолонки = 20 по 5 Цикл
   Элемент.Columns(НомерУдаляемойКолонки).Delete();
КонецЦикла;

Синтаксис поправьте сами
3 arsik
 
гуру
19.11.25
09:52
(0) Иди в цикле от большего к меньшему, тогда ошибки описанной в (1) избежишь.
4 lirt82
 
19.11.25
09:59
(1) (2)  (3)  аааааа))) допетрил, благодарствую
5 Волшебник
 
19.11.25
10:26
(2)
Для НомерУдаляемойКолонкиМинусом = -20 по -5 Цикл
   НомерУдаляемойКолонки = -НомерУдаляемойКолонкиМинусом; 
   Элемент.Columns(НомерУдаляемойКолонки).Delete();
КонецЦикла;
7 Kigo_Kigo
 
19.11.25
11:07
а нахер это городить?
МассивЛистовExcel = Новый Массив;
    МассивЛистовExcel.Добавить(Excel.Sheets(4));
    МассивЛистовExcel.Добавить(Excel.Sheets(5));
    МассивЛистовExcel.Добавить(Excel.Sheets(6));
    МассивЛистовExcel.Добавить(Excel.Sheets(7));
    МассивЛистовExcel.Добавить(Excel.Sheets(8));
    МассивЛистовExcel.Добавить(Excel.Sheets(9));
    МассивЛистовExcel.Добавить(Excel.Sheets(10));
    МассивЛистовExcel.Добавить(Excel.Sheets(11));
    МассивЛистовExcel.Добавить(Excel.Sheets(12));
    МассивЛистовExcel.Добавить(Excel.Sheets(13));

а че сразу

Элемент.Columns(13).Delete()
Элемент.Columns(12).Delete()
Элемент.Columns(11).Delete()
и т.д. не сделать?
нахера эти переборы и массивы?
8 paramedic
 
19.11.25
12:00
А зачем удалять по одной? Удаляете сразу весь требуемый диапазон. Не знаете как - сделайте запись макроса в Экселе и посмотрите как надо делать.