4
kls2
25.10.14
✎
00:01
|
dave2000, прошу сильно не ругать если не понял тему. Что значит "шаблоны для автозаполнения", я не знаю. для создания прайса, как пример, открываем xls файл с готовой шапкой, заполняем его и сохраняем под другим именем. Если надобно нечто подобное готов делиться опытом.
Перем scr, Массив, Desktop, Document, ServiceManager, Листы, Лист;
Перем НачURL, СредURL, КонURL;
Перем Цена, ПапкаКниги, ПапкаПечать, ОсновнаяФирма, ВыбСклад;
Перем ТН, Сегодня;
//******************************************
Функция ПолучитьАвторов(ТМЦ)
Результ = "";
АвторПроизведения = СоздатьОбъект("Справочник.АвторПроизведения");;
АвторПроизведения.ИспользоватьВладельца(ТМЦ);
АвторПроизведения.ВыбратьЭлементы(1);
Пока АвторПроизведения.ПолучитьЭлемент() = 1 Цикл
Результ = СокрЛП(Результ +" "+ СокрЛП(АвторПроизведения.ТекущийЭлемент()));
КонецЦикла;
Возврат Результ;
КонецФункции /// ПолучитьАвторов()
//******************************************
Функция ПолучитьИздательства(ТМЦ)
Результ = "";
ИздательстваПроизведения = СоздатьОбъект("Справочник.ИздательстваПроизведения");;
ИздательстваПроизведения.ИспользоватьВладельца(ТМЦ);
ИздательстваПроизведения.ВыбратьЭлементы(1);
Пока ИздательстваПроизведения.ПолучитьЭлемент() = 1 Цикл
Результ = СокрЛП(Результ +" "+ СокрЛП(ИздательстваПроизведения.ТекущийЭлемент()));
КонецЦикла;
Возврат Результ;
КонецФункции /// ПолучитьИздательства()
//*******************************************
Функция ПолучитьЦену(ТМЦ)
Цена.ИспользоватьВладельца(ТМЦ);
Цена.ВыбратьЭлементы();
Пока Цена.ПолучитьЭлемент()=1 Цикл
Если СокрЛП(Цена.ТипЦен) = "Оптовые" Тогда
Возврат Цена.Цена.Получить(Сегодня);
КонецЕсли;
КонецЦикла;
КонецФункции ///ПолучитьЦену(ТМЦ)
///*******************************************
// НарисоватьГраницу(Ячейка,Кант)
//
// Параметры:
// Ячейка,Кант
//
// Возвращаемое значение:
// ЛинияГраницы (Объект)
//
// Описание:
// ТекстОписания
//
Функция НарисоватьГраницу(Ячейка,Кант)
oBorder = Ячейка.Tableborder;
oBorderline = oBorder.TopLine;
oBorderline.outerlinewidth = Кант.ВнешняяТолщинаЛинии;
oBorderline.innerlinewidth = Кант.ВнутренняяТолщинаЛинии;
oBorderline.linedistance = Кант.РасстояниеМеждуВнутрИВнешнЛиниямии;
oBorderline.color = Кант.ЦветЛинии;
Возврат oBorderline;
КонецФункции /// НарисоватьГраницу(Ячейка,Кант)
///*******************************************
/// L лист книги (объект)
/// Str Строка таблицы (число)
/// Col Колонка таблицы(число)
/// линия описывается таблицей значений из одной строки
/// пустое значние игнорирунтся.
/// Расположение (линии вокруг ячейки
/// topBorder -"верхняя граница"
/// bottomBorder -"нижняя граница"
/// leftBorder -"граница слева"
/// rightBorder -"граница спрва"
Процедура ГраницыЯчейки(L,Str,Col,topBorder="",bottomBorder="",leftBorder="",rightBorder="")
Ячейка = L.getCellByPosition(Col,Str);
Если НЕ(topBorder="") Тогда
ячейка.topBorder = НарисоватьГраницу(Ячейка,topBorder);
КонецЕсли;
Если НЕ(bottomBorder="") Тогда
ячейка.bottomBorder = НарисоватьГраницу(Ячейка,bottomBorder);
КонецЕсли;
Если НЕ(leftBorder="") Тогда
ячейка.leftBorder = НарисоватьГраницу(Ячейка,leftBorder);
КонецЕсли;
Если НЕ(rightBorder="") Тогда
ячейка.rightBorder = НарисоватьГраницу(Ячейка,rightBorder);
КонецЕсли;
КонецПроцедуры ///ГраницыЯчейки(L,Str,Col,topBorder="",bottomBorder="",leftBorder="",rightBorder="")
///*******************************************
/// L лист книги (объект)
/// Str Строка таблицы (число)
/// Col Колонка таблицы(число)
/// значение которое устанавливают в ячейку
/// тип (значения) 1-Число, 2-Строка, 3-Формула
/// ЦветТекста (текста в ячейке) "" - игнорируем
/// ЦветФона (фона самой ячейки) "" - игнорируем
Процедура ВывестиВЯчейку(L,Str,Col,значение,тип,ЦветТекста="",ЦветФона="")
Ячейка = L.getCellByPosition(Col,Str);
Если НЕ(ЦветФона="") Тогда
Ячейка.CellBackColor = ЦветФона;
КонецЕсли;
Если НЕ(ЦветТекста="") Тогда
Ячейка.charColor = ЦветТекста;
КонецЕсли;
Если тип = 1 тогда
Попытка
Ячейка.Value = значение;
Исключение
Сообщить(" ошибка число "+Col+" "+Str+" {"+значение+"}+++");
КонецПопытки;
Иначеесли тип = 2 тогда
Попытка
Ячейка.SetString(значение);
Исключение
Сообщить(" ошибка строка "+Col+" "+Str+" {"+значение+"}+++");
КонецПопытки;
;
Иначеесли тип = 3 тогда
Попытка
Ячейка.setFormula(значение);
Исключение
Сообщить(" ошибка формула "+Col+" "+Str+" {"+значение+"}+++");
КонецПопытки;
иначе
сообщить("Неизвестный параметр = "+тип);
КонецЕсли;
КонецПроцедуры ///ВывестиВЯчейку(L,Str,Col,значение,тип )
//*******************************************
Процедура Сформировать()
Лист = Листы.getByIndex(0);
Лист.setName("Прайс без картинок");
Лист.Columns.GetByIndex(1).Width = 12000; /// 2-ая колонка, первая Лист.Columns.GetByIndex(0)
Лист.Columns.GetByIndex(2).Width = 900;
Лист.Columns.GetByIndex(10).Width = 900;
Лист.Columns.GetByIndex(3).Width = 1200;
Лист.Columns.GetByIndex(4).Width = 1400;
Лист.Columns.GetByIndex(7).Width = 1400;
Лист.Columns.GetByIndex(8).Width = 3000;
Лист.Columns.GetByIndex(11).Width = 1400;
Лист.Columns.GetByIndex(12).Width = 1400;
ТонкЛин = СоздатьОбъект("ТаблицаЗначений");
ТонкЛин.ВставитьКолонку("ВнешняяТолщинаЛинии",1,,,,"ВнешняяТолщинаЛинии",,,);
ТонкЛин.ВставитьКолонку("ВнутренняяТолщинаЛинии",2,,,,"ВнутренняяТолщинаЛинии",,,);
ТонкЛин.ВставитьКолонку("РасстояниеМеждуВнутрИВнешнЛиниямии",3,,,,"РасстояниеМеждуВнутрИВнешнЛиниямии",,,);
ТонкЛин.ВставитьКолонку("ЦветЛинии",4,,,,"ЦветЛинии",,,);
ТонкЛин.НоваяСтрока();
ТонкЛин.ВнешняяТолщинаЛинии=12;
ТонкЛин.ВнутренняяТолщинаЛинии=12;
ТонкЛин.РасстояниеМеждуВнутрИВнешнЛиниямии=9;
ТонкЛин.ЦветЛинии=120;
Для клнк = 0 По 12 Цикл
Если (клнк = 0) Тогда
знч="Артикул";
ИначеЕсли (клнк = 1) Тогда
знч="Наименование";
ИначеЕсли (клнк = 2) Тогда
знч="Стандарт";
ИначеЕсли (клнк = 3) Тогда
знч="Цена";
ИначеЕсли (клнк = 4) Тогда
знч="Цена пачк";
ИначеЕсли (клнк = 5) Тогда
знч="Издательство";
ИначеЕсли (клнк = 6) Тогда
знч="Автор";
ИначеЕсли (клнк = 7) Тогда
знч="Тираж";
ИначеЕсли (клнк = 8) Тогда
знч="Переплет";
ИначеЕсли (клнк = 9) Тогда
знч="Бумага";
ИначеЕсли (клнк = 10) Тогда
знч="кол. стр.";
ИначеЕсли (клнк = 11) Тогда
знч="Год изд.";
ИначеЕсли (клнк = 12) Тогда
знч="Наличие";
КонецЕсли;
ВывестиВЯчейку(Лист,12,клнк,знч, 2);
ГраницыЯчейки(Лист,12,клнк,ТонкЛин,ТонкЛин,ТонкЛин,ТонкЛин);
КонецЦикла;
ТН.ВыбратьСтроки(); N = 0;
Пока ТН.ПолучитьСтроку() = 1 Цикл
ТМЦ = ТН.ТМЦ; N = N +1;
Артикул = СокрЛП(ТМЦ.Артикул);
Наименование= ТМЦ.ПолнНаименование;
Стандарт = ТМЦ.ОсновнаяЕдиница.Коэффициент;
Цена_экземп = ТН.ОптЦена;
Цена_пачки = Цена_экземп*Стандарт;
Издательство= ПолучитьИздательства(ТМЦ);
Автор = ПолучитьАвторов(ТМЦ);
Тираж = ?((0+ТМЦ.Тираж)=0,"",ТМЦ.Тираж);
_Формат = ТМЦ.Формат;
Переплет = ТМЦ.Переплет;
Бумага = ТМЦ.Бумага;
Стр = ТМЦ.КоличествоСтраниц;
ГодИзд = ТМЦ.ГодИздания;
Наличие = "есть";
Попытка
Если (ТМЦ.ПечататьДозволяется = 1)
Или НЕ(СокрЛП(ТМЦ.НомерИС)="") Тогда
Если (СокрЛП(ТМЦ.НомерИС)="") Тогда
ПечДозв = "+";
иначе
ПечДозв = СокрЛП(ТМЦ.НомерИС);
КонецЕсли;
иначе
ПечДозв = "";
КонецЕсли;
Исключение
ПечДозв = "";
КонецПопытки;
ПолнНазвание = СокрЛП(СокрЛП(ТМЦ.ПолнНаименование)+" "+Автор);
ПолнНазвание = СокрЛП(ПолнНазвание +" "+Издательство);
ПолнНазвание = СокрЛП(ПолнНазвание +" "+СокрЛП(?(ГодИзд=0,"",(""+ГодИзд+" г.,"))));
ПолнНазвание = СокрЛП(ПолнНазвание +" "+?((0+Стр)=0,"",(""+Стр+" стр.,")));
ПолнНазвание = СокрЛП(ПолнНазвание +" "+?(СокрЛП(Переплет)="","",("перепл.: "+Переплет+",")));
ПолнНазвание = СокрЛП(ПолнНазвание +" "+?(СокрЛП(Бумага)="","",("бум.: "+Бумага)));
Для клнк = 0 По 12 Цикл
тип =2;
Если (клнк = 0) Тогда
знч=Артикул;
ИначеЕсли (клнк = 1) Тогда
знч=Наименование;
знч=НачURL+Артикул+СредURL+Наименование+КонURL;
//Лист.setPropertyValue("Width", 100);
тип = 3;
ИначеЕсли (клнк = 2) Тогда
знч=Стандарт;
ИначеЕсли (клнк = 3) Тогда
знч=0+Цена_экземп;
ИначеЕсли (клнк = 4) Тогда
знч=0+Цена_пачки;
ИначеЕсли (клнк = 5) Тогда
знч=Издательство;
ИначеЕсли (клнк = 6) Тогда
знч=Автор;
ИначеЕсли (клнк = 7) Тогда
знч=Тираж;
ИначеЕсли (клнк = 8) Тогда
знч=Переплет;
ИначеЕсли (клнк = 9) Тогда
знч=Бумага;
ИначеЕсли (клнк = 10) Тогда
знч=Стр;
ИначеЕсли (клнк = 11) Тогда
знч=ГодИзд;
ИначеЕсли (клнк = 12) Тогда
знч=Наличие;
КонецЕсли;
Если (тип=2) Тогда
знч=СокрЛП(знч);
КонецЕсли;
ВывестиВЯчейку(Лист,(ТН.НомерСтроки+12),клнк,знч,тип );
ГраницыЯчейки(Лист,(ТН.НомерСтроки+12),клнк,ТонкЛин,ТонкЛин,ТонкЛин,ТонкЛин);
КонецЦикла;
КонецЦикла;
SaveParam = scr.Eval("ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
SaveParam.Name = "FilterName";
SaveParam.Value = "MS Excel 97";
scr.CodeObject.SetItem(0,SaveParam);
Document.storeToURL("file:///I:/Работа 1С/TEMP/Price_"+СтрЗаменить(Сегодня,".","_")+".xls",Массив);
КонецПроцедуры /// Сформировать()
//*******************************************
Процедура ДобавитьВсеЭлементы(БезВопроса=0)
Если БезВопроса=0 Тогда
Ответ = Вопрос("Список будет очищен!
|Заполнить заново? Продолжить?","Да+Нет");
Если Ответ = "Да" Тогда
Иначе
СтатусВозврата(0);
Возврат
КонецЕсли;
КонецЕсли;
ОбщРег = СоздатьОбъект("Регистры");
ОстаткиТМЦ = ОбщРег.ОстаткиТМЦ;
ТМЦ = СоздатьОбъект("Справочник.Номенклатура");
ТМЦ.ВыбратьЭлементы();
Пока ТМЦ.ПолучитьЭлемент() = 1 Цикл
Если ТМЦ.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;
Если (ТМЦ.ПринадлежитГруппе(ПапкаКниги) = 1) ИлИ
(ТМЦ.ПринадлежитГруппе(ПапкаПечать) = 1) Тогда ///все хорошо
ИНАЧЕ Продолжить;
КонецЕсли;
Если НЕ(Найти(СокрЛП(ТМЦ.Артикул),"30-0") = 0) Тогда
Продолжить;
КонецЕсли;
Остаток = ОстаткиТМЦ.СводныйОстаток(ОсновнаяФирма,ТМЦ.ТекущийЭлемент(),ВыбСклад,,"Количество");
ОптЦена = ПолучитьЦену(ТМЦ.ТекущийЭлемент());
Если (Остаток < 12) Тогда
Продолжить;
КонецЕсли;
ТН.НоваяСтрока();
ТН.Внести = 2;
ТН.ТМЦ = ТМЦ.ТекущийЭлемент();
ТН.ОптЦена = ОптЦена;
ТН.Остаток = Остаток;
КонецЦикла;
ТН.Выгрузить(ТЗ);
ТЗ.ВыводитьПиктограммы("Внести");
КонецПроцедуры ///ДобавитьВсеЭлементы()
//*******************************************
// Предопределенные процедуры
//
Процедура ПриОткрытии()
Сегодня = ТекущаяДата(); /// возможно РабочаяДата()
ДобавитьВсеЭлементы(1);
Сформировать()
КонецПроцедуры // ПриОткрытии()
///---///---///---///
/// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
///---///---///--- общие команды и функции ///---///---///---
scr = СоздатьОбъект("MSScriptControl.ScriptControl");
scr.language = "javascript";
scr.eval("Массив=new Array()");
Массив = scr.eval("Массив");
scr.AddCode("function SetItem(ind,val){Массив[ind]=val}");
ServiceManager=СоздатьОбъект("com.sun.star.ServiceManager");
scr.AddObject("ServiceManager",ServiceManager);
Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
///Document = Desktop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, Массив);
Url = "file:///"+СтрЗаменить((КаталогИБ()+"01\shablon.xls"),"\","/")+"";
Document = Desktop.LoadComponentFromURL(Url, "_blank", 0, Массив);
Листы = Document.getSheets();
НачURL="=HYPERLINK("";;
СредURL="/"";""";
КонURL=""")";
МеткаЕсть = 1; МеткиНет = 0;
Цена = СоздатьОбъект("Справочник.Цены");
ТН = СоздатьОбъект("ТаблицаЗначений");
ТН. ВставитьКолонку("Внести",1,,,,"х",,,);
ТН. ВставитьКолонку("ТМЦ",2,,,,"ТМЦ",,,);
ТН. ВставитьКолонку("ОптЦена",3,,,,"ЦЕНА",,,);
ТН. ВставитьКолонку("Остаток",4,,,,"Остаток",,,);
Фирмы = СоздатьОбъект("Справочник.Фирмы");
Если (Фирмы.НайтиПоКоду("00001")=1) Тогда
ОсновнаяФирма = Фирмы.ТекущийЭлемент();
КонецЕсли;
Склады = СоздатьОбъект("Справочник.Склады");
Если (Склады.НайтиПоКоду("00001")=1) Тогда
ВыбСклад = Склады.ТекущийЭлемент();
КонецЕсли;
ТМЦ = СоздатьОбъект("Справочник.Номенклатура");
Если (ТМЦ.НайтиПоКоду("00000001",0)=1) Тогда
ПапкаКниги = ТМЦ.ТекущийЭлемент();
КонецЕсли;
Если (ТМЦ.НайтиПоКоду("00008378",0)=1) Тогда
ПапкаПечать = ТМЦ.ТекущийЭлемент();
КонецЕсли;
|
|