Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2, свеженьких 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Поиск в пустом подчиненном справочнике          
Sede Подменю пользователя
сообщение 03.06.15, 9:24
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 2 раз
Рейтинг: 0

Добрый день.
Создан подчиненный справочник (КодыКонтрагентов, реквизиты: КодТовара, Контрагент) подчинен справочнику (ТМЦ).
Пример - в справочнике ТМЦ товар Мыло, на етот товар в справочнике КодыКонтрагентов записи (фирма 1 - код 00001, фирма2 - код 22212, фирма3 - код 23232)
Необходимо - Найти код указаного контрагента и вернуть название Товара ТМЦ(владелец)
Листинг функции поиска в подчиненном справочнике.
Функция ПоискПоКоду(кодПоиска, Контрагент)               
нет=0;    
спрКодКонтр=СоздатьОбъект("Справочник.КодыКонтрагентов");
    спрКодКонтр.ВыбратьЭлементы(0);  
    Пока спрКодКонтр.ПолучитьЭлемент()=1 Цикл
        КодИзСпр=СокрЛП(Строка(СпрКодКонтр.КодТовара));
        КонтрИзСпр=спрКодКонтр.Контрагент;
        Пометка=спрКодКонтр.ПометкаУдаления();
          Если (КодИзСпр=кодПоиска) И (КонтрИзСпр=Контрагент) И (Пометка=0) Тогда
          Возврат спрКодКонтр.Владелец;  
    
         Прервать;
        Иначе
         нет=1;
         КонецЕсли;    
КонецЦикла;
Если нет=1 Тогда
      Возврат "";
КонецЕсли;
КонецФункции


Использование НайтиПоРеквизиту или НайтиПоНаименованию исключаю, так как в случае 2х одинаковых кодов поиск остановится на первом елементе (например у фирмы1 на код 00001 - мыло, у фирмы2 на коде 00001-рубашки)

Суть седующая: если в справочнике есть хотябы одна запись все работает отлично(записанные коды находит - если кодов нет сообщает).
Если справочник пуст результат -сообщает что все коды присутствуют.
Какбы вариант добавить 1 запись вроде (БлаБла, Абракадабра) и все работает никаких претензий, но все же для себя хотелось бы разобраться почему Фирма1="" и код 00001=""(Пустой справочник)

Как узнать что в справочнике (есть/нет) записи. Или может что-нибуть посоветуете.

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

Может кому пригодится

Спасибо сказали: Vofka,

vadim007 Подменю пользователя
сообщение 03.06.15, 9:48
Сообщение #2

Почти крутой
Иконка группы
Группа: Местный
Сообщений: 1298
Из: Донецк
Спасибо сказали: 208 раз
Рейтинг: 0

Цитата(Sede @ 03.06.15, 9:24) *
Может кому пригодится

Это было актуально лет десять назад...

Vofka Подменю пользователя
сообщение 03.06.15, 10:08
Сообщение #3

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4519 раз
Рейтинг: 3641.2

Цитата(vadim007 @ 03.06.15, 10:48) *
Это было актуально лет десять назад...

Что актуально сейчас?

TipsyKID Подменю пользователя
сообщение 03.06.15, 11:50
Сообщение #4

Оратор
Иконка группы
Группа: Местный
Сообщений: 413
Из: Киев
Спасибо сказали: 161 раз
Рейтинг: 0

А чем не устроил метод

ВыбратьЭлементыПоРеквизиту(<ИмяРеквизита>, <Значение>, <РежимИерархии>, <РежимГрупп>)
Метод ВыбратьЭлементыПоРеквизиту() предоставляет возможность выбирать элементы (открывает выборку) при помощи метода ПолучитьЭлемент().

Дальнейшая выборка при помощи метода ПолучитьЭлемент() будет происходить среди элементов текущего справочника, имеющих значение реквизита <ИмяРеквизита> равным <Значение>, в порядке, установленном параметрами <РежимИерархии> и <РежимГрупп>, а также согласно установкам, сделанным заранее при помощи методов:

ПорядокНаименований(),

ПорядокКодов(),

ВключатьПодчиненные(),

ИспользоватьРодителя(),

ИспользоватьВладельца(),

ИспользоватьДату().

?

Сообщение отредактировал TipsyKID - 03.06.15, 11:51


Signature
Специалист : Технологическая платформа 8.х, Бухгалтерия для Украины, Управление торговлей для Украины, Зарплата и Управление Персоналом для Украины

