v7plus.dll - отсутствует CLSID либо отсутствует интерфейс llnitDone Категория:
Администрирование Обмен данными 1Сv8 Управление Торговлей 10.1 и virtuemart Задача: создать обмен 1с v8 управление торговлей 10.1 и virtuemart .
Что такое VM можно почитать тут www.virtuemart.ru, вкраце - это компонент интернет магазина/каталога товаров к известному CMS движку Joomla.
Код 1C v 8.х Процедура СнятиеФлагаПустыхГрупп(Кнопка)
СтрПодключения = "DSN=mySQL_ishop;";
СтрПодключения = СтрПодключения+"Database=joomla;";
СтрПодключения = СтрПодключения+"Uid=Sa;";
СтрПодключения = СтрПодключения+"Pwd=хххххххх;";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрПодключения);
RS = Новый COMОбъект("ADODB.Recordset");
RSIDProduct= Новый COMОбъект("ADODB.Recordset");
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
Сообщить (Строка (ТекущаяДата()) + " обновляем флаг пустых групп");
Запрос =Новый Запрос;
ЗАпрос.Текст ="ВЫБРАТЬ РАЗЛИЧНЫЕ
| Номенклатура.ЭтоГруппа,
| Номенклатура.НеОтображатьWeb,
| Номенклатура.НеОтображатьНикогда,
| Номенклатура.Код КАК Код,
| Номенклатура.Артикул,
| Номенклатура.ПустойОстаток
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ИСТИНА";
// | И (Номенклатура.ПустойОстаток = ИСТИНА
// | ИЛИ Номенклатура.НеОтображатьWeb = ИСТИНА
// | ИЛИ Номенклатура.НеОтображатьНикогда = ИСТИНА)";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ПустойОстаток ИЛИ Выборка.НеОтображатьНикогда ИЛИ Выборка.НеОтображатьWEB Тогда
АпдейтГрупп = "UPD ATE jos_vm_category SET category_publish='N' WHERE category_description='"+Выборка.Код+"'" ;
Иначе
АпдейтГрупп = "UPD ATE jos_vm_category SET category_publish='Y' WHERE category_description='"+Выборка.Код+"'" ;
КонецЕсли;
Command.CommandText = АпдейтГрупп;
Command.CommandType = 1;
Попытка
РекордСет = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Процедура КнопкаВыполнитьНажатие(Кнопка)
СтрПодключения = "DSN=mySQL_ishop;";
СтрПодключения = СтрПодключения+"Database=joomla;";
СтрПодключения = СтрПодключения+"Uid=Sa;";
СтрПодключения = СтрПодключения+"Pwd=ххххххх;";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрПодключения);
RS = Новый COMОбъект("ADODB.Recordset");
RSIDProduct= Новый COMОбъект("ADODB.Recordset");
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
// выберем запросом все группы товаров
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.ПометкаУдаления,
| Номенклатура.Предопределенный,
| Номенклатура.Родитель,
| Номенклатура.ЭтоГруппа,
| Номенклатура.Код,
| Номенклатура.Наименование,
| Номенклатура.НеОтображатьWeb,
| Номенклатура.НеОтображатьНикогда,
| Номенклатура.Артикул,
| Номенклатура.ПустойОстаток
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ИСТИНА";
// | И Номенклатура.Родитель = &Родитель";
// Запрос.УстановитьПараметр("Родитель",Справочники.Номенклатура.ПустаяСсылка());
Результат = Запрос.Выполнить();
Выборка= Результат.Выбрать();
ЭлементыФормы.Индикатор1.МинимальноеЗначение = 0;
ЭлементыФормы.Индикатор1.МаксимальноеЗначение = Выборка.Количество();
н=0;
Пока Выборка.Следующий() Цикл
н=н+1;
// запрос существования товара в базе виртуемарта
query = "
|SEL ECT category_id
|FR OM jos_vm_category WHERE category_description='"+Выборка.Код+"' limit 1";
RSIDProduct.CursorType = 3;
RSIDProduct.Open(query, Connection);
Если RSIDProduct.EOF() И RSIDProduct.BOF() Тогда
СтрН = СтрЗаменить(Строка(н)," ","");
//пишем группы верхнего уровня
// если группа имеет признак того что-бы ее не выгружать на web то отменим публикацию // необходимо для оптимизации добавить рекурсию по родительскому каталогу
Если Выборка.НеОтображатьWeb или Выборка.НеОтображатьНикогда или Выборка.Родитель.НеОтображатьНикогда или Выборка.Родитель.НеОтображатьWeb или Выборка.ПустойОстаток
Тогда
query = "ins ert into jos_vm_category (vendor_id , category_name ,category_description, category_publish , category_browsepage , products_per_row , category_flypage, list_order )
|values ('1' , '"+Выборка.НАИМЕНОВАНИЕ+"' ,'"+Выборка.Код+"', 'N', 'managed' , '1' , 'flypage.tpl', '1')";
// иначе публикуем
Иначе
query = "ins ert into jos_vm_category (
|vendor_id ,
|category_name ,
|category_description,
|category_publish ,
|category_browsepage ,
|products_per_row ,
|category_flypage,
|list_order )
|values ('1' , '"+Выборка.НАИМЕНОВАНИЕ+"' ,'"+Выборка.Код+"', 'Y', 'managed' , '1' , 'flypage.tpl', '1')";
КонецЕсли;
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
Сообщить (Выборка.Код);
Сообщить (Формат (н,"ЧГ=0"));
КонецПопытки;
query = "
|SEL ECT *
|FR OM jos_vm_category WHERE category_description='"+Выборка.Код+"' limit 1";
RS.Open(query, Connection);
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
ИДГруппы = RS.Fields("category_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
query = "ins ert into jos_vm_category_xref ( `category_parent_id` , `category_child_id` )
|values ( '"+0+"' , '"+Формат(ИДгруппы,"ЧГ=0")+"' )";
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (Выборка.Код);
Сообщить(ОписаниеОшибки());
КонецПопытки;
ОбработкаПрерыванияПользователя();
// Состояние("Обновляем группу товаров " + Выборка.Наименование);
КонецЕсли;
Индикатор1=н;
RSIDProduct.Close();
КонецЦикла;
Сообщить ("обновлено " + н+ " групп");
// обновим статус публикацию групп
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.ПометкаУдаления,
| Номенклатура.Предопределенный,
| Номенклатура.Родитель.Код КАК КодРодителя,
| Номенклатура.ЭтоГруппа,
| Номенклатура.Код,
| Номенклатура.Наименование,
| Номенклатура.НеОтображатьWeb,
| Номенклатура.НеОтображатьНикогда
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ИСТИНА
| И (НЕ Номенклатура.Родитель = &Родитель)";
Запрос.УстановитьПараметр("Родитель",Справочники.Номенклатура.ПустаяСсылка());
Результат = Запрос.Выполнить();
Выборка= Результат.Выбрать();
ЭлементыФормы.Индикатор1.МинимальноеЗначение = 0;
ЭлементыФормы.Индикатор1.МаксимальноеЗначение = Выборка.Количество();
н=0 ;
Сообщить ("Строим структуру...");
Пока Выборка.Следующий() Цикл
н=н+1;
// Если не Выборка.Ссылка.Уровень=0 тогда
//1 найдем айди родителя и категории в виртуамарте
query = "
|SEL ECT *
|FR OM jos_vm_category WHERE category_description='"+Выборка.КодРодителя+"' limit 1";
RS.Open(query, Connection);
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
ИДРодителя = RS.Fields("category_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
query = "
|SEL ECT *
|FR OM jos_vm_category WHERE category_description='"+Выборка.Код+"' limit 1";
RS.Open(query, Connection);
Попытка
RS.MoveFirst();
Исключение
Сообщить (Выборка.Код);
КонецПопытки;
Пока RS.EOF() = 0 Цикл
ИДГруппы = RS.Fields("category_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
//найдем и завалим запись в категории
query = "delete fr om jos_vm_category_xref where category_child_id='"+Формат(ИДгруппы,"ЧГ=0")+"'";
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (Выборка.Код);
Сообщить(ОписаниеОшибки());
КонецПопытки;
// добавим запись в категорию
query = "ins ert into jos_vm_category_xref ( category_parent_id , category_child_id)
|values ( '"+Формат(ИДРодителя,"ЧГ=0")+"' , '"+Формат(ИДгруппы,"ЧГ=0")+"' )";
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (Выборка.Код);
Сообщить(ОписаниеОшибки());
КонецПопытки;
Индикатор1=н;
// КонецЕсли;
КонецЦикла;
Сообщить ("обновлена структура " + н+ " групп");
// RS.Close();
Connection.Close();
КонецПроцедуры
Процедура ОсновныеДействияФормыОчистьТАблицыSQL(Кнопка)
СтрПодключения = "DSN=mySQL_ishop;";
СтрПодключения = СтрПодключения+"Database=joomla;";
СтрПодключения = СтрПодключения+"Uid=Sa;";
СтрПодключения = СтрПодключения+"Pwd=ххххххх;";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрПодключения);
RS = Новый COMОбъект("ADODB.Recordset");
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
query ="
|DELETE FR OM jos_vm_category";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
query ="
|DELETE FR OM jos_vm_category_xref";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
query ="
|DELETE FR OM jos_vm_product";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
query ="
|DELETE FR OM jos_vm_product_category_xref";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
query ="
|DELETE FR OM jos_vm_product_price";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
// RS.Close();
Connection.Close();
КонецПроцедуры
Процедура ОсновныеДействияФормыОбновитьТовары(Кнопка)
Сообщить (Строка (ТекущаяДата()) + " обновляем группы товаров...");
КнопкаВыполнитьНажатие(1);
СтрПодключения = "DSN=mySQL_ishop;";
СтрПодключения = СтрПодключения+"Database=joomla;";
СтрПодключения = СтрПодключения+"Uid=Sa;";
СтрПодключения = СтрПодключения+"Pwd=ххххххх;";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрПодключения);
RS = Новый COMОбъект("ADODB.Recordset");
RSIDProduct = Новый COMОбъект("ADODB.Recordset");
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
Склад = Константы.СкладРозница.Получить();
Сообщить (Строка (ТекущаяДата()) + " распубликовываем отсутсвующие товары");
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток КАК Остаток,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Артикул КАК Артикул,
| ЕСТЬNULL(ЕСТЬNULL(ОстаткиТоваровКомпанииОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0), 0) КАК ДоступноеКоличество,
| ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0) КАК Заказы
|ИЗ
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&КонецДня, СкладКомпании = &Склад) КАК ОстаткиТоваровКомпанииОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Остатки(&КонецДня, ) КАК ЗаказыПокупателейОстатки
| ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = ЗаказыПокупателейОстатки.Номенклатура
|ГДЕ
| ОстаткиТоваровКомпанииОстатки.Заказ = &ПустойЗаказ
| И ЕСТЬNULL(ЕСТЬNULL(ОстаткиТоваровКомпанииОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0), 0) > 0
| И (НЕ ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр = 0)
| И (НЕ ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр2 = 0)";
Запрос.УстановитьПараметр("ПустойЗаказ", Документы.ЗаказПокупателя.ПустаяСсылка());
Запрос.УстановитьПараметр("Склад",Склад );
Запрос.УстановитьПараметр("КонецДня",КонецДня (ТекущаяДата()));
// Запрос.УстановитьПараметр("Артикул",Артикул);
ТЗостатоков = Запрос.Выполнить().Выгрузить();
// ТЗостатоков.ВыбратьСтроку();
query = "
|SEL ECT product_sku, product_id
|FR OM jos_vm_product";
RS.Open(query, Connection);
Если (НЕ RS.EOF()) И (НЕ RS.BOF()) Тогда
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
Артикул = RS.Fields("product_sku").Value;
ПродуктИД = RS.Fields("product_id").Value;
// Если Выборка.Количество()= 0 Тогда
Если ТЗостатоков.Найти(Артикул,"Артикул")= Неопределено Тогда
АпдейтВиртмарта = "UPD ATE jos_vm_product SET product_in_stock= '0',product_publish='N' WHERE product_sku='"+Артикул+"'" ;
Command.CommandText = АпдейтВиртмарта;
Command.CommandType = 1;
Попытка
РекордСет = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
RS.MoveNext();
КонецЦикла;
КонецЕсли;
RS.Close();
//** модуль обновление цен
Сообщить (Строка (ТекущаяДата()) + " начинаем обновление цен на сайте...");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток КАК Остаток,
| ОстаткиТоваровКомпанииОстатки.Номенклатура КАК Номенклатура,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Код КАК Код,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Артикул КАК Артикул,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Наименование КАК Наименование,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Родитель.Код КАК РодительКОД,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Родитель.Артикул КАК РодительАртикул,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр КАК WEbЦЕнаУПР,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр2 КАК WEbЦЕнаУПР2,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.НеВыводитьНаСайт КАК НеВыводитьНаСайт,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Родитель.НеОтображатьWeb КАК НеОтображатьWeb,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Родитель.НеОтображатьНикогда КАК НеОтображатьНикогда,
| ЕСТЬNULL(ЕСТЬNULL(ОстаткиТоваровКомпанииОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0), 0) КАК ДоступноеКоличество,
| ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0) КАК Заказы
|ИЗ
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&КонецДня, СкладКомпании = &Склад) КАК ОстаткиТоваровКомпанииОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Остатки(&КонецДня, ) КАК ЗаказыПокупателейОстатки
| ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = ЗаказыПокупателейОстатки.Номенклатура
|ГДЕ
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток > 0
| И ОстаткиТоваровКомпанииОстатки.Заказ = &ПустойЗаказ
| И (НЕ ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр = 0)
| И (НЕ ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр2 = 0)";
Запрос.УстановитьПараметр("ПустойЗаказ", Документы.ЗаказПокупателя.ПустаяСсылка());
Запрос.УстановитьПараметр("Склад", Справочники.СкладыКомпании.НайтиПоКоду("00002"));
Запрос.УстановитьПараметр("КонецДня",КонецДня(ТекущаяДата()));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
ЭлементыФормы.Индикатор1.МинимальноеЗначение = 0;
ЭлементыФормы.Индикатор1.МаксимальноеЗначение = Выборка.Количество();
н=0 ;
ЗапросКурса = Новый Запрос;
ЗапросКурса.Текст = "ВЫБРАТЬ
| КурсыВалютСрезПоследних.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&ТекущаяДата, ) КАК КурсыВалютСрезПоследних
|ГДЕ
| КурсыВалютСрезПоследних.Валюта = &Валюта";
ЗапросКурса.УстановитьПараметр("Валюта", Константы.ВалютаУправленческогоУчетаКомпании.Получить());
ЗапросКурса.УстановитьПараметр("ТекущаяДата",КонецДня(ТекущаяДата()));
ВыборкаКурса = ЗапросКурса.Выполнить().Выбрать();
Пока ВыборкаКурса.Следующий() Цикл
Курс = ВыборкаКурса.Курс;
КонецЦикла;
Пока Выборка.Следующий() Цикл
н=н+1;
// Если Выборка.ДоступноеКоличество < 0 Тогда ДОступноеКоличество=0; Иначе ДОступноеКоличество=Выборка.ДоступноеКоличество; КонецЕсли;
ДОступноеКоличество=Выборка.ДоступноеКоличество;
// Сообщить (Выборка.Номенклатура.Наименование + " " + ДОступноеКоличество);
флагсуществования=Ложь;
// убираем непорядочные символы
Наименование = СтрЗаменить(Выборка.Наименование,"'"," "); //уберем символ '
// запрос существования товара в базе виртуемарта
query = "
|SEL ECT *
|FR OM jos_vm_product WHERE product_sku='"+Выборка.Артикул+"' limit 1";
RSIDProduct.Open(query, Connection);
Если RSIDProduct.EOF() И RSIDProduct.BOF() Тогда
// Если Выборка.НеОтображатьНикогда = NULL Тогда НеОтображатьНикогда=Ложь; Иначе НеОтображатьНикогда=ИСТИНА; КонецЕсли;
// Если Выборка.НеОтображатьНикогда = NULL Тогда НеОтображатьWeb=Ложь Иначе НеОтображатьНикогда=ИСТИНА; КонецЕсли;
Если ПРО2 Тогда Цена = ВЫборка.WEbЦЕнаУПР2; Иначе Цена = Выборка.WEbЦЕнаУПР; КонецЕсли;
Если Выборка.НеВыводитьНаСайт Тогда
// флаги отображения на сайте
//Если Выборка.НеВыводитьНаСайт или Выборка.НеОтображатьНикогда или Выборка.НеОтображатьWeb Тогда
query = "ins ert into jos_vm_product ( vendor_id , product_parent_id , product_sku , product_s_desc , product_publish , product_special , product_discount_id , product_name , product_unit , quantity_options, product_order_levels, product_in_stock, product_sales,product_url )
|values ( '1', '0', '"+Выборка.Артикул+"', '"+наименование+"', 'N', 'N', '0', '"+наименование+"', 'шт.', 'none,0,0,1', '0,0','"+Формат (ДОступноеКоличество, "ЧГ=0")+"','"+Формат (Цена*Курс,"ЧГ=0")+"','http://catalog.sunrise.ru/descriptionPage.aspx?a="+Выборка.Артикул+"')";
Иначе
query = "ins ert into jos_vm_product ( vendor_id , product_parent_id , product_sku , product_s_desc , product_publish , product_special , product_discount_id , product_name , product_unit , quantity_options, product_order_levels, product_in_stock, product_sales, product_url )
|values ( '1', '0', '"+Выборка.Артикул+"', '"+наименование+"', 'Y', 'N', '0', '"+наименование+"', 'шт.', 'none,0,0,1', '0,0','"+Формат (ДОступноеКоличество, "ЧГ=0")+"','"+Формат (Цена*Курс,"ЧГ=0")+"','http://catalog.sunrise.ru/descriptionPage.aspx?a="+Выборка.Артикул+"')";
КонецЕсли;
// запишем номенклатуру
// Сообщить (query);
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
КонецПопытки;
RSIDProduct.Close();
флагсуществования =Ложь;
Иначе
флагсуществования=Истина;
// выполним пока не нужный запрос /// данные об изменении в номенклатуре
//RSIDProduct.MoveFirst();
//Пока RSIDProduct.EOF() = 0 Цикл
// ИД = RSIDProduct.Fields("product_id").Value;
// RSIDProduct.MoveNext();
//КонецЦикла;
// Если Выборка.НеОтображатьНикогда = NULL Тогда НеОтображатьНикогда=Ложь; Иначе НеОтображатьНикогда=ИСТИНА; КонецЕсли;
// Если Выборка.НеОтображатьНикогда = NULL Тогда НеОтображатьWeb=Ложь Иначе НеОтображатьНикогда=ИСТИНА; КонецЕсли;
Если ПРО2 Тогда Цена = ВЫборка.WEbЦЕнаУПР2; Иначе Цена = Выборка.WEbЦЕнаУПР; КонецЕсли;
Если Выборка.НеВыводитьНаСайт Тогда
query = "UPD ATE jos_vm_product SET product_sku='"+Выборка.Артикул+"', product_s_desc= '"+наименование+"',product_in_stock= '"+Формат (ДОступноеКоличество, "ЧГ=0")+"',product_sales='"+Формат (Цена*Курс,"ЧГ=0")+"',product_url ='http://catalog.sunrise.ru/descriptionPage.aspx?a="+Выборка.Артикул+"',product_publish='N' WHERE product_sku='"+Выборка.Артикул+"'" ;
Иначе
query = "UPD ATE jos_vm_product SET product_sku='"+Выборка.Артикул+"', product_s_desc= '"+наименование+"',product_in_stock= '"+Формат (ДОступноеКоличество, "ЧГ=0")+"',product_sales='"+Формат (Цена*Курс,"ЧГ=0")+"',product_url ='http://catalog.sunrise.ru/descriptionPage.aspx?a="+Выборка.Артикул+"',product_publish='Y' WHERE product_sku='"+Выборка.Артикул+"'" ;
КонецЕсли;
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
КонецПопытки;
RSIDProduct.Close();
КонецЕсли;
// Попытка записать Данные о товаре
Попытка
// запрос ID родителя товара
query = "
|SEL ECT *
|FR OM jos_vm_category WHERE category_description='"+Выборка.РодительКод+"' limit 1";
RS.Open(query, Connection);
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
ИДгрупы = RS.Fields("category_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
//Обновление группы
// запрос айди товара в мускуле виртуемарта
// Сообщить (Выборка.Номенклатура.Артикул);
query = "
|SEL ECT *
|FR OM jos_vm_product WHERE product_sku='"+Выборка.Артикул+"' limit 1";
RS.Open(query, Connection);
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
ИД = RS.Fields("product_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
Если НЕ флагсуществования Тогда
query = "ins ert into jos_vm_product_category_xref (category_id , product_id ) values ( '"+Формат(ИДгрупы,"ЧГ=0")+"' , '"+Формат(ИД,"ЧГ=0")+"' )";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
Иначе
query = "UPD ATE jos_vm_product_category_xref SET category_id='"+Формат(ИДгрупы,"ЧГ=0")+"' WHERE product_id='"+Формат(ИД,"ЧГ=0")+"'";
// "UPD ATE jos_vm_product_category_xref SET category_id='"+Формат(ИДгрупы,"ЧГ=0")+"', product_id='"+Формат(ИД,"ЧГ=0")+"' WHERE product_id='"+Формат(ИД,"ЧГ=0")+"' " ;
// Сообщить (query);
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
КонецЕсли;
// прибьем ценник товара
query = "delete fr om jos_vm_product_price WHERE product_id='"+Формат(ИД,"ЧГ=0")+"' " ;
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
// все поля важны !
query = "I_nsert into jos_vm_product_price (
|product_id,
|product_price,
|product_currency,
|product_price_vdate,
|product_price_edate,
|cdate,
|mdate,
|shopper_group_id,
|price_quantity_start,
|price_quantity_end )
|values ( '"+Формат(ИД,"ЧГ=0")+"' , '"+Формат (Цена*Курс,"ЧГ=0")+"','RUB',0,0,1222792314,1222792314,'5',0,0 )";
// Сообщить(Формат(ИД,"ЧГ=0"));
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Исключение
Сообщить (ОписаниеОшибки());
Сообщить (Выборка.Наименование);
КонецПопытки;
ОбработкаПрерыванияПользователя();
// Состояние("Обновляем товары " + Выборка.Номенклатура.Наименование);
Индикатор1 = н;
КонецЦикла;
Сообщить ("Выгружено " + н + " объектов");
Сообщить(Строка (ТекущаяДата()) + " обновление завершено");
КонецПроцедуры
Процедура Автомат ()
ОсновныеДействияФормыОбновитьТовары(1);
КонецПроцедуры
Процедура ПустыеГруппы()
СнятиеФлагаПустыхГрупп(1);
КонецПроцедуры
Процедура ОсновныеДействияФормыАвтомат(Кнопка)
ЭтаФорма.ПодключитьОбработчикОжидания("автомат", 3600);
ЭтаФорма.ПодключитьОбработчикОжидания("ПустыеГруппы", 5400);
ЭтаФорма.ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Автомат.Доступность = Ложь;
КонецПроцедуры
d.snissarenko Категория:
Конвертация данных, Обмен, Перенос Использование RLS Начиная с платформы 8.0 системы 1С Предприятие, существует возможность ограничивать права доступа пользователей на уровне записей. Для этого используется механизм RLS (Record Level Security). Такая «тонкая» настройка может быть полезна для ограничения доступа по организациям, клиентам, номенклатуре и др.
RLS – это возможность разработчика задать условие на таблицы базы данных для тех или иных пользователей (групп пользователей) и не дать им увидеть лишнего. Условие имеет булевый тип. Если значение условия принимает значение «истина», то доступ предоставляется, в противном случае – запрещается.
RLS используется одновременно с настройкой обычных прав доступа. Поэтому прежде чем приступить к настройке RLS, необходимо раздать обычные права на объекты конфигурации.
RLS применяется для следующих видов прав доступа:
* Чтение
* Добавление
* Изменение
* Удаление
Порядок настройки RLS
Рассмотрим простой пример выполнения настройки. Снимки экрана сделаны на версии 1С Предприятие 8.2 (8.2.9.356). Синтаксис шаблонов текстов ограничений описан в документации по 8.2 в книге «Руководство разработчика. Часть 1», поэтому на нем останавливаться не будем.
Итак, первым делом нужно определить шаблоны ограничений для каждой существующей роли.
После этого на основании указанных шаблонов задаются ограничения к необходимым объектам. Для редактирования текста условия можно воспользоваться конструктором ограничений доступа к данным.
Для редактирования нескольких ролей удобно управлять через окно «Все роли».
Для копирования условий в другие роли можно использовать окно «Все ограничения доступа». Шаблоны в другие роли могут копироваться только вручную.
Вот и все. Можно проверить результат.
Недостатки использования RLS:
1. Применение механизма ограничения доступа на уровне записей приводит к неявному увеличению таблиц, участвующих в запросе, что может привести к ошибкам в клиент-серверном режиме работы базы данных.
2. Для контроля записи бывает трудно или невозможно реализовать сложную логику приложения. В таких случаях лучше использовать условия в процедуре ПриЗаписи().
3. Написание условия (запроса) требует определенной квалификации разработчика.
4. Дополнительные трудности может создать невозможность отладки условия (запроса).
В типовых конфигурациях права на уровне записей могут быть заданы интерактивно для следующих объектов: организации, контрагенты, номенклатура, склады, подразделения, физические лица, заявки кандидатов и другие.
Следует помнить, что ограничения прав доступа на уровне записей довольно ресурсоемкий механизм и чем более сложные ограничения Вы поставите, тем медленнее программа будет работать, особенно при большой базе данных.
Мелкоступов Александр Категория:
Пользователь, роль доступа, интерфейс Создание писем, событий и задач в MS Outlook из 1С Отправка писем из 1С Предприятия – одна из самых необходимых функций, отсутствующая в штатном функционале платформы. Один из вариантов реализации – это подключение к MS Outlook по технологии OLE. В статье приведены примеры создания писем, событий и задач в MS Outlook из 1С. Автоматическое создание событий и задач используется не часто, но порой бывает очень удобно.
Для 1С 8.х замените
Код 1C v 7.x Outlook = СоздатьОбъект("Outlook.Application");
на
Код 1C v 8.х Outlook = Новый COMОбъект("Outlook.Application");
так же посмотрите:
Отправка почтового сообщения на локальный MS Office Outlook с вложенным файлом
Создание сообщения
Код 1C v 7.x //создать новое сообщение из 1С в MS Outlook
Процедура СоздатьПисьмо(Адрес,ПутьКВложению)
Попытка
Outlook = СоздатьОбъект("Outlook.Application");
ЕстьОшибка = 0;
Исключение
Предупреждение("Не удалось создать объект Outlook.Application");
ЕстьОшибка = 1;
КонецПопытки;
Если ЕстьОшибка = 0 Тогда
Письмо = Outlook.CreateItem(0);
Письмо.Subject = "Тема письма";
Письмо.Body = "Текст письма";
Письмо.Recipients.Add(Адрес);
Если ФС.СуществуетФайл(ПутьКВложению)=1 Тогда
Письмо.Attachments.Add(ПутьКВложению);
КонецЕсли;
Письмо.Display();
Иначе
Тема = "Тема письма";
ТекстПисьма = "Текст письма";
СтрокаЗапуска = "mailto:" + Адрес + "?subject=" + Тема + "&body=" + ТекстПисьма;
ЗапуститьПриложение(СтрокаЗапуска);
КонецЕсли;
КонецПроцедуры
Создание события
Код 1C v 7.x //создать запись в календаре событий из 1С в MS Outlook
Процедура СоздатьСобытие()
Попытка
Outlook = СоздатьОбъект("Outlook.Application");
Исключение
Предупреждение("Не удалось создать объект Outlook.Application");
Возврат;
КонецПопытки;
Событие = Outlook.CreateItem(1);
Событие.Subject = "Название события";
Событие.Start = "15.01.2010 15:00:00";
Событие.End = "15.01.2010 16:00:00";
Событие.Body = "Описание события";
Событие.Location = "Место события";
Событие.ReminderMinutesBeforeStart = 15;
Событие.BusyStatus = 0;
Событие.MeetingStatus = 0;
Событие.Sensitivity = 2;
Событие.Save();
Сообщить("Событие в календаре создано успешно","i");
КонецПроцедуры
Создание задачи
Код 1C v 7.x //создать новую задачу из 1С в MS Outlook
Процедура СоздатьЗадачу(ДатаСтартаЗадачи)
Попытка
Outlook = СоздатьОбъект("Outlook.Application");
Исключение
Предупреждение("Не удалось создать объект Outlook.Application");
Возврат;
КонецПопытки;
Задача = Outlook.CreateItem(3);
Задача.Subject = "Название задачи";
Задача.StartDate = ДатаСтартаЗадачи;
Задача.Body = "Описание задачи";
Задача.Status = 0;
Задача.Display();
Задача.Importance = 2;
Задача.ReminderSet = 1;
Задача.ReminderTime = "" + ДатаСтартаЗадачи + " 9:00:00";
//Задача.Save();
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Как получить Срез Последних значений на Каждую Дату Данный способ подходит для отчетов. Из очевидных плюсов - если курс (или другие данные) не нужны для построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться и несколько ниже, чем в первом способе.
Для примера сделаем отчет - список заказов покупателей.
Для этого создадим набор данных "Документы" - запрос:
Код 1C v 8.х ВЫБРАТЬ
ЗаказПокупателя.Ссылка КАК ЗаказПокупателя,
ЗаказПокупателя.Дата КАК Дата,
ЗаказПокупателя.ВалютаДокумента КАК ВалютаДокумента,
ЗаказПокупателя.СуммаДокумента КАК СуммаДокумента
{ВЫБРАТЬ
ЗаказПокупателя.*,
Дата,
ВалютаДокумента.*,
СуммаДокумента}
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
{ГДЕ
ЗаказПокупателя.Ссылка.* КАК ЗаказПокупателя,
ЗаказПокупателя.СуммаДокумента}
Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля "Дата" и "ВалютаДокумента". Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице "Поля" схемы компоновки. В остальном запрос вряд ли требует комментариев.
Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":
Код 1C v 8.х ВЫБРАТЬ
&Дата КАК Дата,
КурсыВалютСрезПоследних.Валюта КАК Валюта,
КурсыВалютСрезПоследних.Курс КАК Курс,
КурсыВалютСрезПоследних.Кратность КАК Кратность
{ВЫБРАТЬ
Дата,
Валюта.*,
Курс,
Кратность}
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
{ГДЕ
КурсыВалютСрезПоследних.Курс,
КурсыВалютСрезПоследних.Кратность}
В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях - это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.
Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "Дата", выражение приемник - "Дата", Параметр - "Дата"
2. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "ВалютаДокумента", выражение приемник - "Валюта", Параметр - "Валюта"
Главное здесь - параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае - запрос "Курсы валют") параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.
Перейдем к вычисляемым полям. Добавим вычисляемое поле "СуммаВВалютеУпрУчета". Выражение поля - "СуммаДокумента * Курс / Кратность".
Также укажем поля "СуммаДокумента" и "СуммаВВалютеУпрУчета" как ресурсы
Настроим отчет.
Добавим одну группировку "Детальные записи", в выбранных полях укажем "ЗаказПолкупателя", "Курс" и "Кратность". Добавим ресурсы "СуммаДокумента" и "СуммаВВалютеУпрУчета"
Можно формировать отчет
Defender aka LINN
Как получить Срез Последних на Каждую Дату
То же самое простым запросом Категория:
Схема Компоновки Данных Как вывести произвольный макет в произвольном месте схемы СКД В ходе работы мне понадобилось формировать печатные формы по заданному макету поставщика. Решил делать с использованием СКД, но столкнулся с тем, что нужно выводить произвольный заголовок, но непонятно как. Немного поискав и посмотрев примеры нашел способ сделать это быстро и просто. Внимание – написанное ниже предполагает, что вы знаете, что такое СКД и как примерно работают в СКД макеты.
По шагам рассмотрю как вывести шапку для счет-фактуры:
1. Создаем в схеме новую группировку без указания поля (детальные записи)
2. Установим имя группировке
3. Удалим у данной группировки из выбранных полей автополе
4. В других настройках выберем макет оформления «Без оформления» (иначе на наш макет будет накладываться стандартный макет и вокруг всех ячеек будет рамка)
5. На вкладке макеты добавляем наши данные
6. Добавляем макет группировки и указываем наше имя группировки из п.2 и указываем область с нашими данными
7. Готово
Автор статьи
Александр Фотов , оригинал статьи
тут
Пример вывода в шапке отчета произвольного текста и Картинки Категория:
Схема Компоновки Данных Разбить строку на подстроки Разлогает строку типа:
Поле1, "Сложное, с запятыми внутри Поле2", Поле3
на массимв подстрок типа:
Поле1
Сложное, с запятыми внутри Поле2
Поле3
Код 1C v 8.х RegExp = Новый COMОбъект("VBScript.RegExp");
Результат = Новый Массив();
RegExp.IgnoreCase = Ложь; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим
RegExp.Pattern = "(?:^|;)(\""(?:[^\""]+|\""\"")*\""|[^;]*)"; //вот наш супер шаблон
//RegExp.Pattern = ";|;|;|;|;;|;|;|;|;|;|;|;|;;|;|;"; //вот наш супер шаблон
Matches=RegExp.Execute(Стр);
ЧислоВхождений=Matches.Count();
//Сообщить(Стр,СтатусСообщения.Важное);
Если ЧислоВхождений>0 Тогда
Для к = 0 По ЧислоВхождений-1 Цикл
Match = Matches.Item(к);
SubMatches = Match.SubMatches;
ЧислоПодвыражений=SubMatches.Count();
Для н = 0 По ЧислоПодвыражений-1 Цикл
SubMatch=SubMatches.Item(н);
Если SubMatch="" Тогда
//Продолжить;
КонецЕсли;
Результат.Добавить(SubMatch);
//Сообщить("Подстрока: "+SubMatch);
КонецЦикла;
КонецЦикла;
Иначе
//Сообщить("Вхождений шаблона не найдено");
КонецЕсли;
Возврат Результат;
Живой Ископаемый Категория:
Регулярные выражения Использование регулярных выражений (RegExp) в 1С Регулярные выражения (Regular Expressions) являются известным и мощным средством для поиска, тестирования и замены подстрок. Эта технология доступна и в 1С - через объект VBScript.RegExp. Нужный объект уже встроен в современные версии Windows (начиная с Windows 98), и устанавливать дополнительно ничего не нужно.
Приведенные ниже примеры были протестированы в 1С:Предприятие 7.7; для 1С:Предприятие 8.x изменяется способ создания объекта:
Код 1C v 8.х RegExp = Новый COMОбъект("VBScript.RegExp");
Кроме того, там уже есть логические константы Истина и Ложь - объявлять их не нужно.
Более подробное описание самой технологии RegExp (что означают те или иные значки или скобочки, или какие шаблоны поиска или замены можно использовать в типичных ситуациях) можно найти в специальной литературе (например Бен Форта "Освой самостоятельно регулярные выражения (regexp) за 10 минут") или на сайтах в сети Internet.
Код 1C v 7.x ///////////////////////////////////////////////////////////////////////
//Поиск вхождений подстроки
Процедура RegExp_Exec()
//Для 1С 7.7:
Истина=-1;
Ложь=0;
RegExp = CreateObject("VBScript.RegExp");
RegExp.IgnoreCase = Ложь; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим
RegExp.Pattern = "<[^>]*>"; //Ищем теги HTML
Matches=RegExp.Execute("Это <hr> строка <br> с тегами HTML");
ЧислоВхождений=Matches.Count();
Если ЧислоВхождений>0 Тогда
Для к = 0 По ЧислоВхождений-1 Цикл
Match = Matches.Item(к);
Сообщить("Найден тег:"+ Match.Value);
КонецЦикла;
Иначе
Сообщить("Вхождений шаблона не найдено");
КонецЕсли;
//Выдаст в окно сообщений:
//Найден тег:<hr>
//Найден тег:<br>
КонецПроцедуры
Более продвинутый пример разбора HTML использует подвыражения (SubMatches) и позволяет находить как сами теги, так и текст между ними.
Код 1C v 7.x ///////////////////////////////////////////////////////////////////////
//Поиск вхождений подстроки с использованием подвыражений
Процедура RegExp_Exec1()
//Для 1С 7.7:
Истина=-1;
Ложь=0;
RegExp = CreateObject("VBScript.RegExp");
RegExp.IgnoreCase = Ложь; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим
RegExp.Pattern = "([^<]*)(<[^>]*>)([^<]*)"; //Ищем теги HTML, а также текст до и после тега
Matches=RegExp.Execute(" <tr><td id=aaa>Дятел <td> долбит <td> сосну </tr>");
ЧислоВхождений=Matches.Count();
Если ЧислоВхождений>0 Тогда
Для к = 0 По ЧислоВхождений-1 Цикл
Match = Matches.Item(к);
SubMatches = Match.SubMatches;
ЧислоПодвыражений=SubMatches.Count();
Для н = 0 По ЧислоПодвыражений-1 Цикл
SubMatch=SubMatches.Item(н);
Если SubMatch="" Тогда
Продолжить;
КонецЕсли;
Сообщить("Подстрока: "+SubMatch);
КонецЦикла;
КонецЦикла;
Иначе
Сообщить("Вхождений шаблона не найдено");
КонецЕсли;
КонецПроцедуры
//Выводит в окно сообщений:
//Подстрока:
//Подстрока: <tr>
//Подстрока: <td id=aaa>
//Подстрока: Дятел
//Подстрока: <td>
//Подстрока: долбит
//Подстрока: <td>
//Подстрока: сосну
//Подстрока: </tr>
Часто регулярные выражения используются для тестирования строк, например пользовательского ввода.
Этот пример позволяет узнать, является ли строка целым числом.
Код 1C v 7.x ///////////////////////////////////////////////////////////////////////
//Проверка подстроки
Процедура RegExp_Test()
RegExp = CreateObject("VBScript.RegExp");
RegExp.Pattern = "^\d+$"; //Шаблон, который соответствует целому числу
стр="12345";//Строка, которую тестируем
Если RegExp.Test(стр)=0 Тогда
Сообщить("Это не целое число");
Иначе
Сообщить("Это целое число");
КонецЕсли;
//Выдаст в окно сообщений:
//"Это целое число"
КонецПроцедуры
Регулярные выражения поддерживают не только поиск, но и замену текста. При этом найденные подвыражения (в круглых скобках) могут быть представлены в строке замены как $1, $2 и т. д.
(знак доллара используется в VBScript.RegExp; в других средах программирования, например в JavaScript, используемый для этой цели символ может отличаться).
Код 1C v 7.x ///////////////////////////////////////////////////////////////////////
//Замена текста в подстроке
Процедура RegExp_Replace()
//Строка, где мы будем производить замены
стр="Дятел долбил сосну";
Истина=-1;
Ложь=0;
RegExp = CreateObject("VBScript.RegExp");
RegExp.IgnoreCase = Истина; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Истина; //Многострочный режим
RegExp.Pattern = "(долбил)";
стр=RegExp.Replace(стр, "про$1");
Сообщить(стр);
//Выдаст в окно сообщений:
//"Дятел продолбил сосну"
КонецПроцедуры
Источник Категория:
Регулярные выражения СКД и Сводная таблица В СКД - набор данных Объект. Имя объекта - Табл
Табл - это Таблица Значений, которую я получаю из внешнего файла
В форме отчета, в процедуре
ПередОткрытием() есть следующий код:
Код 1C v 8.х ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("Табл",Табл);
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных1");
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
//Выводит табличку после открытия формы в результат, все замечательно.
//Затем добавляю строки по выводу СКД:
ИсточникСводнойТаблицы = Новый ИсточникДанныхСводнойТаблицыКомпоновкиДанных;
ИсточникСводнойТаблицы.УстановитьСхему(СхемаКомпоновкиДанных);
ЭлементыФормы.Результат.ВстроенныеТаблицы.СводнаяТаблица1.ИсточникДанных = ИсточникСводнойТаблицы;
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных);
КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
ИсточникСводнойТаблицы.УстановитьНастройки(КомпоновщикНастроек.Настройки);
//ругается на последнюю строку
//Ошибка источника сводной таблицы.
Нужно сделать набор данных - запрос и оставить код, который выше, после "Затем добавляю строки по выводу СКД:" и все прекрасно выводится в сводной таблице
ПодводныйТаракан Категория:
Схема Компоновки Данных Полезные процедуры работы с Active Directory (AD) Надоели просить меня запостить рабочие модули работы с AD, вот запостил, в качестве бонуса убийца любого процесса в памяти любого компа.
p.s. для работы нужны определенные права.
Автор:
vde69
Код 1C v 8.х Функция ПолучитьСписокДоменов () Экспорт
Результат = Новый Массив();
objNameSpace = "";
Попытка objNameSpace = ПолучитьCOMОбъект("WinNT:");
м = Новый Массив(); м.Добавить("domain"); // Computer User Group GlobalGroup domain
м2 = Новый COMSafeArray(м, "VT_VARIANT");
objNameSpace.Filter = м2;
Для каждого item Из objNameSpace Цикл
Результат.Добавить(item.Name);
КонецЦикла;
Исключение
Результат.Очистить();
КонецПопытки;
Возврат Результат;
КонецФункции
Функция ПолучитьСписокГруппВДомене (ИмяДомена, ТипГрупп = "GlobalGroup") Экспорт
Результат = Новый Массив();
objNameSpace = "";
Попытка objNameSpace = ПолучитьCOMОбъект("WinNT://"+СокрЛП(ИмяДомена));
м = Новый Массив();
м.Добавить(ТипГрупп); // Computer User Group GlobalGroup domain
м2 = Новый COMSafeArray(м, "VT_VARIANT");
objNameSpace.Filter = м2;
Для каждого item Из objNameSpace Цикл
Результат.Добавить(item.Name);
КонецЦикла;
Исключение
Результат.Очистить();
КонецПопытки;
Возврат Результат;
КонецФункции
Функция ПолучитьСписокПользователейВГруппеДомена (ИмяДомена, ИмяГруппы) Экспорт
Результат = Новый Массив();
objNameSpace = "";
Попытка
objNameSpace = ПолучитьCOMОбъект("WinNT://" + СокрЛП(ИмяДомена) + "/" + СокрЛП(ИмяГруппы) + ", Group");
Для каждого item Из objNameSpace.Members() Цикл
Результат.Добавить(item.Name);
КонецЦикла;
Исключение
Результат.Очистить();
КонецПопытки;
Возврат Результат;
КонецФункции
Функция ПользовательВГруппеДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь;
Массив = ПолучитьСписокПользователейВГруппеДомена (СокрЛП(ИмяДомена), ИмяГруппы);
Для каждого элМассив из Массив Цикл
Если ВРег(элМассив) = ВРег(СокрЛП(ИмяПользователя)) Тогда // пользователь уже в группе
Результат = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ДобавитьПользователяВГруппуДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь;
element_user = "";
element_group = "";
Попытка
element_user = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user");
element_group = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group");
element_group.Add(element_user.ADsPath); element_group.SetInfo();
Результат = Истина;
Исключение
Результат = Ложь;
КонецПопытки;
Возврат Результат;
КонецФункции
Функция УдалитьПользователяИзГруппыДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь;
element_user = "";
element_group = "";
Попытка element_user = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user");
element_group = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group");
element_group.Remove(element_user.ADsPath);
element_group.SetInfo();
Результат = Истина;
Исключение
Результат = Ложь;
КонецПопытки;
Возврат Результат;
КонецФункции
Процедура ЗаполнитьПочтовыеАдресаИзAD()
Попытка
conn = ПолучитьCOMОбъект("","ADODB.Connection");
conn.Provider = "ADSDSOObject";
conn.Open("Active Directory Provider");
Исключение Предупреждение("Ошибка подключения к Active Directory!");
Возврат;
КонецПопытки;
Для Каждого Стр из Таблица Цикл
Если НЕ ПустаяСтрока(Стр.Логин) Тогда
Попытка
query = "SEL ECT ADsPath FR OM 'LDAP://DC="+СокрЛП(Домен.Код)+"' WHERE SAMAccountName='"+Стр.Логин+"'";
rs = conn.Execute(query);
Пока НЕ rs.EOF() Цикл
obj = ПолучитьCOMОбъект(rs.Fields(0).Value);
Если obj.Class="user" Тогда
Стр.НоваяПочта=СокрЛП(obj.EmailAddress);
Если Стр.НоваяПочта<>Стр.СтараяПочта Тогда
Стр.Установить=Истина;
КонецЕсли;
КонецЕсли;
rs.MoveNext();
КонецЦикла;
Исключение
Сообщить("Ошибка получения почты для логина :"+Стр.Логин);
КонецПопытки;
КонецЕсли;
КонецЦикла;
conn.Close();
КонецПроцедуры
Функция УдалитьПроцесс (ИмяКомпьютера, НазваниеПроцесса, Логин, Пароль) Экспорт
Попытка COM = Новый COMОбъект ("WbemScripting.SWbemLocator");
Серв = COM.ConnectServer(СокрЛп(ИмяКомпьютера), "\root\cimv2", СокрЛП(Логин), СокрЛП(Пароль));
СписокПроцессов = Серв.execQuery("Sel ect * fr om Win32_Process Where Name = '"+СокрЛП(НазваниеПроцесса)+"'");
Для каждого item Из СписокПроцессов Цикл
item.Terminate();
КонецЦикла;
Исключение
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
Код 1C v 8.х // coder1cv8 - Мой вариант получения почты 1С-ного пользователя:
Функция ПолучитьMailПоПользователю(СсылкаПользователь)
Адрес="";
ПользовательИБ=ПользователиИнформационнойБазы.НайтиПоИмени(СокрЛП(СсылкаПользователь.Код));
Если ПользовательИБ<>Неопределено Тогда
Если ПользовательИБ.АутентификацияОС Тогда
ПользовательОС=СтрЗаменить(ПользовательИБ.ПользовательОС,"\","/");
Попытка
ЮзерАД=ПолучитьCOMОбъект("WinNT:"+ПользовательОС+",user");
LDAP=ПолучитьCOMОбъект("LDAP://CN="+ЮзерАД.FullName+",OU=Common Users,OU=Regular Users,DC="+Домен+",DC=local");
Адрес=LDAP.Mail;
Исключение
КонецПопытки;
КонецЕсли;
КонецЕсли;
Возврат Адрес;
КонецФункции
Категория:
COM-объекты, WMI, WSH Как в запросе получить срез последних на Каждую Дату Данная задача может быть решена как с использованием вложенных запросов, так и с помощью. временных таблиц. Попробуем решить задачу, используя временные таблицы. Сначала приведем весь текст запроса, а потом кратко разберем по частям принцип его работы.
Текст запроса:
Код 1C v 8.х ВЫБРАТЬ
ПродажиОбороты.Период КАК Дата,
ПродажиОбороты.Контрагент КАК Контрагент,
ПродажиОбороты.Номенклатура КАК Номенклатура,
СУММА(ПродажиОбороты.КоличествоОборот) КАК Количество,
СУММА(ПродажиОбороты.СтоимостьОборот) КАК Стоимость
ПОМЕСТИТЬ втБезЦены
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК ПродажиОбороты
СГРУППИРОВАТЬ ПО
ПродажиОбороты.Период,
ПродажиОбороты.Контрагент,
ПродажиОбороты.Номенклатура
ИНДЕКСИРОВАТЬ ПО
Номенклатура,
Дата,
Контрагент
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втБезЦены.Дата КАК Дата,
втБезЦены.Контрагент КАК Контрагент,
втБезЦены.Номенклатура КАК Номенклатура,
втБезЦены.Количество,
втБезЦены.Стоимость,
МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период
ПОМЕСТИТЬ втМаксПериод
ИЗ
втБезЦены КАК втБезЦены
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО втБезЦены.Номенклатура = ЦеныНоменклатуры.Номенклатура
И втБезЦены.Дата >= ЦеныНоменклатуры.Период
СГРУППИРОВАТЬ ПО
втБезЦены.Дата,
втБезЦены.Контрагент,
втБезЦены.Номенклатура,
втБезЦены.Количество,
втБезЦены.Стоимость
ИНДЕКСИРОВАТЬ ПО
Номенклатура,
Дата,
Контрагент,
Период
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втМаксПериод.Дата,
втМаксПериод.Контрагент,
втМаксПериод.Номенклатура,
втМаксПериод.Количество,
втМаксПериод.Стоимость,
ЦеныНоменклатуры.Цена
ИЗ
втМаксПериод КАК втМаксПериод
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО втМаксПериод.Номенклатура = ЦеныНоменклатуры.Номенклатура
И втМаксПериод.Период = ЦеныНоменклатуры.Период
ГДЕ
ЦеныНоменклатуры.ТипЦен = &ТипЦен
АВТОУПОРЯДОЧИВАНИЕ
Данный пакетный запрос содержит три подзапроса. Рассмотрим их подробнее.
Первый запрос пакета группирует данные по периоду, контрагенту и номенклатуре и помещает их во временную таблицу втБезЦены. Далее мы будем соединять эту таблицу с таблицей цен номенклатуры и получим небольшой выигрыш в том, что соединять будем уже сгруппированные данные.
Во втором подзапросе мы соединяем временную таблицу с регистром сведений «ЦеныНоменклатуры» при этом из регистра сведений мы выбираем МАКСИМАЛЬНУЮ дату из меньших или равных дат. Результат этого подзапроса также помещаем во временную таблицу (втМаксПериод). Посмотрим, какие данные попадают в эту таблицу:
Рис. 8 Временная таблица втМаксПериод
В последнем запросе пакета, мы еще раз соединяем временную таблицу с таблицей цен номенклатуры. На этот мы соединяем таблице по номенклатуре и периоду.
Итоговый результат запроса:
То же самое средсвами СКД Категория:
Запросы Как очистить, сократить журнал регистрации? В 1С 8.х
В процессе длительной эксплуатации системы в журнале регистрации может накапливаться значительное число записей. Поэтому поддерживается возможность сокращения журнала регистрации и удаления записей, ставших неактуальными. При сокращении журнала регистрации можно записать удаляемые события в файл, если предвидится необходимость их анализа в будущем.
В конфигураторе, в меню «Администрирование – Настройка журнала регистрации…» кнопкой «Сократить» – установив текущую дату. Там же можно сохранить журнал в файл.
В поле
Текущий диапазон событий , указывается диапазон времени за который есть данные.
Удалить события до – здесь указываем до какой даты можно удалить данные.
Удаляемые данные можно сохранить, для этого установим свойство “
Записать удаляемые события в файл ” и укажем папку в которую сохраним.
Если требуется периодически сокращать журнал и при этом иметь возможность просматривать уже удаленные события журнала, то установите флажок “
Сохранять разделение хранения журнала по периодам и объединять с сохраненным ранее журналом “.
Используя средства работы со списками, разработчик имеет возможность выгрузить журнал регистрации в текстовый или табличный документ, который в дальнейшем может быть сохранен в собственном формате или, например, формате листа Excel или документа HTML.
Кроме этого поддерживается выгрузка журнала регистрации в формате XML, что может использоваться для последующего анализа выгруженных записей средствами встроенного языка.
Особенности функционирования журнала регистрации
При создании новой информационной базы для журнала устанавливается режим регистрации событий всех уровней важности; включение и выключение журнала регистрации. При загрузке информационной базы из файла журнал регистрации не очищается.
Как сократить журнал регистрации программно
Код DOS Batch File C:\Program Files\1cv8\bin\1cv8.exe" CONFIG /F"C:\DemoTrd2" /N"Федоров (администратор)" /P"" /OutD:\my\log.txt /ReduceEventLogSize 2004-12-26 -saveAsC:\OldLog.elf
Для 1С 7.7:
удалить файл <Путь к базе>\SYSLOG\1Cv7.mlg
Что такое Журнал регистрации? Категория:
Администрирование Как получить Срез Последних на Каждую Дату С задачей получения среза последних на каждую дату рано или поздно сталкиваются все. Безусловно, это задача достаточно просто решается запросом с соединением по максимальной дате из меньших или равных дат. Но эту же задачу можно решить и с помощью компоновки данных. Не будем рассуждать о том, какой из способов более производителен, все может зависеть от конкретной задачи.
Первый набор данных:
В качестве примера, создадим отчет по продажам, в котором отдельной колонкой будем выводить цену из прайса на дату продажи.
Создадим набор данных-запрос «ПродажиОбороты»:
Код 1C v 8.х ВЫБРАТЬ
ПродажиОбороты.Период КАК Дата,
ПродажиОбороты.Контрагент КАК Контрагент,
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СтоимостьОборот КАК Стоимость
{ВЫБРАТЬ
Дата,
Контрагент.*,
Номенклатура.*,
Количество,
Стоимость}
ИЗ
РегистрНакопления.Продажи.Обороты({(&НачалоПериода)},
{(&КонецПериода)}, День, ) КАК ПродажиОбороты
{ГДЕ
ПродажиОбороты.Период,
ПродажиОбороты.Контрагент.*,
ПродажиОбороты.Номенклатура.*,
ПродажиОбороты.КоличествоОборот,
ПродажиОбороты.СтоимостьОборот}
Рис. 1 Вкладка ресурсы набора данных ПродажиОбороты
Рис. 2 Настройки отчета
Сейчас наш отчет будет иметь следующий вид:
Рис. 3 Формирование отчета с одним набором данных
Теперь необходимо добавить в отчет колонку «Цена по прайсу», которая будет подтягиваться из регистра сведений «Цены номенклатуры» на дату продажи.
Второй набор данных:
Добавим второй набор данных-запрос «Цены», цены будем брать для фиксированного типа цен:
Код 1C v 8.х ВЫБРАТЬ
&Дата КАК Дата,
ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
{ВЫБРАТЬ
Дата,
Номенклатура.*,
Цена}
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
&Дата,
Номенклатура = &Номенклатура
И ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
{ГДЕ
(&Дата),
ЦеныНоменклатурыСрезПоследних.Номенклатура.*,
ЦеныНоменклатурыСрезПоследних.Цена}
В данном наборе данных три параметра: Дата, Номенклатура и тип цен. Из низ самые интересные Дата и Номенклатура. Они будут использованы при соединении наборов данных, причем параметр данных присутствует как в параметрах виртуальной таблицы, так и в выбранных полях.
Соединения наборов:
Приступим к основной «фишке» данного метода – соединениям наборов:
Рис. 4 Соединение наборов данных
Здесь самое основное правильно настроить параметры. Если указан параметр,то СКД передает в приемник связи параметры, указанные в соединении. Значениями этих параметров будут значения соответствующих полей источника связи.
Далее добавим поле цена в ресурсы и в выбранные поля.
Рис. 5 Вкладка ресурсы
Рис. 6 Выбранные поля
Результат:
Теперь можно формировать отчет. Проверим правильность работы отчета на примере «Дивана для отдыха».
Рис. 7 Итоговый отчет
Первоисточник
Как получить Срез Последних значений на Каждую Дату
То же самое простым запросом Категория:
Схема Компоновки Данных Индикатор выполнения Код 1C v 8.х // Индикатор выполнения обработки результата запроса
Выборка = РезультатЗапроса.Выбрать();
Индикатор = ЭлементыФормы.ИндикаторПеребора;
Индикатор.МаксимальноеЗначение = Выборка.Количество();
Индикатор.Значение = 0;
Пока Выборка.Следующий() Цикл
Индикатор.Значение = Индикатор.Значение + 1;
КонецЦикла;
Код 1C v 8.х // Индикатор выполнения вывода результата запроса с расширенной настройкой
Выборка = РезультатЗапроса.Выбрать();
Индикатор = ЭлементыФормы.ИндикаторПеребора;
Индикатор.МаксимальноеЗначение = Выборка.Количество();
Индикатор.Значение = 0;
Индикатор.ОтображатьПроценты = Истина;
Индикатор.СтильОтображения = РежимСглаживанияИндикатора.Прерывистый;
Индикатор.Ориентация = Ориентация.Вертикально;
Индикатор.Шаг = 0.1;
Пока Выборка.Следующий() Цикл
Индикатор.Значение = Индикатор.Значение + 1;
КонецЦикла;
Индикатор в строке состояния с помощью СКД
Иногда хочется видеть подобие индикатора, но в строке состояния. Это можно сделать только с помощью СКД, и то есть небольшой минус: невозможно убрать или изменить надпись «Вывод отчета». Сделать это можно примерно следующим образом:
Код 1C v 8.х ПроцессорКомпоновки = Новый ПроцессорВыводаРезультатаКомпоновкиДанных
ВТабличныйДокумент;
ПроцессорКомпоновки.ОтображатьПроцентВывода = Истина ;
ЭлементКомпоновки = Новый ЭлементРезультатаКомпоновкиДанных;
ПроцессорКомпоновки.НачатьВывод();
//Считаем проценты по своему алгоритму, для примера:
Для Сч = 1 По 100 Цикл
ЭлементКомпоновки.ПроцентВывода = Сч;
ПроцессорКомпоновки.ВывестиЭлемент(ЭлементКомпоновки);
КонецЦикла;
ПроцессорКомпоновки.ЗакончитьВывод();
Для 1С 7.7 посмотрите
v7: Прогресс бар в строке состояния Категория:
Встроенные Функции Управляемый режим блокировки данных Вопрос: Как использовать управляемый режим блокировки данных?
Ответ: Рассмотрим на примере удаления записей из регистра сведений.
1. В свойствах объекта, для которого используется управляемый режим блокировки данных установить поле «Режим управления блокировкой данных» в значение «Управляемый» (иначе будет сообщение об ошибке «Автоматический режим блокировки недопустим в этой транзакции»). Причем если это делается для документа, то необходимо перевести в этот же режим блокировки все регистры, в которых делает движения этот документ.
2. Пример кода управляемой блокировки регистра при удалении из него записи:
Например:
Код 1C v 8.х Процедура ОчиститьЗаПериод()
Пока Истина Цикл
НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
Попытка
текЗапрос = новый Запрос;
текЗапрос.Текст =
"ВЫБРАТЬ
| усИсторияОстатковПоПоказателям.Склад,
| усИсторияОстатковПоПоказателям.Поклажедатель,
| усИсторияОстатковПоПоказателям.Показатель,
| усИсторияОстатковПоПоказателям.Период
|ИЗ
| РегистрСведений.усИсторияОстатковПоПоказателям КАК усИсторияОстатковПоПоказателям
|ГДЕ
| усИсторияОстатковПоПоказателям.Период МЕЖДУ &ПериодС И &ПериодПо";
текЗапрос.УстановитьПараметр("ПериодС", ГраницаОчисткиС);
текЗапрос.УстановитьПараметр("ПериодПо", ГраницаОчисткиПо);
тбзЗаписиЖурнала = текЗапрос.Выполнить().Выгрузить();
// Блокировка данных
текБлокировка = Новый БлокировкаДанных;
тбдЖурнал = текБлокировка.Добавить("РегистрСведений.усИсторияОстатковПоПоказателям");
тбдЖурнал.Режим = РежимБлокировкиДанных.Исключительный;
Если тбзЗаписиЖурнала.Количество() тогда
тбдЖурнал.ИсточникДанных = тбзЗаписиЖурнала;
тбдЖурнал.ИспользоватьИзИсточникаДанных("Склад", "Склад");
тбдЖурнал.ИспользоватьИзИсточникаДанных("Поклажедатель", "Поклажедатель");
тбдЖурнал.ИспользоватьИзИсточникаДанных("Показатель", "Показатель");
// Заблокировать
текБлокировка.Заблокировать();
Для каждого текЗаписьЖурнала из тбзЗаписиЖурнала цикл
текЗапись = РегистрыСведений.усИсторияОстатковПоПоказателям.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(текЗапись, текЗаписьЖурнала);
текЗапись.Удалить();
КонецЦикла;
КонецЕсли;
ЗафиксироватьТранзакцию();
Прервать;
Исключение // сообщим об ошибке
стрОписаниеОшибки = ОписаниеОшибки();
ОтменитьТранзакцию();
Сообщить("Ошибка блокировки" + ОписаниеОшибки());
Прервать;
КонецПопытки;
КонецЦикла;
КонецПроцедуры // ОчиститьЗаПериод()
Источник Категория:
Встроенные Функции