powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / [игнор отключен] [закрыт для гостей] / Как определить, что в справочнике нет элемента?
8 сообщений из 8, страница 1 из 1
Как определить, что в справочнике нет элемента?
    #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
Как определить, что в справочнике нет элемента?
    #38262941
Программист 1с
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы хелп по 1с открыли?

Прочтите что возращает найти по наименованию. Там помнится даже написана проверка на пустое значение.
...
Рейтинг: 0 / 0
Как определить, что в справочнике нет элемента?
    #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
Как определить, что в справочнике нет элемента?
    #38263096
Программист 1с
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shops := V.Справочники.Организации.ПустаяСсылка - Вылетает?

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

Второй вариант - заполните второй параметр в найти по наименованию - "истина". (Что-то было, если не заполняешь параметры то они неопределены)
Кстати - да! При com-подключении все параметры методов надо задавать явно, даже необязательные, "значение по-умолчанию" тут не работает.
...
Рейтинг: 0 / 0
Как определить, что в справочнике нет элемента?
    #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
Как определить, что в справочнике нет элемента?
    #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
Как определить, что в справочнике нет элемента?
    #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]