Sede Подменю пользователя
сообщение 04.06.15, 8:10
Сообщение #5

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 2 раз
Рейтинг: 0

Цитата(TipsyKID @ 03.06.15, 11:50) *
А чем не устроил метод

ВыбратьЭлементыПоРеквизиту(<ИмяРеквизита>, <Значение>, <РежимИерархии>, <РежимГрупп>)
Метод ВыбратьЭлементыПоРеквизиту() предоставляет возможность выбирать элементы (открывает выборку) при помощи метода ПолучитьЭлемент().

Дальнейшая выборка при помощи метода ПолучитьЭлемент() будет происходить среди элементов текущего справочника, имеющих значение реквизита <ИмяРеквизита> равным <Значение>, в порядке, установленном параметрами <РежимИерархии> и <РежимГрупп>, а также согласно установкам, сделанным заранее при помощи методов:

ПорядокНаименований(),

ПорядокКодов(),

ВключатьПодчиненные(),

ИспользоватьРодителя(),

ИспользоватьВладельца(),

ИспользоватьДату().



?


Извините Но даный метод не работает по причине описаной выше. Если по результатам ВыбратьЭлементыПоРеквизиту количество елементов - 0, то результат поиска возвращет положительноесть результат (все найдено, но название представляется отсутствующим,- именно отсутсвующим, поскольку при значении ""(пусто) результат отрицательный- товар не найден,см. листинг выше).
Чтобы он работал необходимо снова делать проверку на количество уже отобраных елементов. Или может ктонибуть подскажет где "Собака зарыта". Почему при отсутствии записей (количество которых =0) результат положительный.

хм.. TipsyKID спасибо! Подтолкнул на еще одно решение:
Функция ПоискПоКоду(кодПоиска, Контрагент)               
нет=0;    
спрКодКонтр=СоздатьОбъект("Справочник.КодыКонтрагентов");
//    спрКодКонтр.ВыбратьЭлементы(0); //1

    количество = спрКодКонтр.ВыбратьЭлементыПоРеквизиту("КодТовара", кодПоиска, 0,0);
    Если количество=0 Тогда
        Возврат "";
    КонецЕсли;    


    Пока спрКодКонтр.ПолучитьЭлемент()=1 Цикл
        КодИзСпр=СокрЛП(Строка(СпрКодКонтр.КодТовара));
        КонтрИзСпр=спрКодКонтр.Контрагент;
        Пометка=спрКодКонтр.ПометкаУдаления();
          Если (КодИзСпр=кодПоиска) И (КонтрИзСпр=выбКонтрагент) И (Пометка=0) Тогда
          Возврат спрКодКонтр.Владелец;  
         Прервать;
        Иначе
         нет=1;
         КонецЕсли;    
    КонецЦикла;
Если нет=1 Тогда
      Возврат "";
КонецЕсли;
КонецФункции


И судя по всему ето и есть одно из верных решений, если не единственное .

TipsyKID Подменю пользователя
сообщение 04.06.15, 9:09
Сообщение #6

Оратор
Иконка группы
Группа: Местный
Сообщений: 413
Из: Киев
Спасибо сказали: 161 раз
Рейтинг: 0

Так красивее будет ( а то 100500+ прерываний функции возвратом - изврат ) :
Функция ПолучитьВладельцаПоКоду(кодПоиска, Контрагент)               
       Результат = ПолучитьПустоеЗначение();
       
    спрКодыКонтрагентов=СоздатьОбъект("Справочник.КодыКонтрагентов");
    спрКодыКонтрагентов.ВыбратьЭлементыПоРеквизиту("КодТовара", кодПоиска, 0,0);

    Пока спрКодыКонтрагентов.ПолучитьЭлемент()=1 Цикл
        КодИзСпр = СокрЛП(спрКодыКонтрагентов.КодТовара);
        КонтрИзСпр = спрКодКонтр.Контрагент;
        Пометка = спрКодКонтр.ПометкаУдаления();
        
        Если (Пометка = 0) И (КонтрИзСпр = Контрагент) И (КодИзСпр = КодПоиска) Тогда
            Результат = спрКодКонтр.Владелец;
            Прервать;
        КонецЕсли;    
    КонецЦикла;
    
    Возврат Результат;
КонецФункции


Сообщение отредактировал TipsyKID - 04.06.15, 9:09


