Имя: Пароль:
1C
1С v8
Помогите вызвать процедуры и функции из модуля объекта в форме объекта
0 pele
 
26.10.12
10:51
Вот есть процедуры и функции написанные в модуле объекта помогите в форме объекта


&НаКлиенте
Процедура ПрочитатьИзФайлаXML(Команда)    
       Результат();
   
КонецПроцедуры
 



Процедура Результат() Экспорт
   
   стрСодержимоеФайлаXML = ПолучитьТекстXMLССайта();    
   стрСодержимоеФайлаXML = СтрЗаменить(стрСодержимоеФайлаXML, "&", "'n'");
   дзРезультат = РаспарситьФайлXML(стрСодержимоеФайлаXML);
   Сформировать(дзРезультат);

КонецПроцедуры

&НаСервере
Функция ПолучитьТекстXMLССайта() Экспорт
   
   Попытка
       Соединение = Новый HTTPСоединение("krasavik.by");
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат Неопределено;
   КонецПопытки;
                                                   
   ОписаниеОшибки = "";
   ОтветСервера = ПолучитьДанныеССервера(Соединение, "1corders.php?id=1300", , ОписаниеОшибки);
   
   Если ОтветСервера = Неопределено Тогда
       Сообщить(ОписаниеОшибки);
       Возврат Неопределено;
   КонецЕсли;
   
   Возврат ОтветСервера;
   
КонецФункции

&НаСервере
Функция ПолучитьДанныеССервера(Соединение, ПараметрыЗапроса = "", Заголовки = "", ОписаниеОшибки)
   
   ИмяФайлаОтвета = ПолучитьИмяВременногоФайла();
   
   Попытка
       Соединение.Получить(ПараметрыЗапроса, ИмяФайлаОтвета, СокрЛП(Заголовки));
   Исключение
       ОписаниеОшибки = ОписаниеОшибки();
   КонецПопытки;
   
   ФайлОтвета = Новый Файл(ИмяФайлаОтвета);
   ОтветСервера = НеОпределено;
   
   Если ФайлОтвета.Существует() Тогда
       
       ТекстОтвета = Новый ТекстовыйДокумент();
       ТекстОтвета.Прочитать(ИмяФайлаОтвета);
       Если ТекстОтвета.КоличествоСтрок()>0 Тогда
           ОтветСервера = ТекстОтвета.ПолучитьТекст();
       Иначе
           ОписаниеОшибки = ОписаниеОшибки + НСтр("ru = 'Получение данных с сервера: Получен пустой ответ сервера.'");
       КонецЕсли;
       
   Иначе
       ОписаниеОшибки = ОписаниеОшибки + НСтр("ru = 'Получение данных с сервера: Ответ сервера не получен.'");
   КонецЕсли;
   
   Попытка
       УдалитьФайлы(КаталогВременныхФайлов(), ИмяФайлаОтвета);
   Исключение
   КонецПопытки;
   
   Возврат ОтветСервера;
   
КонецФункции

&НаСервере
Функция РаспарситьФайлXML(стрСодержимоеФайлаXML)
   
   ЧтениеXML = Новый ЧтениеXML();
   ЧтениеXML.УстановитьСтроку(стрСодержимоеФайлаXML);

   дзРезультат = Новый ДеревоЗначений();
   дзРезультат.Колонки.Добавить("Название");
   дзРезультат.Колонки.Добавить("Значение");
   дзРезультат.Колонки.Добавить("ЭтоУзел");
   
   хзПриемникДанных = дзРезультат;
   
   Пока ЧтениеXML.Прочитать() Цикл
       
       Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
           хзПриемникДанных = хзПриемникДанных.Строки.Добавить();
           хзПриемникДанных["Название"] = ЧтениеXML.ЛокальноеИмя;
       ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
           хзПриемникДанных["Значение"] = ЧтениеXML.Значение;
       ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
           хзПриемникДанных["ЭтоУзел"] = хзПриемникДанных.Строки.Количество();
           хзПриемникДанных = хзПриемникДанных.Родитель;
       КонецЕсли;
       
   КонецЦикла;
   
   ЧтениеXML.Закрыть();
   
   Возврат дзРезультат;
   

КонецФункции


