1. 1C / Говнокод #13436

    −126

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    Функция ЗначениеСвойства(Объект, ИмяСвойства) Экспорт
    	
    	Возврат Объект[ИмяСвойства]
    	
    КонецФункции

    Пипец полезная функция!

    Запостил: doom2good, 17 Июля 2013

    Комментарии (30) RSS

    • Может, это используется в какой-нибудь функциональщине?
      Ответить
      • > 1C
        > функциональщине
        Я что-то пропустил? :)
        Ответить
        • В том и дело, что bormand ничего не пропустил и даже отметился здесь: http://govnokod.ru/12149
          Ответить
        • А если серьёзно, то совсем недавно показывал имеющую право на жизнь конструкцию для php:
          $arr3 = array_map(function($value, $key) {return $value[$key];}, $arr1, $arr2);
          В адынэсе случайно подобных callback-функций не бывает?
          Ответить
          • Странный код. Я правильно понимаю, что $arr1 - массив массивов? Для чего это юзалось, если не секрет?
            Ответить
            • Так и есть, можете смело участвовать в битве экстрасенсов.

              Может быть, существует более элегантное решение, но это первое, что пришло в голову на ночь глядя:
              http://govnokod.ru/13420#comment188689
              Ответить
              • показать все, что скрыто
                * g o a t s e x * g o a t s e x * g o a t s e x *
                g                                               g  
                o /     \             \            /    \       o
                a|       |             \          |      |      a
                t|       `.             |         |       :     t
                s`        |             |        \|       |     s
                e \       | /       /  \\\   --__ \\       :    e
                x  \      \/   _--~~          ~--__| \     |    x  
                *   \      \_-~                    ~-_\    |    *
                g    \_     \        _.--------.______\|   |    g
                o      \     \______// _ ___ _ (_(__>  \   |    o
                a       \   .  C ___)  ______ (_(____>  |  /    a
                t       /\ |   C ____)/      \ (_____>  |_/     t
                s      / /\|   C_____)       |  (___>   /  \    s
                e     |   (   _C_____)\______/  // _/ /     \   e
                x     |    \  |__   \\_________// (__/       |  x
                *    | \    \____)   `----   --'             |  *
                g    |  \_          ___\       /_          _/ | g
                o   |              /    |     |  \            | o
                a   |             |    /       \  \           | a
                t   |          / /    |         |  \           |t
                s   |         / /      \__/\___/    |          |s
                e  |           /        |    |       |         |e
                x  |          |         |    |       |         |x
                * g o a t s e x * g o a t s e x * g o a t s e x *
                Ответить
    • а как на счет получения реквизита в тонком клиенте? эта функция для такого рода деятельности.
      мимо кассы, господа.
      Ответить
      • Пока не могу себе представить, где и как оно могло бы выполняться.
        Ответить
        • Получение реквизита со ссылки, очевидно же. Гляньте БСП, там аж четыре такие функции в ОбщегоНазначения: значение/значения свойства объекта/объектов. Правда более корректным способом, без получения объекта целиком. до ветки 2.1.3 в этом модуле еще и вызов сервера стоял. Потом убирали, но большинство типовых сразу обертки написали :)
          Ответить
          • ОбщегоНазначения.ПолучитьЗначениеРеквизи та()
            Активно юзаю этот метод. но назначение Объект[ИмяСвойства] ваще не представляю! что мешает просто через точку получить свойство?
            Ответить
            • То, что на стороне тонкого клиента не сработает Объект.Контрагент.Наименование
              и придется использовать
              ЗначениеСвойства(Объект.Контрагент, "Наименование")

              Вы, молодой человек, не постигли
              Ответить
              • я то всё постиг, а вот вы попробуйте со своего тонкого клиента вызвать ЗначениеСвойства(Объект.Контрагент, "Наименование"), и посмотрите, что из этого выйдет. Обращаю внимание - процедура лежит в общем модуле (для непонятливых поясню: чтобы вызвать её из упр формы, придется писать обертку, иначе говоря, получать свойство ЧЕРЕЗ ЖОПУ))) )
                Ответить
                • Если на модуле стоит флаг "вызов сервера", то вызов такой функции возможен и с тонкого и с толстого клиента. Флаг для того и сделан как бы.
                  Ответить
            • Имя свойства - строка, которую можно собрать по кусочкам из подстрок или получить любым другим способом. При работе через точку имя свойства должно быть заранее известно.
              Ответить
            • Почему бы не реализовать более универсальное решение - получение группы реквизитов для группы объектов. Проблем не вижу, выигрыш налицо.
              Ответить
              • Для группы реквизитов есть
                ОбщегоНазначения.ПолучитьЗначениеРеквизи тов(Ссылка, СписокРеквизитовЧерезЗапятую)
                Возвращает структуру.
                Ответить
                • Вместо ссылки массив можно передать? Там же элементарно, в запросе вместо "Ссылка = &Ссылка" написать "Ссылка В (&Ссылка)".
                  Хотя я, если честно, этой лабудой не пользуюсь. Все равно обычно все Ссылки у меня появляются из какого-нибудь запроса, так почему бы и реквизиты не дернуть в том же запросе. Так и делаю, и это кошерно ИМХО.
                  Ответить
                  • я чуть выше писал, что есть 4 реализации в ОбщегоНазначения. получение из 1 ссылки 1 свойство, из 1 ссылки много свойств и такая же пара для массива ссылок 1 свойство и много свойств.
                    Ответить
    • Эта функция используется во внешнем соединении при открытии 1С через COM, например из 7.7.
      Ответить
      • а во внешнем соединении нельзя через точку получать значения?
        Ответить
        • Можно.
          Со внешним соединением другой косяк.
          Вот попробуйте (не во внешнем соединении) получить 2 ссылки на один и тот же объект двумя разными способами, напр. двумя запросами. А потом проверьте на равенство, типа
          Если Ссылка1 = Ссылка2 тогда
          Сообщить("Равны")
          Иначе
          Сообщить("Не равны")
          КонецЕсли
          А потом тот же финт проверните во внешнем соединении.
          Вуаля! Они ВСЕГДА не равны, даже если ссылка на один и тот же объект!
          В принципе, зная системное программирование и COM-объекты, я могу это понять, но любой 1С-ник будет ругаться...
          Ответить
          • ну так в случае внешнего соединения он возвращает не ссылки, а ком-объекты. разные ком-объекты. потому они и не равны. тут надо сравнивать в терминах базы-хоста - по строковому представлению гуида, например.
            Ответить
            • Я и говорю, я могу это понять как системный кодер. Даже в контексте базы-хоста, это две разные переменные-"ссылки", но с одинаковым содержимым. Логично было бы у ком-соединения реализовать метод (как есть методы String(), NewObject()) метод Equal() чтобы сравнивать ТОЧНО так же, как идет сравнение в контексте хоста.
              Ответить
    • Господа, сейчас поясню - как рождается подобное. Недавно сам наткнулся на точно такой же код в древней базе 7.7. Так вот, суть в том, что когда-то в эта функция была молода и наполнена методами и кодом. Но требования заказчика и ситх-программер сделали своё дело - она стала такой, как есть. Вместо того, чтобы убивать функцию, искать точки вызова(а их может быть тоже масса) и отрубать их, ситх сделал всё в течении нескольких секунд - он очистил функцию и оставил только возврат параметра. Это идеальное решения с точки зрения затраченного времени и решения задачи заказчика. Так что это - минималистичный говнокод
      Ответить
    • Функция полезна, если выполняет на сервере, а функцию вызывают на стороне клиенте (Тонкий клиент).
      Ответить
    • Не согласен что это говнокод.
      Как и писалось выше такой метод используется для получения значения реквизита объекта из web или тонкого клиента. Так как на этих клиентах не доступны реквизиты объекта.
      Тоесть код: "КодПоЕДРПОУКонтрагент = ДокументОбъект.Контрагент.КодПоЕДРПОУ" вызовет исключение.

      Автор не учёл особенности платформы.
      Ответить
      • У модуля нет галки "Вызов сервера", так что использовать этот метод для получения значения реквизита объекта из web или тонкого клиента нельзя.
        Ответить
        • С этого стоило начать. Тогда это либо любитель функционального подхода, либо это обрубок какой-то большей функции.
          Ответить
      • По-хорошему это делается запросом к нужному реквизиту нужного объекта. А то вот захотел я узнать номер документа, а там ТЧ на 2000 строк... И всё это подгрузилось в кэш при вызове через [].
        Так что в любом случае говнокод.
        И соглашусь, что это любитель функционального подхода. На обрубок мало походит по логике названия.
        Ответить

    Добавить комментарий