Имя: Пароль:
1C
1С v8
Ошибка в запросе?
0 Me-chtatel
 
16.05.14
11:30
Полный текст процедуры:
Процедура УдалитьДубли ()
    
    
    Запрос = Новый Запрос;
    Запрос.Текст =     
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    СтавкиНалогаНаИмущество.ОС,
    |    СтавкиНалогаНаИмущество.Период,
    |    СтавкиНалогаНаИмущество.ИнвНомер КАК ИнвНомер,
    |    СтавкиНалогаНаИмущество.НалоговаяСтавка,
    |    СтавкиНалогаНаИмущество.Учреждение,
    |    СтавкиНалогаНаИмущество.ПорядокНалогообложения,
    |    СтавкиНалогаНаИмущество.ВидИмущества,
    |    СтавкиНалогаНаИмущество.БазоваяСтавка
    |ИЗ
    |    РегистрСведений.СтавкиНалогаНаИмущество КАК СтавкиНалогаНаИмущество
    |
    |СГРУППИРОВАТЬ ПО
    |    СтавкиНалогаНаИмущество.ОС,
    |    СтавкиНалогаНаИмущество.ИнвНомер,
    |    СтавкиНалогаНаИмущество.НалоговаяСтавка,
    |    СтавкиНалогаНаИмущество.Учреждение,
    |    СтавкиНалогаНаИмущество.ПорядокНалогообложения,
    |    СтавкиНалогаНаИмущество.ВидИмущества,
    |    СтавкиНалогаНаИмущество.БазоваяСтавка,
    |    СтавкиНалогаНаИмущество.Период
    |
    |УПОРЯДОЧИТЬ ПО
    |    ИнвНомер";
    
    Результат = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    НаборЗаписей = РегистрыСведений.СтавкиНалогаНаИмущество.СоздатьНаборЗаписей();
    НаборЗаписей.Записать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        // Вставить обработку выборки ВыборкаДетальныеЗаписи
        
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    СобытияОССрезПоследних.ДатаСобытия
        |ИЗ
        |    РегистрСведений.СобытияОС.СрезПоследних КАК СобытияОССрезПоследних
        |ГДЕ
        |    СобытияОССрезПоследних.ОС = &ОС";
        
        Запрос.УстановитьПараметр("ОС", ВыборкаДетальныеЗаписи.ОС);
//        Запрос.УстановитьПараметр("Событие", Перечисления.СостоянияОС.ВведеноВЭксплуатацию);      
        ВыборкаСобытияОС = Запрос.Выполнить().Выбрать().Следующий();
        
        ЗаписьРегистра = РегистрыСведений.СтавкиНалогаНаИмущество.СоздатьМенеджерЗаписи();

        ЗаписьРегистра.ОС = ВыборкаДетальныеЗаписи.ОС;
        ЗаписьРегистра.ИнвНомер = ВыборкаДетальныеЗаписи.ИнвНомер;
        ЗаписьРегистра.Период = ВыборкаСобытияОС.Событие;
        ЗаписьРегистра.Учреждение = ВыборкаДетальныеЗаписи.Учреждение;
        ЗаписьРегистра.НалоговаяСтавка = ВыборкаДетальныеЗаписи.НалоговаяСтавка;
        ЗаписьРегистра.БазоваяСтавка = ВыборкаДетальныеЗаписи.БазоваяСтавка;
        ЗаписьРегистра.ПорядокНалогообложения = ВыборкаДетальныеЗаписи.ПорядокНалогообложения;
        ЗаписьРегистра.ВидИмущества = ВыборкаДетальныеЗаписи.ВидИмущества;
        ЗаписьРегистра.Записать();
        
        Сообщить(Строка(ВыборкаДетальныеЗаписи.ОС)+" инв номер "+Строка(ВыборкаДетальныеЗаписи.ИнвНомер)+" "+Строка(ВыборкаДетальныеЗаписи.Учреждение));
        
    КонецЦикла;                              
    
    
    
КонецПроцедуры

Суть вопроса: надо очистить регистр от дублрирующихся записей, которых там неимоверно много. Не нашел ничего лучше, как в начале первым запросом выбрать из этого регистра по одной записи для каждого ОС, затем его очистить и заного перезаполнить. Но тут вышла проблема - надо правильно задать реквизит "Период". Для этого внутри цикла создал еще 1 запрос по регистру сведений СобытияОС. Если я его проверяю через консоль запросов - все работает как надо. А как только запускаю обработку - второй запрос пустой, как не изворачивайся. Подскажите что именно я не так делаю?
1 Me-chtatel
 
16.05.14
13:01
Сейчас ради эксперимента сделал такой запрос:

Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                   |    СобытияОС.Период,
                   |    СобытияОС.ОС,
                   |    СобытияОС.ОС.Код,
                   |    СобытияОС.ДатаСобытия,
                   |    СобытияОС.Событие,
                   |    СобытияОС.ИнвНомер
                   |ИЗ
                   |    РегистрСведений.СобытияОС КАК СобытияОС
                   |ГДЕ
                   |    СобытияОС.Событие = &Событие";
    Запрос.УстановитьПараметр("Событие", Перечисления.СостоянияОС.ПринятоКУчету);


И опять пустой результат.....
причем теперь если убрать отбор по событию - запрос работает....
Подскажите где тут собака зарыта?? уже все мозги сломал...
2 Ненавижу 1С
 
гуру
16.05.14
13:02
а тип Событие точно Перечисления.СостоянияОС
3 User_Agronom
 
