Всем здрасте!
Не нашел достойного и простого решения, казалось бы, обыденной задачи: выгрузка прайс-заказа для УТ 10.3 с дальнейшей его загрузкой обратно в 1С.
Взял имеющийся у меня в закромах прайс с картинками, автора "shoa" от 10.10.2013. Не смог найти здесь этой публикации, помогите, сделаю ссылку.
Сделал картинку впереди номенклатуры, добавил колонки и выгрузку в Excel.
//мифе 20171207
Процедура КоманднаяПанельСохранитьExcel(Кнопка)
//Сообщить("Пошло сохранение ... ");
ФайлПрайсЛиста = "";
// Выбираем название файла
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогВыбораФайла.Фильтр = "Файл прайс-листа (*.xls)|*.xls";
ДиалогВыбораФайла.Заголовок = "Выберите файл прайс-листа";
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
ДиалогВыбораФайла.Расширение = "xsl";
ДиалогВыбораФайла.ИндексФильтра = 0;
ДиалогВыбораФайла.ПолноеИмяФайла = "ПрайсЛист " + Формат(ТекущаяДата(), "ДФ = ""ддММгггг""");
ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Ложь;
Если ДиалогВыбораФайла.Выбрать() Тогда
ФайлПрайсЛиста = ДиалогВыбораФайла.ПолноеИмяФайла;
КонецЕсли;
// Записываем в excel "как есть"
ЭлементыФормы.ДокументРезультат.Записать(ДиалогВыбораФайла.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLS);
// Подставляем формулы
ВыбФайл = Новый Файл(ФайлПрайсЛиста);
НомерЛистаExcel = 1;
xlLastCell = 11;
Если НЕ ВыбФайл.Существует() Тогда
Сообщить("Файл не существует!");
Возврат;
КонецЕсли;
Попытка
Excel = Новый COMОбъект("Excel.Application");
//Excel = Новый COMОбъект("Calc.Application");
КнигаExcel = Excel.WorkBooks.Open(ФайлПрайсЛиста);
Состояние("Обработка файла Microsoft Excel...");
ExcelЛист = КнигаExcel.Sheets(НомерЛистаExcel);
Исключение
Сообщить("Ошибка. Не удалось открыть документ.");
Сообщить(" Подробное описание ошибки: "+ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
Возврат;
КонецПопытки;
ActiveCell = КнигаExcel.ActiveSheet.Cells.SpecialCells(xlLastCell);
RowCount = ActiveCell.Row;
ColumnCount = ActiveCell.Column;
// наши настройки
ПерваяСтрокаДанных = 11;
КолонкаИтоговая = 6;
КолонкаСуммаСтроки = 4 + мКоличествоДопПолейПосле;
КолонкаЗаказа = КолонкаСуммаСтроки - 1;
СтрокаСуммаБезСкидки = 5;
СтрокаРазмерСкидки = 6;
СтрокаСуммаСоСкидкой = 7;
СмещениеКолонкиПоГоризонтали = мКоличествоДопПолейПосле - 2; //количество допполей без суммы и заказа
СмещениеКолонкиПоВертикали = 6;
// пропишем формулы в шапке
попытка
ЯчейкаФормулы = ExcelЛист.Cells(СтрокаСуммаБезСкидки,КолонкаИтоговая); // Итоговая сумма
ЯчейкаФормулы.Formula = "=SUM(R[" + СмещениеКолонкиПоВертикали +"]C[" + СмещениеКолонкиПоГоризонтали + "]:R[" + (RowCount - СмещениеКолонкиПоВертикали + 1) + "]C[" + СмещениеКолонкиПоГоризонтали + "])";
ЯчейкаФормулы = ExcelЛист.Cells(СтрокаСуммаСоСкидкой,КолонкаИтоговая); // Итоговая сумма со скидкой
ЯчейкаФормулы.Formula = "=R[-2]C*(1-R[-1]C/100)";
исключение
конецпопытки;
// пропишем формулы для каждой строки
Для Row = ПерваяСтрокаДанных По RowCount Цикл
ЯчейкаФормулы = ExcelЛист.Cells(Row,КолонкаСуммаСтроки);
ЯчейкаФормулы.Formula = "=RC[-1]*RC[-2]";
ЯчейкаФормулы = ExcelЛист.Cells(Row,КолонкаЗаказа);
ЯчейкаФормулы.Formula = "0";
КонецЦикла;
// закрываем Excel
Excel.DisplayAlerts = FALSE;
КнигаExcel.SaveAs(ФайлПрайсЛиста,-4143);
КнигаExcel.Close();
Excel = 0;
КонецПроцедуры
Далее сделал внешнюю обработку заполнения табличной части. При регистрации необходимо добавить параметр "КолонкаЗаказ", в котором указать номер колонки, у меня "6".
Процедура Инициализировать(Объект, ИмяТабличнойЧасти = Неопределено, ТабличноеПолеОбъекта = Неопределено) Экспорт
//Объект = Документы.РеализацияТоваровУслуг.СоздатьДокумент().Ссылка; //тест
ФайлПрайсЛиста = "";
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Фильтр = "Файл прайс-листа (*.xls)|*.xls";
ДиалогВыбораФайла.Заголовок = "Выберите файл прайс-заказа";
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
ДиалогВыбораФайла.Расширение = "xsl";
ДиалогВыбораФайла.ИндексФильтра = 0;
ДиалогВыбораФайла.ПолноеИмяФайла = "";
ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Ложь;
Если ДиалогВыбораФайла.Выбрать() Тогда
ФайлПрайсЛиста = ДиалогВыбораФайла.ПолноеИмяФайла;
КонецЕсли;
ВыбФайл = Новый Файл(ФайлПрайсЛиста);
НомерЛистаExcel = 1;
xlLastCell = 11;
Если НЕ ВыбФайл.Существует() Тогда
Сообщить("Файл не существует!");
Возврат;
КонецЕсли;
Попытка
Excel = Новый COMОбъект("Excel.Application");
//Excel = Новый COMОбъект("Calc.Application");
КнигаExcel = Excel.WorkBooks.Open(ФайлПрайсЛиста);
Состояние("Обработка файла Microsoft Excel...");
ExcelЛист = КнигаExcel.Sheets(НомерЛистаExcel);
Исключение
Сообщить("Ошибка. Не удалось открыть документ.");
Сообщить(" Подробное описание ошибки: "+ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
Возврат;
КонецПопытки;
ActiveCell = КнигаExcel.ActiveSheet.Cells.SpecialCells(xlLastCell);
RowCount = ActiveCell.Row;
ColumnCount = ActiveCell.Column;
// наши настройки
КолонкаЗаказ = 0;
попытка
КолонкаЗаказ = ДополнительныеПараметры.КолонкаЗаказ;
исключение
Сообщить("Ошибка! Необходимо указать параметр заполнения ""КолонкаЗаказ""! По умолчанию используется ""6""!");
КолонкаЗаказ = 6;
КонецПопытки;
ПерваяСтрокаДанных = 11;
КолонкаНаименование = 3;
КолонкаСумма = КолонкаЗаказ + 1;
КолонкаИтоговая = 6;
СтрокаРазмерСкидки = 6;
НашДокумент = Объект;//.ПолучитьОбъект();
НашаТЧ = НашДокумент.Товары;
//посмотрим скидку
РазмерСкидки = 0;
попытка
РазмерСкидки = Число(ExcelЛист.Cells(СтрокаРазмерСкидки, КолонкаИтоговая).Value);
Исключение
КонецПопытки;
Для i = ПерваяСтрокаДанных По RowCount Цикл
попытка
НаименованиеНоменклатуры = СокрЛП(ExcelЛист.Cells(i, КолонкаНаименование).Value);
КоличествоНоменклатуры = Число(ExcelЛист.Cells(i, КолонкаЗаказ).Value);
СуммаНоменклатуры = Число(ExcelЛист.Cells(i, КолонкаСумма).Value);
исключение
Сообщить("Ошибка! Не получается распознать значение в колонке, загрузка прекращена!");
Сообщить("КолонкаНаименование: " + ExcelЛист.Cells(i, КолонкаНаименование).Value);
Сообщить("КолонкаЗаказ: " + ExcelЛист.Cells(i, КолонкаЗаказ).Value);
Сообщить("КолонкаСумма: " + ExcelЛист.Cells(i, КолонкаСумма).Value);
Сообщить("----");
// закрываем Excel
Excel.DisplayAlerts = FALSE;
КнигаExcel.Close();
Excel = 0;
Возврат;
КонецПопытки;
если КоличествоНоменклатуры = 0 тогда
продолжить;
КонецЕсли;
НашаНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(НаименованиеНоменклатуры);
если НашаНоменклатура <> Неопределено тогда
НоваяСтрока = НашаТЧ.Добавить();
НоваяСтрока.Номенклатура = НашаНоменклатура;
НоваяСтрока.Количество = КоличествоНоменклатуры;
НоваяСтрока.Сумма = СуммаНоменклатуры * (1 - РазмерСкидки/100);
НоваяСтрока.ПроцентСкидкиНаценки = РазмерСкидки;
НоваяСтрока.Цена = СуммаНоменклатуры/КоличествоНоменклатуры;
НоваяСтрока.ЕдиницаИзмерения = НашаНоменклатура.ЕдиницаХраненияОстатков;
НоваяСтрока.Коэффициент = 1;
НоваяСтрока.СтавкаНДС = НашаНоменклатура.СтавкаНДС;
НоваяСтрока.СпособСписанияОстаткаТоваров = Перечисления.СпособыСписанияОстаткаТоваров.СоСклада;
КонецЕсли;
//Сообщить(НаименованиеНоменклатуры);
КонецЦикла;
// закрываем Excel
Excel.DisplayAlerts = FALSE;
КнигаExcel.Close();
Excel = 0;
КонецПроцедуры
Работоспособность проверена на ут 10.3.45.1 и Excel 2007.
Вроде все, всем спасибо за внимание!