Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Говнокод или нет? 2 страниц V   1 2 >          
Это говнокод в контексте конкретной описанной задачи?
Просьба помимо голосования отписать свой ответ и высказать мнение почему именно так считаете
1 говнокод, 2 нормально [ 2 ] ** [13,33%]
2 говнокод, 1 нормально [ 1 ] ** [6,67%]
Оба варианта говнокод [ 3 ] ** [20,00%]
Оба варианта нормально [ 9 ] ** [60,00%]
Всего голосов: 15
Гости не могут голосовать 
Vofka Подменю пользователя
сообщение 30.10.19, 9:49
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Тема создана по мотивам этой темы.

Итак, есть задача: нужно определить, что валюта в документе - доллар. Было предложено пару вариантов:

1. Если ВалютаДокумента = справочники.Валюты.НайтиПоКоду(КодДоллара) Тогда
2. Если ВалютаДокумента.Код = КодДоллара Тогда

Так же было высказано мнение, что подобные конструкции - это ковнокод. Тема, на мой взгляд, довольно интересная и можно было бы поговорить на эту тему.
Как вы считаете:
1. Говнокод ли это?
2. Говнокод ли это конкретно в такой задаче?

Настоятельная просьба при обсуждении не переходить на личности!

Я проголосовал за вариант "Оба варианта нормально". Соглашусь с комментарием из темы источника, что код валюты это достаточно стабильный показатель, на который можно ссылаться в большинстве случаев. Но если бы я писал какое-то тиражируемое решение, то так, возможно, не сделал бы. Но в обычных внутренних системах, считаю, что это вполне допустимо. Раньше на каждый подобный чих я всегда заводил константы, потому что везде написано, что делать так плохо и надо это выносить в константы. То, что в идеале так должно быть, тут я не спорю. Но мы работаем не в идеальных условиях и когда список констант переваливает за пару сотен и ты начинаешь добавлять дублирующие константы, потому что уже не в состоянии проинспектировать все, начинаешь писать НайтиПоКоду и прочее crazy.gif

Сообщение отредактировал Vofka - 30.10.19, 14:53

nik389 Подменю пользователя
сообщение 30.10.19, 9:54
Сообщение #2

Завсегдатай
****
Группа: Пользователи
Сообщений: 153
Из: Украина
Спасибо сказали: 37 раз
Рейтинг: 34

всегда смотрю по ситуации.
Можно писать красиво, если за это платят
если платят только за то, чтобы работало, и такое в конфе сплошь и рядом, хай буде

denis84 Подменю пользователя
сообщение 30.10.19, 10:50
Сообщение #3

Оратор
Иконка группы
Группа: Местный
Сообщений: 421
Из: Украина
Спасибо сказали: 133 раз
Рейтинг: 132.5

Оба варианта имеют право на жизнь. Т. к. на мой взгляд поиск по коду оптимально решает поставленную задачу.

Petre Подменю пользователя
сообщение 30.10.19, 11:16
Сообщение #4

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

В общем и целом следует избегать обоих конструкций.

Что касается первого варианта, то, во-первых, реквизит "Код" - совсем не гарантия уникальности. А во-вторых, сам элемент валюты с таким значением реквизита "Код" может быть хоть и уникальным, но не актуальным, например, помечен на удаление (а самой проверки на пометку в этом коде нет).

Что касается второго варианта, то если исходить из того, что для документа все проверки пройдены, и учитывать тот факт, что значение реквизита "Код" - стандартизированное значение из международного классификатора валют, то можно считать его приемлемым.


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

onsamuy Подменю пользователя
сообщение 30.10.19, 11:29
Сообщение #5

Оратор
Иконка группы
Группа: Местный
Сообщений: 264
Спасибо сказали: 69 раз
Рейтинг: 0

