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

30.05.22

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

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

Ошибки, которые поймал при написании формул:

Ошибка при установке значения атрибута контекста (FormulaR1C1)

Ошибка при установке значения атрибута контекста (FormulaR1C1Local)

О том, как избежать появления, смотрите в конце статьи.

  1. Формируем обычный отчет в табличный документ при помощи СКД
  2. Далее, имея сформированный табличный документ на экране, начинаем выгрузку
  3. Выбираем каталог
&НаКлиенте
Процедура ВыгрузитьВЁксель(Команда)
    
    //вызываем диалог выбора каталога сохранения файла (с возможностью изменения и самого имени файла при необходимости)
    лОписаниеОповещения = Новый ОписаниеОповещения("ВыборФайлаДляСохранения",ЭтаФорма);
    лДиалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    лДиалог.Фильтр="Файлы Excel(2007-2010)|*.xlsx";
    лДиалог.ПолноеИмяФайла = СтрШаблон(("Report_for_example_%1",Формат(ТекущаяДата(),"ДФ=yyyy_MM_dd_HH_mm_ss"));                
    лДиалог.Показать(лОписаниеОповещения);
    
КонецПроцедуры

4. Выполняем выгрузку в excel

&НаКлиенте
Процедура ВыборФайлаДляСохранения(аВыбраныйФайл,аДопПараметры) Экспорт      
	
	//не выбрали куда сохранять делать дальше нечего
	Если аВыбраныйФайл = Неопределено Тогда
		Возврат;	
	КонецЕсли; 
		
    //сюда мы получим excel файл шаблона то есть файл с раскрашенными колонками и т. и т. п.
	лДвоичныеДанныеШаблона = Неопределено; 
	//тут убиваем двух зайцев получаем шаблон excel и собственно данные для помещения в excel.
	лСрРаРезультат = СложитьДанныеВМассив(лДвоичныеДанныеШаблона);
	
	//получаем количество колонок и строк будущего файла excel
	лКолонок = лСрРаРезультат.Количество();
	лСтрок = лСрРаРезультат["column_0"].Количество();
	Если лСтрок = 0 Тогда
		Возврат;
	КонецЕсли;
	
	//проверяем что шаблон файла excel получен 
	Если лДвоичныеДанныеШаблона = Неопределено Тогда
		Возврат;
	КонецЕсли;	

	лИмяШаблона = аВыбраныйФайл[0];
	лДвоичныеДанныеШаблона.Записать(лИмяШаблона);
	
	//Создаем объект excel для выгрузки данных
	Попытка
		лЕксель = Новый COMОбъект("Excel.Application");
		лЕксель.DisplayAlerts=0;    
		лЕксельВерсия=Число(лЕксель.Version);		
	Исключение
		Возврат
	КонецПопытки;
	
	лЕксельКнига = лЕксель.WorkBooks.Open(лИмяШаблона);
	лЕксельЛист = лЕксельКнига.Worksheets("Report_for_example");
	
	лчТекНомерКолонки = 1;  
	лбПервыйРаз = Истина;
	лТекПроцент=0;
	Для Каждого лЗначение из лСрРаРезультат цикл
		//демонстрируем прогресс)))
		Если Цел(лчТекНомерКолонки/лКолонок*10)>=лТекПроцент тогда
			лТекПроцент=Цел(лчТекНомерКолонки/лКолонок*10);
		КонецЕсли;	
		Состояние("Writing data..."+(лТекПроцент*10)+"%");
		//помещаем данные в excel массивами содержащими колонки отчета
		лЕксельОбласть = лЕксельЛист.Range(лЕксельЛист.Cells(2,лчТекНомерКолонки),
                             лЕксельЛист.Cells(лСтрок+1,лчТекНомерКолонки));
		лЕксельОбластьФормата = лЕксельЛист.Range(лЕксельЛист.Cells(2,лчТекНомерКолонки), 
                                    лЕксельЛист.Cells(2,лчТекНомерКолонки));
		лЕксельОбласть.NumberFormat = лЕксельОбластьФормата.NumberFormat;
		Если ТипЗнч(лЗначение.Значение) = Тип("Массив") Тогда
			лМассивДляЗаливки = Новый Массив();
			лМассивДляЗаливки.Добавить(лЗначение.Значение);
			лМассКСА = Новый COMSafeArray(лМассивДляЗаливки,"VT_VARIANT");
			лЕксельОбласть.Value = лМассКСА;
		Иначе
			//заполняем формулы
			Попытка
				лЕксельОбласть.FormulaR1C1Local = лЗначение.Значение;
			Исключение
			    лЕксельОбласть.FormulaR1C1 = лЗначение.Значение;
			КонецПопытки;
		КонецЕсли; 
		лчТекНомерКолонки = лчТекНомерКолонки + 1;
	КонецЦикла;	 
	Попытка
		//сохраняем файл после выгрузки данных
		лЕксельКнига.SaveAs(лИмяШаблона,51); 
	Исключение
		лЕксель.Quit();
		Возврат;
	КонецПопытки;
	лЕксель.Quit();

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

5. Готовим данные для выгрузки на базе табличного документа

&НаСервере
Функция СложитьДанныеВМассив(аДвоичныеДанныеШаблона)
	
	лСрРаРезультат = Новый Структура;
	ПоследняяСтрока = Результат.ВысотаТаблицы;
    ПоследняяКолонка = Результат.ШиринаТаблицы;
    лОбластьЯчеек = Результат.Область(1, 1, ПоследняяСтрока, ПоследняяКолонка);
    лИсточникДанных = Новый ОписаниеИсточникаДанных(лОбластьЯчеек);
    лПостроительОтчета = Новый ПостроительОтчета;
    лПостроительОтчета.ИсточникДанных = лИсточникДанных;
    лПостроительОтчета.Выполнить();
    лТзРезультат = лПостроительОтчета.Результат.Выгрузить();
	Для лчНомерКолонки = 0 По лТзРезультат.Колонки.Количество() - 1 Цикл
		лСрРаРезультат.Вставить(лТзРезультат.Колонки[лчНомерКолонки].Имя,лТзРезультат.ВыгрузитьКолонку(лчНомерКолонки));
	КонецЦикла;
	//далее добавляем две пустых колонки их заполнит пользователь при работе в Excel
	лСрРаРезультат.Вставить("column_1","");
	лСрРаРезультат.Вставить("column_2","");
	//добавляем колонки с формулами
	лСрРаРезультат.Вставить("column_3","=RC[-1]- IF(NOT(ISBLANK(RC[-10])),RC[-10],RC[-11])");
    лСрРаРезультат.Вставить("column_4","=IF(RC[-1]<=3,0,IF(AND(RC[-1]>3,RC[-1]<14),RC[-1],IF(RC[-1]>=14,13)))");
	лСрРаРезультат.Вставить("column_5","=IF(RC[-2]>13,RC[-2]-13,IF(RC[-2]<=13,0))");
	лСрРаРезультат.Вставить("column_6","=ROUND(RC[-2]*(RC[-24]*0.005),2)");
	лСрРаРезультат.Вставить("column_7","=ROUND(RC[-2]*(RC[-25]*0.01),2)");
	лСрРаРезультат.Вставить("column_8","=RC[-1]+RC[-2]");
	аДвоичныеДанныеШаблона = Отчеты.НашОТчет.ПолучитьМакет("ШаблонВыгрузки");
	Возврат лСрРаРезультат;
	
КонецФункции

6. Особенности формирования формул

Различия

Формула на английском

Формула на русском

При вводе числя

1.5

1,5

Разделитель

,

;

 

Если про это забыть, то получим:

Ошибка при установке значения атрибута контекста (FormulaR1C1)

Ошибка при установке значения атрибута контекста (FormulaR1C1Local)

Пример:

Формула на английском:

"=IF(RC[-1]<=3,0,IF(AND(RC[-1]>3,RC[-1]<14),RC[-1],IF(RC[-1]>=14,13)))"

"=ROUND(RC[-2]*(RC[-25]*0.01),2)"

Формула на русском:

"=ЕСЛИ(RC[-1]<=3;0;ЕСЛИ(И(RC[-1]>3;RC[-1]<14);RC[-1];ЕСЛИ(RC[-1]>=14;13)))"

"=ОКРУГЛ(RC[-2]*(RC[-25]*0,01);2)"

RC[-1] – предыдущая ячейка

RC[+1] – следующая ячейка

Заполнять формулу можно вот так:

лЕксельОбласть.FormulaR1C1Local = Формула;

Или так:

лЕксельОбласть.FormulaR1C1 Формула;

 

Надеюсь, было полезно! Если нет, не кидайтесь тухлыми помидорами.))) Просто проходите мимо.

