| 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) Тогда
 ПапкаПечать = ТМЦ.ТекущийЭлемент();
 КонецЕсли;
 
 |  |