Вполне корректное решение и №1 и №2. Но вопрос в том что если база упр, то возможно что код валюты им побоку. Я бы просто в спр. Валюты создал предопределенные для основных валют - usd eur uah. Тогда проверка организовывается без проблем. Ну а если конфа например какой то фин. группы, где валют десятки smile.gif))) ? Ну тогда все по старому - мВалютаУправленческогоУчета smile.gif))))))))))))))))). Да и вообще сейчас идет тенденция все завязывать на БСП.

TipsyKID Подменю пользователя
сообщение 30.10.19, 12:42
Сообщение #6

Оратор
Иконка группы
Группа: Местный
Сообщений: 413
Из: Киев
Спасибо сказали: 161 раз
Рейтинг: 0

Как по одной строчке, без контекста, можно понять говнокод это или нет?

Все упирается в то, что такое КодДоллара и где / как оно определяется и самое главное для чего?
В контексте этого, проверки на доллар а потом умножения на 24, СуммаС = Выборка.СуммаДокумента * 24 является плохим стилем программирования.

Нет строго понятия, что такое гавнокод, но есть множество книг на тему хорошего кода (Например "Чистый код" Роберта Мартина).

Представим, что, через некоторое время у клиента появся расчетные счета не только в долларах, но и в Евро, а еще через некоторое время в Юанях.

Считаете ли Вы, что корректна будет проверка:

Если Выборка.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду(КодДоллара) Тогда
     СуммаС = Выборка.СуммаДокумента * 24;
ИначеЕсли Выборка.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду(КодЕвро) Тогда
     СуммаС = Выборка.СуммаДокумента * 31;
ИначеЕсли Выборка.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду(КодЮаня) Тогда
     СуммаС = Выборка.СуммаДокумента * 3.5;
Иначе
  //...
КонецЕсли;

ИЛИ
Если Выборка.ВалютаДокумента.Код = КодДоллара Тогда
     СуммаС = Выборка.СуммаДокумента * 24;
ИначеЕсли Выборка.ВалютаДокумента.Код = КодЕвро Тогда
     СуммаС = Выборка.СуммаДокумента * 31;
ИначеЕсли Выборка.ВалютаДокумента.Код = КодЮаня Тогда
     СуммаС = Выборка.СуммаДокумента * 3.5;
Иначе
  //...
КонецЕсли;


Лично для меня, вопрос стоит именно так.

Сообщение отредактировал TipsyKID - 30.10.19, 12:44


Signature
Специалист : Технологическая платформа 8.х, Бухгалтерия для Украины, Управление торговлей для Украины, Зарплата и Управление Персоналом для Украины

Vofka Подменю пользователя
сообщение 30.10.19, 13:36
Сообщение #7

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

TipsyKID, в исходной теме спор возник, как я понял, на тему того как определить валюту. Вот цитата из вашего сообщения:
Цитата(TipsyKID)
То, что Вы посоветовали, начинающему программисту :
Если Выборка.ВалютаДокумента = справочники.Валюты.НайтиПоКоду(КодДоллара) Тогда

Похоже на говнокод, если, конечно, "КодДоллара" не является настройкой информационной базы, но тогда лучше сразу определить параметр с типом СправочникСсылка.Валюты.

То о чем вы говорите сейчас - это правильные вещи, но вы предлагаете поменять вариант решения задачи. Но если задача звучит именно так, как звучит, то делать её надо исходя из этого: мы же даже не знаем есть ли в системе регистр курсов валют, заполняется ли он нормально и вовремя и куча других нюансов.

sava1 Подменю пользователя
сообщение 30.10.19, 13:43
Сообщение #8

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

давайте отвлечемся от конкретной конфигурации и предположим, что это код из внешней печатной формы для НЕИЗМЕНЕННОЙ конфигурации.

п.с. По "чистому коду" - программер на С++ весь 1С-кий код назвал бы "Овном" - потому, что нигде объект принудительно не разрушается, а рассчитывать на "уборщик" - плохой стиль (да и опасно)