Процедура Сформировать(дзРезультат)
   
   
   Для Каждого Заказа Из дзРезультат.Строки цикл
       
       
       
       Для каждого Строка из Заказа.Строки цикл
           
           КомментарийПартнера = "";
           КомментарийКонтрагента = "";
           
           докЗаказКлиента = Документы.ЗаказКлиента.СоздатьДокумент();

           Соответствие = Новый Соответствие;
           Индекс = 0;
           тз = Новый ТаблицаЗначений;
           тз.Колонки.Добавить("КодТовараНаСайте");
           тз.Колонки.Добавить("НаименованиеТовара");
           тз.Колонки.Добавить("КодКаталогаНаСайте");
           тз.Колонки.Добавить("НаименованиеКаталога");
           тз.Колонки.Добавить("НомерЦвета");
           тз.Колонки.Добавить("НаименованиеЦвета");
           тз.Колонки.Добавить("Размер");
           тз.Колонки.Добавить("Цена");
           тз.Колонки.Добавить("Скидка");
           тз.Колонки.Добавить("Количество");
           
           Для каждого стрЗаказы из Строка.Строки  Цикл
               
               Индекс = Индекс + 1;
               Соответствие [Индекс] = стрЗаказы.Значение;
                   
           КонецЦикла;
           
           Стр =  Соответствие.Получить(7);
           Дата = ПолучитьДатуИзСтроки(Стр);

           докЗаказКлиента.Дата = Дата;
           
           РезПоискаПартнеры = Справочники.Партнеры.НайтиПоКоду(Соответствие.Получить(1));
           
           Запрос = Новый Запрос;
           Запрос.Текст =    
           "ВЫБРАТЬ
           |    Контрагенты.КодНаСайте,
           |    Контрагенты.Ссылка
           |ИЗ
           |    Справочник.Контрагенты КАК Контрагенты
           |ГДЕ
           |    Контрагенты.КодНаСайте = &КодНаСайте";
           Запрос.УстановитьПараметр("КодНаСайте",Соответствие.Получить(5));
           Выборка = Запрос.Выполнить();
           ПоискКонтрагента = Выборка.Выбрать();
           
           Если   ПоискКонтрагента.Следующий() = Истина тогда
               
               РезПоискаКонтрагенты = ПоискКонтрагента.ссылка;
               
           
           КонецЕсли;
           
                       
           Если РезПоискаПартнеры.Пустая()  или Не ЗначениеЗаполнено(РезПоискаКонтрагенты)  тогда
               
               КомментарийПартнера    = "Не найден партнер    с id:" + Соответствие.Получить(1);
               КомментарийКонтрагента = "Не найден контрагент с id:" + Соответствие.Получить(5);
               
           Иначе
               
               докЗаказКлиента.Партнер    = РезПоискаПартнеры.Ссылка;
               докЗаказКлиента.Контрагент = РезПоискаКонтрагенты.Ссылка;
           КонецЕсли;
           
                           
               Если стрЗаказы.Название= "order_details" тогда
                   
                   Для каждого  ЭлСтрока из  стрЗаказы.Строки Цикл
                       
                       НоваяСтрока = тз.Добавить();
                       
                       Для каждого ЭлементЗаказа из ЭлСтрока.Строки Цикл
                           
                           Если  ЭлементЗаказа.Название = "item_id" тогда
                               НоваяСтрока.КодТовараНаСайте = ЭлементЗаказа.Значение;    
                           ИначеЕсли ЭлементЗаказа.Название = "item_name" тогда  
                               НоваяСтрока.НаименованиеТовара = ЭлементЗаказа.Значение;  
                           ИначеЕсли ЭлементЗаказа.Название = "item_catalog_id" тогда
                               НоваяСтрока.КодКаталогаНаСайте = ЭлементЗаказа.Значение;  
                           ИначеЕсли ЭлементЗаказа.Название = "item_catalog_name" тогда
                               НоваяСтрока.НаименованиеКаталога = ЭлементЗаказа.Значение;
                           ИначеЕсли ЭлементЗаказа.Название = "color_id" тогда
                               НоваяСтрока.НомерЦвета = ЭлементЗаказа.Значение;
                           ИначеЕсли ЭлементЗаказа.Название = "color_name" тогда
                               НоваяСтрока.НаименованиеЦвета = ЭлементЗаказа.Значение;
                           ИначеЕсли ЭлементЗаказа.Название = "size" тогда
                               НоваяСтрока.Размер = ЭлементЗаказа.Значение;  
                           ИначеЕсли ЭлементЗаказа.Название = "price" тогда
                               НоваяСтрока.Цена = ЭлементЗаказа.Значение;
                           ИначеЕсли ЭлементЗаказа.Название = "discount" тогда
                               НоваяСтрока.Скидка = ЭлементЗаказа.Значение;
                           ИначеЕсли ЭлементЗаказа.Название = "cnt" тогда
                               НоваяСтрока.Количество = ЭлементЗаказа.Значение;
                               
                           КонецЕсли;
                           
                       КонецЦикла
                       
                   КонецЦикла;
                   
                ДокументЗаказаКлиента(тз,докЗаказКлиента,КомментарийПартнера,КомментарийКонтрагента);
   
                   
               КонецЕсли;
               
               ДокЗаказКлиента.ОбменДанными.Загрузка = Истина;
               ДокЗаказКлиента.Записать();
               
               
           КонецЦикла;
           
       КонецЦикла;
       
   
