Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка в запросе обработки.  (Прочитано 7067 раз)
0 Пользователей и 1 Гость смотрят эту тему.
annyz
Интересующийся

ua
Offline Offline

« : 11-11-2013 07:11 » new

Пишу внешнюю обработку по заполнению табличной части документа Перемещение ОС, есть условие по подразделению, по молу, но все тянется общей кучей без отбора, подскажите, пожалуйста, в чем ошибка.

Код: (1C v8)
Функция СформироватьЗапросПоОС()
        Запрос = Новый Запрос;
        Запрос.УстановитьПараметр("Период", ОбъектСсылка.Дата);
  //  Запрос.УстановитьПараметр("Организация", ОбъектСсылка.Организация);

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

                КонецЕсли;
                ИначеЕсли ЗначениеЗаполнено(МОЛ) Тогда
                Запрос.Текст = СтрЗаменить(Запрос.Текст, "УсловиеНаМОЛ", " И МестонахождениеОССрезПоследних.МОЛ = &МОЛ ");
                Запрос.УстановитьПараметр("МОЛ",МОЛ);
        КонецЕсли;

   
        Если ЗначениеЗаполнено(ПодразделениеОрганизаций) Тогда
                Запрос.Текст = СтрЗаменить(Запрос.Текст, "УсловиеНаМестонахождение", " И МестонахождениеОССрезПоследних.Местонахождение = &Местонахождение ");
                Запрос.УстановитьПараметр("Местонахождение",ПодразделениеОрганизаций);
        Иначе
                Запрос.Текст = СтрЗаменить(Запрос.Текст, "УсловиеНаМестонахождение", "");
        КонецЕсли;
       
        Возврат Запрос.Выполнить();
               
КонецФункции
« Последнее редактирование: 11-11-2013 10:22 от Kivals » Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 11-11-2013 10:36 » 

1. Для кода используй [code][/code] или [code=e1cv8][/code]!!!
2. Пиши код аккуратней (отступы) - легче будет разобраться
3. Всю конструкцию
Код: (1C v8)
Если НЕ ЗначениеЗаполнено(МОЛ) Тогда
    Если  ОтобратьПоПустомуМОЛ = Истина  Тогда
        Запрос.УстановитьПараметр("МОЛ",МОЛ);
        ...;
    Иначе
        ...;
    КонецЕсли;
ИначеЕсли ЗначениеЗаполнено(МОЛ) Тогда
    Запрос.УстановитьПараметр("МОЛ",МОЛ);
    ...;
КонецЕсли;
логичней (для простоты чтения кода) заменить
Код: (1C v8)
Если ЗначениеЗаполнено(МОЛ) ИЛИ (ОтобратьПоПустомуМОЛ = Истина) Тогда
    Запрос.УстановитьПараметр("МОЛ",МОЛ);
    ...;
Иначе
    ...;
КонецЕсли;
4. Строки для замены лучше оформлять как параметры, тогда можно будет легко использовать конструктор запросов. Вместо:
Код: (1C v8)
"...
|ГДЕ
|        ...
|        УсловиеНаМОЛ
|        УсловиеНаМестонахождение
|..."
;
лучше написать
Код: (1C v8)
"...
|ГДЕ
|        ...
|        И &УсловиеНаМОЛ
|        И &УсловиеНаМестонахождение
|..."
;
и тогда:
Код: (1C v8)
Если ЗначениеЗаполнено(ПодразделениеОрганизаций) Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеНаМестонахождение", "(МестонахождениеОССрезПоследних.Местонахождение = &Местонахождение)");
    Запрос.УстановитьПараметр("Местонахождение", ПодразделениеОрганизаций);
Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеНаМестонахождение", "ИСТИНА");
КонецЕсли;

Выполнишь все пожелания - в результате думаю легко будет найти ошибку, ибо тут скорее ошибка от неаккуратности (где-то опечатка или что-то подобное)
Записан
annyz
Интересующийся

ua
Offline Offline

« Ответ #2 : 11-11-2013 10:45 » 

просто, когда выбираю мол и подразделение, выбирается все правильно...
когда мол и пустое подразделение тоже, а когда подразделение с пустым мол, то не срабатывает отбор по подразделению
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 11-11-2013 12:11 » 

Выведи какой получился запрос в этом случае перед выполнением запроса  (Сообщить(Запрос.Текст) или отладчиком) и проанализаруй результат
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines