7.7 каким методом правильно очистить текущий элемент справочника?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем PaPaY, 25 авг 2009.

  1. TopicStarter Overlay
    PaPaY
    Offline

    PaPaY

    Регистрация:
    5 июл 2009
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    добрый день.

    Код:
    //создаю объект
    OS= V7.CreateObject("Справочник.НеоборотныеАктивы");
    //если принадлежит Основным средствам тогда поиск по реквизиту"инвентарный номер", 
    If What = "Основные средства" Then 
    if (OS.НайтиПоРеквизиту("ИнвенНомер",СокрЛП(Obj.ИнвенНомер),1) = 1) и (ПустаяСтрока(Obj.ИнвенНомер) =0) then  
    rez = OS.CurrentItem();	
    КонецЕсли;
    //если нематериальные активы, тогда поиск по наименованию. 
    Иначе 
    if OS.FindByDescr(naim,0, 1) = 1 then
    rez = OS.CurrentItem();	
    КонецЕсли;
    КонецЕсли;
    //Затем проверяю выбран ли объект и если выбран возвращаю текущий элемент
    if OS.Selected() = 1 then  
    rez = OS.CurrentItem();
    иначе 
    //создаю новый элемент справочника 
    
    Первым проходит условия элемент справочника с пустым инвентарным номером и записывается новый элемент, затем пять элементов с инвентарными номерами удачно записываются. Следующие уже без инвентарного номера идут. Они в отладчике правильно проходят условие if (OS.НайтиПоРеквизиту("ИнвенНомер",СокрЛП(Obj.ИнвенНомер),1) = 1) и (ПустаяСтрока(Obj.ИнвенНомер) =0) и не возвращают результат , а на строке if OS.Selected() = 1 позиционируются как найденный элемент с пустым значением и соответственно не создаётся новый элемент справочника, а в операциях записывается как первый элемент, который записался с пустым реквизитом "Инвентарный номер" . Не могу понять или не отрабатывает условие "OS.НайтиПоРеквизиту("ИнвенНомер",СокрЛП(Obj.ИнвенНомер),1) = 1) и (ПустаяСтрока(Obj.ИнвенНомер) =0) " тогда почему перескакивает строку "rez = OS.CurrentItem(); "
    или выбранный элемент с пустым значением хранится в памяти и его нужно очистить.
    Подскажите, пжлста, какие варианты существуют или замены условия или очистки текущего элемента.
    Пасиба.
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Что за конфа? Бух - классика?
  3. TopicStarter Overlay
    PaPaY
    Offline

    PaPaY

    Регистрация:
    5 июл 2009
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    Приемник - классика, источник - солянка(писали все кому не лень). Данный код отдельная обработка.
  4. Хряк
    Offline

    Хряк Профессионал в 1С

    Регистрация:
    26 сен 2007
    Сообщения:
    1.447
    Симпатии:
    37
    Баллы:
    54
    что мешает
    if (OS.НайтиПоРеквизиту("ИнвенНомер",СокрЛП(Obj.ИнвенНомер),1) = 1) и (ПустаяСтрока(Obj.ИнвенНомер) =0) then
    разделить на 2 условия

    ищем проблемы там где их нет

    и вот это не нравится
    if OS.Selected()
    не буду объяснять почему, всего кода не видно
  5. TopicStarter Overlay
    PaPaY
    Offline

    PaPaY

    Регистрация:
    5 июл 2009
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    уверенность в том, что платформа корректно отрабатывает данное условие и обычная человеческая лень писать лишние строчки. В любом случае, пасиба, завтра попробую.

    Собственно код почти весь. Это функция поиска/создания объекта в приёмнике при переносе ОС через OLE. Так как через OLE можно перенести только простые данные, поэтому ищу в приёмнике по реквизиту те справочники у которых основная масса их имеет или по наименованию у той основной части, которая их не имеет. Собственно код почти весь указан. Отсутствуют только несколько объектов в начале функции, необходимых для правильного отображения типов реквизита справочника приёмника при создании нового и сам код создания нового справочника. Если убрать комментарии, то код выглядит так:
    функция ПоискСозданиеСправочникаВБазеПриемнике(Obj,What)
    OS= V7.CreateObject("Справочник.НеоборотныеАктивы");
    If What = "Основные средства" Then
    if (OS.НайтиПоРеквизиту("ИнвенНомер",СокрЛП(Obj.ИнвенНомер),1) = 1) и (ПустаяСтрока(Obj.ИнвенНомер) =0) then
    rez = OS.CurrentItem();
    КонецЕсли;
    Иначе
    if OS.FindByDescr(naim,0, 1) = 1 then
    rez = OS.CurrentItem();
    КонецЕсли;
    КонецЕсли;
    if OS.Selected() = 1 then
    rez = OS.CurrentItem();
    иначе
    //создаю новый элемент справочника
    Любопытство осталось, почему не нравится метод или условие ( if OS.Selected() ) и каким методом или условием заменить?
  6. Alex_Old
    Offline

    Alex_Old

    Регистрация:
    24 окт 2007
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Далеко не факт, что данное условие может корректно отработать. Наступал на такие грабли.
  7. Хряк
    Offline

    Хряк Профессионал в 1С

    Регистрация:
    26 сен 2007
    Сообщения:
    1.447
    Симпатии:
    37
    Баллы:
    54
    >каким методом или условием заменить?

    Пустоезначение(ос)<>0
    ""+ОС<>""
  8. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    Наверное все дело в кривизне кода..

    Код:
    Function СоздатьЭлемент(Obj,What)
    OS = V7.CreateObject("Справочник.НеоборотныеАктивы");
    ...
    Return rez,
    EndFunction
    
    Function ПоискСозданиеСправочникаВБазеПриемнике(Obj,What)
    ...
    OS = V7.CreateObject("Справочник.НеоборотныеАктивы");
    If What = "Основные средства" Then
    If IsBlankString(Obj.ИнвенНомер) = 0 Then
    If OS.FindByAttribute("ИнвенНомер",TrimAll(Obj.ИнвенНомер),1) = 1 Then
    rez = OS.CurrentItem();
    ElsIf
    rez = СоздатьЭлемент(Obj,What);//создаю новый элемент справочника 
    EndIf;
    Else 
    Message("Пустой номер, что с ним делать?");
    EndIf;
    ElsIf
    If OS.FindByDescr(naim,0, 1) = 1 Then
    rez = OS.CurrentItem();
    Else 
    rez = СоздатьЭлемент(Obj,What);//создаю новый элемент справочника 
    EndIf;
    EndIf;
    EndFunction
    
    
    
    Разница чувствуется между условиями?
    Что подразумевается по словом "очистка"?
  9. TopicStarter Overlay
    PaPaY
    Offline

    PaPaY

    Регистрация:
    5 июл 2009
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    Всем пасиба.Если кому интересно результат ниже. Проблема разрешилась разделением условия
    Код:
    if (OS.НайтиПоРеквизиту("ИнвенНомер",СокрЛП(Obj.ИнвенНомер),1) = 1) и (ПустаяСтрока(Obj.ИнвенНомер) =0) then 
    
    
    на
    Код:
      If IsBlankString(Obj.ИнвенНомер) = 0 Then
    If OS.FindByAttribute("ИнвенНомер",TrimAll(Obj.ИнвенНомер),1) = 1 Then)
    
    
    Правда с оговорками: если в отладчике ходить по шагово, то результат тот же - всё равно не проходило следующее пустое значение условие
    Код:
     if OS.Selected() = 1 then
    rez = OS.CurrentItem();
    
    
    и в итоге и справочники не создавались новые и в операциях отражался первый справочник во всех строках. Но стоит запустить пакетом ( без отладчика) всё красиво переносится. Видимо платформа кривая. Это одна из причин перехода на другую конфигурацию. База источник не проходит проверку в тестировании и исправлении физической целостности, красные часики висят.
    почти не заметил - платформе всё равно в каком порядке английский и русский язык, о разделении писали выше, два раза один и тот же код писать на создание нового элемента справочника - нет необходимости поражать клиента кол-вом строк кода. Да и потом процедура разовая.
    имел ввиду придания переменной OS значения 0 перед функцией, если она ходила по "кругу" оставалась в оперативке и не корректно проходила условие
    Код:
     if OS.Selected() = 1 then
    
    
  10. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    Я не говорю о том на каком языке написано, я говорю о разнице в условиях.
    это
    Код:
    if (OS.НайтиПоРеквизиту("ИнвенНомер",СокрЛП(Obj.ИнвенНомер),1) = 1) и (ПустаяСтрока(Obj.ИнвенНомер) =0) then 
    
    
    не равно этому
    Код:
    If IsBlankString(Obj.ИнвенНомер) = 0 Then
    If OS.FindByAttribute("ИнвенНомер",TrimAll(Obj.ИнвенНомер),1) = 1 Then 
    
    
    объяснять почему?
    Краткость, конечно, сестра таланта..
  11. TopicStarter Overlay
    PaPaY
    Offline

    PaPaY

    Регистрация:
    5 июл 2009
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    конешно не равно.
    можно и не объяснять, но нам "адыгейцам" наверняка интересно было бы это узнать.
  12. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    а чего обижаться-то :unsure: я вроде без агрессии говорил)
    просто я считаю что не нужно стремиться без особой надобности сократить код любыми способами, ну и код должен быть удобочитаем (как минимум для тебя), если тебе удобны конструкции типа "If Then Иначе КонецЕсли" то это твое право, но в ситуациях, когда у тебя этого кода будет тысяч пять строк, разбираться в написанном будет немного напряжнее..
    удачи)

Поделиться этой страницей