Холиварный мегасрач

  1. 10 г. назад

    Как писать правильнее (три варианта) имея ссылку на документ в переменной "ВыбДокумент":

    1.
    Если ВыбДокумент.Склад <> Справочники.Склады.НайтиПоКоду("00005")
    И ВыбДокумент.Склад <> Справочники.Склады.НайтиПоКоду("К0028")
    И ВыбДокумент.Склад <> Справочники.Склады.НайтиПоКоду("00014") Тогда

    2.

    Если СокрЛП(ВыбДокумент.Склад.Код) <> "00005"
    И СокрЛП(ВыбДокумент.Склад.Код) <> "К0028"
    И СокрЛП(ВыбДокумент.Склад.Код) <> "00014" Тогда

    3.

    Если Найти("00005,К0028,00014",СокрЛП(ВыбДокумент.Склад.Код)) = 0 Тогда

    З.Ы.: Понимаю что практической разницы никакой нет, но ссссуко как в анеке с тем профессором и бородой, которую надо ложить на одеяло, или под одеяло.

    Ответы: (17) (50) (59) (60) (61)
  2. ну, если разбираться в сортах гумна, то третий вариант, но в такой модификации:

    Если Найти("\00005\К0028\00014\","\"+СокрЛП(ВыбДокумент.Склад.Код)+"\") = 0 Тогда

    Ответы: (3)
  3. Прям колбасит от такого говнокода ".НайтиПоКоду("00005")".

    Ответы: (6) (27) (32)
  4. (1) месье знает толк

    а можно обрисовать преимущества этого варианта для тех, кто от сохи?

    Ответы: (4)
  5. (3) лишь один раз лезем в объект за значением свойства, а потом работаем чисто со строками (это по сравнению со 2-м вариантом).

    надеюсь, насчёт 1-го варианта пояснять не надо?

    Ответы: (5) (7)
  6. (4) не, это понятно. интересуют тонкие отличия от третьего варианта

    Ответы: (8)
  7. (2) что не так в ".НайтиПоКоду("00005")" ?

    Ответы: (10)
  8. (4) в первом варианте ты тоже не лезешь за значениями свойства

    Ответы: (9)
  9. (5) а-а-а...

    ну, учитывая специфику пользователей 1С, нужно допускать наличие в БД элементов с кодами, например, "010" и "010010"

  10. (7) думаешь, три запроса к БД быстрее?

    Ответы: (11)
  11. (6) В том что в справочник надо добавить реквизит "Свойство" и вывести на форму.
    Потом
    Если ВыбДокумент.Склад.Свойство <> ТребуемоеСвойство тогда
    Все

    Ответы: (14) (28)
  12. 09.06.2014 08:54:55 отредактировано БухиТог

    (9) ну во втором варианте тоже три запроса, правда скорее всего вторые два уже из кеша будут браться
    кстати, колонка "код" проиндексирована в таблице "Справочника"?

    Ответы: (12)
  13. БухиТог ну во втором варианте тоже три запроса

    а вот и нет

  14. код проиндексирован всегда

    Ответы: (16)
  15. (10) жжжошь :-)
    это каждый раз конфу переписывать, чтобы отобрать в коде несколько значений справочника

    Ответы: (15)
  16. 09.06.2014 09:03:50 отредактировано Lenka_Boo

    (14) facepalm

  17. (13) В строке Если ВыбДокумент.Склад <> Справочники.Склады.НайтиПоКоду("00005") у тебя уже два запроса, а не один. Сначала по ссылке на ВыбДокумент ищем ссылку на Склад, Потом по коду ищем ссылку на склад, ссылки сравниваем. 6 запросов на три строки. Во втором варианте на одно сравнение один запрос с унутренным соединением. К таблице документов джойнится таблица справочника. Три запроса на три строки. Третий вариант один такой же запрос на все сравнения, но плохо читается. По производительности заметной разницы никакой, а в таком коде разбираться потом сложнее будет. Так что второй вариант оптимален.

    Ответы: (18) (23)
  18. (0) Во так надо:

    Кот = СокрЛП(ВыбДокумент.Склад.Код);
    Если Кот <> "00005"
    И Кот <> "К0028"
    И Кот <> "00014" Тогда

    Все остальное извращение.

    Ответы: (19) (20) (27) (32) (74)
  19. (16) +1

  20. 09.06.2014 09:12:17 отредактировано БухиТог

    (17) ну это по сути третий вариант, только оперативку тратит на хранение переменной "Кот"
    хотя-а-а, в функции "Найти" наверняка какой-нибудь перебор в цикле скрывается....

    наверное всё таки 17- тзе бест

    Ответы: (21)
  21. admin govnoforuma Все остальное извращение.

    тут все варианты - извращение. конкурс объявлен на лучшее извращение

  22. (19) Оперативки тратит не существенно. Зато экономит процессор на вызове функции "Найти"!

    Ответы: (22) (24)
  23. (21) согласен

  24. (16) сфигаль у тебя три запроса лучше одного? и не надо ля-ля про "одинаковое" время. да, оно может быть неразличимо для человеческого взгляда, но три запроса - это три запроса, а не один

  25. (21) а чем таким, по-твоему, нагружает процессор Найти(), чем не нагружает операция сравнения Кот <> "К0028" ?

    Ответы: (26) (29)
  26. Если Документы.РеализацияТоваровИУслуг.НайтиПоНомеру(ВыбДокумент.Номер).Склад.ПолучитьОбъект().Ссылка.Код <> Справочники.Склады.НайтиПоКоду("00005").ПолучитьОбъект().Ссылка.Код

    Ответы: (28)
  27. (24) хотя-а-а, в функции "Найти" наверняка какой-нибудь перебор в цикле скрывается....

    Ответы: (30)
  28. 09.06.2014 09:16:24 отредактировано Дядя Васька

    (17) Вообще-то еще в семерке были методы-константы. Например если в цикле написать Для Сч = 1 По ТабЗначений.КоличествоСтрок(), это не ошибка, метод КоличествоСтрок() будет вызван один раз, а не при каждой итерации, хотя с виду не скажешь. Скорее всего и набор условий оптимизирует "за кадром", если компилятор видит что в одном Если несколько раз используется один и тот же запрос. То есть реально вариант (2) после компиляции превратится в (17).

    Ответы: (31) (32)
  29. (25) О! Дас ист фантастишь!

    Но Ленка тебя всё равно переплюнула в (10)

    Ответы: (39)
  30. (24) напиши алгоритмы для сравнения и поиска. Увидишь что поиск во столько раз больше команд использует, сколько всего символов в строке.

    Ответы: (34)
  31. (26) то же самое, что и в операции сравнения

  32. Дядя Васька По ТабЗначений.КоличествоСтрок(), это не ошибка, метод КоличествоСтрок() будет вызван один раз, а не при каждой итерации, хотя с виду не скажешь

    с виду скажешь. это даже школьники знают

  33. Дядя Васька Скорее всего и набор условий оптимизирует "за кадром", если компилятор видит что в одном Если несколько раз используется один и тот же запрос. То есть реально вариант (2) после компиляции превратится в (17).

    блажен верующий

    Ответы: (33)
  34. (32) проверять надо...

    Ответы: (35)
  35. (29) чо-чо-чо? это ты на потолке прочитал?

    Ответы: (36)
  36. (33)+ Оптимизация по идее простейшая, было бы странно ее не применить.

  37. (34) Это я тебе предложил чтобы ты понял чем поиск хуже сравнения.

    Ответы: (37)
  38. (36) ничем не хуже. это суть одна и та же операция

    Ответы: (38)
  39. (37) Поиск - это суть операция сравнения, повторяющаяся N раз!

    Ответы: (40)
  40. (28) Значит, когда через неделю-месяц они тебе нарисуют в справочнике еще один такой же склад, ты конфу дописывать не будешь?
    Они тебе "Мамой клянусь - это единственные" сказали?

    Ответы: (42) (48)
  41. 09.06.2014 09:31:23 отредактировано Дядя Васька

    (38) Не совсем так. Сравнение строк это же не сравнение чисел. Посимвольно сравниваются, так что там тоже цикл.

    Ответы: (41)
  42. (40) Сравнение строк - это одна команда процессора.

    CMPS Сравнение строк

    CMPSB Сравнение строк по байтам

    CMPSW Сравнение строк по словам
    Команды предназначены для операций над строками (строкой называется последовательность байтов или слов памяти с любым содержимым). Они сравнивают по одному элементу каждой строки, фактически осуществляя вычитание второго операнда из первого и устанавливая в соответствии с результатом вычитания флаги CF, PF, AF, ZF, SF и OF. Команда cmpsb выполняет сравнение по байтам, команда cmpsw - по словам, а команда cmps может быть использована для сравнения как байтов, так и слов. В последнем случае размер сравниваемых элементов определяется их описанием (с помощью директив db или dw). Первый операнд адресуется через DS:SI, второй - через ES:DI. Таким образом, операцию сравнения можно условно изобразить следующим образом:
    (DS:SI) - (ES:DI) -> флаги процессора
    ...............................................

    Ответы: (45) (46)
  43. (39) А если это внешняя обработка, а конфа базовая вообще? )) Правильней список элементов для сравнения иметь на форме наверное...

    Ответы: (43) (44)
  44. (42) Список элементов лучше хранить в регистре сведений. В типовых конфах есть регистры для хранения всякой непредвиденной фигни.

  45. (42) На форме внешней обработки тогда правильней иметь настройки, где можно задать список исключаемых складов.

  46. (41) то, что это одна команда - не означает, что она будет выполнена за один такт.
    к тому же, не надо забывать, что у нас не 1 операция сравнения vs 1 операция поиска, а N операций сравнения vs 1 операция поиска

    Ответы: (47) (49) (53)
  47. (41) Подозреваю что это все же одна команда ассемблера, а не процессора. Строку в регистр не запихнешь, соответственно идет куча обращений к памяти, чего в один такт никак не сделать. То есть фактически все равно будет цикл: вытащить из памяти пару символов в регистры, сравнить, если равны, вытащить следующие два, и так далее.

  48. (45) опередун )

  49. 09.06.2014 09:58:51 отредактировано БухиТог

    (39) ну я ж фикси, чтобы мне не дописать то ...
    Тем более это обработка для дуболомных кладовщиков. На ней даже кнопок никаких нет, только событие на сканирование штрихкода и большими буками во весь экран "ГОТОВО!", или "ОШИБКА".

    Ответы: (50)
  50. (45) то, что это одна команда - не означает, что она будет выполнена за один такт

    Ччорт! Это же вы про такты процессора?! Фигасе вы глубоко капнули!

    //Продолжаю следить за темой затаив дыхание в благоговейном трепете

    Ответы: (51)
  51. (48) Со складами-то ладно. Помню у клиентов на семерке еще попалась мегахрень с md на двести мегабайт (при норме около 20-ти), разница заключалась в коде вида (0), с помощью которого на тысячи строк кода раздавались права пользователям. Ну то есть как здесь со складами, там со справочником пользователей извращались. 6 долботятлов в поте лица на полной занятости ежедневно добавляли все новые тонны этих наитупейших сравнений. На среднестатистической рабочей станции того времени с 256 МБайт оперативки запустить такую "базу" понятно было уже невозможно - не хватало памяти. Если и добавить, то тормозило понятно жутко. При этом самих данных было даже меньше чем строк в модулях :)

  52. (49) Не только и не столько, больше о том, что сравнение так или иначе происходит побайтово (ну или словами, не суть), все равно это цикл. Если вместо одной этой команды все это руками написать, производительность будет та же, просто намного больше писанины.

    Ответы: (54)
  53. для продолжения дискуссии предлагаю скачать:
    wiki:SoftICE

    Ответы: (55)
  54. (45)Я это все учел. Все равно получается сравнение лучше поиска.

  55. (51) на 1С руками написать, будет почти то же самое что одна команда процессора, только писанины больше, хахаахахахаха ))))))

    Ответы: (57)
  56. (52) Да ну, старье такое...

  57. Если своими словами на рабоче-крестьянском языке:
    Разница алгоритма в том, что когда ищем, то "сканируем" строку до нахождения первого совпадения символа, потом сравниваем последующие символы, если совпали не все символы, то дальше сканируем...
    А сравнение - сразу сравниваем последующие символы, "сканирование" не требуется.

    Ответы: (58) (66)
  58. (54) При чем тут 1С? Я про ассемблер. Операции сравнения строк часть движка, а не на макроязыке написаны.

  59. 09.06.2014 11:20:22 отредактировано Дядя Васька

    (56) не совсем так. Поиск подстроки прекрасно реализуется в один проход. Не надо быть мегаумом чтобы понять как это сделать. Ну не совсем в один, но почти в один. Доходим до первого совпадающего, сравниваем дальше пока совпадают, если один не совпал возвращаемся к следующему после первого совпавшего и уже его сравниваем с первым искомой подстроки. Несколько более сложное сравнение чем двух одинаковых, но количество итераций не намного большее. Теперь учти еще тот момент, что по второму варианту на одинаковость сравниваем трижды, а в последнем на вхождение только один раз. Не смотря на то что количество итераций на поиск подстроки несколько больший, общее число итераций получается меньше.

    Ответы: (68)
  60. (0)через ПХВ и это будет идеально.

  61. (0) Если в конфигурацию можно добавлять объекты, то завести регистр сведений, назвать, например, ИменованныеЗначения, Измерения
    - ИмяЗначения (строка)
    Ресурсы
    - Значение (любая ссылка)
    В менеджере этого регистра, сделать функцию которая культурно будет возвращать значение по имени. Культурно, это значит, что если с таким именем нет то сообщит и вернет, например неопределено, можно еще и исключение вызывать.
    Ну и писать, типа Если ВыбДокумент.Склад<>РегистрыСведенй.ИменованныеЗначения.ПолучитьЗначениеПоИмени("НашСамыйЛюбимыйСклад") Тогда
    ...
    Иначе
    ...
    КонецЕсли

    Конечно же, для приведенного в (0) случая можно реализовать функцию которая проверит, что склад не в списке складов

    Ответы: (62) (64)
  62. (0) Если конфу менять нельзя, можно ссылку получать по UUID, UUID забивать прям в коде. Это весьма некрасиво, но весьма надежно. Но в любом случае, 2 и 3 это чтение объекта, поэтому лучше не получать через точку, а воспользоваться, например, функциями типовых, которые получают значение реквизита, что то типа ОбщегоНазначения.ЗначениеРеквизита(Ссылка,ИмяРеквизита)

    Ответы: (64)
  63. (60) зачем это все если уже есть ПХВ.

    Ответы: (64)
  64. http://infostart.ru/public/275145/
    тут хорошо расписано

  65. 09.06.2014 12:26:54 отредактировано andrewks

    (60)(61)(62) нафига городить огороды, когда есть хранилища настроек? и конфу трогать не надо, и новые сущности плодить. дёшево и сердито

    Ответы: (65) (67)
  66. (64) Давай. Попробуй ты продавить, а то меня уже блондинкой обозначили.

    Ответы: (67)
  67. (56) даже в самом наихудшем варианте кол-во сравнений символов при поиске будет в 2 раза больше (а не в N раз), чем при последовательном сравнении строк

    Ответы: (71)
  68. (64)(65) а подробнее, как при помощи хранилища настроек можно решить подобную задачу, я пока, как то слабо себе представляю.
    З.Ы. А почему топик в культуре? Культура программирования?

    Ответы: (69)
  69. Дядя Васька Не смотря на то что количество итераций на поиск подстроки несколько больший, общее число итераций получается меньше.

    С чего оно меньше то будет?

    Ответы: (76)
  70. (67) на форму обработки вешаешь элементы для изменения списка нужных элементов, и сохраняешь их в хранилище. никаких изменений в конфу при этом вносить не нужно

  71. Куда-то сообщение делось.

  72. (66) Почему N<>2?
    Что если искомый код = "К002"?

    Ответы: (72) (74) (79)
  73. (71) у тебя изначально под N что понималось?

    Ответы: (73)
  74. (72) Число которое я не считал и точно не знаю, поэтому заменил на переменную.

  75. (71) так что поиск отпадает, остается только сравнение (17)

    Ответы: (75)
  76. (74) ну, давай тогда уж ещё посчитаем, сколько интерпретатор 1С будет парсить три (или более) строки кода, а сколько - одну аккуратную и читабельную строчку

  77. (68) согласен, немного больше получается. Но несущественно, не на порядки.

  78. Уже написал же что поиск вообще работать не будет! Вы как читаете, выборочно?

    Ответы: (78)
  79. (77) ась?

    Ответы: (79)
  80. (78) - (71)

или зарегистрируйтесь чтобы ответить!