Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Запрос по нескольким реквизитам. (число прочтений - 4211 )
AgenTSiD
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 06. Сентября 2010
Запрос по нескольким реквизитам.
06. Сентября 2010 :: 16:21
Печать  
Доброе время суток! Извините если тема повторяется, пользовался поиском, ответа не нашел.
Моя проблема заключается в следующем.
Есть справочник Номенклатуры, в нем необходимо организовать поиск по нескольким реквизитам.
пример. Есть товар Задвижка. Необходимо сделать отбор всех существующих задвижек с серийным номером 777, Диаметром 100мм и производителя Иванов. Таких реквизитов у меня 6. по любому из них и по любой комбинации данных реквизитов необходимо организовать поиск или отбор если это можно так назвать. Перебрал возможные варианты получил 63 комбинации которые может ввести пользователь при поиске. Была идея создать 63 реквизита справочника и заполнять их при Добавлении нового товара автоматически. а потом делать отбор уже по сохраненным заготовкам. Но сейчас задача меняется и добавляется еще один реквизит по которому нужно искать товар. Тем самым количество комбинаций возрастает и метод становится не эффективным.
ПОДСКАЖИТЕ ПОЖАЛУЙСТА!!! Есть ли какие то решения данной задачи??? путем использования доп библиотек или еще чего либо.
Заранее спасибо!!!
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос по нескольким реквизитам.
Ответ #1 - 06. Сентября 2010 :: 16:56
Печать  
перечисли сюда все 6 своих реквизитов ( чтобы ответить тебе в твоих же терминах).

также непонятно чем для тебя поиск отличается от отбора  ?
какая у тебя версия 1с ( dbf . sql ) ?
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Запрос по нескольким реквизитам.
Ответ #2 - 07. Сентября 2010 :: 06:42
Печать  
AgenTSiD писал(а) 06. Сентября 2010 :: 16:21:
Доброе время суток! Извините если тема повторяется, пользовался поиском, ответа не нашел.
Моя проблема заключается в следующем.
Есть справочник Номенклатуры, в нем необходимо организовать поиск по нескольким реквизитам.
пример. Есть товар Задвижка. Необходимо сделать отбор всех существующих задвижек с серийным номером 777, Диаметром 100мм и производителя Иванов. Таких реквизитов у меня 6. по любому из них и по любой комбинации данных реквизитов необходимо организовать поиск или отбор если это можно так назвать. Перебрал возможные варианты получил 63 комбинации которые может ввести пользователь при поиске. Была идея создать 63 реквизита справочника и заполнять их при Добавлении нового товара автоматически. а потом делать отбор уже по сохраненным заготовкам. Но сейчас задача меняется и добавляется еще один реквизит по которому нужно искать товар. Тем самым количество комбинаций возрастает и метод становится не эффективным.
ПОДСКАЖИТЕ ПОЖАЛУЙСТА!!! Есть ли какие то решения данной задачи??? путем использования доп библиотек или еще чего либо.
Заранее спасибо!!!


Посмотри конфу - Скат - там красиво реализованы отботы по нескольким реквизитам станд. методами. Дешево и сердито.
  
Наверх
 
IP записан
 
AgenTSiD
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 06. Сентября 2010
Re: Запрос по нескольким реквизитам.
Ответ #3 - 07. Сентября 2010 :: 07:27
Печать  
У меня 1С7.7 Типовая конфигурация "Торговля+Склад" ред 9.2 (dbf)
Реквизиты:
1- НомерПоКаталогу (Строк)
2- Диаметр1 (Строк)
3- Диаметр2 (Строк)
4- Давление (Строк)
5- Длина1 (Строк)
6- Длина2 (Строк)
Поиск от отбора ничем для меня не отличается.
Спасибо!
  
Наверх
IP записан
 
AgenTSiD
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 06. Сентября 2010
Re: Запрос по нескольким реквизитам.
Ответ #4 - 07. Сентября 2010 :: 07:29
Печать  
Цитата:
Посмотри конфу - Скат - там красиво реализованы отботы по нескольким реквизитам станд. методами. Дешево и сердито.