КонецПроцедуры
   

Процедура ДокументЗаказаКлиента(тз,докЗаказКлиента,КомментарийПартнера,КомментарийКонтрагента)
   
   //ДокЗаказКлиента = Документы.ЗаказКлиента.СоздатьДокумент();
   //
   Для каждого СтрТЗ из тз Цикл
       
       КомментарийХарактеристик = "";
       КомментарийТовара = "";
       

       тчТовары = ДокЗаказКлиента.Товары;
       ОбъектТовары = тчТовары.Добавить();
       
       КоллекцияЗначений = Новый СписокЗначений();
       КоллекцияЗначений.Добавить(СтрТЗ.Размер);
       КоллекцияЗначений.Добавить(СтрТЗ.НомерЦвета);
       КоллекцияЗначений.Добавить(СтрТЗ.НаименованиеЦвета);
       
       НаименованиеХарактеристик = СформироватьНаименованиеХарактеристик(КоллекцияЗначений);
       
       Запрос = Новый Запрос;
       Запрос.Текст =
       "ВЫБРАТЬ
       |    Номенклатура.idТовараНаСайте,
       |    Номенклатура.idКаталогаНаСайте,
       |    Номенклатура.Ссылка,
       |    Номенклатура.ВидНоменклатуры.ИспользованиеХарактеристик КАК ИспользованиеХарактеристик
       |ИЗ
       |    Справочник.Номенклатура КАК Номенклатура
       |ГДЕ
       |    Номенклатура.idТовараНаСайте = &idТовараНаСайте
       |    И Номенклатура.idКаталогаНаСайте = &idКаталогаНаСайте";
       
       Запрос.УстановитьПараметр("idТовараНаСайте",СтрТЗ.КодТовараНаСайте);
       Запрос.УстановитьПараметр("idКаталогаНаСайте",СтрТЗ.КодКаталогаНаСайте);
       Выборка = Запрос.Выполнить();
       ПоискНоменклатуры = Выборка.Выбрать();
       
       Если   ПоискНоменклатуры.Следующий() = Истина тогда
           ОбъектТовары.Номенклатура = ПоискНоменклатуры.ссылка;
       Иначе
           КомментарийТовара =  "Не найден товар с кодом:"+ СтрТЗ.КодТовараНаСайте +";" + " " + "Наименование:"+ "" +  СтрТЗ.НаименованиеТовара;
           
                       
       КонецЕсли;
       
       
       Если ПоискНоменклатуры.ИспользованиеХарактеристик = Перечисления.ВариантыВеденияДополнительныхДанныхПоНоменклатуре.ИндивидуальныеДляНоменклатуры тогда
           
           Запрос = Новый Запрос;
           Запрос.Текст =
           "ВЫБРАТЬ
           |    ХарактеристикиНоменклатуры.Ссылка,
           |    ХарактеристикиНоменклатуры.Владелец,
           |    ХарактеристикиНоменклатуры.Наименование
           |ИЗ
           |    Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
           |ГДЕ
           |    ХарактеристикиНоменклатуры.Владелец = &Владелец";
           Запрос.УстановитьПараметр("Владелец",ПоискНоменклатуры.ссылка);                    
           Выборка = Запрос.Выполнить();
           РезХарактеристик = Выборка.Выбрать();
           
           Пока  РезХарактеристик.Следующий() Цикл
               
               Если НаименованиеХарактеристик  = РезХарактеристик.Ссылка тогда
                   ОбъектТовары.Характеристика = РезХарактеристик.Ссылка;
               Иначе
                   КомментарийХарактеристик = "Не найдена характеристика товара:" + НаименованиеХарактеристик;
                   
               КонецЕсли;    
           КонецЦикла;
           
       КонецЕсли;
       
       ОбъектТовары.Количество = СтрТЗ.Количество;
       
       ДокЗаказКлиента.Комментарий = КомментарийПартнера + Символы.ПС + КомментарийКонтрагента + Символы.ПС + КомментарийТовара + Символы.ПС + КомментарийХарактеристик + Символы.ПС;

   КонецЦикла;
   
                 
