Имя: Пароль:
1C
1С v8
Не могу поменять элемент справочника...
,
0 jaroslavbayev
 
18.02.14
18:03
Есть код:
НачатьТранзакцию();
    стрПодключения = "Driver={Microsoft Visual FoxPro Driver};
    |SourceType=DBF;SourceDB=D:\Наст;
    |Exclusive=No ;NULL=NO; BackgroundFetch=Yes;";
    Connect = Новый COMОбъект("ADODB.Connection");
    попытка
        Connect.Open(стрПодключения);
    исключение
        сообщить(ОписаниеОшибки());
        Отказ=Истина;
        Возврат;                                      
    КонецПопытки;
ЛС = Новый COMОбъект("ADODB.Recordset");
ЛС.Open("Select CPCONVERT(866,1251,kod) as kod,nomer,CPCONVERT(866,1251,name) as ima,nkv,CPCONVERT(866,1251,lkv) as lkv from sprls2", Connect);

Пока ЛС.EOF()=0 цикл
    РезультатПоиска = Справочники.ЛицевыеСчета.НайтиПоКоду(ЛС.Fields("nomer").Value);
Если РезультатПоиска = 0 Тогда
НовыйЛицевойСчет = Справочники.ЛицевыеСчета.СоздатьЭлемент();
НовыйЛицевойСчет.Код = ЛС.Fields("nomer").Value;
НовыйЛицевойСчет.Номер = ЛС.Fields("nomer").Value;
НовыйЛицевойСчет.Квартиросьемщик =ЛС.Fields("ima").Value;
НовыйЛицевойСчет.Квартира = ЛС.Fields("nkv").Value;
НовыйЛицевойСчет.ЛитераКвартиры = ЛС.Fields("lkv").Value;
НовыйЛицевойСчет.Владелец =Справочники.ДОМА.НайтиПоКоду(ЛС.Fields("kod").Value).
НовыйЛицевойСчет.Записать();
Иначе Результат = Справочники.ЛицевыеСчета.НайтиПоКоду(ЛС.Fields("nomer").Value).Квартиросъемщик;
    Если Не Результат = ЛС.Fields("ima").Value  Тогда
    Лицевой = Справочники.ЛицевыеСчета.НайтиПоКоду(ЛС.Fields("nomer").Value).Ссылка.ПолучитьОбъект();
    Лицевой.Квартиросъемщик = ЛС.Fields("ima").Value;
    Лицевой.Записать();
   КонецЕсли;
    КонецЕсли;
ЛС.MoveNext();
КонецЦикла;
    ЛС.Close();
    Connect.Close();
    ЗафиксироватьТранзакцию();

Программа доходит до места:Справочники.ЛицевыеСчета.НайтиПоКоду(ЛС.Fields("nomer").Value).Ссылка.ПолучитьОбъект(); и тут же уходит в ошибку: Ошибка при вызове метода контекста (ПолучитьОбъект)по причине:
Элемент не выбран! и все ни в какую работать не желает, что не так???
1 Eugene_life
 
18.02.14
18:04
(0) Ну, значит не находит он элемента
2 Eugene_life
 
18.02.14
18:05
(0) + Попробуй (ЛС.Fields("nomer").Text)
3 Torquader
 
18.02.14
18:05
Так, насколько я помню, если что-то не найдено, то возвращается НЕОПРЕДЕЛЕНО - кто это проверяет ?
4 Eugene_life
 
18.02.14
18:06
(3) Никто не проверяет, даже Попытка нету )
5 jaroslavbayev
 
18.02.14
18:07
Хорошо если так, то каким же макаром оно проскочило первое условие и не появилось?
6 Torquader
 
18.02.14
18:08
(5) Как бы 0 и НЕОПРЕДЕЛЕНО это разные вещи.
7 Eugene_life
 
18.02.14
18:10
(5) Поставь условие такое
вместо Если РезультатПоиска = 0 Тогда
вот так:
Если РезультатПоиска = Неопределено ИЛИ РезультатПоиска.Пустая() Тогда
8 hhhh
 
18.02.14
18:12
(6) НЕОПРЕДЕЛЕНО не может возвращать - это сказки. Пустая ссылка там.
9 jaroslavbayev
 
18.02.14
18:13
Т.е вы хотите сказать, что запись есть, но она битая?
10 Рэйв
 
18.02.14
18:14
(0)Ну ты герой
11 Рэйв
 
18.02.14
18:14
Завидная самоуверенность
12 Рэйв
 
18.02.14
18:15
Не определив вообше что ты получил(толи хрень, толи то что хотел), ты браво пытаешься получить от этого объект!
13 Рэйв
 
