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

    −97.6

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    Запрос1 = Новый Запрос;
    	Запрос1.Текст = "ВЫБРАТЬ
    	|	Номенклатура.ЕдиницаИзмерения
    	|ИЗ
    	|	Справочник.Номенклатура КАК Номенклатура
    	|ГДЕ
    	|	Номенклатура.Ссылка = &ном";
    	
    	
    	Запрос1.УстановитьПараметр("Ном", ЭлементыФормы.Товары.ТекущаяСтрока.Номенклатура);
    	
    	
    	
    	Результат1 = Запрос1.Выполнить();
    	Выборка1 = Результат1.Выбрать();
    	
    	Пока Выборка1.Следующий() Цикл
    		ед = выборка1.единицаизмерения;
    	КонецЦикла;			
    	
    	ЭлементыФормы.Товары.ТекущаяСтрока.ЕдИзм= ед;

    "Простой" способ подставить единицу измерения в табличную часть))

    Запостил: vedvd, 18 Сентября 2009

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

    • Линейкой ему по пальцам.
      Ответить
    • Для полного счастья не хватает:
      ...
      ед = выборка1.единицаизмерения.ссылка;
      ...
      И всё это положить в "ПриВыводеСтроки".
      Ответить
    • Зря наехали на этот код.
      Сравните, что будет в скуле, когда напишите так:
      ЭлементыФормы.Товары.ТекущаяСтрока.ЕдИзм= Номенклатура.ЕдиницаИзмерения;

      У вас еще и блокировка ляжет на объект....
      А при такой реализации произойдет грязное чтение, которому пофиг на блокировку. Да и по скорости большой разницы не будет
      Ответить
      • С какого переляка блокировка ляжет? То что ты написал сработает точно также как приведённый код. Разницы нет.
        Ответить
    • Согласен с напрасным наездом... Код этот надобно в отдельную функцию, да отрефакторить, это да... Но идея лучше, чем получение через точку. Со скулем работал три года в плотном режиме, потому про блокировки знаю не по наслышке.
      Ответить
      • Вы чего, ребята? Разве при обращении к ссылке, типа: ЭлементыФормы.Товары.ТекущаяСтрока.Номен клатура - она не кэшируется, и не выполняется тот же запрос? Кэшируется и выполняется.
        Эдак, давайте, налепим сюда ещё проверку на количество выборки, на существование колонки "ЕдИзм" и прочего говна. А что, по скорости большой разницы не будет.
        Кстати, что выдаст этот код, если номенклатура окажется пустой ссылкой?
        В общем, не стоит мудрить, когда это того не стоит. В 90% случаев, через жопу получается только хуже.
        Ответить
        • ТекущаяСтрока.Номенклатура хранится в уже полученном объекте в памяти сервера 1С.
          ТекущаяСтрока.Номенклатура.ЕдиницаИзмере ния - это запрос к БД с получением объекта в память, со всеми его реквизитами.
          То, как сделано - получение только ссылки.

          Более короткий код не всегда эффективнее. Кто сомневается - пузырьковая сортировка против например Quicksort Чарльза Хоара.
          Ответить
    • А ты замерь производительность. Создание объекта Запрос и прочее тоже время занимают
      Ответить
      • Обращение к ссылке через точку тоже ведет к созданию запроса. Просто его платформа неявно выполняет, может получиться и чуть быстрее, но не намного. Я имею в виду создание самого объекта Запрос, а не его выполнение.
        А тянуть единственный мне нужный реквизит запросом - имеет смысл. Потому что платформа-то потянет все реквизиты.
        В итоге проиграем 10 нс, а выиграем 1 мс и трафик и нагрузку на скуль.
        Ответить
        • Какая разница - брать 1 реквизит или все? Один хрен запрос выберет строку таблицы, и только потом получит из нее нужные поля.
          Ответить
          • Выберет, но не отправит. Отправить одно поле или все - нагрузка на сеть для особо крупных объектов в тысячи раз отличается.
            А сеть, насколько я знаю, самый медленный элемент в цепи HDD/Память/Процессор/Сеть
            Ответить
            • Не стоит путать latency (задержку) и throughput (пропускную способность).

              Один пакет на 10 байт и один пакет на килобайт будут идти примерно одинаково. В общем-то, даже два-три пакета подряд будут идти чуть-чуть дольше, чем только один первый.

              З.Ы. Но если эта ваша платформа вытягивает поля по одному, а не пачкой - тогда да, запрос всего объекта будет лагать как говно.
              Ответить
    • Вызов запросом оптимален.
      Единственное, что нужно было сделать - вызвать стандартную функцию БСП ЗначениеРеквизитаОбъекта, а не лепить свою.
      Ответить

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