Signature
Специалист : Технологическая платформа 8.х, Бухгалтерия для Украины, Управление торговлей для Украины, Зарплата и Управление Персоналом для Украины

Спасибо сказали: Sede,

twilight_dream Подменю пользователя
сообщение 08.06.15, 9:01
Сообщение #7

Оратор
*****
Группа: Пользователи
Сообщений: 265
Спасибо сказали: 4 раз
Рейтинг: 0

Да, семерка она коварная. Выбирать надо без групп. То же касается и запроса. В зависимости от того, как его построишь, может вернуть либо одну пустую строку, естественно,с ненулевым счетчиком, либо ничего, либо одну строку с нулевым счетчиком. smile.gif


Signature

Sede Подменю пользователя
сообщение 08.06.15, 9:42
Сообщение #8

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 2 раз
Рейтинг: 0

В справочнике 1 уровень так что с группами заморачиваться не пришлось...и слаба Богу, хватит с одного головной болью разобрался rulez.gif

Sharzem Подменю пользователя
сообщение 08.06.15, 11:49
Сообщение #9

Оратор
Иконка группы
Группа: Местный
Сообщений: 298
Спасибо сказали: 98 раз
Рейтинг: 99.1

Цитата(Sede @ 08.06.15, 10:42) *
В справочнике 1 уровень так что с группами заморачиваться не пришлось...и слаба Богу, хватит с одного головной болью разобрался rulez.gif


А я так не думаю, что разобрались уж-таки до конца ))).
Для отбора единичного количества элементов, варриант предложенный TipsyKID вполне решает задачу.

Смотря что Вы собираетесь делать. Решение в нужном направлении, но: в функции используются такие операторы как СоздатьОбъект, ВыбратьЭлементыПоРеквизиту, Пока ... Цикл.
В зависимости от количества обращений к функции у Вас очень уж сильно возрастет время выполнения задачи. Например, нужно загрузить прайс-лист, с немеряным количеством Элементов, в следствии будете смотреть в экран минутами.

Вопрос: Почему Вы не можете даже тем самым запросом отобрать подчиненый справочник по условию Контрагент = Контрагент, выгрузить запрос в Таблицу значений и по мере необходимости доставать оттуда методом НайтиЗначение в колонке "код" подчиненный справочник ? В результате Вы получите возрастание производительности (на большом количестве обращений) раз в 10-15 (в зависимости от формата базы)! Подумайте, возможно еще не поздно изменить подход и на этапе разработки переделать.


Signature
То, что для одного человека константа, для другого - переменная. (Алан.Дж.Перлис)

Спасибо сказали: Sede,

Sede Подменю пользователя
сообщение 11.06.15, 9:03
Сообщение #10

Говорящий
***
Группа: Пользователи
Сообщений: 51
Спасибо сказали: 2 раз
Рейтинг: 0

Цитата(Sharzem @ 08.06.15, 12:49) *
А я так не думаю, что разобрались уж-таки до конца ))).
Для отбора единичного количества элементов, варриант предложенный TipsyKID вполне решает задачу.

Смотря что Вы собираетесь делать. Решение в нужном направлении, но: в функции используются такие операторы как СоздатьОбъект, ВыбратьЭлементыПоРеквизиту, Пока ... Цикл.
В зависимости от количества обращений к функции у Вас очень уж сильно возрастет время выполнения задачи. Например, нужно загрузить прайс-лист, с немеряным количеством Элементов, в следствии будете смотреть в экран минутами.

Вопрос: Почему Вы не можете даже тем самым запросом отобрать подчиненый справочник по условию Контрагент = Контрагент, выгрузить запрос в Таблицу значений и по мере необходимости доставать оттуда методом НайтиЗначение в колонке "код" подчиненный справочник ? В результате Вы получите возрастание производительности (на большом количестве обращений) раз в 10-15 (в зависимости от формата базы)! Подумайте, возможно еще не поздно изменить подход и на этапе разработки переделать.


Спасибо 12201689.gif . На работу с запросами еще руки не очень заточены, не знаю как реализовать. Но Ваш вариант мне нравится буду разбираться.
Касательно количества обращений тут пока либо поштучно, либо пачками по 10-15 штук. В тестовом варианте обработал 20 штук грузится за секунду(может просто справочник еще не достаточно большой), так что пусть пока работает, НО в перспективу придется обязательно переделать.

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 20.04.24, 0:21
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!