Версия для печати темы (https://pro1c.org.ua/index.php?s=dfa4eeed13b7b9263f350c35fcb7651d&showtopic=66633)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Перебор одноименных элементов справочника

Автор: miha74 24.06.21, 21:14

Ситуация такая. В Справочнике есть элементы с одинаковым Наименованием, но отличаются реквизитом "Комментарий" тип Строка. Есть ли какой-то способ быстрого поиска нужного элемента, кроме полного перебора всего Справочника с проверкой по отличающемуся реквизиту.
Типа ищем по Наименованию, проверяем реквизит. Если не тот - переходим на следующий одноименный элемент и т.д.

Автор: volodya1122 25.06.21, 9:19

miha74 @ Вчера, 22:14 * ,

Похожая ситуация обсуждалась. Можете попробовать применить данный метод себе
https://pro1c.org.ua/index.php?showtopic=59528&hl=

Или например так

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Контрагенти.Наименование,
    |    1 КАК Повторов
    |ИЗ
    |    Справочник.Контрагенти КАК Контрагенти
    |ГДЕ
    |    Контрагенти.ЭтоГруппа = ЛОЖЬ";
    
    ТаблЗнач = Запрос.Выполнить().Выгрузить();
    ТаблЗнач.Свернуть("Наименование","Повторов");
    ТаблЗнач.Сортировать("Повторов Убыв");
    ТекСтрокаТаблицы=ТаблЗнач.Получить(0);
    МаксПовторов=ТекСтрокаТаблицы[1];
    Если МаксПовторов=1 тогда
        Сообщить("Немає повторов");
    Иначе
        Для Каждого Стр Из ТаблЗнач Цикл
            Если Стр.Повторов=1 тогда
                Прервать;
            КонецЕсли;    
            Сообщить("Повторы= "+Стр.Наименование);
        КонецЦикла;

    КонецЕсли;

Автор: miha74 25.06.21, 9:31

Спасибо за ответ.

Цитата(volodya1122 @ 25.06.21, 10:19) *
Или например так

На 7.7 так не получится.
В теме по ссылке тоже перебор всех значений. Хотелось бы поиском.

Автор: volodya1122 25.06.21, 9:39

miha74 @ Сегодня, 10:31 * ,

Сорри, не заметил что 7.7

Можно переделать легко на 7,7

Автор: miha74 25.06.21, 9:49

volodya1122 @ Сегодня, 10:39 * ,
Если не трудно пожалуйста.
У меня пока примерно такой код:

// -----------------------------------------------------------------------------------------
    СпрВидыКатегорий = СоздатьОбъект("Справочник.ВидыКатегорий");
    
    // елемент "Торти";"дільниця"
    плНаименование = "Торти";
    плКомментарий  = "дільниця";
    // в Довіднику є ще елемент "торти";"сайт"
    
    
    флЕстьЭлемент=0;
    
    СпрВидыКатегорий.ВыбратьЭлементы(0);
    Пока СпрВидыКатегорий.ПолучитьЭлемент() = 1 Цикл
        Если (СпрВидыКатегорий.Наименование=плНаименование) И (СпрВидыКатегорий.Комментарий=плКомментарий) Тогда
            флЕстьЭлемент=1;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    Если флЕстьЭлемент=1 Тогда
        //есть нужный элемент справочника
        Сообщить(СпрВидыКатегорий.Наименование+"      "+СпрВидыКатегорий.Комментарий);
    Иначе
        //нет элемента
        Сообщить("Не найдено!");
    КонецЕсли;


Я раньше думал, что 1С ищет по наименованиям с учетом заглавных и прописных букв, пока не столкнулся с такой ситуацией.

Автор: volodya1122 25.06.21, 10:09

miha74 @ Сегодня, 10:49 * ,

Так тут вы ищите только совпадение с конкретным значением Наименования. В таком случае можно использовать другую выборку

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

Автор: miha74 25.06.21, 10:11

Не-а. Ошибку выдает, неверный реквизит или как-то так. Я так пробовал.
Я так понимаю, что Наименование это обязательный атрибут и не может выступать реквизитом.

Автор: sava1 25.06.21, 10:14

поставьте 1срр+ (или 1sqlite) и нормальным запросом через LIKE сразу полУчите результат

Автор: miha74 25.06.21, 10:18

sava1 @ Сегодня, 11:14 * ,
Тоесть, штатными средствами это решить нельзя. Так?
А то я думал что я туплю, а все элементарно.

Автор: 29a 14.07.21, 13:25

miha74 @ 24.06.21, 22:14 * ,
ИМХО добавить реквизит "НаименованиеКомментарий" (на форму можно не выводить), программно его заполнить, при записи элемента перезаполнять его, установить пизнак "Сортировка", поиск производить методом НайтиПоРеквизиту("НаименованиеКомментарий", ЗначениеДляПоиска)

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua