7.7 Некоторые ньюансы работы

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

  1. TopicStarter Overlay
    WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Всем привет, может кто может объяснить проведение следующего кода? (Писал сам, все работает, но некоторые моменты не соответствуют описанию):
    Значит в двух словах, функция возвращает элемент справочника по виду справочника и наименованию элемента:

    Код:
    Функция НайтиЭл(Тип, Наим, Влад = 0)
    Эл = СоздатьОбъект("Справочник." + Тип);
    Если Метаданные.Справочник(Тип).Владелец.Выбран() = 1 Тогда
    Если ПустоеЗначение(Влад) = 0 Тогда
    Эл.ИспользоватьВладельца(Влад);
    КонецЕсли;
    КонецЕсли;
    Если Эл.НайтиПоНаименованию(Наим) = 0 Тогда
    Эл.Новый();
    Эл.Наименование = Наим;
    Попытка
    Эл.Записать();
    Сообщение("Создан элемент ""Справочник." + Тип + """ (" + Наим + ")","i");
    Исключение
    Сообщение("Невозможно создать элемент ""Справочник." + Тип + """ (" + Наим + ")");
    Эл = ПолучитьПустоеЗначение("Справочник." + Тип);
    КонецПопытки;
    КонецЕсли;
    Возврат Эл.ТекущийЭлемент();
    КонецФункции    // НайтиЭл(Элемент)
    
    Теперь вопросы:
    1) Почему, если использовать
    ПолучитьПустоеЗначение(Эл);
    возвращается значение неопределенного типа?
    2) Функция ПустоеЗначение(Эл) всегда возвращает 1 вне зависимости от спозиционированости Эл? (Причем Эл.Выбран() правильно выдает значение)
  2. burgomister
    Offline

    burgomister

    Регистрация:
    14 май 2007
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    Читайте справку!!!
    1. ПолучитьПустоеЗначение(<Тип>)
    Назначение: Возвращает пустое значение заданного типа.
    Параметры: <Тип> - необязательный параметр. Строка или вид субконто или объект метаданных, задающий тип данных. Если параметр не задан, то функция возвращает пустое значение неопределенного типа.

    2. ПустоеЗначение(<Значение>)
    Назначение: Функция определяет, является ли пустым переданное в параметре значение. Возвращает число: 1- если значение пустое и 0 - если нет. При этом применяется следующее правило:
    - значение неопределенного типа - всегда пустое;
    - значение типа ''строка'' проверяется как в методе ПустаяСтрока;
    - значение типа ''число'' проверяется на равенство нулю;
    - значение типа ''дата'' проверяется на пустое значение;
    - значения следующих типов: ''справочник'', ''перечисление'', ''документ'', ''счет'', ''вид субконто'', ''план счетов'', ''календарь'' проверяются как в методах Выбран для соответствующего типа объекта.;
    - значение типа ''СписокЗначений'' считается пустым, если в нем нет значений;
    - значение типа ''ТаблицаЗначений'' считается пустым, если нет ни одной строки таблицы.
    Параметры: <Значение> - выражение любого типа данных, значение которого проверяется.
  3. TopicStarter Overlay
    WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Читайте КОД!!!
    Тип переменной Эл - Справочник, Возвращаемое значение - неопределенного вида

    Так в этом случае метод Выбран возвращает правильное значение (если выбран - 1, иначе - 0)
    А метод ПустоеЗначение(Эл) всегда возвращает 1.

    PS Со справкой и КЖК ознакомлен отлично, как никак все 3 сертификата по 7.7
  4. X-Man
    Offline

    X-Man Опытный в 1С

    Регистрация:
    18 май 2007
    Сообщения:
    439
    Симпатии:
    3
    Баллы:
    29
    Ну ты как маленький, ей богу. Что значит "ПолучитьПустоеЗначение(Эл)"? Что-то непохоже, что у тебя 3 сертификата. Только без обид. Я понимаю еще бы написал так "ПолучитьПустоеЗначение(ТипЗначениеСтр(Эл))" А то бред какой-то ты пишешь:)
  5. X-Man
    Offline

    X-Man Опытный в 1С

    Регистрация:
    18 май 2007
    Сообщения:
    439
    Симпатии:
    3
    Баллы:
    29
    У тебя же даже в коде написано правильно "Эл = ПолучитьПустоеЗначение("Справочник." + Тип);
    " То есть в параметр Тип должна передаваться строка. А ты, как я понял, передаешь элемент справочника, который, по правилам преобразования типов, преобразуется в строку со значением, содержащимся в реквизите "Наименование" элемента Эл. То есть, грубо говоря, получается ты хочешь получить пустое значение "Вася Пупкин"-типа. Или я что-то путаю?
  6. TopicStarter Overlay
    WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    2 X-Man
    Ошибаешься...
    1) "Ну ты как маленький, ей богу. Что значит "ПолучитьПустоеЗначение(Эл)"?"
    Спасибо что напомнил :)
    Почитай лучше книгу. Там написано, что параметр может быть не только строка, но и объект метаданных.

    2) "У тебя же даже в коде написано правильно"
    ЗНАЮ!!! Я профессионал, и добиваюсь цели любым путем, поэтому здесь представлено правильное рабочее решение. Чтоб не возникало ситуации - скопировал себе, а оно не работает.
    А потом указаны поясняющие вопросы.

    Кому очень интересно, поищите одноименный топик в клубе профессионалов, там уже этот вопрос приведен к эдиному решению.

    Теперь специально для X-Man (после того, как почитаешь КЖК стр 1-120):
    Эл - это ссылка на элемент справочника (тип "Справочник.Идентификатор")
    Справочник является ОБЪЕКТОМ МЕТАДАННЫХ.
    Пустое значение - соответствует неспозиционированной на элемент ссылке. Вот его я и хочу получить (что выполняет указанная тобой ПРАВИЛЬНАЯ строка).

    Я рекомендую проанализировать данный участок при помощи отладчика, проверь как себя ведут значения
    ТипЗначенияСтр(Эл)
    Эл.Выбран()
    ПустоеЗначение(Эл) (по описанию СООТВЕТСТВУЕТ Эл.Выбран())
    ПолучитьПустоеЗначение(Эл)
    ПолучитьПустоеЗначение("Справочник." + Тип)

    PS по поводу обид: лично мне твое мнение по барабану. К критике отношусь нормально, если виноват - исправлюсь, иначе - игнорирую.
    Но что бы не возникало такой ситуации, рекомендую сначала изучить материал по подробнее (к тому же есть такая возможность), а потом высказывать предложения (желательно со ссылкой или указанием степени объективности).
  7. X-Man
    Offline

    X-Man Опытный в 1С

    Регистрация:
    18 май 2007
    Сообщения:
    439
    Симпатии:
    3
    Баллы:
    29
    WARDER, не убедил:) Твой Эл, как ты сам справедливо заметил, - всего лишь ссылка на элемент справочника и не более того. Для достижения твоей цели я бы порекомендовал передать в качестве параметра "правильный" объект метаданных, то есть использовать конструкцию типа Эл=ПолучитьПустоеЗначение(Метаданные.Справочник("ТвойЛюбимыйСправочник")) вместо того, чтобы иронизировать и бить себя в грудь по поводу твоего профессионализма(в котором, кстати, никто и не сомневается, отчего такая агрессивная реакция с твоей стороны становится мягко говоря непонятной.). Будь спокойней и все получится:) Я правда не хотел тебя в прошлый раз обидеть, опять же повторюсь, до сих пор не понимаю агрессии.
  8. TopicStarter Overlay
    WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    По поводу агресси :) все нормально, я о-о-очень спокойный и это всерьез не воспринимаю. Думаю проехали :)
    По поводу ПустоеЗначение() в клубе профессионалов мы тоже пришли к выводу, что такая ситуация именно из-за того, что это ссылка.
    Изначально вопрос задавался не с целью получить ответ (ответ сразу и представлен :) ), а хотелось поделиться обнаруженным несоответствием, ведь нигде в официальном описании нет никаких уточнений по поводу ссылок, да и функция ТипЗначенияСТР(Эл) явно пишет, что это "Справочник". Вот я сразу и попался, потерял часа два на анализ (а время, как говорится, деньги). Думаю тема теперь закрыта.

    PS Функция довольно востребована, поэтому можно сюда ссылки давать (и предложения на доработку). Желаю всем удачи в дебрях неописанных возможностей 1С.

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