У меня нет данной конфигурации, подскажите где можно взять MD'шник?
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос по нескольким реквизитам.
Ответ #5 - 07. Сентября 2010 :: 08:16
Печать  
AgenTSiD писал(а) 07. Сентября 2010 :: 07:27:
У меня 1С7.7 Типовая конфигурация "Торговля+Склад" ред 9.2 (dbf)
Реквизиты:
1- НомерПоКаталогу (Строк)
2- Диаметр1 (Строк)
3- Диаметр2 (Строк)
4- Давление (Строк)
5- Длина1 (Строк)
6- Длина2 (Строк)
Поиск от отбора ничем для меня не отличается.
Спасибо!

непонятно почему Числовые реквизиты Диаметр, Длина ты хранишь в строках. ПО моему это ошибка в логике.

решение без 1сpp :
на форме 6 твоих реквизитов ( а не 64 )
по заполненым реквизитам отбираешь подходящие элементы и помещаешь их в списокзначений.
отображаешь только элементы из списказначений с помощью
ИспользоватьСписокЭлементов(ТвойСписок);

решение с 1сpp :
на форме 6 твоих реквизитов ( а не 64 )
справочник отображаем с помощью ТП или ПоставщикДанных (
и уже именно они по заданым тобой фильтрам отбирают подходящие значения )
  
Наверх
 
IP записан
 
AgenTSiD
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 06. Сентября 2010
Re: Запрос по нескольким реквизитам.
Ответ #6 - 07. Сентября 2010 :: 09:00
Печать  
Z1 писал(а) 07. Сентября 2010 :: 08:16:
AgenTSiD писал(а) 07. Сентября 2010 :: 07:27:
У меня 1С7.7 Типовая конфигурация "Торговля+Склад" ред 9.2 (dbf)
Реквизиты:
1- НомерПоКаталогу (Строк)
2- Диаметр1 (Строк)
3- Диаметр2 (Строк)
4- Давление (Строк)
5- Длина1 (Строк)
6- Длина2 (Строк)
Поиск от отбора ничем для меня не отличается.
Спасибо!

непонятно почему Числовые реквизиты Диаметр, Длина ты хранишь в строках. ПО моему это ошибка в логике.

решение без 1сpp :
на форме 6 твоих реквизитов ( а не 64 )
по заполненым реквизитам отбираешь подходящие элементы и помещаешь их в списокзначений.
отображаешь только элементы из списказначений с помощью
ИспользоватьСписокЭлементов(ТвойСписок);

решение с 1сpp :
на форме 6 твоих реквизитов ( а не 64 )
справочник отображаем с помощью ТП или ПоставщикДанных (
и уже именно они по заданым тобой фильтрам отбирают подходящие значения )


Храню в строк типе потому что это было необходимо для реализации предыдущего метода отбора.

