Имя: Пароль:
1C
1С v8
Помогите с запросом
0 Масянька
 
16.05.12
09:44
Доброе утро!
Помогите с запросом, пожалуйста:
Функция ПроверкаДублей(ПараметрСправочник, ПараметрУсловие1Поле, ПараметрУсловие1Ссылка,
                      ПараметрУсловие2, ПараметрУсловие2Поле, ПараметрУсловие2Ссылка, ПараметрСсылка) Экспорт

   Условие2 = "";
   
   ЗапросПоДублям    = Новый Запрос();

   ЗапросПоДублям.Текст =  
   "ВЫБРАТЬ
   |    СправочникОбъект.Наименование,
   |    СправочникОбъект.Контрагент.Ссылка
   |ИЗ
   
   |    " + ПараметрСправочник.Метаданные().ПолноеИмя() + " КАК СправочникОбъект
   
   |ГДЕ
   |    СправочникОбъект." + ПараметрУсловие1Поле + " =&ПараметрУсловие1Ссылка
   |    " + Условие2 + "
   |    И СправочникОбъект.Ссылка <> &Ссылка";
   
   ЗапросПоДублям.УстановитьПараметр("ПараметрУсловие1Ссылка", ПараметрУсловие1Ссылка);
   
   Если ПараметрУсловие2 = Истина Тогда
       Условие2 = "СправочникОбъект." + ПараметрУсловие2Поле + " =&ПараметрУсловие2Ссылка";
       ЗапросПоДублям.УстановитьПараметр("ПараметрУсловие2Ссылка", ПараметрУсловие2Ссылка);
Сообщить("1 - " + Условие2 + " - " + ПараметрУсловие2Ссылка);
   КонецЕсли;
   ЗапросПоДублям.УстановитьПараметр("Ссылка", ПараметрСсылка);

   Возврат ЗапросПоДублям.Выполнить().Пустой();

КонецФункции // ПроверкаДублей()


   Если элОбщегоНазначения.ПроверкаДублей(ЭтотОбъект, "Наименование", Наименование, Истина, "Контрагент.Ссылка", Контрагент, Ссылка) = Ложь Тогда
       Предупреждение("Линия с таким наименованием (" + Наименование + ") уже есть в справочнике.");
       Отказ = Истина;
   КонецЕсли;
1 andrewks
 
16.05.12
09:46
в чём вопрос?
2 Масянька
 
16.05.12
09:47
(1) Забыла :). В справочнике есть такое наименование, но завожу другого контрагента. А ругается, что такая запись уже есть.
3 andrewks
 
16.05.12
09:49
а разве не этого надо, судя по коду?
4 Масянька
 
16.05.12
09:53
Надо:  может быть много одинаковых наименований, но контрагенты разные или 1 пустой.
Например: ADMIRAL - (пустой контрагент)
         ADMIRAL - ООО "Веллас"
         ADMIRAL - Деловые линии
Новую запись: ADMIRAL - Деловые линии - завести нельзя, а запись ADMIRAL - ЗАО "Маерск" - можно.
5 Азазелло
 
16.05.12
10:00
(0) Так ты Условие2 заполняешь после того, как собираешь текст запроса
6 Азазелло
 
16.05.12
10:01
(0) Ну и да, традиционно, Если ПараметрУсловие2 = Истина Тогда - жесть :)
Да и СправочникОбъект.Контрагент.Ссылка тоже жесть
7 Масянька
 
16.05.12
10:01
Ребята! Я тут туплю (машину разбила :((((((((( ). Вы уж извините. А куда надо Условие2 пихнуть?
8 Масянька
 
16.05.12
10:02
Пардон - поняла - до установки параметров....
9 andrewks
 
16.05.12
10:03
(8) до склейки текста запроса
10 Азазелло
 
16.05.12
10:03
(8) В данном случае
Если ПараметрУсловие2 = Истина Тогда
       Условие2 = "СправочникОбъект." + ПараметрУсловие2Поле + " =&ПараметрУсловие2Ссылка";
КонецЕсли;
Вынести в самый верх, там, где Условие2 = ""
11 Масянька
 
16.05.12
10:05
(6) А как нужно?
12 cViper
 
16.05.12
10:13
(0) Зачем ты в запросе даешь название таблице "СправочникОбъект", если у тебя там не объект?
Зачем передавать булев параметр ПараметрУсловие2 если можно просто проверять ПараметрУсловие2Поле на заполненность?
"ПараметрУсловие1Поле, ПараметрУсловие1Ссылка" - такие параметры можно положить в единую структуру данных (ключ-значение).
13 Азазелло
 
16.05.12
10:20
(12) да какая разница, какой синоним придумать
(11) достаточно просто Если ПараметрУсловие2 Тогда
и ВЫБРАТЬ СправочникОбъект.Контрагент
14 cViper
 
16.05.12
10:26
(13) Для быдлокодера разницы никакой.
15 Азазелло
 
16.05.12
10:30
(14) мы в 1с-е - все такие :) и не надо начинать холивар на тему, что с синонимов все и начинается.
16 Азазелло
 
16.05.12
10:31
(15) *уточняю "мы в 1с-е - все такие" - с точки зрения "православных" программистов :)
17 Азазелло
 
16.05.12
10:32
(14) ну и в продолжнение (12) - можно подумать, у вас там СправочникСсылка :) Не думаю, что ты даешь синоними а-ля ОсновнаяТаблицаСправочникаНоменклатура
18 Масянька
 
16.05.12
10:34
Дядьки - спасибо!

PS Целовать не буду - плачу :(((((
19 andrewks
 
16.05.12
10:36
(18) намекаешь, что надо утешить?
20 Азазелло
 
16.05.12
10:37
(18) машина - железка. сама жива и здорова - главное. остальное - прибудет.
21 Масянька
 
16.05.12
10:38
(19) Бесполезно :(((

Забыла: а как параметры передавать лучше? Ткните - где про "ключ-значение" посмотреть.
22 Азазелло
 
16.05.12
10:39
(21) куда передавать?
23 Масянька
 
16.05.12
10:47
(22) В функцию. Такая фишка - в нескольких справочниках используется. Вот и хочу сделать функцию.
24 Азазелло
 
16.05.12
10:54
(23) Ну, если делать универсально, то передавай в функцию массив структур вида
Новый Структура("Поле, Значение", <ИмяРеквизитаСправочника>, <ЗначениеРеквизитаСправочника>)
В функции пробегай по этому массиву и для каждого элемента достраивай текст запроса
что-то вроде
Для Каждого ТекУсловие Из МассивУсловий Цикл
ТекстЗапроса = ТекстЗапроса + "И " ТекУсловие.Поле + " = &_" + ТекУсловие.ПолеКонецЦикла;
Запрос.УстановитьПараметр("_" + ТекУсловие.Поле, ТекУсловие.Значение);
КонецЦикла;
25 Масянька
 
16.05.12
11:05
Огромное, человеческое спасибо!