См. также

SALE! 20%

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

Универсальная обработка для загрузки документов из Excel в 1С одним нажатием. Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, заказ, отчет комиссионера и т.д.). Не требует MS Office. Для поиска таблиц используются методы эвристического поиска. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д. Содержит модуль работы с электронной почтой и api-загрузчик отчетов о продажах маркетплейсов.

6000 5100 руб.

09.11.2016    234079    1062    898    

1003

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

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

2400 руб.

12.08.2021    35482    348    68    

155

SALE! 30%

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

Универсальная программа для распознавания сканов или фото товарных документов в 1С. Не требует указания параметров и предварительной настройки. Просто выбираете файл (PDF, JPG, DOC, XLS, HTML) выбираете документ 1С и нажимаете кнопку "Распознать и загрузить".

8400 5880 руб.

04.06.2019    106879    313    173    

326

Загрузка и выгрузка в 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 форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 10.10.2024, версия 9.8 - 9.13)

15600 руб.

20.11.2015    156033    378    378    

513

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

Загрузка данных отчета о реализации и продаже товаров из сервиса Яндекс.Маркета «Беру» в 1С из Отчетов Excel для конфигурации: Бухгалтерия предприятия, редакция 3.0; Управление торговлей, редакция 11; Управление торговлей, редакция 10.3; Управление нашей фирмой, редакция 3.0 и Розница, редакция 3.0 в документ «Отчет комиссионера о продажах».