Процедура Отбор()
     Если (ПустоеЗначение(oA)=1) и (ПустоеЗначение(oB)=1) и (ПустоеЗначение(oC)=1) и (ПустоеЗначение(oD)=1)и (ПустоеЗначение(oE)=1)и (ПустоеЗначение(oF)=1) Тогда
           Предупреждение("Не задан ни один критерий отбора");
           //-=A=-
     ИначеЕсли (ПустоеЗначение(oA)=0) и (ПустоеЗначение(oB)=1) и (ПустоеЗначение(oC)=1) и (ПустоеЗначение(oD)=1)и (ПустоеЗначение(oE)=1)и (ПустоеЗначение(oF)=1) Тогда
           УстановитьОтбор("НомерПоКаталогу",oA);
           //-=B=-
     ИначеЕсли (ПустоеЗначение(oA)=1) и (ПустоеЗначение(oB)=0) и (ПустоеЗначение(oC)=1) и (ПустоеЗначение(oD)=1)и (ПустоеЗначение(oE)=1)и (ПустоеЗначение(oF)=1) Тогда
           УстановитьОтбор("Диаметр1",oB);
           //-=С=-
     ИначеЕсли (ПустоеЗначение(oA)=1) и (ПустоеЗначение(oB)=1) и (ПустоеЗначение(oC)=0) и (ПустоеЗначение(oD)=1)и (ПустоеЗначение(oE)=1)и (ПустоеЗначение(oF)=1) Тогда
           УстановитьОтбор("Диаметр2",oC);
           //-=D=-
     ИначеЕсли (ПустоеЗначение(oA)=1) и (ПустоеЗначение(oB)=1) и (ПустоеЗначение(oC)=1) и (ПустоеЗначение(oD)=0)и (ПустоеЗначение(oE)=1)и (ПустоеЗначение(oF)=1) Тогда
           УстановитьОтбор("Давление",oD);
           //-=E=-
     ИначеЕсли (ПустоеЗначение(oA)=1) и (ПустоеЗначение(oB)=1) и (ПустоеЗначение(oC)=1) и (ПустоеЗначение(oD)=0)и (ПустоеЗначение(oE)=1)и (ПустоеЗначение(oF)=1) Тогда
           УстановитьОтбор("Длина1",oD);
           //-=F=-
     ИначеЕсли (ПустоеЗначение(oA)=1) и (ПустоеЗначение(oB)=1) и (ПустоеЗначение(oC)=1) и (ПустоеЗначение(oD)=0)и (ПустоеЗначение(oE)=1)и (ПустоеЗначение(oF)=1) Тогда
           УстановитьОтбор("Длина2",oF);      
           //-=AB=-
     ИначеЕсли (ПустоеЗначение(oA)=0) и (ПустоеЗначение(oB)=0) и (ПустоеЗначение(oC)=1) и (ПустоеЗначение(oD)=1)и (ПустоеЗначение(oE)=1)и (ПустоеЗначение(oF)=1) Тогда
           оAB=СокрЛП(oA)+СокрЛП(oB);
           УстановитьОтбор("AB",оAB);
           //-=AС=-
     ИначеЕсли (ПустоеЗначение(oA)=0) и (ПустоеЗначение(oB)=1) и (ПустоеЗначение(oC)=0) и (ПустоеЗначение(oD)=1)и (ПустоеЗначение(oE)=1)и (ПустоеЗначение(oF)=1) Тогда
           оAС=СокрЛП(oA)+СокрЛП(oC);
           УстановитьОтбор("AС",оAС);
           //-=AD=-
     ИначеЕсли (ПустоеЗначение(oA)=0) и (ПустоеЗначение(oB)=1) и (ПустоеЗначение(oC)=1) и (ПустоеЗначение(oD)=0)и (ПустоеЗначение(oE)=1)и (ПустоеЗначение(oF)=1) Тогда
           оAD=СокрЛП(oA)+СокрЛП(oD);
           УстановитьОтбор("AD",оAD);
           //-=AE=-
     ИначеЕсли (ПустоеЗначение(oA)=0) и (ПустоеЗначение(oB)=1) и (ПустоеЗначение(oC)=1) и (ПустоеЗначение(oD)=1)и (ПустоеЗначение(oE)=0)и (ПустоеЗначение(oF)=1) Тогда
           оAE=СокрЛП(oA)+СокрЛП(oE);
           УстановитьОтбор("AD",оAE);
           //-=AF=-
     ИначеЕсли (ПустоеЗначение(oA)=0) и (ПустоеЗначение(oB)=1) и (ПустоеЗначение(oC)=1) и (ПустоеЗначение(oD)=1)и (ПустоеЗначение(oE)=1)и (ПустоеЗначение(oF)=0) Тогда
           оAF=СокрЛП(oA)+СокрЛП(oF);
           УстановитьОтбор("AF",оAF);
         //-=BС=-
     ИначеЕсли (ПустоеЗначение(oA)=1) и (ПустоеЗначение(oB)=0) и (ПустоеЗначение(oC)=0) и (ПустоеЗначение(oD)=1)и (ПустоеЗначение(oE)=1)и (ПустоеЗначение(oF)=1) Тогда
           оBС=СокрЛП(oB)+СокрЛП(oC);
           УстановитьОтбор("BС",оBС);      
           //-=BD=-
     ИначеЕсли (ПустоеЗначение(oA)=1) и (ПустоеЗначение(oB)=0) и (ПустоеЗначение(oC)=1) и (ПустоеЗначение(oD)=0)и (ПустоеЗначение(oE)=1)и (ПустоеЗначение(oF)=1) Тогда
           оBD=СокрЛП(oB)+СокрЛП(oD);
           УстановитьОтбор("BD",оBD);
