Имя: Пароль:
1C
1C 7.7
v7: Поиск в таблице значений по двум колонкам
0 goldenhawk
 
24.11.15
16:36
Есть таблица значений ТЗ Колонки (Кол1,Кол2,Кол3,Кол4) . Как проверить, если ли строка со значениями "AAA", "bbb" по двум колонками
допустим Кол2 и Кол3 ?

НайтиЗначение(<Знач>,<Строка>,<Колонка>)
находит только по одной колонке
1 ДенисЧ
 
24.11.15
16:37
отсортировать по колонкам, найти по первому значению, потом перебором искать дальше.
2 VikingKosmo
 
24.11.15
16:37
запрос
3 ДенисЧ
 
24.11.15
16:37
Или при заполнении создать ещё колонку с составным ключОм
4 Garykom
 
гуру
24.11.15
16:45
или найти все строки с "AAA" в Кол2, затем все строки с "bbb" в Кол3
а потом просто пересечение по номерам...
5 Vladal
 
24.11.15
16:50
В восьмерке подобный поиск я делаю запросом. Это в самописках, куда не перетянул процедуру из ОбщегоНазначения.НайтиСтрокиПоКритериям.

А в 7.7 скорее всего перебором строк и проверкой в каждой строке соответствия условию по колонке А и колонке Б.
6 Garykom
 
гуру
24.11.15
16:53
(5) так спросить хочется а сумму по колонке ТЗ тоже запросом?
7 Злопчинский
 
24.11.15
17:41
если таблицы небольшие и не жмет то просто-объектноориентировано...

ТЗрезультат = глОтобратьПоКолонке(глОтобратьПоКолонке(ТЗисходная,"ИдКолонкиГдеААА","ААА"),"ИдКолонкиГдеБББ","БББ");
8 runoff_runoff
 
24.11.15
17:44
ИндексированнаяТаблица.. или сделать колонку - СУММУ двух колонок..
9 NikVars
 
24.11.15
17:51
(0) А я не понял чего ты хочешь найти "по двум колонкам".
В одной колонке А,в другой АА допустимо?
Кол2 = "пппА", Кол3="ААппп".
10 Злопчинский
 
24.11.15
18:39
//********************************************************************************************************************************
//
Функция глОтобратьПоКолонке(ТЗВход,Колонка,Значение) Экспорт //возвращает отобранную ТЗ
    Перем ТЗ, ТЗВрем;
    
    ТЗВход.Выгрузить(ТЗ);
    
    ТЗ.Сортировать(Колонка+"*");    //по внутр значению
    НомСтр = 0;
    Если ТЗ.НайтиЗначение(Значение, НомСтр, Колонка) = 0 Тогда
        //нет такого значения
        ТЗ.УдалитьСтроки();
        Возврат ТЗ;
    Иначе
        //найдем строку, в которой уже не встречается Значение
        ТЗКС = ТЗ.КоличествоСтрок();
        Для счСтрок = НомСтр По ТЗКС Цикл
            Если ТЗ.ПолучитьЗначение(счСтрок, Колонка) <> Значение Тогда //нужное значение есть до пред.строки
                НомСтр2 = счСтрок - 1;
                Прервать;
            КонецЕсли;
            Если счСтрок = ТЗКС Тогда //нужное значение встречается до конца таблицы
                НомСтр2 = ТЗКС;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    ТЗВрем = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.Выгрузить(ТЗВрем,НомСтр,НомСтр2);    //выгрузим только строки с нужным значением
    Возврат ТЗВрем;
КонецФункции //глОтобратьПоКолонке()
11 2S
 
24.11.15
18:42
Новая колонка для поиска. Сложение значений хоть 100 колонок
12 Злопчинский
 
24.11.15
18:55
(11) ага, как же... он будет искать в новой колонке БББААА, а там - внезапно - АААБББ
13 osa1C
 
24.11.15
19:40
(13) В клюшки по-моему тут лучше всех играется Злопченский
14 Злопчинский
 
25.11.15
00:39
(13) Это ты сам себе тихо под нос бормочешь..?
не, я так, потихоньку.. апологеты прямых запросов и монстры фишек типа Епрста свалят на снеговика - кто нас, оставшихся, наставлять будет?
15 Vladal
 
29.11.15
12:03
(6) хочется - спрашивай. Я внимательно слушаю твой вопрос.

Скажи мне, поиск по критериям (метод таблицы НайтиСтроки) ограничен какими возможностями?
Он может искать сразу по нескольким колонкам? Или по нескольким критериям, различным для каждой колонки?
Или ты предлагаешь перебирать строки таблицы в цикле?
16 MishaD
 
29.11.15
12:14
(12) Хуже будет, если поиск ААА и БББ, а в колонках окажется АА и АББББ. Хотя всегда сам искал по составному полю, а тут задумался, но для ссылочных полей, и разных типов в колонках, сумма норм отработает. А вот для примитных типов может быть засада.
17 Это_mike
 