4800 руб.

09.12.2020    25342    252    1    

114

SALE! 15%

Загрузка и выгрузка в 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. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

11100 9435 руб.

29.10.2014    216740    657    527    

456
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. vld1973 90 30.05.22 18:02 Сейчас в теме
Спасибо, сам иногда встречался, но просто переписывал формулу, пока не заработает, думал, что опечатался
Zlohobbit; +1 Ответить
2. i132 123 07.06.22 15:32 Сейчас в теме
есть другой вариант копирования формул: https://infostart.ru/public/175820/
формулы прописываешь в шаблоне а потом в новый документ копировать область ДиапозонИсточник.Copy(ДиапозонПриемник) вместе с формулами и оформлением
Zlohobbit; +1 Ответить
3. user1650208 30.08.22 17:06 Сейчас в теме
Добрый день! Возможно ли с вашей помощью сделать модуль автоматической выгрузки регистра (определенного) из 1С ЗУП 3 на адрес почты или фтп в виде таблицы эксель?
4. Zlohobbit 271 30.08.22 18:33 Сейчас в теме
(3)
(3) да конечно без проблем.
Напишите мне в Skype.
Zlohobbit
5. user635629_exter 37 18.12.22 05:58 Сейчас в теме
Добавьте, пожалуйста, отключение пересчета книги xlCalculation из https://forum.mista.ru/topic.php?id=263635
Если я вставляю большие объемы в существующую книгу с кучей других листов, что ссылаются на заполняемый, то производительность может быть низкая - еще не тестил.

это для семерки, но думаю достаточно для понимания.
//*******************************************
Процедура Сформировать()
   xlCalculationAutomatic = -4105;
   xlCalculationManual = -4135;
   Попытка
       scr = СоздатьОбъект("MSScriptControl.ScriptControl");
       scr.language = "vbscript";
       ExcelApp = scr.eval("CreateObject(""Excel.Application"")");
       ExcelApp.WorkBooks.Add();
       //Вот это, при таком обращении к ехелю нет книг в контексте
   Исключение
       Попытка
           ExcelApp = СоздатьОбъект("Excel.Application");
       Исключение
           Сообщить("Не удалось открыть Excel. " + ОписаниеОшибки());
           Возврат;
       КонецПопытки;
   КонецПопытки;
   ExcelApp.Calculation = xlCalculationManual;
КонецПроцедуры
Показать
Оставьте свое сообщение