18.02.14
18:15
Гусар куле...
14 Torquader
 
18.02.14
18:17
(8)
Возвращаемое значение:

Тип: СправочникСсылка.; Неопределено. Если не существует ни одного элемента с требуемым кодом, то будет возвращена пустая ссылка.
Если для справочника код не задан (длина = 0), то будет возвращено Неопределено.

Может быть и неопределено, но это, если  совсем не там ищут.
15 Eugene_life
 
18.02.14
18:18
(8) + (14) У него может оказаться пустым его значение из ячейки :)
16 Eugene_life
 
18.02.14
18:19
(9) Нет никакой "битой" записи. Посмотри уже отладчиком, что ты ищешь.
17 jaroslavbayev
 
18.02.14
18:20
Герой не герой, вот только я не пойму как он вообще там может иметь значения типа Неопределенно или Пустая, если НайтиПоКоду () Выдает значение типа Булево это раз! Соответственно, если в первой части :  РезультатПоиска = Справочники.ЛицевыеСчета.НайтиПоКоду(ЛС.Fields("nomer").Value);
Если  РезультатПоиска = 0 Тогда мы не попали в тогда, логично предположить, что запись с данным кодом есть и мы проверяем на соответствие второго реквизита в этой строке. Замечу что номер и код в данном справочники абсолютно идентичны друг другу.
18 Eugene_life
 
18.02.14
18:20
(9) + Останови в ошибке и посмотри значение ЛС.Fields("nomer").Value. Потом найди этот код вручную и все поймешь
19 hhhh
 
18.02.14
18:20
(17) записи вообще нет. Результат = NULL.

Не Результат = ЛС.Fields("ima").Value  = ИСТИНА

Всё сходится.
20 Torquader
 
18.02.14
18:20
(17) Это семёрка или восьмёрка - начнём с этого.
21 Eugene_life
 
18.02.14
18:22
(17) НайтиПоКоду не возвращает Булево в 1С 8
22 jaroslavbayev
 
18.02.14
18:22
Это Восьмерка
23 Eugene_life
 
18.02.14
18:22
(22) тогда тебе вернется ссылка или неопределено
24 Eugene_life
 
18.02.14
18:23
(22) твое Если РезультатПоиска = 0 Тогда вообще никогда не выполнится
25 Torquader
 
18.02.14
18:23
Зачем тогда два раза искать - если один раз нашёл, то проверяешь, что нашёл, потом зачем, когда это делаешь:
Результат = Справочники.ЛицевыеСчета.НайтиПоКоду(ЛС.Fields("nomer").Value).Квартиросъемщик;
26 Шапокляк
 
18.02.14
18:24
(17) НайтиПоКоду(<Код>, <Поиск по полному коду>, <Родитель>, <Владелец>)
Параметры:
<Код> (обязательный)
Тип: Число, Строка. Искомый код.
Строка или число в зависимости от настроек справочника в конфигураторе.
<Поиск по полному коду> (необязательный)
Тип: Булево. Определяет режим поиска по полному коду. Истина - искомый код следует задавать в виде строки, состоящей из последовательности кодов по уровням справочника, разделенных символом "/".
Значение по умолчанию: Ложь
<Родитель> (необязательный)
Тип: СправочникСсылка. Родитель, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
<Владелец> (необязательный)
Тип: СправочникСсылка. Владелец, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
Возвращаемое значение:
Тип: СправочникСсылка.<Имя справочника>, Неопределено. Если не существует ни одного элемента с требуемым кодом, то будет возвращена пустая ссылка.
Если код не задан, то будет возвращено Неопределено.

Если у вас в ячейке nomer пусто, поиск вернет Неопределено, если не пусто, то поиск вернет или ссылку на элемент справочника или пустую ссылку на элемент этого справочника. 0 не вернет никогда, поэтому вы проскакиваете сразу в ветку Иначе, хотя не факт, что вы нашли непустую ссылку.
27 Torquader
 
18.02.14
18:25
Если результатпоиска=НЕОПРЕДЕЛЕНО Тогда
Сообшить("Шайтан какой-то");
ИначеЕсли результатпоиска.Пустая()Тогда
// первая часть кода
Иначе
Результат=РезультатПоиска.Квартиросъемщик;
Лицевой=РезультатПоиска.ПолучитьОбъект();

ну и так далее.
28 jaroslavbayev
 
19.02.14
17:20
Ура, все заработало, всем огромное спасибо и за вашу помощь и за ваши посмеивания и за ваше терпение.
29 Torquader
 
19.02.14
17:21
Да, не прошло и суток.
2 + 2 = 3.9999999999999999999999999999999...