........
//-=ABCDEF=-
     ИначеЕсли (ПустоеЗначение(oA)=0) и (ПустоеЗначение(oB)=0) и (ПустоеЗначение(oC)=0) и (ПустоеЗначение(oD)=0)и (ПустоеЗначение(oE)=0)и (ПустоеЗначение(oF)=0) Тогда
           оABCDEF=СокрЛП(oA)+СокрЛП(oB)+СокрЛП(oC)+СокрЛП(oD)+СокрЛП(oE)+СокрЛП(oF);
           УстановитьОтбор("ABCDEF",оABCDEF);      
КонецЕсли;

ABCDEF- записывалось при создании нового Товара, а также при изменении текущего.
На форме небыло 64 реквизита. бало как вы предлагаете 6.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос по нескольким реквизитам.
Ответ #7 - 07. Сентября 2010 :: 09:54
Печать  
Смотри сейчас вариантов 2**6 а если будет не 6 реквизитов а 10
тогда будет в if 1024 варианта ?
Я считаю что нужно уходить от такого решения :

Список1 = СоздатьОбъект("СписокЗначений");
Спр1 = СоздатьОбъект("Справочник.КонкретныйСправочник");
Спр1.ВыбратьЭлементы();
Пока Спр1.ПолучитьЭлемент() = 1 Цикл
   ТекЭл = Спр1.ТекущийЭлемент();
   Если ПодходитПоТекущимКритериям(ТекЭл) = 1 Тогда
     Список1.ДобавитьЗначение(ТекЭл, "");
   КонецЕсли;
КонецЦикла;
ИспользоватьСписокЭлементов(Список1);

как то так
  
Наверх
 
IP записан
 
AgenTSiD
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 06. Сентября 2010
Re: Запрос по нескольким реквизитам.
Ответ #8 - 07. Сентября 2010 :: 13:37
Печать  
Z1 писал(а) 07. Сентября 2010 :: 09:54:
Смотри сейчас вариантов 2**6 а если будет не 6 реквизитов а 10
тогда будет в if 1024 варианта ?
Я считаю что нужно уходить от такого решения :

Список1 = СоздатьОбъект("СписокЗначений");
Спр1 = СоздатьОбъект("Справочник.КонкретныйСправочник");
Спр1.ВыбратьЭлементы();
Пока Спр1.ПолучитьЭлемент() = 1 Цикл
  ТекЭл = Спр1.ТекущийЭлемент();
  Если ПодходитПоТекущимКритериям(ТекЭл) = 1 Тогда
     Список1.ДобавитьЗначение(ТекЭл, "");
  КонецЕсли;
КонецЦикла;
ИспользоватьСписокЭлементов(Список1);

как то так

Да я тоже считаю что этот вариант непрактичный. Кстати столкнулся с такой штукой. При последовательном добавлении реквизитов в справочник на определенном этапе 1С-ку глючит. При сохранении метаданных возникает ошибка чтения... память не может быть риад. Пришли к выводу что есть лимит на количество реквизитов. Последний раз удалось создать 27.

Спасибо огромное за помощь! Буду реализовывать.  Очень довольный
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос по нескольким реквизитам.
Ответ #9 - 07. Сентября 2010 :: 13:51
Печать  
AgenTSiD писал(а) 07. Сентября 2010 :: 13:37:
Z1 писал(а) 07. Сентября 2010 :: 09:54:
Смотри сейчас вариантов 2**6 а если будет не 6 реквизитов а 10
тогда будет в if 1024 варианта ?
Я считаю что нужно уходить от такого решения :

Список1 = СоздатьОбъект("СписокЗначений");
Спр1 = СоздатьОбъект("Справочник.КонкретныйСправочник");
Спр1.ВыбратьЭлементы();
Пока Спр1.ПолучитьЭлемент() = 1 Цикл
  ТекЭл = Спр1.ТекущийЭлемент();
  Если ПодходитПоТекущимКритериям(ТекЭл) = 1 Тогда
     Список1.ДобавитьЗначение(ТекЭл, "");
  КонецЕсли;