29.11.15
12:34
Самое лучшее решение в таких случаях - использование ИндексированнойТаблицы. Но это - уже 1с++.
А у многих религия не позволяет.
18 Это_mike
 
29.11.15
12:41
Можно строки перебирать.
Можно в конце концов выгрузить из в дбф или таблицу сиквела, и  использовать работу с БД.
Все Вель зависит ещё и от того, например - что в этой таблице валяется (допускается ли сортировка и т.д.). Почему на этом акцентируют внимание - потому, что у тех, кто задаёт такие вопросы - в тз может быть что угодно в т.ч.
зависимое от порядка строк...
19 Записьдампа
 
29.11.15
15:07
(15) А ты на исходный вопрос отвечаешь, или хвастаешься, что вприсядку умеешь? За тебя можно уже начинать радоваться? =)

Запрос он делает... Тем самым ты перекладываешь нагрузку с машины на каналы связи между клиентом и сервером. И под нагрузкой твое супер-дупер-универсальное решение, внезапно хорошо работает только в тепличных рамках клиента и сервера на одной машине.
20 vladmenleo
 
29.11.15
15:29
Я использую как-то так (функция не моя, пользуюсь давно)
Функция НайтиСтрокуПоПараметрам(ИсходнаяТаблица, СписокПараметров, НачСтрока=1)
    Рез=0;
    НачСтрока=?(НачСтрока<=0,1,НачСтрока);
    Если ТипЗначенияСтр(ИсходнаяТаблица)<>"ТаблицаЗначений" Тогда
        Возврат Рез;
    КонецЕсли;
    Если ТипЗначенияСтр(СписокПараметров)<>"СписокЗначений" Тогда
        Возврат Рез;
    КонецЕсли;
    Таб=СоздатьОбъект("ТаблицаЗначений");
    ИсходнаяТаблица.Выгрузить(Таб);
    КолКолонок=ИсходнаяТаблица.КоличествоКолонок();
    ТекН=0;
    Таб.ВыбратьСтроки();
    Пока Таб.ПолучитьСтроку()=1 Цикл
        ТекН=ТекН+1;
        Если ТекН<НачСтрока Тогда
            Продолжить;
        КонецЕсли;
        Подходит=1;
        Для Ит=1 По СписокПараметров.РазмерСписка() Цикл
            ИмяКол="";
            ЗначениеКол=СписокПараметров.ПолучитьЗначение(Ит,ИмяКол);
            Если Таб.ПолучитьПараметрыКолонки(ИмяКол)>0 Тогда
                ЗначениеИсхТаб=Таб.ПолучитьЗначение(Таб.НомерСтроки,ИмяКол);
                Если ТипЗначенияСтр(ЗначениеКол)="СписокЗначений" Тогда
                    Если ЗначениеКол.Принадлежит(ЗначениеИсхТаб)=0 Тогда
                        Подходит=0;
                        Прервать;
                    КонецЕсли;
                Иначе
                    Если ЗначениеИсхТаб<>ЗначениеКол Тогда
                        Подходит=0;
                        Прервать;
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
        Если Подходит=1 Тогда
            Рез=Таб.НомерСтроки;
            Возврат Рез;
        КонецЕсли;
    КонецЦикла;
    Возврат Рез;
КонецФункции

Процедура Сформировать()
// В Тз должны быть колонки Контрагент, Договор, Сумма
    СписокПараметров = СоздатьОбъект("СписокЗначений");
    СписокПараметров.УдалитьВсе();
    СписокПараметров.ДобавитьЗначение(Значение_Контры_которое_ищем, "Контрагент");
    СписокПараметров.ДобавитьЗначение(Значение_Договора_которое_ищем, "Договор");
    СписокПараметров.ДобавитьЗначение(Значение_Суммы_которое_ищем, "Сумма");
    НомСтр = 0;
    НомСтр = НайтиСтрокуПоПараметрам(Тз, СписокПараметров, НомСтр + 1);
    Пока НомСтр <> 0 Цикл
        Тз.ПолучитьСтрокуПоНомеру(НомСтр);
        // Тут делай что надо с данными из ТЗ
    КонецЦикла;
КонецПроцедуры
21 Garykom
 
гуру
29.11.15
19:42
(15) вопрос был прямо озвучен в (6)

вот есть ТЗ с числовыми данными
хочется узнать суммы по всем колонкам
как делать будем?

А насчет "НайтиЗначение" и поиск по нескольким строкам ))
Иногда так смешно становится а как по вашему в этом случае sql движок БД или sql сервер то работает?

Да абсолютно так же, сначала ищет все строки с неким значением в одной колонке, далее среди найденных строк ищет с нужным значением в другой колонке...
22 Харлампий Дымба
 
29.11.15
20:35
(10) - Из типовой бухии глТаблицаЗначенийНайтиСтроки:

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