Vofka Подменю пользователя
сообщение 30.10.19, 14:08
Сообщение #9

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Цитата(sava1 @ 30.10.19, 13:43) *
п.с. По "чистому коду" - программер на С++ весь 1С-кий код назвал бы "Овном" - потому, что нигде объект принудительно не разрушается, а рассчитывать на "уборщик" - плохой стиль (да и опасно)

Программера на C++, который не читал не одной книги по 1С, но полез туда что-то править - надо подсрачниками от конфигуратора отгонять. То же справедливо и по отношению к "чистому" 1С-нику, который ничего не читал по C++, но говорит о том какое это говно.

Сообщение отредактировал Vofka - 30.10.19, 14:09

Petre Подменю пользователя
сообщение 30.10.19, 14:19
Сообщение #10

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

С точки зрения программиста С++ тут вообще не о чем говорить. Язык 1с - ни разу не ООП, и мнение программиста С++ будет как минимум необъективным.
Но, кроме общепринятых правил (универсальных для большинства языков), есть "официальные" рекомендации, например, т. н. "Система стандартов и методик разработки конфигураций для платформы 1С"...

TipsyKID @ Today, 12:42 * ,
Магические константы - однозначно говнокод. Но в данной теме, как я понимаю, не об этом...


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

zfilin Подменю пользователя
сообщение 30.10.19, 14:30
Сообщение #11

Говорящий
Иконка группы
Группа: Местный
Сообщений: 51
Спасибо сказали: 13 раз
Рейтинг: 0

Мне не нравятся оба варианта.

Первый тем, что для каждой строки выборки будет осуществляться поиск по справочнику.
Если вынести поиск ЗА цикл обхода выборки, то такое решение вполне нормально.
Ссылка сравнивается со ссылкой, все хорошо.
(если в запросе гарантировано одна строка, например потому что выборка определена как ПЕРВЫЕ 1, то этот вариант подходит и в таком виде).

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

В общем же бизнес-смысле код валюты достаточно константное значение, чтобы на него опираться, конечно, при условии что используются общепринятые международные коды.

Спасибо сказали: stark,

Vofka Подменю пользователя
сообщение 30.10.19, 14:52
Сообщение #12

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

zfilin, суть темы/опроса: приемлемо ли найти валюту таким образом. То есть вопросы поиска в цикле немного за рамками данного обсуждения.

ПС. убрал слово Выборка в вариантах, что бы не смущало.

Сообщение отредактировал Vofka - 30.10.19, 14:53

pablo Подменю пользователя
сообщение 30.10.19, 14:55
Сообщение #13

Старейшина
********
Группа: Команда (модераторы)
Сообщений: 1116
Из: Одесса-Луганск
Спасибо сказали: 192 раз
Рейтинг: 0

Проголосовал за второй вариант, поскольку он отработает как на сервере, так и на клиенте(любом), а второй вариант уместен только для сервера и толстого клиента.


Signature
Правильно поставленный вопрос содержит до 90% ответа.

Макс1С Подменю пользователя
сообщение 30.10.19, 15:23
Сообщение #14

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 189
Из: Днепр
Спасибо сказали: 62 раз
Рейтинг: 58.6

Оба варианта норм.
В частности для валюты код является уникальным не в рамках 1С, а по классификатору, который можно считать константой.
Для самописных баз или где пользователи совсем безответственные это накладывает ряд рисков что код валюты доллар будет не 840.
Так что норм использовать код валюты в качестве локальной переменной или константы в процедуре/форме/объекте.
Сам натыкался на базы с 300+ добавленными константами, назначение 80% из которых никто не помнит

stark Подменю пользователя
сообщение 30.10.19, 15:47
Сообщение #15

Говорящий
***
Группа: Пользователи
Сообщений: 58
Из: Киев
Спасибо сказали: 7 раз
Рейтинг: 0

Цитата(Макс1С @ 30.10.19, 16:23) *
Сам натыкался на базы с 300+ добавленными константами, назначение 80% из которых никто не помнит

Как вариант справочник с реквизитом типа: ЛюбаяСсылка, Булево, Строка. В нем предопределенные элементы.

