Имя: Пароль:
1C
1С v8
Поиск документов
0 Garikus
 
22.03.15
08:56
Доброго времени суток.
Имеется проблема, загружаю из EXCEL файл в котором номер и сумма документа, но номер документа это цифры от номера в базе.
Нужно найти документы в базе по короткому номеру.(Полный номер может быть разным, нужно как то искать по последним 5-6 цифрам). Кто подскажет как это можно реализовать?
1 ДенисЧ
 
22.03.15
09:14
Запрос и ПОДОБНО
2 Garikus
 
22.03.15
09:23
(1) Не хотелось бы запрос, т.к. искать нужно порядка 4 тысяч документов.
3 Garikus
 
22.03.15
09:26
Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
    |    РеализацияТоваровУслуг.Номер КАК ДокНом,
    |    РеализацияТоваровУслуг.Дата КАК ДокДата,
    |    РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДок
    |ИЗ
    |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    |    РеализацияТоваровУслуг.Номер ПОДОБНО &Номер";

    
    Запрос.УстановитьПараметр("Номер", Прав(Номер,5));

    РезультатЗапроса = Запрос.Выполнить();

Соорудил примерный запрос, но почему то нехрена не находит(
4 ДенисЧ
 
22.03.15
09:27
(3)  Запрос.УстановитьПараметр("Номер", "%" + Прав(Номер,5));
(2) Кто мешает сначала собрать все номера, потом всё одним запросом найти?
5 User_Agronom
 
22.03.15
09:30
(2) Все номера в ТЗ, которую передать в запрос.
Запрос только медленный будет, конечно.
6 ShoGUN
 
22.03.15
09:34
(5) Можно запросом выбрать таблицу вида
Ссылка | Последние 5 цифр номера | Последние 6 цифр номера
Сделать индекс, искать в ТЗ через Найти или НайтиСтроки. Точно будет быстрей, чем запрос в цикле, как в (3).
7 Garikus
 
22.03.15
09:37
Спасибо всем)) будем экспериментировать) что быстрее)
8 User_Agronom
 
22.03.15
09:59
(6) да и это запросом быстрее. цикл то 4000 раз должен будет пройти.
9 Garikus
 
22.03.15
10:08
А подскажите как в запрос ТЗ закинуть (Номера находятся в табличном документе на поле?
Запрос.УстановитьПараметр("Номер", "%" + Прав(Номер,5)); - Находит ищет соотвествия не только по последним 5 символам, вообще по любому соотвествию из этих цифр.

Сильно не ругайтесь, я вообще сисадминю, а програмлю раз в год по нужде.
10 фобка
 
22.03.15
10:12
(9) нет верю
11 фобка
 
22.03.15
10:13
соответсвие в оюбой части %номер%
12 Garikus
 
22.03.15
10:14
Запрос.УстановитьПараметр("Тз", Таблица.ВыгрузитьКолонку("Номер")); как то так?
13 фобка
 
22.03.15
10:15
(12) это если параметр - список
14 фобка
 
22.03.15
10:16
нет конструкции "подобно в". Только циклом запрос пускать
15 ShoGUN
 
22.03.15
10:32
(14) Потому и предложил (6), умники, блин. Параметров-то много. Ну либо сделать ВТ такую же, как в (6) и JOIN по равенству с той ТЗ, что загружена из Excel.
16 ShoGUN
 
22.03.15
10:33
(8) Подумай ещё раз. Как ты будешь искать ПОДОБНО любому значению из списка запросом?
17 фобка
 
22.03.15
10:37
Можно сделать так:
ТекстЗапроса = " выбрать... Где номер подобно (%номер1)";
Пока ... Цикл
Текстзапроса = текстзапроса+" или номер подобно (%номерN)";
Конеццикла;
18 ShoGUN
 
22.03.15
10:38
(17) 4000 TableScan-ов? :) Ну что, тоже вариант...
19 ShoGUN
 
22.03.15
10:41
Хотя нет, один TableScan, нормально. Я думал, ты через ОБЪЕДИНИТЬ ВСЕ предлагаешь.
20 фобка
 
22.03.15
10:42
(18) проще в источнике полный номер иметь, а вообще сначала вложенный запрос по сумме, с него уже лайки
21 ShoGUN
 
22.03.15
10:44
(20) Согласен :)
У тебя в (17) ещё косяк, документы ты найдёшь, а как понять - какой к какой строке Excel?
22 фобка
 
22.03.15
10:48
(21) а, ну для сопоставления нужно уже будет результат ворочать типа как в (6).
Так что может 4000 запросов не так плохо для решения задачи? если время исполнения некритично
23 ShoGUN
 
22.03.15
10:49
(22) Проще сразу выбрать как в (6) и не ипать мозга. Таблица в памяти будет быстро работать, и не будет очень большой.
24 ShoGUN
 
22.03.15
10:50
Даже если в базе десять тыщ документов. Если миллион - тогда вопрос)
25 Garikus
 
22.03.15
17:48
Решил след образом:
Для каждого строка из Ндок цикл
            
         поиск = ТабПоле.Найти(Прав(строка.ДокНом,5), "Колонка10");
        
         Если Поиск <> Неопределено
             Тогда
            
                
         Если число(Строка.СуммаДок) <> число(поиск.Колонка8) Тогда
        стр = РезультатСверки.Добавить();
        стр.НомерДок = поиск.Колонка10;
        стр.ДатаДок = поиск.Колонка4;
        Стр.Сумма = поиск.Колонка8;
        Стр.ДокРеал = строка.ДокНом;
        Стр.ДатаРеал = строка.ДокДата;
        Стр.СуммаР = строка.СуммаДок;
        стр.Разница = Число(строка.СуммаДок)+Число(поиск.Колонка8);
        ТабПоле.Удалить(Поиск);    
          Конецесли;
       КонецЕсли;
КонецЦикла;
Т.е. Сначало загоняю в ТЗ список документов, а потом начинаю искать по второй тз.

Но на данный момент словил глюк, при удалении некоторые строчки пропускаются, т.е. условие срабатывает, все заполняется. а вот ТабПоле.Удалить(Поиск); через раз, в чем заковырка может быть?
26 Mankubus
 
22.03.15
17:56
(25) делай обход цикла с конца и перебирай по индексу
27 Garikus
 
22.03.15
17:58
(26) А как определить индекс(поиск)
28 Mankubus
 
22.03.15
18:00
Сч = Ндок.Количество()-1;
Пока Сч>=0 Цикл
строка = Ндок[Сч];
---------
Сч = Сч-1;
КонецЦикла;
29 Garikus
 
22.03.15
18:04
(28) Мне удалять надо с другой ТЗ в которой я ищу
поиск = ТабПоле.Найти(Прав(строка.ДокНом,5), "Колонка10");
т.е. ТабПоле
А в Ндок исходные данные для поиска, и нужно что то
если нашел то заполнил результат, а в ТабПоле удалить строку
30 Garikus
 
22.03.15
18:05
работает, строку находит, данные заполняет, а удаляет почему то через раз
31 Garikus
 
22.03.15
18:11
И еще подскажите ТабПоле.Найти ищет точное соответствие, а можно как то искать по последним 5и цифрам?
32 ДенисЧ
 
22.03.15
18:13
(31) Можно. Запросом. )
33 Garikus
 
22.03.15
18:14
(32) ага и думает год))) С удалением подскажите в чем глюк может быть? код в (25)
34 Garikus
 
22.03.15
18:27
))) вопрос снят)) сам дурак)))
35 ДенисЧ
 
22.03.15
18:27
Хотел ответить...
Но дурак - значит, дурак )))
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший