Тема создана по мотивам https://pro1c.org.ua/topic/kak-v-vyborke-rezultata-zaprosa-sravnit-znachenievalyutadokumenta-54891/ темы.
Итак, есть задача: нужно определить, что валюта в документе - доллар. Было предложено пару вариантов:
1. Если ВалютаДокумента = справочники.Валюты.НайтиПоКоду(КодДоллара) Тогда
2. Если ВалютаДокумента.Код = КодДоллара Тогда
Так же было высказано мнение, что подобные конструкции - это ковнокод. Тема, на мой взгляд, довольно интересная и можно было бы поговорить на эту тему.
Как вы считаете:
1. Говнокод ли это?
2. Говнокод ли это конкретно в такой задаче?
Настоятельная просьба при обсуждении не переходить на личности!
Я проголосовал за вариант "Оба варианта нормально". Соглашусь с комментарием из темы источника, что код валюты это достаточно стабильный показатель, на который можно ссылаться в большинстве случаев. Но если бы я писал какое-то тиражируемое решение, то так, возможно, не сделал бы. Но в обычных внутренних системах, считаю, что это вполне допустимо. Раньше на каждый подобный чих я всегда заводил константы, потому что везде написано, что делать так плохо и надо это выносить в константы. То, что в идеале так должно быть, тут я не спорю. Но мы работаем не в идеальных условиях и когда список констант переваливает за пару сотен и ты начинаешь добавлять дублирующие константы, потому что уже не в состоянии проинспектировать все, начинаешь писать НайтиПоКоду и прочее
всегда смотрю по ситуации.
Можно писать красиво, если за это платят
если платят только за то, чтобы работало, и такое в конфе сплошь и рядом, хай буде
Оба варианта имеют право на жизнь. Т. к. на мой взгляд поиск по коду оптимально решает поставленную задачу.
В общем и целом следует избегать обоих конструкций.
Что касается первого варианта, то, во-первых, реквизит "Код" - совсем не гарантия уникальности. А во-вторых, сам элемент валюты с таким значением реквизита "Код" может быть хоть и уникальным, но не актуальным, например, помечен на удаление (а самой проверки на пометку в этом коде нет).
Что касается второго варианта, то если исходить из того, что для документа все проверки пройдены, и учитывать тот факт, что значение реквизита "Код" - стандартизированное значение из международного классификатора валют, то можно считать его приемлемым.
Вполне корректное решение и №1 и №2. Но вопрос в том что если база упр, то возможно что код валюты им побоку. Я бы просто в спр. Валюты создал предопределенные для основных валют - usd eur uah. Тогда проверка организовывается без проблем. Ну а если конфа например какой то фин. группы, где валют десятки ))) ? Ну тогда все по старому - мВалютаУправленческогоУчета ))))))))))))))))). Да и вообще сейчас идет тенденция все завязывать на БСП.
Как по одной строчке, без контекста, можно понять говнокод это или нет?
Все упирается в то, что такое КодДоллара и где / как оно определяется и самое главное для чего?
В контексте этого, проверки на доллар а потом умножения на 24, СуммаС = Выборка.СуммаДокумента * 24 является плохим стилем программирования.
Нет строго понятия, что такое гавнокод, но есть множество книг на тему хорошего кода (Например "Чистый код" Роберта Мартина).
Представим, что, через некоторое время у клиента появся расчетные счета не только в долларах, но и в Евро, а еще через некоторое время в Юанях.
Считаете ли Вы, что корректна будет проверка:
Если Выборка.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду(КодДоллара) Тогда
СуммаС = Выборка.СуммаДокумента * 24;
ИначеЕсли Выборка.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду(КодЕвро) Тогда
СуммаС = Выборка.СуммаДокумента * 31;
ИначеЕсли Выборка.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду(КодЮаня) Тогда
СуммаС = Выборка.СуммаДокумента * 3.5;
Иначе
//...
КонецЕсли;
Если Выборка.ВалютаДокумента.Код = КодДоллара Тогда
СуммаС = Выборка.СуммаДокумента * 24;
ИначеЕсли Выборка.ВалютаДокумента.Код = КодЕвро Тогда
СуммаС = Выборка.СуммаДокумента * 31;
ИначеЕсли Выборка.ВалютаДокумента.Код = КодЮаня Тогда
СуммаС = Выборка.СуммаДокумента * 3.5;
Иначе
//...
КонецЕсли;
TipsyKID, в исходной теме спор возник, как я понял, на тему того как определить валюту. Вот цитата из вашего сообщения:
Если Выборка.ВалютаДокумента = справочники.Валюты.НайтиПоКоду(КодДоллара) Тогда
давайте отвлечемся от конкретной конфигурации и предположим, что это код из внешней печатной формы для НЕИЗМЕНЕННОЙ конфигурации.
п.с. По "чистому коду" - программер на С++ весь 1С-кий код назвал бы "Овном" - потому, что нигде объект принудительно не разрушается, а рассчитывать на "уборщик" - плохой стиль (да и опасно)
С точки зрения программиста С++ тут вообще не о чем говорить. Язык 1с - ни разу не ООП, и мнение программиста С++ будет как минимум необъективным.
Но, кроме общепринятых правил (универсальных для большинства языков), есть "официальные" рекомендации, например, т. н. "Система стандартов и методик разработки конфигураций для платформы 1С"...
TipsyKID @ Today, 12:42
,
Магические константы - однозначно говнокод. Но в данной теме, как я понимаю, не об этом...
Мне не нравятся оба варианта.
Первый тем, что для каждой строки выборки будет осуществляться поиск по справочнику.
Если вынести поиск ЗА цикл обхода выборки, то такое решение вполне нормально.
Ссылка сравнивается со ссылкой, все хорошо.
(если в запросе гарантировано одна строка, например потому что выборка определена как ПЕРВЫЕ 1, то этот вариант подходит и в таком виде).
Второй вариант плох тем, что идет обращение к реквизиту переменной ссылочного типа через точку. Что порождает лишний запрос к базе (опять же в цикле).
Его следовало бы переделать и еще в запросе выбрать что-то типа: "Валюты.Код КАК КодВалюты" и уже в условии сравнивать его с кодом доллара.
В общем же бизнес-смысле код валюты достаточно константное значение, чтобы на него опираться, конечно, при условии что используются общепринятые международные коды.
zfilin, суть темы/опроса: приемлемо ли найти валюту таким образом. То есть вопросы поиска в цикле немного за рамками данного обсуждения.
ПС. убрал слово Выборка в вариантах, что бы не смущало.
Проголосовал за второй вариант, поскольку он отработает как на сервере, так и на клиенте(любом), а второй вариант уместен только для сервера и толстого клиента.
Оба варианта норм.
В частности для валюты код является уникальным не в рамках 1С, а по классификатору, который можно считать константой.
Для самописных баз или где пользователи совсем безответственные это накладывает ряд рисков что код валюты доллар будет не 840.
Так что норм использовать код валюты в качестве локальной переменной или константы в процедуре/форме/объекте.
Сам натыкался на базы с 300+ добавленными константами, назначение 80% из которых никто не помнит
Vofka @ Сегодня, 14:52
,
А. Ну тогда пофигу. Оба варианта норм, но второй мне нравится больше.
stark @ Сегодня, 15:47
,
Жуть.
Кто-нибудь воткнет этот справочник в запрос рано или поздно и начнется...
Я бы избегал использования составных типов в случаях, когда их можно не использовать.
stark @ Сегодня, 15:47
,
пробовали, суть не меняется - куча предопределенных элементов, назначение которых становится загадочным через какое-то время
fly, что первый, что второй вариант - это запрос, который ищет элемент справочника по коду.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua