Имя: Пароль:
1C
1C 7.7
v7: Не получается сделать нормальный поискПОреквизиту.
,
0 McDos
 
22.10.12
11:42
Добрый день. Вот никак не могу разобраться.
Есть две базы с одинаковыми конфами, между которыми должен быть обмен данными по клиентам с помощью обработок... Выгрузить/Загрузить. Вот с этим Загрузить и проблема. Нормально сделать функцию НайтиПоРеквизиту не выходит хоть тресни. Код обработки
Процедура ВыборФайла()
   Папка = КаталогИБ()+"Текст";
   сФайл = "";
       Если ФС.ВыбратьФайл(1,сФайл,Папка,"Выберите файл DBF (*.dbf)","Файл Базы данных DBF (*.dbf)|*.dbf",,) = 1 Тогда
           ПутьКФайлу = СтрЗаменить(Папка,КаталогИБ(),"")+сФайл;
   КонецЕсли;
КонецПроцедуры


Процедура ДобавлениеСуммыПокупки(Идентификатор, СуммаЧека, Файл)
   Перем НовыйНомерКарты; ///изменяется только при изменении процента скидки в большую сторону
                               
   СпрКли=СоздатьОбъект("Справочник.Клиенты");  
   СпрКли.ИспользоватьДату(ТекущаяДата());
   
   Если СпрКли.НайтиПоРеквизиту("Идентификатор", Идентификатор, 0) = 1 Тогда
       
       Если СпрКли.СуммаНакопленийЗагруженная <> СуммаЧека Тогда
           СпрКли.СуммаНакопленийЗагруженная = СуммаЧека;
           НовыйПроцентСкидки=глОпределениеПроцентаСкидки(СпрКли.ОбщаяСумма+СуммаЧека);
       
           Если СпрКли.ПроцентСкидки<>НовыйПроцентСкидки Тогда
               СпрКли.ПроцентСкидки=НовыйПроцентСкидки;
           КонецЕсли;
           СпрКли.Записать();
       КонецЕсли;    
   Иначе
       Сообщить("Клиент с идентификатором " + Идентификатор + " не найден и будет добавлен.");
       СпрКли.Новый();      
       СпрКли.Идентификатор = Идентификатор;
       СпрКли.Код = Файл.NOM;
       СпрКли.Наименование = Файл.NAM;    
       СпрКли.Адрес = Файл.ADR;
       СпрКли.Телефон = Файл.TEL;
       СпрКли.ДатаРождения = Файл.DAT;
       СпрКли.ОбщаяСумма = 0;
       СпрКли.НакопительнаяСумма = Файл.NAK;
       СпрКли.ПроцентСкидки = Файл.PRO;
       СпрКли.ДатаПервойПокупки = Файл.POK;
       СпрКли.НомерКарты = Файл.NOM;
       СпрКли.ТелефонСот = Файл.SOT;
       СпрКли.СуммаНакопленийЗагруженная = СуммаЧека;
       СпрКли.Записать();
   КонецЕсли;
1 mikecool
 
22.10.12
11:43
что не работает?
2 mikecool
 
22.10.12
11:43
+1 наверное индекса по полю нет?
3 nv24
 
22.10.12
11:47
чтобы искать по реквизиту, таблица должна быть упорядочена по реквизиту - так кажется.
4 dk
 
22.10.12
11:54
либо идентификатор кривой, например не хватает пробелов
5 McDos
 
22.10.12
11:54
Ну пример, есть клиент с кодом карты 01626. Идентификатор в обоих базах один и тот же. Но, прога пишет что данный клиент не найден и пробует его записать в базу. Но клиент есть, код неуникальный, поэтому стопориться. Данный клиент с таким кодом идет первым в списке. То есть чтобы решить проблему я должен просто упорядочить по коду, или по реквизиту поиска?
6 nv24
 
22.10.12
11:58
(5) см (2) в конфигураторе галка стоять должна напротив реквзита "индексировать"
7 Zmich
 
22.10.12
11:58
(5). Признак Сортировка стоит у реквизита Идентификатор? И 3-й параметр в НайтиПоРеквизиту попробуй поставить 1.
8 McDos
 
22.10.12
12:01
Признак Сортировка стоит.
9 mikecool
 
22.10.12
12:06
(8) чудес не бывает
10 McDos
 
22.10.12
12:15
Могу выложить Базы и обработки)
11 McDos
 
22.10.12
12:22
За решение проблемы положу деньги на телефон)
12 chief accountant
 
22.10.12
12:26
(11) а так работает?
Если СпрКли.НайтиПоРеквизиту("Идентификатор", Идентификатор, 1) = 1 Тогда
13 McDos
 
22.10.12
12:31
Нет, проверял)
14 nv24
 
22.10.12
12:34
А так не пробовал?

Если СпрКли.НайтиПоРеквизиту("Идентификатор", Идентификатор, 0) = 1 Тогда
ТекКл =СпрКли.ТекущийЭлемент();
15 PuhUfa
 
22.10.12
12:37
Тип реквизита "Идентификатор" число?
16 McDos
 
22.10.12
12:37
Как точно должен выглядеть код процедуры?
Если СпрКли.НайтиПоРеквизиту("Идентификатор", Идентификатор, 0) = 1 Тогда
ТекКл = СпрКли.ТекущийЭлемент();        
       Если СпрКли.СуммаНакопленийЗагруженная <> СуммаЧека Тогда
           СпрКли.СуммаНакопленийЗагруженная = СуммаЧека;
           НовыйПроцентСкидки=глОпределениеПроцентаСкидки(СпрКли.ОбщаяСумма+СуммаЧека);
?
17 chief accountant
 
22.10.12
12:37
(10) выложи мд и обработку
18 McDos
 
22.10.12
12:38
Строка.
19 nv24
 
22.10.12
12:39
(16) Если ТекКл.СуммаНакопленийЗагруженная <> СуммаЧека Тогда
и дальше работаешь с ТекКл

попробуй
20 chief accountant
 
22.10.12
12:40
(19) у него в условие не заходит, см.(5)
21 PuhUfa
 
22.10.12
12:41
(18) а в НайтиПоРеквизиту( для поиска тоже строку подставляешь или число?
22 McDos
 
22.10.12
12:42
23 nv24
 
22.10.12
12:44
(16) и поиск во всем справочнике
НайтиПоРеквизиту("Идентификатор", Идентификатор, 1)
вместо
НайтиПоРеквизиту("Идентификатор", Идентификатор, 0)
24 McDos
 
22.10.12
12:44
У баз задан префикс. К префиксу плюсуется автонумератор. выходит что-то вроде D1, d2 и т.д. Первый обмен делается с копированием индетификаторов, он проходит нормально, а вот второй, стопориться.
25 McDos
 
22.10.12
12:45
(23) Было. Нифига.
26 chief accountant
 
22.10.12
13:21
(25) начнем с простого:
   СпрКли=СоздатьОбъект("Справочник.Клиенты");  
   СпрКли.ИспользоватьДату(ТекущаяДата());
   
   Если СпрКли.НайтиПоРеквизиту("Идентификатор", Идентификатор, 1) = 1 Тогда
       Сообщить(СпрКли.Идентификатор);
       Сообщить(СпрКли);
   КонецЕсли;

получаем:
D103                
А..... Е..... М.......
все работает
27 McDos
 
22.10.12
13:25
Значит проблема была не в поиске? А какого черта тогда загрузка не работает?
28 chief accountant
 
22.10.12
13:31
(27) в обработке поставь после
Идентификатор = Файл.ID
Сообщить(ТипЗначения(Идентификатор));
что кажет?
29 McDos
 
22.10.12
13:39
пишет
2
Клиент с идентификатором 0     не найден и будет добавлен.
СпрКли.Записать();
{D:\1С\ЗАГРУЗКА 2.ERT(43)}: Код не уникальный!
30 chief accountant
 
22.10.12
13:41
(29) файло загрузки выложи
31 Mikeware
 
22.10.12
13:42
(29) читай документацию...
32 chief accountant
 
22.10.12
13:43
(31) на какой странице?
33 Mikeware
 
22.10.12
13:45
(32) как уголовный кодекс...
"Я, например, на свете лучшей книгой
Считаю кодекс уголовный наш.

И если мне неймется и не спится,
Или с похмелья нет на мне лица,
Открою кодекс на любой странице,
И не могу, читаю до конца."©ВСВ
34 McDos
 
22.10.12
13:46
http://file.karelia.ru/t5n58n/
А Можно просто через выгрузку сформировать.
35 chief accountant
 
22.10.12
13:46
(33) проблема походу не в коде, а в
"Клиент с идентификатором 0"
36 McDos
 
22.10.12
13:50
Это не идентификатор 0. Это его номер карты
37 chief accountant
 
22.10.12
13:52
(36) а, понятно косяк здесь:
ДобавлениеСуммыПокупки(НомерКарты,СуммаЧека,Файл);
а нужно
ДобавлениеСуммыПокупки(Идентификатор,СуммаЧека,Файл);
38 chief accountant
 
22.10.12
13:52
(37)+ стр.89
39 Zmich
 
22.10.12
13:53
Ищи по Коду, а не по Идентификатору. Тем более, ты там в тексте Код элемента насильно присваиваешь.
40 chief accountant
 
22.10.12
13:56
(39) по-барабану как искать
41 Zmich
 
22.10.12
13:59
(40). Ну ошибка "Код не уникальный" у него не просто так возникла. Два элемента с одинаковым реквизитом Идентификатором могут быть, а вот с одинаковым Кодом - нет (Контроль уникальности у него ведь не отключен).
42 McDos
 
22.10.12
14:01
2
Клиент с идентификатором D1           не найден и будет добавлен.
СпрКли.Записать();
{D:\1С\ЗАГРУЗКА 2.ERT(43)}: Код не уникальный!
)) Не, изменение на Индитификатор с Номера карты ничего не дало.
43 AAP
 
22.10.12
14:05
(42) сделай так
Идентификатор =  Формат(Файл.ID,"С20");

проходит, ну и (37)
44 PuhUfa
 
22.10.12
14:06
(42) >>Клиент с идентификатором D1           не найден и будет добавлен.

Пробелы после D1?
45 chief accountant
 
22.10.12
14:07
(42) я чупею, тык если у тебя в файло колонка NOM пустая, то чего ты хочешь от СпрКли.Код = Файл.NOM;
46 chief accountant
 
22.10.12
14:09
(45) а в справочнике элемент с пустым кодом присутствует ид D1517
47 AAP
 
22.10.12
14:09
(42) проблема в том что при выгрузке у ТС есть такая строка
Файл.ДобавитьПоле("ID", "S", 12, 0);

а длина Идентификатора 20
48 chief accountant
 
22.10.12
14:11
(47) мимо
49 McDos
 
22.10.12
14:15
(46) Присутвует.
50 chief accountant
 
22.10.12
14:17
(49) я знаю, что присутствует
51 McDos
 
22.10.12
14:19
Если вопрос был приписан ли емуц ИД то Да.
52 AAP
 
22.10.12
14:19
(48) может и мимо но у меня получилось
53 chief accountant
 
22.10.12
14:21
(52) чего получилось?
(51) у тебя в файле колока NOM ПУСТАЯ, поэтому и не работает обработка
54 1Сергей
 
22.10.12
14:21
(47) + 1. СтрДлина(Идентификатор) должна быть как у реквизита
55 1Сергей
 
