|
Ваши любимые костыли в конфигурациях 1С | ☑ | ||
---|---|---|---|---|
0
hi1C
09.12.19
✎
09:35
|
Добрый день коллеги! Не секрет, что костыли исправляющие поведение платформы проникли даже в БСП, см. ОбщегоНазначения.ЗначенияРеквизитовОбъекта. Поделитесь своими "любимыми" костылями.
|
|||
1
2S
09.12.19
✎
09:35
|
хорошая попытка, 1С
|
|||
2
Maniac
09.12.19
✎
09:36
|
в 1С нет костылей. Все заипись!
|
|||
3
hi1C
09.12.19
✎
09:41
|
(1) но нет? найдется любимый костылик?
|
|||
4
sqr4
09.12.19
✎
09:42
|
(0) Лень разбираться а что там не так?
|
|||
5
Maniac
09.12.19
✎
09:42
|
(3) а тебе зачем сбор информации? нахаляву что то хочешь разведать?
|
|||
6
2S
09.12.19
✎
09:42
|
(3) пока все хорошо
|
|||
7
ptiz
09.12.19
✎
09:42
|
ping для реализации паузы. Слабо им сделать оператор отдельный для этого.
|
|||
8
Maniac
09.12.19
✎
09:43
|
Мои любимые костыли я никому не скажу. еще чо не хватало чтобы кто то на этом бабки рубил.
Могу продать знания за несколько миллионов долларов. |
|||
9
2S
09.12.19
✎
09:43
|
(7) о, точно. Не хватает таймера. Приходится свою библиотеку совать
|
|||
10
hi1C
09.12.19
✎
09:43
|
(7) о, да
|
|||
11
hi1C
09.12.19
✎
09:46
|
(4) этот метод исправляет поведение платформы, когда мы, получая значение реквизита через точку, тащим все данные объекта из БД
|
|||
12
hi1C
09.12.19
✎
09:50
|
(8) а нелюбимыми поделишься?
|
|||
13
Ботаник Гарден Меран
09.12.19
✎
10:05
|
||||
14
hi1C
09.12.19
✎
10:06
|
(13) ну костыль же
|
|||
15
hi1C
09.12.19
✎
10:07
|
(13) и да, это не пауза
|
|||
16
ДенисЧ
09.12.19
✎
10:08
|
(11) А почему ты считаешь, что это ошибка?
|
|||
17
hi1C
09.12.19
✎
10:10
|
(16) потому что мне нужно значение одного реквизита, не нужно додумывать за меня, что мне понадобится что-то еще
|
|||
18
Maniac
09.12.19
✎
10:10
|
(12) поделюсь. не нравится что 1С слишком много делает. Лучше бы типовые были недоразвитыми вечно.
|
|||
19
hi1C
09.12.19
✎
10:11
|
(18) гхм, к платформе это какое отношение имеет?
|
|||
20
Xapac
09.12.19
✎
10:15
|
(17)не убедил
|
|||
21
Maniac
09.12.19
✎
10:15
|
Ты с утра не проснулся? Теме отчетливо вижу слово - конфигурациях.
|
|||
22
hi1C
09.12.19
✎
10:16
|
(21) ок, хорошо что ты проснулся
|
|||
23
ДенисЧ
09.12.19
✎
10:16
|
(17) А чтобы получить реквизит - по-любому нужно поиметь объект.
|
|||
24
hi1C
09.12.19
✎
10:16
|
(20) и не собирался
|
|||
25
hi1C
09.12.19
✎
10:16
|
(23) но почему?
|
|||
26
sqr4
09.12.19
✎
10:16
|
(20) а почему не убедил? Ведь логично, что если я пишу Дата = Ссылка.Дата, то мне нужна именно дата, зачем тянуть еще и содержимое табличных частей?
|
|||
27
Xapac
09.12.19
✎
10:20
|
(26)Ты прочитал дата, логично что тебе что то еще понадобиться. (таких ситуаций больше)
Если ты меняешь поведение "точки" то тебе за каждым реквизитом нудно бегать запросом, тут одним тебе все принесли. И все равно "ЗначенияРеквизитовОбъекта" - прийдется делать, потому что для получать НЕСКОЛЬКО реквизитов выгодней именно так. |
|||
28
ДенисЧ
09.12.19
✎
10:21
|
(26) А табличные части, ЕМНИП, и не тянутся...
|
|||
29
ДенисЧ
09.12.19
✎
10:21
|
(25) По определению.
|
|||
30
hi1C
09.12.19
✎
10:22
|
(29) спасибо, ваше мнение очень важно для нас
|
|||
31
ДенисЧ
09.12.19
✎
10:23
|
(30) Ваше ещё более важно. Так что не стесняйтесь. Проходите. Мимо.
|
|||
32
hi1C
09.12.19
✎
10:24
|
(28) весь объект читается
|
|||
33
Radkt
09.12.19
✎
10:24
|
"Однако запрос будет выполнять считывание из базы данных при каждом вызове. Соответственно, при многократном обращении к одним и тем же данным будет выполняться многократное считывание. Этого можно избежать, обращаясь к свойствам ссылки. В этом случае используется кэширование объектов и в определенном интервале времени при повторном обращении к данным объекта не будет выполняться повторное считывание. Но следует учитывать, что обращение к любому полю через ссылку приведет к полному считыванию объекта (включая все поля и все табличные части). Соответственно, ссылку можно использовать для многократного обращения, если считывание объекта целиком не может его существенно замедлить. Например, получение признака "Проведен" у документа через ссылку приведет к считыванию в том числе и его табличной части. Если у документа табличная часть может иметь несколько сотен строк, то лучше воспользоваться запросом. "
|
|||
34
Radkt
09.12.19
✎
10:24
|
(33) отсюда https://its.1c.eu/db/metod8dev#content:2717:hdoc
|
|||
35
Radkt
09.12.19
✎
10:25
|
(31) ТЧ тянуться
|
|||
36
sqr4
09.12.19
✎
10:26
|
(27) ну отсюда следует, что с точки зрения быстродействия, обращение через точку использовать всегда медленнее. Т.е всегда надо юзать запрос и понимать какие данные тянуть.
|
|||
37
sqr4
09.12.19
✎
10:28
|
Ну вроде как это уже обсуждали, правда в рамках другой ветки)
|
|||
38
ДенисЧ
09.12.19
✎
10:30
|
(35) Значит, я ошибался.
|
|||
39
hi1C
09.12.19
✎
10:30
|
(36) предложу еще один костыль, не знаю есть ли в БСП он, в инструментах разработчика есть, БыстрыйМассивЛкс - тут разработчик костылит косяк платформы - кривой конструктор массивов
|
|||
40
hi1C
09.12.19
✎
10:36
|
(31) Забыл нахамить в ответ. Исправляюсь. Не говори мне что делать и я не скажу куда тебе идти.
|
|||
41
sqr4
09.12.19
✎
10:38
|
(39) А можешь привести тут пример, не охота искать)
|
|||
42
hi1C
09.12.19
✎
10:38
|
(41) конечно
Функция БыстрыйМассивЛкс( п1 = Неопределено, п2 = Неопределено, п3 = Неопределено, п4 = Неопределено, п5 = Неопределено, п6 = Неопределено, п7 = Неопределено, п8 = Неопределено, п9 = Неопределено, п10= Неопределено, п11= Неопределено, п12= Неопределено, п13= Неопределено, п14= Неопределено, п15= Неопределено, п16= Неопределено, п17= Неопределено, п18= Неопределено, п19= Неопределено, п20= Неопределено ) Экспорт Перем М; М = Новый Массив(); Если п1 = Неопределено Тогда Возврат М; Иначе М.Добавить(п1 ); КонецЕсли; Если п2 = Неопределено Тогда Возврат М; Иначе М.Добавить(п2 ); КонецЕсли; Если п3 = Неопределено Тогда Возврат М; Иначе М.Добавить(п3 ); КонецЕсли; Если п4 = Неопределено Тогда Возврат М; Иначе М.Добавить(п4 ); КонецЕсли; Если п5 = Неопределено Тогда Возврат М; Иначе М.Добавить(п5 ); КонецЕсли; Если п6 = Неопределено Тогда Возврат М; Иначе М.Добавить(п6 ); КонецЕсли; Если п7 = Неопределено Тогда Возврат М; Иначе М.Добавить(п7 ); КонецЕсли; Если п8 = Неопределено Тогда Возврат М; Иначе М.Добавить(п8 ); КонецЕсли; Если п9 = Неопределено Тогда Возврат М; Иначе М.Добавить(п9 ); КонецЕсли; Если п10= Неопределено Тогда Возврат М; Иначе М.Добавить(п10); КонецЕсли; Если п11= Неопределено Тогда Возврат М; Иначе М.Добавить(п11); КонецЕсли; Если п12= Неопределено Тогда Возврат М; Иначе М.Добавить(п12); КонецЕсли; Если п13= Неопределено Тогда Возврат М; Иначе М.Добавить(п13); КонецЕсли; Если п14= Неопределено Тогда Возврат М; Иначе М.Добавить(п14); КонецЕсли; Если п15= Неопределено Тогда Возврат М; Иначе М.Добавить(п15); КонецЕсли; Если п16= Неопределено Тогда Возврат М; Иначе М.Добавить(п16); КонецЕсли; Если п17= Неопределено Тогда Возврат М; Иначе М.Добавить(п17); КонецЕсли; Если п18= Неопределено Тогда Возврат М; Иначе М.Добавить(п18); КонецЕсли; Если п19= Неопределено Тогда Возврат М; Иначе М.Добавить(п19); КонецЕсли; Если п20= Неопределено Тогда Возврат М; Иначе М.Добавить(п20); КонецЕсли; Возврат М; КонецФункции |
|||
43
pechkin
09.12.19
✎
10:42
|
(42) в 1с редко когда юзаются массивы простых типов.
а для сложных писать в 1 строку все - моветон |
|||
44
hi1C
09.12.19
✎
10:45
|
(43) редко - часто это всё субъективно, например в моем коде часто используются массивы
|
|||
45
pechkin
09.12.19
✎
10:47
|
(44) можно пример
|
|||
46
unenu
09.12.19
✎
10:52
|
ниче больше в голову не приходит - высосали какую-то чушь и все сдулись?
похоже на тайное собрание "Меча и Орала", где скучающие пенсионеры выпивают и ищут причины выпить еще) |
|||
47
hi1C
09.12.19
✎
10:53
|
(45) конечно, Новый ОписаниеТипов(БыстрыйМассивЛкс(Тип("СправочникСсылка.Номенклатура"),Тип("Строка")))
|
|||
48
FormatC
09.12.19
✎
10:53
|
(0) вы там в 1с между отделами не общаетесь? ))
|
|||
49
hi1C
09.12.19
✎
10:54
|
(46) ты забыл похмелится - зашел на Мисту?
|
|||
50
hi1C
09.12.19
✎
10:54
|
(48) я не работаю в 1С, там мало платят :)
|
|||
51
FormatC
09.12.19
✎
10:54
|
))))
|
|||
52
unenu
09.12.19
✎
10:56
|
(47) 1С не Лисп, принцип "каждой твари по паре" работаем и в IT.
скрещиваете ежа и ужа - это не протезирование. |
|||
53
hi1C
09.12.19
✎
10:58
|
(52) да, блин, я не знаю что ты куришь, я сейчас на работе, домой приду, выпью коньяку, попробую понять что ты написал
|
|||
54
pechkin
09.12.19
✎
10:59
|
(53) слишком много скобочек в твоем примере
|
|||
55
hi1C
09.12.19
✎
11:00
|
(54) не мы такие, язык такой
|
|||
56
Конструктор1С
09.12.19
✎
11:00
|
(17)(26) типичный код, встречающийся везде и всюду:
ИНН = Организация.ИНН; КПП = Организация.КПП; Наименование = Организация.НаименованиеПолное Почему вы думаете, что было бы лучше, если бы вместо одного запроса к БД выполнялось бы несколько запросов? |
|||
57
hi1C
09.12.19
✎
11:02
|
(56) отличный пример, спасибо
если бы разработчики 1С немного подумали это выглядело бы так: РквизитыОрганизации = Организация.ПолучитьРеквизиты("ИНН,КПП,НаименованиеПолное"); и не нужна была бы ОбщегоНазначения.ЗначенияРеквизитовОбъекта |
|||
58
sqr4
09.12.19
✎
11:04
|
(56) я не считаю что так было бы быстрее. Я считаю что быстрее получить эти реквизиты запросом и использовать дальше, а не тянуть из ссылки.
|
|||
59
hi1C
09.12.19
✎
11:04
|
прямо сейчас наткнулся на УникальныйИдентификатор и отсутствие в платформе методов проверки уида на валидность, чтобы УникальныйИдентификатор не падал
|
|||
60
ДенисЧ
09.12.19
✎
11:04
|
(57) "если бы разработчики 1С немного подумали это выглядело бы так: "
Вот они и подумали. Что тебе не нравится? |
|||
61
Конструктор1С
09.12.19
✎
11:05
|
(42) тут разработчик костылит нечто вроде полиморфизма. Только слабо представляю себе ситуацию, конда такое может пригодиться. Многие коллекции прекрасно выдают массив
|
|||
62
hi1C
09.12.19
✎
11:07
|
(61) в (47) я привел пример
|
|||
63
pechkin
09.12.19
✎
11:08
|
мне кажется это переодетый фузиновец )))
|
|||
64
hi1C
09.12.19
✎
11:08
|
(60) ну я не написал, что не нравится, не приписывай мне то что я не писал
|
|||
65
ДенисЧ
09.12.19
✎
11:09
|
(64) см (40)
|
|||
66
hi1C
09.12.19
✎
11:11
|
(65) мое отношение к тебе и мое отношение к платформе 1С разное
|
|||
67
Конструктор1С
09.12.19
✎
11:11
|
(57) ты предлагаешь тот же самый бспшный метод, только вид сбоку
|
|||
68
Xapac
09.12.19
✎
11:13
|
(57)а в чем разница?
|
|||
69
hi1C
09.12.19
✎
11:13
|
(67) да, было бы не плохо, если бы такой методы был у ссылки
|
|||
70
Конструктор1С
09.12.19
✎
11:13
|
(62) очччень сомнительное применение, читабельность кода гробится напрочь
|
|||
71
hi1C
09.12.19
✎
11:14
|
(68) это был бы метод платформы и вообще это только один из примеров
|
|||
72
sqr4
09.12.19
✎
11:14
|
(61) Как я понял, это просто быстрое определение массив. Ну т.е чтобы не писать добавить, а в скобках элементы и все.
(67) Просто это как бы мастхев, а каждому надо свое делать |
|||
73
hi1C
09.12.19
✎
11:14
|
(70) возможно пример неудачный, вычеркиваем :)
|
|||
74
Xapac
09.12.19
✎
11:20
|
итак подытожим:
1. ЗначениеРеквизитовОбъекта. 2. конструктор массивов. все? плохо подготовились! идите еще |
|||
75
sqr4
09.12.19
✎
11:21
|
(74) да просил поделиться других, кто что заметил)
|
|||
76
Xapac
09.12.19
✎
11:24
|
(75)из херни я бы добавил оповещение сервера чтобы процентики выводить. как ни крути костыль на костыле чтобы отобразить прогресс
|
|||
77
hi1C
09.12.19
✎
11:24
|
(74) проверка уида на валидность, чтение не заданного реквизита структуры как у соответствия - это вот прям сейчас наткнулся в работе
|
|||
78
hi1C
09.12.19
✎
11:25
|
(76) ну это совсем жёстко, я запарился объяснять зачем нормальный конструктор массивов нужен, а тут это, забросают помидорами
|
|||
79
Nikoss
09.12.19
✎
11:26
|
(59) что не так с УИ? куда он падает?
|
|||
80
pechkin
09.12.19
✎
11:27
|
(79) если из внешней системы придет гуид, то нужно в попытку оборачивать
|
|||
81
pechkin
09.12.19
✎
11:28
|
(78) так и реализация этого совсем не тривиальна
|
|||
82
fisher
09.12.19
✎
11:28
|
Такого рода претензии (по неполноте системной библиотеки языка) можно выкатывать вагонами.
Более того, даже в более фичастых языках такие претензии никогда не переводятся. Всегда найдется что-то, что кто-то часто делает и хотел бы видеть в системной библиотеке. В 1С таких претензий больше, только и всего. Но по большому счету плевать. Вот вычитывание всего объекта при обращении через точку - согласен, спорное решение. Если хотя бы табличные части при этом не вычитывались - было бы вполне ок. Но видать когда делали это кэширование показалось хорошей идеей привязаться к уже существующему механизму, а не изобретать дополнительные DTO-объекты и целый новый механизм. Теперь да - приходится держать эту фичу в уме. Меня не напрягает беднота инструментария, больше коробит когда натыкаешься на неоднородность интерфейсов коллекций или что-то в этом духе. |
|||
83
novichok79
09.12.19
✎
11:31
|
(7) все уже придумано до нас. можно реализовать через универсальную дату в миллисекундах.
Процедура Delay(ВремяВМиллисекундах) Экспорт Счетчик = 1; Если Не ЗначениеЗаполнено(ВремяВМиллисекундах) Тогда Возврат; КонецЕсли; ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах(); ПредыдущееВремяВыполнения = 0; Пока Истина Цикл ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах(); ВремяВыполнения = ВремяОкончания - ВремяНачала; Если ВремяВыполнения < 0 Тогда ВремяВыполнения = -ВремяВыполнения; КонецЕсли; Если (ВремяВыполнения >= ВремяВМиллисекундах) //время не идет назад - (ПредыдущееВремяВыполнения > ВремяВыполнения) Или (ПредыдущееВремяВыполнения > ВремяВыполнения) Тогда Прервать; КонецЕсли; ПредыдущееВремяВыполнения = ВремяВыполнения; КонецЦикла; КонецПроцедуры |
|||
84
hi1C
09.12.19
✎
11:32
|
(82) любимые костыли есть? делись :)
|
|||
85
hi1C
09.12.19
✎
11:32
|
(83) мегакостыль, нельзя так
|
|||
86
ДенисЧ
09.12.19
✎
11:34
|
(83) У тебя куча лишнего процессорного времени?
|
|||
87
fisher
09.12.19
✎
11:37
|
(86) Для очень коротких пауз норм (иногда для ТО бывает нужна небольшая пауза до полусекунды).
Для длительных пауз вот кошерный костыль: // поместить в общий модуль "МойОбщийМодуль" Процедура Пауза(Секунд) Экспорт ТекущийСеансИнформационнойБазы = ПолучитьТекущийСеансИнформационнойБазы(); ФоновоеЗадание = ТекущийСеансИнформационнойБазы.ПолучитьФоновоеЗадание(); Если ФоновоеЗадание = Неопределено Тогда Параметры = Новый Массив; Параметры.Добавить(Секунд); ФоновоеЗадание = ФоновыеЗадания.Выполнить("МойОбщийМодуль.Пауза", Параметры); КонецЕсли; Попытка ФоновоеЗадание.ОжидатьЗавершения(Секунд); Исключение Возврат; КонецПопытки; КонецПроцедуры |
|||
88
Конструктор1С
09.12.19
✎
11:38
|
(78) ИМХО, подобные "конструкторы" в системе мягкой типизации - зло. В той же Java, с этими ихними полиморфизмами, можно делать методы
МойМетод(ТипЗначения ... ИмяПараметра); он как раз используется для передачи неопределенного количества параметров в метод МойМетод(Значение1); МойМетод(Значение1, Значение2, Значение3); МойМетод(Значение1, Значение2, Значение3, Значение4, Значение5, Значение6); но там жесткая типизация, чуть что компилятор заругается. В 1с, с её неявной типизацией, подобные методы потенциальный источник проблем и трудновыявляемых ошибок. Пример: МойМетод(Значение1,Значение2,Значение3,Значение4,Значение5,Значение6,,Значение7,Значение8,Значение9,Значение10); Кто видит ошибку в этом коде? А она есть. Компилятор на ошибку не укажет |
|||
89
fisher
09.12.19
✎
11:41
|
(88) Почему это вдруг компилятор на ошибку не укажет? Разработчики не смогут себя заставить реализовать проверку обязательности промежуточных параметров?
|
|||
90
hi1C
09.12.19
✎
11:45
|
проверка типа параметра и его заполненности ещё один костыль, забудешь вставить и привет, функция может и не упасть но вернет фазу луны вместо цены заказа
|
|||
91
hi1C
09.12.19
✎
11:46
|
а кто как копирует коллекции?
|
|||
92
fisher
09.12.19
✎
11:47
|
(91) Заходи уже с козырей. С ежегодного конкурса на самый быстрый алгоритм добавления ТЗ в конец другой ТЗ.
|
|||
93
hi1C
09.12.19
✎
11:49
|
(92) не не, сейчас список костылей соберу и голосовалку можно будет устроить, хотя лидер уже есть, может еще что вылезет
|
|||
94
hi1C
09.12.19
✎
11:50
|
поиск по уиду, тоже тема, все же писали?
|
|||
95
Конструктор1С
09.12.19
✎
12:00
|
(89) это будет костыль ещё похлеще. Значение Неопределено в 1с может быть частью бизнес-логики, например, его может вернуть запрос для поля составного типа. И что ты будешь делать, если у тебя запрос в поле РеализацияТоваровУслуг.ДокументОснование вернул Неопределено? Переписывать код в каждом таком случае?
|
|||
96
Конструктор1С
09.12.19
✎
12:01
|
(94) зачем искать по уиду?
|
|||
97
fisher
09.12.19
✎
12:05
|
(95) Мы же говорим конкретно про реализацию в платформе конструктора массива с инициализацией списком элементов массива? Ну и нафига в нем допускать возможность опускания промежуточных параметров? Явно Неопределено - передавай сколько хочешь. Опускать промежуточный параметр - не смей.
|
|||
98
Конструктор1С
09.12.19
✎
12:08
|
Пример к (95)
ЗначенияПараметров - структура из десятой процедуры пятого модуля, о кнутренностях компилятор не может и догадываться. Содержит значения: ЗначениеПараметров.Значение1 - число ЗначениеПараметров.Значение2 - неопределено ЗначениеПараметров.Значение3 - число В коде выполняется: УниверсальныйПолиморфныйМетод(ЗначениеПараметров.Значение1, ЗначениеПараметров.Значение2, ЗначениеПараметров.Значение3); <Маты компилятора> Причем Неопределено в структуре ЗначениеПараметров может прилетать один раз на миллион случаев. Вот ты писал код, отлаживал, тестировал, никогда там не было Неопределено. Запустили в эксплуатацию, неделю, две, три, всё работает отлично. Спустя три месяца в структуре прилетело Неопределено. Твои действия? |
|||
99
dmpl
09.12.19
✎
12:09
|
(47) А зачем тут массив? Через запятую типы с строке перечислить не проще?
|
|||
100
spiller26
09.12.19
✎
12:11
|
РольДоступна("ПолныеПрава")
|
|||
101
Конструктор1С
09.12.19
✎
12:11
|
(97) а что мешает передать параметр с пустым значением?
Процедура Процедура1() Процедура2(1, null) КонецПроцедуры Процедура Процедура2(Значение1, Значение2) ПлатформенныйПолиморфныйМетод(Значение1, Значение2); // тут ругань компилятора КонецПроцедуры |
|||
102
dmpl
09.12.19
✎
12:12
|
(56) В 1С все равно есть подобие компилятора, вот он бы прошелся по коду - и выбрал бы только нужные поля. За столько лет можно было это и исправить.
|
|||
103
fisher
09.12.19
✎
12:12
|
(98) Не. Ты красавчик! 1С-то тут причем? Ты свел пример к вечному баттлу динамическая типизация vs статическая. Эта проблема никак не решается в языках с нестрогой динамической типизацией на этапе компиляции. Это их вечный недостаток и это же их вечное преимущество. Хочешь страховки в этом месте - проверяй параметры в рантайме, раз уж динамическая нестрогая типизация в этом месте тебе никаких гарантий не дает.
|
|||
104
dmpl
09.12.19
✎
12:15
|
(83) 100% загрузка ядра процессора ничегонеделанием?
|
|||
105
dmpl
09.12.19
✎
12:17
|
(94) А что вы ищите по уиду?
|
|||
106
dmpl
09.12.19
✎
12:19
|
(100) В 8.2 такого не было :)
|
|||
107
Конструктор1С
09.12.19
✎
12:20
|
(103) так вот и притом 1с, что при динамической типизации полиморфизм это злейшее зло, потенциальный источник трудновыявляемых проблем
|
|||
108
Александр Б
09.12.19
✎
12:25
|
Пример в (0) это не костыль.
Это 2 разные возможности, и разработчик сам решает, какую ему использовать в зависимости от ситуации и потребности. |
|||
109
Конструктор1С
09.12.19
✎
12:26
|
(102) это просто сделать, когда ссылка получается и используется в пределах одного метода. Но сложно и бессмысленно делать, когда ссылка прокатывается через несколько методов, и каждый из этих методов дергает свои реквизиты через точку
|
|||
110
Александр Б
09.12.19
✎
12:29
|
Для тех кто не знал, обращение через точку не просто получает все реквизиты объекта, но и кэширует его. Т.е. дальнейшее обращение в коде к этому объекту через точку уже не выполнляет запрос к БД, а использует данные кэшированного объекта.
Предполагаю, что это сделано специально для программистов не особо высокого уровня. Так сказать, насильная оптимизация. Пожертвуем, малым ради многого. Вот представьте, что обращение через "." будем брать только этот реквизит. Тогда 10 строк кода к одному объекту через "." сделает 10 запросов на сервер. А это ХУЖЕ, чем 1 запрос за всеми данными. |
|||
111
sqr4
09.12.19
✎
12:29
|
(108) Приведите пример обоснованного использования ссылки через точку?
|
|||
112
Александр Б
09.12.19
✎
12:30
|
(111) В (110) пояснение.
|
|||
113
Конструктор1С
09.12.19
✎
12:30
|
+(109)
Процедура ВрехняяПроцедура(Организация) ИНН = Организация.ИНН; Процедура1(Организация); Процедура2(Организация); Процедура3(Организация); КПП = Организация.КПП ; КонецПроцедуры; Откуда компилятору знать, что между получением ИНН и КПП значение переменной Организация не поменяется? |
|||
114
Конструктор1С
09.12.19
✎
12:31
|
(111) например, когда тебе нужны все или почти все реквизиты справочника за раз
|
|||
115
fisher
09.12.19
✎
12:33
|
(107) Слабая динамическая типизация по определению полиморфна с ног до головы и является источником трудновыявляемых проблем. Но одновременно позволяет писать предельно лаконичный код. Поэтому в скриптовых языках и юзается.
|
|||
116
sqr4
09.12.19
✎
12:34
|
(114) например?)
|
|||
117
dmpl
09.12.19
✎
12:34
|
(109) По факту это и не нужно. Вопрос в том, что нам может уже не нужно кешированное 100500 микросекунд назад значение. Если кто-то в это время поменял объект по ссылке, то без обращения к серверу мы этого не узнаем. А раз все равно обращаемся к серверу - то и выигрыша от такой глубокой оптимизации не получим.
|
|||
118
Конструктор1С
09.12.19
✎
12:35
|
+(114) или когда код выполняется в цикле. Лучше однократно получить все реквизиты, закешировать, и потом тянуть кэш, чем стотыщ раз выполнять запрос в цикле, для получения "только нужных" реквизитов
|
|||
119
dmpl
09.12.19
✎
12:36
|
(113) Вообще не в тему. Организацию между строчками может поменять другой пользователь.
|
|||
120
fisher
09.12.19
✎
12:37
|
(113) Это не проблема компилятора. Значение переменной не поменяется. Это гарантирует однопоточность исполнения. Поменяться могут свойства организации в базе данных. Это решается на уровне блокировок. Но для получения данных условно-постоянной НСИ никто на таком уровне не страхуется. Иначе любое получение данных в транзакции пришлось бы обкладывать управляемыми блокировками.
|
|||
121
sqr4
09.12.19
✎
12:37
|
(118) Не представляю себе пример такого цикла, к сожалению.
|
|||
122
Александр Б
09.12.19
✎
12:37
|
(118) +
Очень хороший пример. |
|||
123
dmpl
09.12.19
✎
12:39
|
(118) Лучше чтобы он 100500 раз получался из базы. Тогда любой дундук, потратив пару часов на тестовый запуск, немного самообразовался бы и научился выносить такие условно постоянные значения за пределы цикла.
|
|||
124
dmpl
09.12.19
✎
12:40
|
(121) Это не пример цикла, это пример г.кода.
|
|||
125
fisher
09.12.19
✎
12:40
|
(121) В смысле? Ты из секты "отрицающих кэш"? :)
|
|||
126
Конструктор1С
09.12.19
✎
12:47
|
(115) "Но одновременно позволяет писать предельно лаконичный код"
Это обратная сторона медали, которой в сложных системах жертвуют не глядя. Например, есть программные системы, от которых зависит безопасность людей, или сложные технологические процессы, нарушение работы которых чревато плачевными последствиями. Эти системы пишутся только на строго типизируемых ЯП (типа того же C), имеющих кучу всяких ограничений . Писать код на таких ЯП тяжело, долго и дорого. Но эти "тяжелые" ЯП никогда не заменят на "волные" скриптовые языки, на которых код писать "вжух и готово", но потом ошибки полгода вылавливай |
|||
127
fisher
09.12.19
✎
12:51
|
(126) И кто с этим спорит? Это такая же правда как и то, что никто не будет писать скрипты на языках со строгой статической типизацией, где вместо трех строчек предельно понятного кода придется делать комплекс приседаний и отжиманий.
|
|||
128
ДенисЧ
09.12.19
✎
12:52
|
(127) Ну, тайпскрипт всё-таки придумали... Правда, там строга типизация такая строгая, что я вчера минут 30 пытался понять, что ему надо...
|
|||
129
dmpl
09.12.19
✎
12:52
|
(126) Ой да ладно. Си - не такой уж строго типизированный. Там при работе с указателями можно такого наворотить... Паскаль построже будет. А если программист дурак - так он просто кастует void - и вперед.
|
|||
130
fisher
09.12.19
✎
12:55
|
(128) Тайпскрипт и придумали после того, как столько динамизма в js наворотили, что хоть стой хоть падай. Чаще падай чем стой. Питон в этом смысле сразу гораздо более разумный язык получился.
(129) Ну так Си и считается языком со слабой типизацией. |
|||
131
Конструктор1С
09.12.19
✎
12:57
|
(129) таки, тем не менее, Си применяют для написания ответственных низкоуровневых систем. Нахреновертить-то можно на любом языке, но на "мягких" ЯП это делать намного легче
|
|||
132
fisher
09.12.19
✎
12:59
|
Только в Си слабая типизация сделана с вполне определенной целью - для повышения эффективности кода. Си это вообще своеобразная надстройка над ассемблером.
|
|||
133
fisher
09.12.19
✎
13:00
|
Только не путать Си и плюсы. Это разные языки.
|
|||
134
Конструктор1С
09.12.19
✎
13:02
|
(127) ИМХО, раз уж 1с стремится к серьезным системам, то и язык должен быть серьёзным, без лишних волностей. Чтобы говнокод было сложнее писать. Иначе не видать 1с в одних рядах с Java и иже с ними
|
|||
135
ДенисЧ
09.12.19
✎
13:03
|
(134) Свидетель секты фузиновцев?
|
|||
136
Конструктор1С
09.12.19
✎
13:04
|
(135) причём тут фузина?
|
|||
137
fisher
09.12.19
✎
13:09
|
(134) 1С никогда туда не стремился. 1С наоборот любыми силами сдерживают в категории "несерьезных". Настолько несерьезных, чтобы им могли заниматься в том числе непрофильные специалисты без особой подготовки. Целься 1С в категорию "серьезных" - уже бы помер давным-давно.
|
|||
138
quest
09.12.19
✎
13:09
|
(134) На джаве нельзя говнокодить?
|
|||
139
hi1C
09.12.19
✎
13:11
|
(105) есть уид, тип не известен, перебираем объекты метаданных и ищем, я дума. все это писали
|
|||
140
fisher
09.12.19
✎
13:12
|
У 1С такая интересная ниша, в которой говнокод в сто тыщ мильонов раз лучше, чем отсутствие кода. И где говнокод существенного вреда не наносит.
|
|||
141
hi1C
09.12.19
✎
13:13
|
(140) ну как сказать, не наносит, наносит и разработчику и компании
|
|||
142
hi1C
09.12.19
✎
13:14
|
(110) ок, пусть так и будет, но что мешает добавить методы для ссылок выполняющие то же что и ОбщегоНазначения.ЗначенияРеквизитовОбъекта?
|
|||
143
hi1C
09.12.19
✎
13:16
|
Еще источник костылей: СхемаЗапроса. Кто ни будь использует СЗ без обёрток?
|
|||
144
hi1C
09.12.19
✎
13:16
|
Мне вот не понятно, почему побитовый сдвиг в платформе есть, а паузы нет?
|
|||
145
hi1C
09.12.19
✎
13:19
|
тема ушла куда то не туда, двайте дадим определение костыля?
|
|||
146
hi1C
09.12.19
✎
13:19
|
в рамках темы костыль это часто используемый метод который "исправляет"/дополняет поведение платформы
|
|||
147
fisher
09.12.19
✎
13:19
|
(141) "Всего лишь" увеличивает совокупную стоимость владения и ускоряет "монструизацию" системы. Но прямого урона "ходу бизнеса" как правило не оказывается. Бизнесу часто скорость воплощения фич намного важнее их качества. В рамках тех задач, что чаще всего решаются на 1С.
|
|||
148
hi1C
09.12.19
✎
13:20
|
нужность костыля и его правильность определяется частотой использования и/или включением в БСП :)
|
|||
149
fisher
09.12.19
✎
13:22
|
(146) Под "дополняет" подойдет любая достаточно универсальная функция. А под "исправляет" хорошо подходят только баги, а не фичи. Поэтому "костыль" предлагаю заменить на что-то более политкорректное. Например, "полезняшки, которые было бы неплохо иметь "из коробки".
|
|||
150
hi1C
09.12.19
✎
13:22
|
(147) ну я как бы в курсе отзывов клиентов и разбора полётов по этим отзывам, куски ободранных шкур разработчиков потом устает выметать уборщица (художественное преувеличение)
|
|||
151
hi1C
09.12.19
✎
13:22
|
(150) ОбщегоНазначения.ЗначенияРеквизитовОбъекта - вполне себе исправляет
|
|||
152
hi1C
09.12.19
✎
13:23
|
(151) это к (149)
|
|||
153
fisher
09.12.19
✎
13:23
|
(151) И что же она "исправляет"? Кэширование объекта при обращении к нему через точку багом назвать сложно.
|
|||
154
ДенисЧ
09.12.19
✎
13:24
|
(136) Она на жаве
|
|||
155
hi1C
09.12.19
✎
13:25
|
(153) это баг, я редко меняю места работы, в двух последних в гайдах прямо прописан запрет на обращение через точку к реквизитам объектов
|
|||
156
fisher
09.12.19
✎
13:27
|
(155) Может и возможность безусловного перехода - тоже баг? Или это в ваших гайдах запрещено не было?
|
|||
157
ejikbeznojek
09.12.19
✎
13:27
|
(0)
scr = Новый ComОбъект("WScript.Shell"); scr.Run("sleep "+Формат(ЗадержкаСекунд, "ЧДЦ=0; ЧГ="), 0, 1); |
|||
158
hi1C
09.12.19
✎
13:30
|
(157) костыль же
|
|||
159
hi1C
09.12.19
✎
13:30
|
(156) запрещено :), но пару раз я использовал :), обосновано
|
|||
160
hi1C
09.12.19
✎
13:32
|
(156) это не баг, это иструмент, как кунфу которое настоящий мастер не будет использовать без надобности
|
|||
161
hi1C
09.12.19
✎
13:35
|
(149) полезняшки тоже подойдет
|
|||
162
fisher
09.12.19
✎
13:36
|
(159) Дык и обращение через точку можно применить обоснованно.
|
|||
163
fisher
09.12.19
✎
13:38
|
Если объект не "тяжелый" и нет никаких тенденций к его "утяжелению", то я не вижу никаких препятствий к обращению к его реквизитам "через точку". Оверхед минимальный. Читабельность на высоте. Кэширование бонусом.
|
|||
164
fisher
09.12.19
✎
13:40
|
По сути, только документы и особо тяжелые справочники в "зоне риска".
|
|||
165
hi1C
09.12.19
✎
13:47
|
(164) тем не менее костылей исправляющих goto нет, а исправляющих чтение через точку вагон и маленькая тележка
|
|||
166
fisher
09.12.19
✎
13:50
|
(165) Как это нет костылей, "исправляющих" гоуту? А выход по флагам? :)
|
|||
167
palsergeich
09.12.19
✎
13:51
|
(56) будет одно обращение, при первом обращении через точку объект причитается целиком и закешируется. 2 и 4 строка не будут делать обращение к БД.
Другой вопрос в том, что теоретически целесообразность получения всего объекта со всеми ТЧ и реквизитами далеко не всегда целесообразна |
|||
168
fisher
09.12.19
✎
13:51
|
Есть языки, где гоуту вообще "исправили" кардинально :)
|
|||
169
ДенисЧ
09.12.19
✎
13:52
|
(167) Есть вероятность, что кеш между двумя обращениями успеет протухнуть. Или кто-то снаружи изменит объект
|
|||
170
hi1C
09.12.19
✎
13:52
|
(166) я с такой наркоманией еще не сталкивался, можно пример?
|
|||
171
palsergeich
09.12.19
✎
13:53
|
(169) если кто то другой изменит объект между строками - будут проблемы и при той же щарросной технике, ибо ты точно так же прочитаешь одну версию, а при присвоении будет актуальна другая.
Время жизни Кеша 20 секунд. Если у Вас юзерские алгоритмы исполняются дольше, то это не самая страшная проблема а любом случае. |
|||
172
hi1C
09.12.19
✎
13:54
|
(167) а еще есть хранилища значений, куда можно много чего запихнуть и узнать об этом на эксплуатации
|
|||
173
palsergeich
09.12.19
✎
13:54
|
(172) это подразумевается в фразе Все реквизиты
|
|||
174
palsergeich
09.12.19
✎
13:56
|
Но хранить ХЗ в объекте так себе идея, при получении основной формы будут проблемы, по этому надо их хранить в связном объекте метаданных, но не в самом объекте.
1с давно уже так делает. |
|||
175
palsergeich
09.12.19
✎
13:57
|
(174) да и не только основной формы, но и везде где требуется работа с объектом в объектной технике. Не надо так
|
|||
176
hi1C
09.12.19
✎
13:59
|
(175) согласен, просто еще один способ выстрелить себе в ногу
|
|||
177
hi1C
09.12.19
✎
14:00
|
(175) есть любимые костыли? делись
|
|||
178
palsergeich
09.12.19
✎
14:06
|
(177) Создать ТЗ на клиенте. Мне этот костыль недавно жизнь спас.
Был выбор или переписывать огромную обработку целиком за неделю, изи за часик просто поменять везде директивы компиляции и костыли воткнуть. Ибо все равно это в прод не пойдет, а нужно только для переноса на старте. |
|||
179
palsergeich
09.12.19
✎
14:08
|
(178) А все потому что разработчики УХ половину действий с екселем делают на клиенте, а вторую на сервере, и все через COM.
И вот так вышло, что нужна серверная часть, а на сервере linux |
|||
180
hi1C
09.12.19
✎
14:10
|
(178) ооо, где посмотреть? сам писал?
|
|||
181
palsergeich
09.12.19
✎
14:12
|
(180) Конечно.
Могу в личку или куда там скинуть костылик, светить не хочу, я на форуме уже показывал, но луша от глаз мамки подальше держать. |
|||
182
hi1C
09.12.19
✎
14:13
|
(181) можно в личку? я так понимаю там массив структур?
Вот еще костыль, встречал в инструментах разработчика, поля ввода для ссылочных данных понимают строковое представление объекта, лепота, 1С учись у ТормозаИт. |
|||
183
ejikbeznojek
09.12.19
✎
14:15
|
(158) Так в (0) просили костылями поделиться, я и поделился))
|
|||
184
hi1C
09.12.19
✎
14:16
|
(183) ещё есть?
|
|||
185
palsergeich
09.12.19
✎
14:16
|
(182) нет не массив структур.
Ты в карточке почту светани, я пришлю |
|||
186
ejikbeznojek
09.12.19
✎
14:17
|
(184) Передача с клиента на сервер таблицы значения из прочитанной эксельки в виде табличной части обработки считается?))
|
|||
187
sqr4
09.12.19
✎
14:18
|
Запрос с таблицей дат)
|
|||
188
dmpl
09.12.19
✎
14:19
|
(139) А кто вам сказал, что уид не может повторяться у объектов разных типов?
|
|||
189
ASU_Diamond
09.12.19
✎
14:20
|
Бро собирает информацию для очередной статейки?
|
|||
190
hi1C
09.12.19
✎
14:20
|
(185) готово
|
|||
191
hi1C
09.12.19
✎
14:20
|
(186) да :)
|
|||
192
hi1C
09.12.19
✎
14:21
|
(187) и преобразование типов в запросе?
|
|||
193
hi1C
09.12.19
✎
14:21
|
(189) я бро, но не тот :)
|
|||
194
hi1C
09.12.19
✎
14:22
|
(188) получим две ссылки, но этого быть не должно, что же это за уникальный идентификатор? :)
|
|||
195
sqr4
09.12.19
✎
14:24
|
(189) подход в разы лучше и приятнее для души обычного 1сника.
|
|||
196
dmpl
09.12.19
✎
14:24
|
(194) Это так и было задумано :) Он поэтому и не ГУИД.
|
|||
197
hi1C
09.12.19
✎
14:33
|
(196) 1С ввела в заблуждение названием, надо было назвать ИногдаУникальныйИдентификатор
|
|||
198
ДенисЧ
09.12.19
✎
14:34
|
(197) Не иди по стопам 1с, не вводи в заблуждение окружающих.
Он уникальный. В пределах таблицы. |
|||
199
hi1C
09.12.19
✎
14:39
|
(198) ок, УникальныйИдентификаторВПределахТаблицы
|
|||
200
Cyberhawk
09.12.19
✎
14:42
|
(185) Скинь мне тоже пож-та (или в Телегу)
|
|||
201
Злопчинский
09.12.19
✎
14:43
|
одно время состав бухии менялся резвенько, и в торговой базе все время менялись бухи. причем у каждого нового - свой уникальный набор разрешений. достало. дал админские права в базе и все.
|
|||
202
hi1C
09.12.19
✎
14:44
|
Коллеги не стесняйтесь, делитесь любимыми костылями.
|
|||
203
Cyberhawk
09.12.19
✎
14:46
|
(202) Обертка для менеджера записи со свойствами как у набора записей (обменданными.загрузка и доп. свойства)
|
|||
204
hi1C
09.12.19
✎
14:48
|
(203) это круть :)
|
|||
205
hi1C
09.12.19
✎
14:48
|
(203) не могу представить зачем это
|
|||
206
Cyberhawk
09.12.19
✎
14:49
|
(205) Наглядность и краткость кода (как у МЗ) с использованием указанных выше двух возможностей, доступными только НЗ
|
|||
207
Cyberhawk
09.12.19
✎
14:49
|
*доступных
|
|||
208
hi1C
09.12.19
✎
14:50
|
(201) Права... сколько я повидал РС с названиями типа "Доп.права", "Динамические права" и т.д. с разным радиусом кривизны реализации.
|
|||
209
hi1C
09.12.19
✎
14:51
|
(206) ясно, я так привык к НЗ, глаз уже замылился, лет 5 наверное РЗ не использую
|
|||
210
hi1C
09.12.19
✎
14:51
|
(209) очепятка РЗ = МЗ
|
|||
211
hi1C
09.12.19
✎
14:53
|
а собственные индексы, привет соглашению с 1С, кто нибудь использует?
|
|||
212
Конструктор1С
09.12.19
✎
14:53
|
(154) и что, что на жаве?
|
|||
213
Конструктор1С
09.12.19
✎
14:54
|
(138) на жаве говнокодить можно, но делать это чуть сложнее, чем на 1с
|
|||
214
ДенисЧ
09.12.19
✎
14:54
|
(212) "язык должен быть серьёзным, без лишних волностей"
(с) Не Я |
|||
215
hi1C
09.12.19
✎
14:57
|
продолжу, флюент интерфейс через обработки, см. инфостарт
|
|||
216
Конструктор1С
09.12.19
✎
15:06
|
(140) ИМХО, дело не в нише, переваривающей говнокод. Платформа 1с это уже сам по себе некий стандарт. Ни один рукожом не сможет заставить справочник перестать быть справочником. Притащи с улицы любого 1сника, ткни пальцем в любой объект в дереве объектов конфигуратора, и этому 1снику будет понятно предопределенное поведение этого объекта, для чего и как он может быть использован. В то же время, на том же FoxPro городили кто во что горазд. Наверно поэтому FoxPro так и не доросла до серьёзных систем, застряв на уровне наколенных нетленок. Фузинцы решили повторить подвиги FoxPro, во что это вылилось сам видел: у них справочник это недосправочник-недоотчет-недорегистр в одном гранёном стакане. В то же самое время, на 1с такое нарукожопить сложно. Вот поэтому 1с и держится прочно в своей нише - у платформы большой запас прочности
|
|||
217
novichok79
09.12.19
✎
15:53
|
(86) (87) используется в фоновых заданиях, разумеется в основном потоке я не использую эту функцию.
|
|||
218
hi1C
09.12.19
✎
16:13
|
Замечательный костыль в БСП: ПроверитьПараметр.
Синтаксис Процедура ПроверитьПараметр(Знач ИмяПроцедурыИлиФункции, Знач ИмяПараметра, Знач ЗначениеПараметра, Знач ОжидаемыеТипы, Знач ОжидаемыеТипыСвойств = Неопределено) Экспорт Параметры ИмяПроцедурыИлиФункции - Строка - имя процедуры или функции, параметр которой проверяется. ИмяПараметра - Строка - имя проверяемого параметра процедуры или функции. ЗначениеПараметра - Произвольный - фактическое значение параметра. ОжидаемыеТипы - ОписаниеТипов, Тип, Массив, ФиксированныйМассив, Соответствие, ФиксированноеСоответствие - тип(ы) параметра процедуры или функции. ОжидаемыеТипыСвойств - Структура - если ожидаемый тип - структура, то в этом параметре можно указать типы ее свойств. У меня не типовая, с БСП близко не знаком. |
|||
219
hi1C
09.12.19
✎
16:31
|
в БСП, как в Греции, всё есть
ЭтоУникальныйИдентификатор Проверяет, является ли строка уникальным идентификатором. В качестве уникального идентификатора предполагается строка вида "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где X = [0..9,a..f]. Синтаксис Функция ЭтоУникальныйИдентификатор(Знач Значение) Экспорт Параметры Значение - Строка - проверяемая строка. Возвращаемое значение Булево - Истина, если переданная строка является уникальным идентификатором. |
|||
220
fisher
09.12.19
✎
16:33
|
(218) С принципе, мне нравится твоя философия. "Язык + костыли = программа". Как-то так оно в жизни и происходит.
|
|||
221
hi1C
09.12.19
✎
16:47
|
(220) Костыли неотъемлемая часть программы, невозможно всё впихнуть в язык. Но когда использование костыля становится массовым, мне кажется, что пора задумываться о включении его в язык. Если посмотреть синтакс-помощник можно найти методы которые не понятно кому нужны. Но они есть, а то что используется во всех типовых почему то в язык не включено. Где логика?
|
|||
222
palsergeich
09.12.19
✎
16:59
|
(221) логика в том что развитие языка идёт по плану.
Сначала появляются библиотеки, потом они становятся частью языка. Как это было например со строковыми функциями например |
|||
223
Конструктор1С
09.12.19
✎
17:05
|
(218)(219) не понятно, почему ты подобные библиотечные функции считаешь костылями? Например, ЭтоУникальныйИдентификатор() очень полезная функция при интеграции со сторонними системами
|
|||
224
hi1C
09.12.19
✎
17:14
|
(223) Костыль, в данном случае, то что могло быть в платформе. Но этого нет. Если бы это было разово разработано, каким то левым разработчиком, для узкой цели, то бог с ним. Но это применяется массово. Вот я не использую, БСП, сам виноват - знаю, мне нужно или самому писать что-то такое, либо искать написанной другими. Я и написал, через попытку.
|
|||
225
fisher
09.12.19
✎
17:41
|
(221) Частично так и происходит. Какие-то функции, ставшие стандартными в БСП, были впоследствии реализованы в языке. Вспомнить хотя бы ЗначениеЗаполнено, СтрШаблон и т.п. Но это касалось только очень простых и действительно очень массово и постоянно используемых функций.
(244) Вопрос в том, стоит ли в стандартную библиотеку языка тащить все полезные функции? Однозначно нет. Вот ты говоришь, что проверка на уникальный идентификатор применяется массово. Вопрос в том - насколько массово? Я вот лично ни разу не проверял. И почему-то мне кажется, что я не одинок. Тоже самое ПолучитьРеквизиты() - применяю чрезвычайно редко. Обычно удается писать так, чтобы получать все запросами одновременно с кучей других данных. А в простых и понятных случаях - смело работаю через точку. А вот ЗначениеЗаполнено() и СтрШаблон() - другое дело. Это нужно всем и каждому и нужно постоянно. |
|||
226
fisher
09.12.19
✎
17:45
|
Я могу понять, когда в платформу добавляют нечто, что не используется массово, но что сложно или неудобно реализовать на языке 1С, если это вдруг понадобится. Тут есть резон. А какой смысл включать в язык что-то, что массы каждый день не юзают, но что легко реализуется при необходимости и так?
|
|||
227
hi1C
09.12.19
✎
17:54
|
(226) ЗначениеЗаполнено так же легко реализуется
|
|||
228
fisher
09.12.19
✎
18:36
|
(227) Зато оно пригождается в каждой второй функции, кто бы и что бы не писал.
|
|||
229
Fragster
гуру
09.12.19
✎
18:51
|
Недавно такое в УТ видел:
Функция ВремяОжиданияИтерации(НомерИтерации) Если НомерИтерации < 15 Тогда ВремяОжидания = 1; Для НомерИтерации = 2 По НомерИтерации Цикл ВремяОжидания = ВремяОжидания * 1.4; КонецЦикла; Иначе ВремяОжидания = 120; КонецЕсли; Возврат ВремяОжидания; КонецФункции вроде переписали по человечески |
|||
230
Fragster
гуру
09.12.19
✎
18:52
|
интересно здесь вот это:
Для НомерИтерации = 2 По НомерИтерации Цикл (ну, кроме того, что все это в принципе говнокод) |
|||
231
DTX 4th
09.12.19
✎
18:59
|
Да, нет смысла тянуть ТЧ при обращении к реквизиту ссылки
(39) О, я себе недавно такое писал) (54) Ага, давайте лучше размажем простецкую конструкцию на 5 строк... (57) Достаточно просто не получать табличные части у ссылок.. Так извращаться ради реквизитов - оверхед Где голосовалка? Платформа выбешивает. Нельзя так наплевательски относится к разрабам. Не хватает вещей, который есть в других языках. И из-за отсутсвия ООП я даже не могу написать себе объект-помощник.... Где ++? Где лямба функции? LINQ бы не помешал С переходом на 8.3 могли бы добавить методы, которые конвертят ТЗ в массивы и наоборот. Но нет, верх всего происходящего - это долгожданное появление таких функций как СтрШаблон. Нет слов. |
|||
232
DTX 4th
09.12.19
✎
19:01
|
(230) Почему говнокод?
|
|||
233
Fragster
гуру
09.12.19
✎
19:05
|
(232) потому что этот код не работает (всегда одна итерация цикла), а также потому что возведение в степень есть в платформе.
|
|||
234
Fragster
гуру
09.12.19
✎
19:07
|
но знали ли вы, что предел цикла Для вычисляется один раз? и при этом после присвоения начального значения?
|
|||
235
DTX 4th
09.12.19
✎
19:22
|
(233) Если заменить переменную счетчика на другую, то имеет право на жизнь.
По (230) я подумал, что сама идея - говнокод. |
|||
236
Конструктор1С
09.12.19
✎
19:38
|
(231) "С переходом на 8.3 могли бы добавить методы, которые конвертят ТЗ в массивы и наоборот"
Так это же есть в БСП. К тому же не самая распространенная задача. В большинстве случаев не требуется гнать никакую табличку на клиент |
|||
237
Конструктор1С
09.12.19
✎
19:40
|
ООП - сомнительная необходимость в 1с. Сколько я ни спрашивал у апологетов ООП, никто так и не сумел привести примера надобности оной в 1с
|
|||
238
DTX 4th
09.12.19
✎
22:45
|
(236) В большинстве случаев и регистры расчета не нужны. Давайте их в БСП вынесем
(237) Достаточно будет инкапсуляции (да, я только что гуглил основные принципы). В наследовании основного смысла нет, ну а про инкапсуляции вы и сами понял xd Пример: Хочу сделать объект, который будет обрабатывать мою таблицу значений. Первый метод - возвращает сортированную, второй - конвертит в массив, и т.д. Текущие варианты реализации: 1. На ОФ можно сделать модули в виде форм. Как тиражное решение - никуда не годится. Крайне неудобно 2. На УФ? Ну на клиенте можно те же формы. А сервер? Инициализировать всё нужное в структуру, а потом гонять её по функциям, которые будут разбросаны вперемешку с основным кодом? https://i.ytimg.com/vi/HcfHBgUTn7I/maxresdefault.jpg |
|||
239
DTX 4th
10.12.19
✎
01:29
|
(238) "про инкапсуляции вы и сами понял" -> "про полиморфизм вы и сами поняли"
|
|||
240
Конструктор1С
10.12.19
✎
04:25
|
(238) инкапсуляция это не какие-то там возможности программирования. Это прежде всего принципы написания кода. Инкапсуляция была придумана ещё задолго до ООП, только пользовались ей лишь опытные разработчики, и держалась она на дисциплине при написании кода. В 1с есть всё необходимое, чтобы инкапсулировать алгоритмы. Ты можешь создать общий модуль, добавить в него экспортную процедуру, вспомагательные процедуры сделать не экспортными, и будет твой алгоритм инкапсулирован в самом полном смысле этого слова. А полиморфизм при динамической типизации, как мы уже выяснили, скорее источник проблем, чем благо
|
|||
241
ДенисЧ
10.12.19
✎
06:13
|
(240) Инкапсуляция - это в первую очередь про данные. Попробуй данные в модуль запихнуть )
|
|||
242
Конструктор1С
10.12.19
✎
08:01
|
(241) не-а, инкапсуляция это про скрытие деталей реализации. Скрытие данных тут скорее побочный бонусный эффект
|
|||
243
d4rkmesa
10.12.19
✎
08:46
|
(0) СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(...) - там, где СтрШаблон недоступен.
|
|||
244
vi0
10.12.19
✎
08:59
|
(216) "Платформа 1с это уже сам по себе некий стандарт"
"В то же время, на том же FoxPro городили кто во что горазд" Потому что 1с - это фреймворк, а фокспро - БД. |
|||
245
тарам пам пам
10.12.19
✎
09:07
|
(240) Мне лично в модулях нет нравится то, что из служебных модулей типа КлиентСервер и ПовтИсп их "потроха" торчат наружу в виде служебного интерфейса и приходится пользоваться соглашением, что на клиенте используем только модуль с припиской Клиент, на сервере - только вообще без приписок.
Также торчат наружу всякие подписки на события и обработчики регл. заданий. Ну и обработчики оповещений тоже. Так что инкапсуляция получается далеко не полной. |
|||
246
тарам пам пам
10.12.19
✎
09:08
|
(243) эти функции, кстати, не равнозначны - СтрШаблон падает при отсутствии локализованной строки, а ПодставитьПараметрыВСтроку() - не падает.
|
|||
247
ДенисЧ
10.12.19
✎
09:14
|
(244) Фокс - это не БД. Это СУБД.
|
|||
248
Bro
10.12.19
✎
09:18
|
(247) Строго говоря там логика представлений тоже была и достаточна развитая. Ну и много чего еще было. Так что все-таки это ближе к платформе было. Только она с внешними SQL дружила где-то на уровне Delphi, а когда SQL стал де факто стандартом в отрасли, все преимущества сошли на нет и Microsoft логично сделала ставку на .Net, похоронив Foxpro.
|
|||
249
Bro
10.12.19
✎
09:19
|
(248) Точнее даже так: на .Net и Axapta, причем их начали сильно сближать друг к другу, X++ используемый в Axapta сейчас очень похож на C#.
|
|||
250
hi1C
10.12.19
✎
09:21
|
(178)Это самое крутое что я видел за последние 3 года, да блин я с 7.7 таких хаков не встречал. Это просто песня!
|
|||
251
hi1C
10.12.19
✎
09:25
|
(249) Бро, у тебя во Фузине костыли есть? Делись :)
|
|||
252
trad
10.12.19
✎
09:28
|
(241) (242) согласен с ДенисЧ
толку от инкапсуляции реализации, без возможности завернуть в нее данные (состояние объекта) - не много |
|||
253
Bro
10.12.19
✎
09:43
|
(251) В самой фузине или в решениях на фузине?
|
|||
254
hi1C
10.12.19
✎
09:46
|
(253) в решениях
|
|||
255
vi0
10.12.19
✎
10:09
|
(247) не может быть такого)
|
|||
256
Bro
10.12.19
✎
10:09
|
(254) Ну то что сходу могу вспомнить:
При расчете себестоимости она выделяется в новый цикл в транзакции, а потом разбивается на итерации. https://github.com/lsfusion-solutions/mycompany/blob/c2ca9254b4dce33988073b5b1d7ee105029561a0/src/main/lsfusion/inventory/ledgers/CostLedger.lsf#L47 Плюс например в ERP очень сильно намудрили с видами цен, замкнув все на одну функцию цена от любого вида цены (а видов цен там десятки, а то и сотни). Соответственно если начать компилировать из этого один запрос он получится очень большим. В итоге иногда делают выверты с событиями на изменения видимой части таблицы: // определяется когда пересчитывать отображаемую цену. WHEN LOCAL FORMS userOrder (SET([ VIEW userOrder.sts](Stock stock, Sku sku)) AND currentUserOrderUserOrder() = UserOrder o) OR ((CHANGED(priceDateTime(o)) OR CHANGED(priceListType(o)) OR CHANGED(agreement(o))) AND [ VIEW userOrder.sts](stock, sku)) DO updateViewPrice(sku, stock, o); ; // читают цену в локальное свойство (временную таблицу), причем пометка NOINLINE означает что надо выполнять FOR по каждому виду цены в отдельности, а по складам, товарам и датам одним запросом updateViewPrice (Sku sku, Stock stock, UserOrder userOrder) { FOR PriceListType pt = priceListType(userOrder, sku) AND (Stock st = IF overPriceStockUser(userOrder) THEN overPriceStockUser(userOrder) ELSE stock) AND stock IS Stock AND DATETIME dt = priceDateTime(userOrder) NOINLINE (pt) DO viewPrice(sku, stock, userOrder) <- prevPriceB(pt, sku, st, dt); } ну и еще есть пару хаков в таком духе. В общем есть свои скелеты, когда оптимизацию выполняют тоже руками за платформу. Но тьфу-тьфу на проект в несколько сотен тысяч строк, их с пару десятков и они локализованы. Ну и мелочи которые недоделали. Например отсутствие вывода типа из равенства (то есть PriceListType в примере платформа могла бы сама определить), ну и в таком духе из чего иногда получаются java проблемы вроде Борщ борщ new Борщ. |
|||
257
Mort
10.12.19
✎
10:14
|
Процедура ПриЧтенииСозданииНаСервере()
{ } |
|||
258
hi1C
10.12.19
✎
10:20
|
(257) в чем костыльность? простите я не понял
|
|||
259
hi1C
10.12.19
✎
10:31
|
(256) интересно, разработчики платформы так же отслеживают костыли?
|
|||
260
Mort
10.12.19
✎
10:33
|
(258) В том, что практически в каждой форме объекта эта конструкция нагорожена. Просто отсутствует удобный обработчик формы для заполнения реквизитов формы зависящих от данных объекта (вне зависимости от того новый он или нет).
|
|||
261
hi1C
10.12.19
✎
10:38
|
(260) меня фигурные скобки сбили с толку, типовые конфигурации?
|
|||
262
Bro
10.12.19
✎
10:47
|
(259) Интересный вопрос. Потому как природа человека такая что если он нашел workaround, он часто не то что не зарепортит, а наоборот будет ходить довольный какой он умный. :) Думаю при разработки типовых в 1С та же фигня.
|
|||
263
Конструктор1С
10.12.19
✎
10:51
|
(244) вообще фокспро СУБД, но использовалась она для тех же целей, что и 1с
|
|||
264
Конструктор1С
10.12.19
✎
10:55
|
(252) ну как это нет толку? Помнишь эпопею со ставками НДС в конце прошлого года? Добавилось новое значение перечисления СтавкиНДС, а меняли код в тыще мест. Этого не было бы, если бы расчет размера НДС был инкапсулирован в отдельном модуле. Тогда обошлось бы исправлением нескольких строк кода
|
|||
265
hi1C
10.12.19
✎
11:25
|
(264) это и без ООП можно реализовать
|
|||
266
pechkin
10.12.19
✎
11:29
|
сейчас вообще в моде функциональщина, там ооп не нужно
|
|||
267
pechkin
10.12.19
✎
11:29
|
(264) основная проблема в запросах, там никак общим модулем не обойдешься.
ибо функций для запросов нет |
|||
268
Конструктор1С
10.12.19
✎
11:33
|
(265) естественно. Я про то и пишу, что инкапсуляция возможна и без ООП
|
|||
269
Bro
10.12.19
✎
11:34
|
(266) функциональщина и наследование / полиморфизм (а это основа ООП) это строго говоря две перпендикулярные вещи.
|
|||
270
Конструктор1С
10.12.19
✎
11:36
|
(267) это уже вопрос написания кода и запросов. Достаточно оставить болезненную, но популярную манеру делать вычисления в запросе, и всё будет тип-топ. В отчетах на СКД можно подтянуть глобальную функцию, в простых запросах делать все расчеты при выборке
|
|||
271
pechkin
10.12.19
✎
11:38
|
(269) речь про то что ооп - это стейт, а функциональщина - это как раз отсутствие стейта
|
|||
272
hi1C
10.12.19
✎
11:47
|
(271) интересная статья на эту тему https://habr.com/ru/post/479238/
|
|||
273
Fragster
гуру
10.12.19
✎
11:49
|
(235) сама идея делать это циклом - тоже говнокод
|
|||
274
hi1C
10.12.19
✎
11:50
|
(270) текст запрос можно собирать
|
|||
275
hi1C
10.12.19
✎
12:01
|
Выжимка из https://habr.com/ru/post/479238/: Отсутствие эффектов это единственное требование, которое нужно соблюдать, чтобы программа была функциональной.
|
|||
276
Fragster
гуру
10.12.19
✎
12:04
|
(275) ну так не пиши инчего в базу тогда
|
|||
277
pechkin
10.12.19
✎
12:12
|
(274) это как раз bad practice
|
|||
278
pechkin
10.12.19
✎
12:12
|
(276) там решается через DI и проброса объекта записывающего в базу
|
|||
279
Fragster
гуру
10.12.19
✎
12:41
|
(278) нет, это не ФП.
|
|||
280
hi1C
10.12.19
✎
13:09
|
(277) коллеги подсказывают, что в ЗУПе применяется очень активно сбор текста запроса
|
|||
281
pechkin
10.12.19
✎
13:12
|
(280) зуп - это воообще сборник лютых bad practice
|
|||
282
pechkin
10.12.19
✎
13:13
|
(279) ну так сам объект пишущий не фп, а все останое фп
|
|||
283
Конструктор1С
10.12.19
✎
13:32
|
(280) ну это не значит, что надо делать также
|
|||
284
Paint_NET
10.12.19
✎
13:33
|
(280) Опыт подсказывает, что модули ЗУПа писали крайне упоротые наркоманы.
|
|||
285
Cyberhawk
10.12.19
✎
13:34
|
(273) А возведение в степень - не цикл?
|
|||
286
Fragster
гуру
10.12.19
✎
13:39
|
(285) не всегда, и что там в процессоре при этом происходит - хз вообще. Факт в том, что на языке платформы писать 5 операторов вместо одного - неправильно.
|
|||
287
palsergeich
10.12.19
✎
14:02
|
(284) Дык дело не в конфе.
Разработчики ЗУП для того что бы разрабатывать должны быть упороты так же как и законотворцы, если не дунуть то ничего не получится (Амаяк Акопян) |
|||
288
palsergeich
10.12.19
✎
14:03
|
(285) возведение в степень можно реализовать байтодрочерством, я помню на лабах в c++ мы делали такую хрень
|
|||
289
mistеr
10.12.19
✎
14:37
|
Поделюсь тем, что бесит меня, хоть костыля нет (и бесит в т.ч. потому, что и костыля не сделать). Невозможность обхода результата запроса (произвольного) без загрузки его целиком в память.
По сабжу. Не всё, что "могло бы быть в платформе", должно быть непременно в платформе. Например, ПроверитьПараметр() - вполне норм. |
|||
290
mistеr
10.12.19
✎
14:40
|
(289) Надеюсь, в фузине это не проблема )
|
|||
291
hi1C
10.12.19
✎
14:41
|
(289) ПроверитьПараметр - это было бы не нужно, если бы можно было типизировать параметры методов.
|
|||
292
pechkin
10.12.19
✎
14:42
|
а что значит ПроверитьПараметр?
|
|||
293
hi1C
10.12.19
✎
14:43
|
(292) см (218)
|
|||
294
mistеr
10.12.19
✎
14:46
|
(291) Нужно. Параметры бывает нужно проверять не только на тип. Но в слабо типизированных языках — ещё и на тип. Это нормально.
А бывает, не нужно проверять тип, например, любая коллекция годится. |
|||
295
hi1C
10.12.19
✎
15:16
|
(294) хотел написать про то что было бы хорошо если бы платформа проверяла тип, но передумал
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |