Имя: Пароль:
1C
1C 7.7
v7: Запрос, и обход результата
, ,
0 Amiralnar
 
14.09.11
09:44
Имеется код из типовых правил обмена ТиС-УТ.

В правиле выгрузки данных для конвертации цен есть код:



       
       Запрос = СоздатьОбъект("Запрос");
       ТекстЗапроса =
           "//{{ЗАПРОС(ОтборЦен)
           |Период с ДатаНач по ДатаНач;
           |Номенклатура = Справочник.Цены.Владелец;
           |ТипЦен = Справочник.Цены.ТипЦен;
           |Рассчитывается = Справочник.Цены.ТипЦен.Рассчитывается;
           |БазовыйТипЦен = Справочник.Цены.ТипЦен.БазовыйТипЦен;
           |Цена = Справочник.Цены.Цена;
           |Единица = Справочник.Цены.Единица;
           |Валюта = Справочник.Цены.Валюта;
           |Процент = Справочник.Цены.Процент;
           |Функция ЦенаСумма = Сумма(Цена);
           |Группировка ТипЦен;
           |Группировка Номенклатура без групп;
           |Условие((Номенклатура.ЭтоГруппа() = 0) И (Цена <> 0));
           |";
       
       Если Запрос.Выполнить(ТекстЗапроса) <> 0 Тогда    
             Индекс = 1;
           Номер = 0;
           Пока Запрос.Группировка(1) = 1 Цикл
               ТипыЦен.УдалитьСтроки();
               ТипыЦен.НоваяСтрока();
               ТипыЦен.ТипЦен = Запрос.ТипЦен;
               Товары.УдалитьСтроки();
               Номер = Номер + 1;
               Пока Запрос.Группировка(2) = 1 Цикл
                   Товары.НоваяСтрока();
                   Товары.Номенклатура = Запрос.Номенклатура;
                   Товары.ТипЦен = Запрос.ТипЦен;
                   Товары.Цена = Запрос.Цена;
                   Товары.ЕдиницаИзмерения = Запрос.Единица;
                   Товары.ПроцентСкидкиНаценки = Запрос.Процент;
                   Товары.ИндексСтрокиТаблицыЦен = Индекс;
                   Товары.Валюта = Запрос.Валюта;
                   Если (Запрос.Рассчитывается = 1)  Или ((Запрос.Рассчитывается = 0) И (ПустоеЗначение (Запрос.БазовыйТипЦен) = 0)) Тогда
                       Товары.СпособРасчетаЦены = "ПоПроцентнойНаценкеНаБазовыйТип";
                   КонецЕсли;
                 КонецЦикла;                    
                 ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
                 ИсходящиеДанные.Установить("Номер", Номер);
               ИсходящиеДанные.Установить("Дата", ДатаНач);
               ИсходящиеДанные.Установить("ТипыЦен",ТипыЦен);
               ИсходящиеДанные.Установить("Комментарий", Параметры.СтрокаКомментария);
               ИсходящиеДанные.Установить("Товары", Товары);        
               ВыгрузитьПоПравилу(,, ИсходящиеДанные,, "ЦеныНоменклатуры");
               Индекс = Индекс + 1;
           КонецЦикла;    


Из него сделал свой обработчик следующего вида:


       Запрос = СоздатьОбъект("Запрос");
       ТекстЗапроса =
           "//{{ЗАПРОС(ОтборЦен)
           |Период с ДатаНач по ДатаНач;
           |Номенклатура = Справочник.Цены.Владелец;
           |ТипЦен = Справочник.Цены.ТипЦен;
           |//Рассчитывается = Справочник.Цены.ТипЦен.Рассчитывается;
           |//БазовыйТипЦен = Справочник.Цены.ТипЦен.БазовыйТипЦен;
           |Цена = Справочник.Цены.Цена;
           |//Единица = Справочник.Цены.Единица;
           |Валюта = Справочник.Цены.Валюта;
           |//Процент = Справочник.Цены.Процент;
           |Функция ЦенаСумма = Сумма(Цена);
           |Группировка ТипЦен;
           |Группировка Номенклатура без групп;
           |Условие((Номенклатура.ЭтоГруппа() = 0) И (Цена <> 0) И (Номенклатура.Актуальный = 1));
           |";
       
       Если Запрос.Выполнить(ТекстЗапроса) <> 0 Тогда    
             Индекс = 1;
           Номер = 0;
           Пока Запрос.Группировка(1) = 1 Цикл
               ТипыЦен.УдалитьСтроки();
               ТипыЦен.НоваяСтрока();
               ТипыЦен.ТипЦен = Запрос.ТипЦен;
               Товары.УдалитьСтроки();
               Номер = Номер + 1;
               Пока Запрос.Группировка(2) = 1 Цикл
                   Товары.НоваяСтрока();
                   Товары.Номенклатура = Запрос.Номенклатура;
                   Товары.ТипЦен = Запрос.ТипЦен;
                   Товары.Цена = Запрос.Цена;
                   Товары.ЕдиницаИзмерения = Товары.Номенклатура.ОсновнаяЕдиница;
                   //Товары.ПроцентСкидкиНаценки = Запрос.Процент;
                   Товары.ИндексСтрокиТаблицыЦен = Индекс;
                   Товары.Валюта = Запрос.Валюта;
                   //Если (Запрос.Рассчитывается = 1)  Или ((Запрос.Рассчитывается = 0) И (ПустоеЗначение (Запрос.БазовыйТипЦен) = 0)) Тогда
                   //    Товары.СпособРасчетаЦены = "ПоПроцентнойНаценкеНаБазовыйТип";
                   //КонецЕсли;
               КонецЦикла;                    
                 ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
                 ИсходящиеДанные.Установить("Номер", Номер);
               ИсходящиеДанные.Установить("Дата", ДатаНач);
               ИсходящиеДанные.Установить("ТипыЦен",ТипыЦен);
               ИсходящиеДанные.Установить("Комментарий", "");
               ИсходящиеДанные.Установить("Товары", Товары);        
               ВыгрузитьПоПравилу(,, ИсходящиеДанные,, "УстановкаЦенНоменклатуры");
               Индекс = Индекс + 1;
           КонецЦикла;


И вот незадача: валюта не определена. В отладчике переменная Запрос не имеет значения в свойстве Валюта.

ЧЯДНТ?
1 1Сергей
 
14.09.11
09:51
а в справочнике определена?
2 Amiralnar
 
14.09.11
10:17
Нет. Оказалось, в списке справочника есть чудная формулировка:


// Валюта()
//
// Параметры:
//  Нет.
//
// Возвращаемое значение:
//  Строка - возвращается наименование валюты цен в договоре или "руб.",
//             если валюта не выбрана.
//
// Вызывается из формул элементов диалога:
//  Графа списка "Валюта".
//
Функция Валюта()
   Если ТекущийЭлемент().Выбран() = 1 Тогда
       Если ПустоеЗначение(Валюта) = 1 Тогда
           Стр = "руб.";
       Иначе
           Стр = Валюта.Наименование;
       КонецЕсли;
       Возврат Стр;
   КонецЕсли;
   Возврат "";
КонецФункции // Валюта()