Гость
Форумы / [игнор отключен] [закрыт для гостей] / Как определить, что в справочнике нет элемента? / 8 сообщений из 8, страница 1 из 1
17.05.2013, 20:45
    #38262744
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в справочнике нет элемента?
Добрый вечер!

Пытаюсь из Delphi работать со справочником 1С Организации

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TConfBu30_V82.GetVBuyer;
var VBuyer, currentBuyer :Variant;
begin
   VBuyer:=V.Справочники.Организации;  // Где V - 1C Приложение
   currentBuyer:=VBuyer.НайтиПоНаименованию('КонноТрактормаш');
 if  {currentBuyer не найдено} then                             
   begin
     currentBuyer:=VBuyer.СоздатьЭлемент();
     currentBuyer.Наименование:='КонноТрактормаш';
     currentBuyer.Записать;
   end;



Как, хотя-бы в терминах 1С определить правильное выражение для {currentBuyer не найдено} ?

Пытал следующие варианты:
if currentBuyer = V.Значение(VBuyer.ПустаяСсылка) then
if VBuyer.НайтиПоНаименованию('КонноТрактормаш')=0 then
if currentBuyer=V.Неопределено then

Да и в Delphi при отсутствии такой записи в справочнике currentBuyer не Null

В 1С 7.7 всё было как-то проще.
...
Рейтинг: 0 / 0
18.05.2013, 00:46
    #38262941
Программист 1с
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в справочнике нет элемента?
Вы хелп по 1с открыли?

Прочтите что возращает найти по наименованию. Там помнится даже написана проверка на пустое значение.
...
Рейтинг: 0 / 0
18.05.2013, 07:15
    #38263034
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в справочнике нет элемента?
Вот по хелпу 1C адаптировал:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TConfBu30_V82.GetVBuyer;
var StringOfDescription: string;
FoundReference, Shops: Variant;
begin
  StringOfDescription := 'КонноТрактормаш';
  Shops := V.Catalogs.Организации;
  FoundReference := Shops.FindByDescription(StringOfDescription);
  If (FoundReference = Shops.EmptyRef)
    Then ShowMessage('There is no ' + StringOfDescription)
    else ShowMessage('There is ' + StringOfDescription);
  exit;



проверку IF не проходит, вылетает.
пробовал и так: If (FoundReference = Shops.EmptyRef())
тот же результат
...
Рейтинг: 0 / 0
18.05.2013, 10:58
    #38263096
Программист 1с
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в справочнике нет элемента?
Shops := V.Справочники.Организации.ПустаяСсылка - Вылетает?

Второй вариант - заполните второй параметр в найти по наименованию - "истина". (Что-то было, если не заполняешь параметры то они неопределены)
...
Рейтинг: 0 / 0
18.05.2013, 11:25
    #38263113
pail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в справочнике нет элемента?
Программист 1сShops := V.Справочники.Организации.ПустаяСсылка - Вылетает?

Второй вариант - заполните второй параметр в найти по наименованию - "истина". (Что-то было, если не заполняешь параметры то они неопределены)
Кстати - да! При com-подключении все параметры методов надо задавать явно, даже необязательные, "значение по-умолчанию" тут не работает.
...
Рейтинг: 0 / 0
18.05.2013, 21:04
    #38263539
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в справочнике нет элемента?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
procedure TConfBu30_V82.GetVBuyer;
var StringOfDescription: string;
    ExactMap: boolean;
FoundReference, NewBuyer, Shops, FParent, FOwner : Variant;
begin
try
  ExactMap:=True;
  FoundReference:=UnAssigned;
  FParent:=UnAssigned;
  FOwner:=UnAssigned;
  StringOfDescription := 'Совхоз им. Красной Конницы';
  Shops := V.Catalogs.Организации;

  NewBuyer:=Shops.СоздатьЭлемент();
  NewBuyer.Наименование:=StringOfDescription;
  NewBuyer.Записать;
  ShowMessage(NewBuyer.Наименование);

  If (NewBuyer = V.Catalogs.Организации.EmptyRef())// Вылетает !  текст ошибки: invalid variant operation
    Then ShowMessage('NewBuyer пустой')
    else ShowMessage('NewBuyer полный');  { }

                      //  FindByDescription(<Description>, <ExactMap>, <Parent>, <Owner>)
  FoundReference := Shops.FindByDescription(StringOfDescription, ExactMap, FParent, FOwner);

  ShowMessage(FoundReference.Наименование); //Здесь тоже вылетает текст ошибки: lock conflict during transaction

//  If (FoundReference = V.Catalogs.Организации.EmptyRef)  // вылетает
//  If (FoundReference = Shops.EmptyRef)                   // вылетает
//  If (FoundReference = V.Catalogs.Организации.EmptyRef())  // вылетает
  If (FoundReference = Shops.EmptyRef())                   // вылетает

    Then ShowMessage('There is no ' + StringOfDescription)
    else ShowMessage('There is ' + StringOfDescription);
  exit;

 except on E: Exception do
  showmessage(E.message);
  end; //try



Кроме как занести новый элемент ничего не удаётся
...
Рейтинг: 0 / 0
19.05.2013, 07:36
    #38263700
pail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в справочнике нет элемента?
zeon11,
1.
Код: pascal
1.
If (NewBuyer = V.Catalogs.Организации.EmptyRef())// Вылетает !  текст ошибки: invalid variant operation

NewBuyer - объект, а V.Catalogs.Организации.EmptyRef(),это разные типы. Если и сравнивать их,то
Код: pascal
1.
If (NewBuyer.Ref() = V.Catalogs.Организации.EmptyRef())

Да только всегда false будет при сравнении ссылки на только что записанный элемент с пустой ссылкой.

2.
Код: pascal
1.
  FoundReference := Shops.FindByDescription(StringOfDescription, ExactMap, FParent, FOwner);

"Неопределено" и UnAsigned - не одно и то же. Попробуйте использовать здесь в качестве FParent, FOwner значения V.Catalogs.Организации.EmptyRef() или V.Undefined. Паскалевские True False тоже не обязаны соответствовать 1С значениям с похожим названием. Чтобы точно убедиться в том, что за значения платформа v8 исользует,посмотрите результат V.Eval("0=1") и V.Eval("1=1") (возможно, что правильно использовать v.true и v.false). FoundReference - это будет либо ссылка на найденное значение, либо пустая ссылка, т.е. Shops.EmptyRef().
Ссылка - это не объект. Для доступа же к полям нужен объект. Возможно, что в
Код: pascal
1.
  ShowMessage(FoundReference.Наименование); //Здесь тоже вылетает текст ошибки: lock conflict during transaction

платформа неявно пытается создать объект из ссылки, т.е. читает его, да еще "для записи", отсюда и блокировка.

Для определения того, что элемент с нужным наименованием существует, достаточно сравнить
Код: pascal
1.
Shops.EptyRef() = Shops.FindByDescription(StringOfDescription, ExactMap, FParent, FOwner)

при корректных значениях аргументов.
...
Рейтинг: 0 / 0
20.05.2013, 18:39
    #38265081
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить, что в справочнике нет элемента?
Спасибо, что уделили внимание, помогли.

Решилось так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
procedure TConfBu30_V82.GetVBuyer;
var StringOfDescription: string;
    Shops, EmptyRef, FoundReference, NewBuyer: OLEVariant;
begin
 try
   Shops    := V.Catalogs.Организации;
   EmptyRef := V.Catalogs.Организации.EmptyRef();
   StringOfDescription := 'с/з Красный путь';
                      //  FindByDescription(<Description>, <ExactMap>, <Parent>, <Owner>)
  FoundReference := Shops.FindByDescription(StringOfDescription, True, EmptyRef, EmptyRef);
  if FoundReference.Пустая()
    then begin
           NewBuyer:=Shops.СоздатьЭлемент();
           NewBuyer.Наименование:=StringOfDescription;
           NewBuyer.Записать;
         end
    else begin
           ShowMessage('There is ' + StringOfDescription);
         end;
  exit;
 except on E: Exception do showmessage(E.message);
  end; //try
end;
...
Рейтинг: 0 / 0
Форумы / [игнор отключен] [закрыт для гостей] / Как определить, что в справочнике нет элемента? / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]