zfilin Подменю пользователя
сообщение 30.10.19, 16:10
Сообщение #16

Говорящий
Иконка группы
Группа: Местный
Сообщений: 51
Спасибо сказали: 13 раз
Рейтинг: 0

Vofka @ Сегодня, 14:52 * ,
А. Ну тогда пофигу. Оба варианта норм, но второй мне нравится больше.

stark @ Сегодня, 15:47 * ,
Жуть.
Кто-нибудь воткнет этот справочник в запрос рано или поздно и начнется...
Я бы избегал использования составных типов в случаях, когда их можно не использовать.

Макс1С Подменю пользователя
сообщение 30.10.19, 16:23
Сообщение #17

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 189
Из: Днепр
Спасибо сказали: 62 раз
Рейтинг: 58.6

stark @ Сегодня, 15:47 * ,
пробовали, суть не меняется - куча предопределенных элементов, назначение которых становится загадочным через какое-то время

TipsyKID Подменю пользователя
сообщение 30.10.19, 16:52
Сообщение #18

Оратор
Иконка группы
Группа: Местный
Сообщений: 413
Из: Киев
Спасибо сказали: 161 раз
Рейтинг: 0

Цитата(Vofka @ 30.10.19, 14:36) *
в исходной теме спор возник, как я понял, на тему того как определить валюту


Совершенно не так, спор возник, т.к. этой проверки вообще не надо делать, о чем я и писал.
И критика была не о способе проверки, а о том, что не нужна проверка на конкретную валюту.
Советы решали проблему локально, помогая реализовать костыль.

Цитата(Vofka @ 30.10.19, 14:36) *
мы же даже не знаем есть ли в системе регистр курсов валют


Если нет, правильный совет - добавьте, а не давайте забивать курсы валют в печатной форме.
Но по запросу очень похоже на типовую конфигурацию.

Сообщение отредактировал TipsyKID - 30.10.19, 16:57


Signature
Специалист : Технологическая платформа 8.х, Бухгалтерия для Украины, Управление торговлей для Украины, Зарплата и Управление Персоналом для Украины

fly Подменю пользователя
сообщение 31.10.19, 11:31
Сообщение #19

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 234
Спасибо сказали: 51 раз
Рейтинг: 48

Цитата(Vofka @ 30.10.19, 10:49) *
Итак, есть задача: нужно определить, что валюта в документе - доллар. Было предложено пару вариантов:

1. Если ВалютаДокумента = справочники.Валюты.НайтиПоКоду(КодДоллара) Тогда
2. Если ВалютаДокумента.Код = КодДоллара Тогда


в первом варианте происходит поиск по всему справочнику, и понятно - что валюты чаще всего небольшой справочник - и поиск происходит быстро.
если применять для справочников Номеклатура, или Контрагенты - где может 10-15-20 тыс. то уже производительность может снижаться.

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

во втором варианте непосредственно проверяется "свойство элемента" (если правильно называю), то нет обращения к серверу и перелистать весь справочник, и найти и потом сравнить + выполнение будет где угодно работать, потому как уже получена при открытии вероятнее всего валюта.

fly @ Сегодня, 12:19 * ,
как по мне, 2й вариант с точки зрения обращения к серверу, и места использования все же предпочтительней.

Petre Подменю пользователя
сообщение 31.10.19, 11:32
Сообщение #20

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

QUOTE (fly @ 31.10.19, 11:19) *
во втором варианте непосредственно проверяется "свойство элемента" (если правильно называю), то нет обращения к серверу и перелистать весь справочник, и найти и потом сравнить + выполнение будет где угодно работать, потому как уже получена при открытии вероятнее всего валюта.

Обращение к объекту через точку - это, во-первых, сервер, во-вторых, запрос (с небольшой оптимизацией в виде кеширования свойств объекта после первого обращения).


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

Спасибо сказали: fly,

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


2 страниц V   1 2 >
Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 13:13
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!