16.05.14
13:03
(1) А просто заглянуть в регистр не судьба?
Может там записей вообще нет.
4 Me-chtatel
 
16.05.14
13:05
(2) Точно.

(3) (2)  все запросы я вначале прогоняю в этой же базе через консоль запросов. И там все есть. но разумеется я заглядывал и проверял.
5 Me-chtatel
 
16.05.14
13:07
(2)
причем когда в отладчике выбираешь "вычислить выражение" и "Запрос", внешне как будто все верно.
Но дальше уже пустота....
6 Me-chtatel
 
16.05.14
13:52
Хелп. Почему один и тот же запрос без отбора работает, а с отбором нет???? Причем в консоле запросов работают оба.

Вот полный текст:

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                   |    СобытияОС.Период,
                   |    СобытияОС.ОС,
                   |    СобытияОС.ОС.Код,
                   |    СобытияОС.ДатаСобытия,
                   |    СобытияОС.Событие,
                   |    СобытияОС.ИнвНомер
                   |ИЗ
                   |    РегистрСведений.СобытияОС КАК СобытияОС
                   |ГДЕ
                   |    СобытияОС.Событие = &Событие";
    Запрос.УстановитьПараметр("Событие", Перечисления.СостоянияОС.ПринятоКУчету);  
    
    Результат = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    НаборЗаписей = РегистрыСведений.СтавкиНалогаНаИмущество.СоздатьНаборЗаписей();
    НаборЗаписей.Записать();
    ДатаПерехода = Дата("20130101000000");
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        ЗаписьРегистра = РегистрыСведений.СтавкиНалогаНаИмущество.СоздатьМенеджерЗаписи();
        
        ЗаписьРегистра.ОС = ВыборкаДетальныеЗаписи.ОС;
        ЗаписьРегистра.ИнвНомер = ВыборкаДетальныеЗаписи.ИнвНомер;
        ЗаписьРегистра.Период = ВыборкаДетальныеЗаписи.ДатаСобытия;
        ЗаписьРегистра.Учреждение = ВыборкаДетальныеЗаписи.Учреждение;
        Если ВыборкаДетальныеЗаписи.ДатаСобытия < ДатаПерехода Тогда
            ЗаписьРегистра.НалоговаяСтавка = 2.2;
            ЗаписьРегистра.БазоваяСтавка = 2.2;
            ЗаписьРегистра.ПорядокНалогообложения = Перечисления.ПорядокНалогообложенияИмущества.ОсобыеЛьготыНеУстановлены;
            ЗаписьРегистра.ВидИмущества = Перечисления.НИ_ВидыИмущества.ОсобенностиОтсутствуют;
        Иначе
            ЗаписьРегистра.НалоговаяСтавка = 0;
            ЗаписьРегистра.БазоваяСтавка = 0;
            ЗаписьРегистра.ПорядокНалогообложения = Перечисления.ПорядокНалогообложенияИмущества.НеПодлежитНалогообложению;
            ЗаписьРегистра.ВидИмущества = Перечисления.НИ_ВидыИмущества.ОсобенностиОтсутствуют;    
        КонецЕсли;
        
        ЗаписьРегистра.Записать();
        
        Если ВыборкаДетальныеЗаписи.ДатаСобытия < ДатаПерехода Тогда
            
            ЗаписьРегистра = РегистрыСведений.СтавкиНалогаНаИмущество.СоздатьМенеджерЗаписи();
            
            ЗаписьРегистра.ОС = ВыборкаДетальныеЗаписи.ОС;
            ЗаписьРегистра.ИнвНомер = ВыборкаДетальныеЗаписи.ИнвНомер;
            ЗаписьРегистра.Период = ДатаПерехода;
            ЗаписьРегистра.Учреждение = ВыборкаДетальныеЗаписи.Учреждение;
            
            ЗаписьРегистра.НалоговаяСтавка = 0;
            ЗаписьРегистра.БазоваяСтавка = 0;
            ЗаписьРегистра.ПорядокНалогообложения = Перечисления.ПорядокНалогообложенияИмущества.НеПодлежитНалогообложению;
            ЗаписьРегистра.ВидИмущества = Перечисления.НИ_ВидыИмущества.ОсобенностиОтсутствуют;    
        КонецЕсли;
        ЗаписьРегистра.Записать();
        
        
        Сообщить(Строка(ВыборкаДетальныеЗаписи.ОС)+" инв номер "+Строка(ВыборкаДетальныеЗаписи.ИнвНомер)+" "+Строка(ВыборкаДетальныеЗаписи.Учреждение));
    КонецЦикла;
7 Me-chtatel
 
16.05.14
13:53
Если исключить этот блок:

|ГДЕ
                   |    СобытияОС.Событие = &Событие";
    Запрос.УстановитьПараметр("Событие", Перечисления.СостоянияОС.ПринятоКУчету);  



то все работает, но мне то надо отобрать только принятые к учету....
8 Крошка Ру
 
16.05.14
14:00
(7)Вариант один: делай выборку без отбора,  в отладчике смотри в выборке тип и значение поля Событие.
9 Me-chtatel
 
16.05.14
14:15
(8) Спасибо, оказалось что собития он брал не из регистра СостоянияОС, а из другого.

Но теперь вопрос, как объединить несколько условий типа "или"?
(просто не разу не приходилось еще такое делать), а вариантов которое может принимать значение события как минимум 3...
10 Me-chtatel
 
16.05.14
14:16
(9) отбой, кажется сам нашел ) спросил, не посмотрев конструктор