КонецЦикла;
ИспользоватьСписокЭлементов(Список1);

как то так

Да я тоже считаю что этот вариант непрактичный. Кстати столкнулся с такой штукой. При последовательном добавлении реквизитов в справочник на определенном этапе 1С-ку глючит. При сохранении метаданных возникает ошибка чтения... память не может быть риад. Пришли к выводу что есть лимит на количество реквизитов. Последний раз удалось создать 27.

Спасибо огромное за помощь! Буду реализовывать.  Очень довольный

Уверяю Вас что 27 реквизитов это не предел.
У меня в справочнике Клиенты 43 реквизита.
Может быть у Вас слишком много отборов ( а значит много индексов ) или еще чего либо другого в этом справочнике.
Исходя из subj трудно сказать.

также можете пробовать два варианта один тот что был описан выше
второй 1с++ и ТП
  
Наверх
 
IP записан
 
AgenTSiD
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 06. Сентября 2010
Re: Запрос по нескольким реквизитам.
Ответ #10 - 07. Сентября 2010 :: 13:55
Печать  
Цитата:
также можете пробовать два варианта один тот что был описан выше
второй 1с++ и ТП


Вариант с  1с++ и ТП очень интересует, но я еще не разу не делал ничего с  1с++ поэтому не понял идею 2 варианта.
если бы Вы нашли еще минутку вашего времени и написали по  подробней я был бы очень признателен.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос по нескольким реквизитам.
Ответ #11 - 07. Сентября 2010 :: 14:20
Печать  
AgenTSiD писал(а) 07. Сентября 2010 :: 13:55:
Цитата:
также можете пробовать два варианта один тот что был описан выше
второй 1с++ и ТП


Вариант с  1с++ и ТП очень интересует, но я еще не разу не делал ничего с  1с++ поэтому не понял идею 2 варианта.
если бы Вы нашли еще минутку вашего времени и написали по  подробней я был бы очень признателен.

ну тогда Вам лучше начать первым способом.
когда получиться тогда делайте через ТП или
лучше сразу изучать класс над ТП : ПоставщикДанных
http://www.1cpp.ru/forum/YaBB.pl?num=1273512019
По вопросам задавайте конкретные вопросы будут и конкретные ответы.(Рассказать сразу о ТП все я не смогу.)
Суть вместо стандартной формы списка справочника
используется отчет на котором есть ТП. далее просто определяются фильтры к этому ТП и происходит отображение данных согласно этим фильтрам.
  
Наверх
 
IP записан
 
AgenTSiD
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 06. Сентября 2010
Re: Запрос по нескольким реквизитам.
Ответ #12 - 07. Сентября 2010 :: 15:35
Печать  
Спасибо большое!
  
Наверх
IP записан
 
AgenTSiD
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 06. Сентября 2010
Re: Запрос по нескольким реквизитам.
Ответ #13 - 07. Сентября 2010 :: 16:36
Печать  
AgenTSiD писал(а) 07. Сентября 2010 :: 13:37:
[quote author=Z1 link=1283790072/0#7 date=1283853274]Смотри сейчас вариантов 2**6 а если будет не 6 реквизитов а 10
тогда будет в if 1024 варианта ?
Я считаю что нужно уходить от такого решения :

Список1 = СоздатьОбъект("СписокЗначений");
Спр1 = СоздатьОбъект("Справочник.КонкретныйСправочник");
Спр1.ВыбратьЭлементы();
Пока Спр1.ПолучитьЭлемент() = 1 Цикл
  ТекЭл = Спр1.ТекущийЭлемент();
  Если ПодходитПоТекущимКритериям(ТекЭл) = 1 Тогда
     Список1.ДобавитьЗначение(ТекЭл, "");
  КонецЕсли;
КонецЦикла;
ИспользоватьСписокЭлементов(Список1);

как то так


Возник вопрос если я делаю отбор по нескольким реквизитам сразу то как описать ПодходитПоТекущимКритериям()
как узнать какие из 6 принимают участие в отборе?
  
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Запрос по нескольким реквизитам.
Ответ #14 - 07. Сентября 2010 :: 19:46
Печать  
Пиши в icq 201216890 - попробую помочь практически.
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать