1C Программирование

1С + MS Excel


В прошлый раз мною была рассмотрена задача выгрузки данных из 1С в MySQL сервер, а теперь я хочу поделиться примером работы 1С и MS Excell. Такая задача возникает например когда есь необходимость наряду с каталогом товаров на сайте опубликовать еще и прайс-лист в формате *.xls

Итак, как я делал и ранее, я привожу листинг программы и описание каждого шага:

1. Задачу оформим в виде обработки, которая при открытии сразу же будет выполнять поставленную задачу без указания каких либо параметров:

Процедура ПриОткрытии()
//Создание объектов базы 1С

ОстаткиТоваров=СоздатьОбъект(«Регистр.ОстаткиТоваров»);

Категория=СоздатьОбъект(«Справочник.КатегорииЦен»);

Спр=СоздатьОбъект(«Справочник.Номенклатура»);

Цена=СоздатьОбъект(«Справочник.Цены»);

2. Создание объектов не есть чем то сложным что следовало бы объяснять, и потому мы пропускаем сей шаг, тем более что создание конкретных объектов может отличаться от моих и зависит от конкретной задачи и базы, а вот далее мы начинаем самое интересное: создание объекта Excel Application, благодаря которому мы сможем создать и заполнить наш прайс-лист:

Ехсеl = СоздатьОбъект(«Excel.Application»);
Ехсеl.Application.Workbooks.Add();
Х=2; У=1;

3. Для вас не будет чем то сложным или непонятным синтаксис  обращения к данному объекту, если вы знакомы с VBA программирование, в противном случае вам прийдется догадываться о том, что происходит в данный момент (немного комментов: x и y — это координаты в Excel документе):

Ехсеl.ActiveSheet.Cells(Х,У).Value=»Прайс лист компании»;
Ехсеl.ActiveSheet.Cells(Х+1,У).Value=»Дата актуальности: «+ТекущаяДата()+» «+ТекущееВремя();
Ехсеl.ActiveSheet.Cells(Х+2,У).Value=»адрес компании»;
Ехсеl.ActiveSheet.Cells(Х+3,У).Value=»телефоны компании»;

небольшая особенность: к ячейке мы обращаемся по ее координатам в виде цифр (x y) а к столбцу по его координатам в виде букв («А:А»)…

Х=6;
Ехсеl.Columns(«A:A»).Select();
Ехсеl.Selection.ColumnWidth = 30;
Ехсеl.Selection.NumberFormat = «@»;
Ехсеl.Columns(«B:B»).Select();
Ехсеl.Selection.ColumnWidth = 50;
Ехсеl.Selection.NumberFormat = «@»;
Ехсеl.Columns(«C:C»).Select();
Ехсеl.Selection.ColumnWidth = 8;
Ехсеl.Selection.NumberFormat = «0,00»;

Ехсеl.ActiveSheet.Cells(Х,У).Value=»Категория»;
Ехсеl.ActiveSheet.Cells(Х,У+1).Value=»Наименование»;
Ехсеl.ActiveSheet.Cells(Х,У+2).Value=»Цена»;
Ехсеl.Range(«A»+Х+»:C»+Х).Select();
Ехсеl.Selection.Interior.ColorIndex = 36;
Ехсеl.Selection.Font.ColorIndex = 3;

Вышеуказанные код создал шапку — документу, таблицу и указал формат ячеек — текстовая (@) либо денежная единица с округлением до 2 знаков после запятой (0,00).

4. Теперь подготовка прайс-листа закончена — переходим к его заполнению, заполнять мы будем его перебирая каталог товаров и выбирая цены для каждого товара:

Х=Х+1;

Спр.ВыбратьЭлементы();

ном=1;

Пока Спр.ПолучитьЭлемент()=1 Цикл
Если (Спр.Актуальность=0) И (Спр.ЭтоГруппа()=0) Тогда
Продолжить;
КонецЕсли;
Цены=»»;
Цена.ИспользоватьВладельца(Спр.ТекущийЭлемент());
Категория.НайтиПоНаименованию(«Цена»);
Цена.НайтиПоРеквизиту(«КатегорияЦены»,Категория,0);
Цена.ИспользоватьДату(ТекущаяДата());
Цены=Цены+», ‘»+Формат(Цена.Цена,»Ч010.2″)+»‘»;

Если Спр.ЭтоГруппа()=1 Тогда
Ехсеl.Range(«A»+Х+»:C»+Х).Select();
Ехсеl.Selection.Interior.ColorIndex = 36;
Ехсеl.ActiveSheet.Cells(Х,У+1).Value=Спр.Наименование;
Иначе
Ехсеl.ActiveSheet.Cells(Х,У).Value=Спр.Родитель.Наименование;
Ехсеl.ActiveSheet.Cells(Х,У+1).Value=Спр.Наименование;
Ехсеl.ActiveSheet.Cells(Х,У+2).Value=Цена.Цена;
КонецЕсли;

ном=ном+1;
Х=Х+1;

КонецЦикла;

5. После чего нам необходимо перейти в самую первую ячейку и сохранить, закрыть созданный прайс-лист:

Ехсеl.Columns(«A:A»).Select();
Ехсеl.Application.ActiveWorkbook.SaveAs(«C:\Temp\price.xls»);
Ехсеl.Quit();

6. Последнее что мы можем проделать, это:

  • удалить старый файл на веб сервере
  • скопировать новый файл на веб сервер
  • удалить файл так как он больше не нужен

Если ФС.СуществуетФайл(«C:\Temp\price.xls»)=1 Тогда
ФС.УдалитьФайл(«\\»+СокрЛП(Константа.Сервер)+»\www\htdocs\price.xls»);
ФС.КопироватьФайл(«C:\Temp\price.xls»,»\\»+СокрЛП(Константа.Сервер)+»\www\htdocs\price.xls»,1);
ФС.УдалитьФайл(«C:\Temp\price.xls»);
КонецЕсли;
Форма.Закрыть(0);
КонецПроцедуры

Вот вроде бы и все что следовало бы рассказать, пусть в простом варианте но прайс-лист заполняется. Образец выполнения данного кода вы можете пронаблюдать по ссылке : venec.com.ua — заполнение происходит каждый час.