КонецПроцедуры

Функция ПолучитьДатуИзСтроки(Стр)    
   СтрокаДаты = Стр;
   ПС = Символы.ПС;
   Стр = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрокаДаты, "-", ПС), ":", ПС), " ", ПС);
   Дата = Дата(
     СтрПолучитьСтроку(Стр, 1)
   , СтрПолучитьСтроку(Стр, 2)
   , СтрПолучитьСтроку(Стр, 3)
   , СтрПолучитьСтроку(Стр, 4)
   , СтрПолучитьСтроку(Стр, 5)
   , СтрПолучитьСтроку(Стр, 6)
   );
   возврат Дата;
   
КонецФункции



Функция СформироватьНаименованиеХарактеристик(КоллекцияЗначений)
   
   Строка = "";
   
   Для каждого ЭлементКоллекции Из КоллекцияЗначений Цикл
       
       Если  ЗначениеЗаполнено(ЭлементКоллекции.Значение) Тогда
           Строка = Строка + ЭлементКоллекции.Значение + ", ";    
       КонецЕсли;
       
   КонецЦикла;
   
   Строка = Лев(Строка, СтрДлина(Строка) - 2);
   
   Если ПустаяСтрока(Строка) Тогда
       Строка = "<Свойства не назначены>";
   КонецЕсли;
   
   Возврат Строка;
   
КонецФункции
1 Godofsin
 
26.10.12
10:58
Запросы в цикле - моветон. В чем проблема-то?
2 pele
 
26.10.12
11:00
нужно вызвать в модуле формы по нажатии на кнопку
3 pele
 
26.10.12
11:01
Как вызвать:

&НаКлиенте
Процедура ПрочитатьИзФайлаXML(Команда)    
       Результат();
   
КонецПроцедуры
 



Процедура Результат() Экспорт
   
   стрСодержимоеФайлаXML = ПолучитьТекстXMLССайта();    
   стрСодержимоеФайлаXML = СтрЗаменить(стрСодержимоеФайлаXML, "&", "'n'");
   дзРезультат = РаспарситьФайлXML(стрСодержимоеФайлаXML);
   Сформировать(дзРезультат);

КонецПроцедуры
4 Ursus maritimus
 
26.10.12
11:07
&НаСервере
Процедура ПрочитатьИзФайлаXML(Команда)    

   Об = РеквизитФормыВЗначение("Объект");    
   Об.Результат();
КонецПроцедуры
 


&НаКлиенте
Процедура ПрочитатьИзФайлаXML(Команда)    
       ВызватьРезультат();
   
КонецПроцедуры
5 Ursus maritimus
 
26.10.12
11:08
Издержки копипаста. Так Надо

&НаСервере
Процедура ВызватьРезультат(Команда)    

   Об = РеквизитФормыВЗначение("Объект");    
   Об.Результат();
КонецПроцедуры
 


&НаКлиенте
Процедура ПрочитатьИзФайлаXML(Команда)    
       ВызватьРезультат();
   
КонецПроцедуры