22.10.12
14:22
Кароче, правильны ответ в (43)
56 chief accountant
 
22.10.12
14:23
(54) пробовал или опять клюшек нет под рукой?
(55) неа
57 1Сергей
 
22.10.12
14:24
(56) причем тут код, скажи мне? там код никоим боком
58 AAP
 
22.10.12
14:24
(53) обработка прочитала файл без ошибок, нашла всех клиентов по Идентификатору
59 chief accountant
 
22.10.12
14:28
(58) безо всяких изменений
Идентификатор = "D1          "
СпрКли.НайтиПоРеквизиту("Идентификатор", Идентификатор, 1) = 1
60 chief accountant
 
22.10.12
14:29
(59)+ СтрДлина(Идентификатор) = 12
61 chief accountant
 
22.10.12
14:31
(57) код это для (42)
62 chief accountant
 
22.10.12
14:39
(51) я не понял, где бабло?
63 McDos
 
22.10.12
14:42
Ну во первых нет вашего телефона, во-вторых, у меня попрежнему не работает загрузка. Или я чего-то не сделал?
64 AAP
 
22.10.12
14:56
(63) давай почту
65 chief accountant
 
22.10.12
14:57
(63) я уже устал объяснять: поиск у тебя работает см.(59) не заботает запись новых элементов см.(42). Для того чтобы заработало нужно проблему решить с СпрКли.Код = Файл.NOM, т.к. Файл.NOM у тебя всегда пустой
66 chief accountant
 
22.10.12
14:58
(65)+ заботает -> работает
67 McDos
 
22.10.12
15:03
почта - [email protected]
68 AAP
 
22.10.12
15:06
(64) Согласен, Файл.NOM это номер карты, зачем его в Код пихать непонятно
69 AAP
 
22.10.12
15:09
(67) Код клиента в одной базе это номер карты в другой?
70 chief accountant
 
22.10.12
15:10
(68) тык у него конфе Номер карты = Код, только он в дбф этот номер не пишет
71 chief accountant
 
22.10.12
15:12
(69) нет
72 AAP
 
22.10.12
15:16
(70) в дбф пишет (пытается), но не учитывает что НомерКарты периодический реквизит
73 chief accountant
 
22.10.12
15:20
(72) Код переодический? О_о
74 AAP
 
22.10.12
15:28
(73) нет))) вот фрагмент
Спр = СоздатьОбъект("Справочник.Клиенты");
       Спр.ВыбратьЭлементы();
       Пока Спр.ПолучитьЭлемент()=1 Цикл
           //Спр.ИспользоватьДату(ТекущаяДата());
           Файл.Добавить();
           Файл.ID = Спр.Идентификатор;
           Файл.KOD = Спр.Код;  
           Файл.PRI = Спр.ОбщаяСумма.Получить(ТекущаяДата()); //так тоже можно;
           Файл.NAM = Спр.Наименование;
           Файл.ADR = Спр.Адрес;
           Файл.TEL = Спр.Телефон;
           Файл.DAT = Спр.ДатаРождения;
           Файл.NAK = Спр.НакопительнаяСумма;
           Файл.PRO = Спр.ПроцентСкидки;
           Файл.POK = Спр.ДатаПервойПокупки;
           Файл.NOM = Спр.НомерКарты;
           Файл.SOT = Спр.ТелефонСот;
           Если Спр.ОбщаяСумма.Получить(ТекущаяДата())=0 тогда
               Сообщить(Спр.Наименование);
           КонецЕсли;
           Файл.Записать();
       КонецЦикла;
   
       Файл.ЗакрытьФайл();
75 chief accountant
 
22.10.12
15:32
(74) ты не понял. У него в элементе
Процедура ИзмененКод()
   ///сработает при вводе данных в поле код
   НомерКарты=Код;
КонецПроцедуры

вывод: в дбф НомерКарты нах ненужен
76 AAP
 
22.10.12
15:50
(75) понятно
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.