Вход | Регистрация
 

книга по правильному написанию алгоритмов и лайфхаки в 1С

книга по правильному написанию алгоритмов и лайфхаки в 1С
Я
   olo_lo1
 
09.08.19 - 10:08
подскажите пожалуйста: а есть ли где то по 1С что то наподобии книги Листа, по алгоритмам но на языке 1С: как правильно строить, всякие хитрости и лайфхаки, с точки зрения оптимизации кода, очень бы хотелось найти и поизучать.
или может портал такой.
 
 
   Cyberhawk
 
1 - 09.08.19 - 10:10
ИС
   XLife
 
2 - 09.08.19 - 10:10
   АгентБезопаснойНацио
 
3 - 09.08.19 - 10:14
алгоритм можно выразить на любом языке. Хоть на 1с, хоть на русском матерном.
   Фрэнки
 
4 - 09.08.19 - 10:16
портал ИС - плюсую (1)
например, вот такое недавно читал у них
http://catalog.mista.ru/public/1087149/
   olo_lo1
 
5 - 09.08.19 - 10:17
(4) спасибо, но этого мало и все разрозненно. а так что бы едино в 1 месте
   Фрэнки
 
6 - 09.08.19 - 10:25
(5) Это да, очень много там публикаций. Можно читать бесконечно. Я на ис подписался на дайджест - раз в неделю письмо приходит и там толпы статей.
   palsergeich
 
7 - 09.08.19 - 10:27
(5) начни со встроенной справки в конфигураторе.
Там достаточно много примеров и лайфхаков для начала
   VS-1976
 
8 - 09.08.19 - 10:33
(0) Начни с простого типа:

a = "Текст1";
b = a;
a = a + "2";
Сообщить( a );
Сообщить( б );

а = Новый Массив;
a.Добавить( "Текст1" );
b = a;
a.Добавить( "Текст2" );
Сообщить( a.Количество() );
Сообщить( b.Количество() );
   Mort
 
9 - 09.08.19 - 10:40
А что за книга Листа?
   VS-1976
 
10 - 09.08.19 - 10:42
(8)
а = -430;
б = 35456;
с = 0;

Если а Тогда
  Сообщить( "Это истина" );
Иначе
  Сообщить( "Это ложь" );
КонецЕсли;

Если б Тогда
  Сообщить( "Это истина" );
Иначе
  Сообщить( "Это ложь" );
КонецЕсли;

Если с Тогда
  Сообщить( "Это истина" );
Иначе
  Сообщить( "Это ложь" );
КонецЕсли;
   palsergeich
 
11 - 09.08.19 - 10:47
А = Истина;
Б = Ложь;
Сообщить(ЗначениеЗаполнено(А));
Сообщить(ЗначениеЗаполнено(Б));
   VS-1976
 
12 - 09.08.19 - 10:48
(8)
а = Новый ТаблицаЗначений;
а.Колонки.Добавить( "Число", Новый ОписаниеТипов( "Число" ) );
а.Добавить().Число = 10;
б = а[ 0 ];
а = Неопределено;
Сообщить( б.Число );
   Lama12
 
13 - 09.08.19 - 10:56
(0) Книга бессмысленна. Платформа на столько динамично развивается, что писать такие хитрости нет смысла.
   Cyberhawk
 
14 - 09.08.19 - 10:59
(6) Угу, и в четверг работа до обеда встает колом :)
   Вафель
 
15 - 09.08.19 - 11:04
никаких хитростей не нужно.
если требуется чуть более сложный алгоритм, значит нужно писать не на 1с
   Вафель
 
16 - 09.08.19 - 11:04
ну и привидение типов - это никакая не хитрость
   VS-1976
 
17 - 09.08.19 - 11:07
(16) Это просто нужно знать неявное приведение типов
Сообщить( ЗначениеЗаполнено( 0 ) );
Сообщить( ЗначениеЗаполнено( Неопределено ) );
   Вафель
 
18 - 09.08.19 - 11:08
(17) тут вообще никакого привидения нет. все есть в справке
   VS-1976
 
19 - 09.08.19 - 11:09
(18) Это так называется, понятно что это вызов у объекта функции
   Arbuz
 
20 - 09.08.19 - 11:12
Алгоритмы и хитрости - это не про 1с, это про перл и хаскелл - вот тут-то и книг навалом про то и другое.
   VS-1976
 
21 - 09.08.19 - 11:16
(20) У 1С есть только одна хитрость, в алгоритмах стараться максимально перекладывывать работу на С++ :)
   palsergeich
 
22 - 09.08.19 - 11:25
(17) вот с булево не так, как с остальными типами.
Ложь = 0
Но
Значение Заполнено (Ложь) <> ЗначениеЗаполнено(0)
Очень много кто на это напарывался)
   Вафель
 
23 - 09.08.19 - 11:30
Хотя в принципе есть некоторый лайфхаки.
Например, поэтапоное формирование больших строк
Раньше был реальный хак, а теперь есть СтрСоединить
   VS-1976
 
24 - 09.08.19 - 11:49
(23) Есть ещё лайфхак известный. По быстрому разбивает строку в массив

Функция Split( ПереданнаяСтрока, Разделитель ) Экспорт

    СтрокаДанных = ПереданнаяСтрока;
    СтрокаДанных = СтрЗаменить( СтрокаДанных, """", """""" );
    ЧислоВхождений = СтрЧислоВхождений( СтрокаДанных, Разделитель );
    СтрокаДанных = СтрЗаменить( СтрокаДанных, Разделитель, """},{""S"",""" );
    СтрокаДанных = "{""#"",51e7a0d2-530b-11d4-b98a-008048da3034,{" + СтрЗаменить( ЧислоВхождений + 1, Символы.НПП, "" ) + ",{""S"",""" + СтрокаДанных + """}}}";

    
    Возврат ЗначениеИзСтрокиВнутр( СтрокаДанных );
    
КонецФункции
   Has
 
25 - 09.08.19 - 11:53
https://its.1c.ru/
Инструкции по разработке на 1С
   H A D G E H O G s
 
26 - 09.08.19 - 12:06
Дарю хак для любого языка.

Функция должна возвращать структуру.
Всегда.
Процедур не бывает.
Структура должна содержать флаг успешности, описание ошибки и полезные данные (при необходимости)
   H A D G E H O G s
 
27 - 09.08.19 - 12:07
(26) можно ещё код ошибки для последующего реагирования.
Но именно расчет на структуру позволит вам гибко дописывать алгоритмы не переписывая все к еене матери.
   olo_lo1
 
28 - 09.08.19 - 14:32
(26) +++ хороший коммент, принял к сведению.
   palsergeich
 
29 - 09.08.19 - 14:36
(26) (27) оно то правильно, но это долгосрочная инвестиция. Куда как менее кардинальные вещи идут через боль
   palsergeich
 
30 - 09.08.19 - 14:36
(29) всем надо сейчас и вчера.
 
 Рекламное место пустует
   Garykom
 
31 - 09.08.19 - 14:46
(26) Ударился в функциональное программирование? А как же ООП?
   H A D G E H O G s
 
32 - 09.08.19 - 14:47
(31) Не грузи меня непонятными словами.
   Провинциальный 1сник
 
33 - 09.08.19 - 14:48
(26) Плюс тыща. Побочные эффекты функций - зло. Хочешь, чтобы подпрограмма что-то _делала_ - оформляй её процедурой. Хочешь при этом узнать результат - через параметры. А функция должна делать единственное, для чего она придумана математикой - возвращать одно значение (простое или составное), принимая один или несколько аргументов. Код резко станет понятнее и прозрачнее.
   ice777
 
34 - 09.08.19 - 14:49
(0) че за х..ня?
алгоритмы работают независимо от языка.
Другой вопрос- незнание самого языка и предметной области.
   ice777
 
35 - 09.08.19 - 14:51
(31) негоже конфигурасту думать о разных там.. влажных фантазиях Кнутов.
   Конструктор1С
 
36 - 09.08.19 - 14:51
(0) нет такой книги. На удивление в 1с не принято заморачиваться по поводу "совершенства" кода, как это принято в других языках. Есть только разрозненная информация во множестве источников
   Garykom
 
37 - 09.08.19 - 14:57
(33) Тогда уж минус.

Пойми что функция лучше когда возвращает не одно значение а структуру.
И значение можно получить из структуры.

Не надо перехреначивать код в куче месте (где используется старый вариант функции) если требуется допилить функцию для возврата еще одного или множества значений.
   ice777
 
38 - 09.08.19 - 15:00
(37) функция в 1с итак может возвратить что угодно.
Херачить структуру в каждую.. это маразм. Мне нужно 1 значение, если вылетит с ошибкой- устраивает, значит где-то ошибка, исправляем. Зачем плодить сущности?
   Garykom
 
39 - 09.08.19 - 15:04
(38) Это сейчас тебе надо одно значение от функции.
Потом потребуется еще одно, а функция уже используется в десятках и сотнях мест.

Будешь писать вторую отдельную функцию дублирующую первую? А конфа не слишком распухнет в итоге?
Не проще было бы поправить исходную функцию добавив туда в возвращаемую структуру еще одно значение, которое потом по ключу/имени легко получить.
   ice777
 
40 - 09.08.19 - 15:06
она у тебя скорее распухнет, если на каждую простую функцию структуру вешать.
Согласен, что для некоторых функций нужно бы изначально закладывать возврат структуры. Это вопрос уже не веры, а квалификации.
   Garykom
 
41 - 09.08.19 - 15:08
(40) От
Значение = МояФункция().Получит("Значение");

сильно не распухнет
   Провинциальный 1сник
 
42 - 09.08.19 - 15:09
(37) А я про что? Функция должна возвращать или простое значение, или составное (структуру или именованный список в семерке). И никакого изменения параметров.
   Garykom
 
43 - 09.08.19 - 15:10
(42) там в (26)
"Функция должна возвращать структуру. 
Всегда. "
   Конструктор1С
 
44 - 09.08.19 - 15:12
(39) за такой код нужно бить по рукам. Любая процедура/функция должна служить единственной цели. Функция должна возвращать единственное значение. О возвращаемом значении должно красноречиво говорить имя фукции
   ДенисЧ
 
45 - 09.08.19 - 15:15
(44) Функция ПолучитьСтруктуруСРезультатом_РасчетЗАрплаты()
Сойдёт?
   Garykom
 
46 - 09.08.19 - 15:15
(44) А потом будет еще одна функция и еще одна и еще одна... И все с одинаковым на 95% кодом внутри...
   Конструктор1С
 
47 - 09.08.19 - 15:15
(24) куда проще СтрРазделить()
   Провинциальный 1сник
 
48 - 09.08.19 - 15:19
(45) Не, функция должна называться РезультатРасчетаЗарплаты(<Параметры расчета>). Никаких Получить или Вычислить, и вообще обходится без императивов.
   Надо работать
 
49 - 09.08.19 - 15:19
Ох уж эти универсальщики, пишущие универсальным способом... Рукы поотрывав бы!
   Надо работать
 
50 - 09.08.19 - 15:23
   Сияющий в темноте
 
51 - 09.08.19 - 15:26
Функция может возвращать код ошибки для быстроты обработки.
Структура прекрасно передается в функцию как параметр и там заполняется,чтобы не плодить новые структуры,как в javascript,где с параметрами немного сложновато.
опять же,возврат структуры это прямой путь на грабли сборки мусора.
и очень хорошо писать результат в ту же структуру,куда параметры передали.
ну и универсальная функция Transfer для переноса параметров между структурами со сменой имени,и все становится просто и ясно.
   Arbuz
 
52 - 09.08.19 - 15:26
а объект со множеством свойств/методов как аргумент функции - это единственное значение?
   Провинциальный 1сник
 
53 - 09.08.19 - 15:27
(51) Нет уж. Хочешь менять параметры - пиши процедуру.
   АгентБезопаснойНацио
 
54 - 09.08.19 - 15:43
(39) вот надо мне разрешить видимость реквизита по условию. зачем мне структура с описанием ошибки?
Логично, что иногда надо знать, обработалось ли  или вылетело в ошибку - но там, где это надо - я так и напишу.
да в клюшкаш штатной структуры долгое время не хватало. Использовать список значений - это изврат, но иногда приходилось (в 1с++ стркутуру добавили). Но это не повод всегда использовать структуру.
Все мы (ну, почти все) знаем теорию реляционных БД, но иногда вынуждены идти на компромисс и применять денормализацию. Так и тут.
   Garykom
 
55 - 09.08.19 - 15:47
Да пишите как хотите, в разных случаях будут разные грабли.
Но все программисты обязательно на них наступят если будут писать/исправлять достаточно много разного кода.
   astrawalk
 
56 - 09.08.19 - 15:54
(0) Алогритм главное правильно придумать. А правильно его написать тебе помогут сообщения об ошибках.
   Провинциальный 1сник
 
57 - 09.08.19 - 15:55
(54) Список значений в 7.7 - по сути та же структура, к элементам можно обращаться по имени (заданному представлению), если кто не знал.
   VS-1976
 
58 - 09.08.19 - 16:09
(47) Проще конечно, но не всегда эта функция была в 1С
   Конструктор1С
 
59 - 09.08.19 - 16:15
(45) про уровни абстракции что-нибудь слышал?
1. Рассчитать зарплату
1.1. Рассчитать начисления
1.2. Рассчитать удержания
1.2.1. Рассчитать НДФЛ
1.2.2. Рассчитать страховые взносы
1.2.3. Рассчитать прочие удержания
...
если твой код пытается оперировать абстракциями уровня "космос" как примитивными значениями, то код у тебя просто ужасный, и лучше его никому не показывать

(46) с чего бы им появиться? Желание возвращать множество значений возникает только когда в функции мёд, кино и немцы. Если функция служит единственной цели, то она вернет одно значение, и это значение будет предсказуемым
   ДенисЧ
 
60 - 09.08.19 - 16:24
(59) Так я тебе и написал прототип функции верхнего ровня абстракции.
   Конструктор1С
 
61 - 09.08.19 - 16:31
(60) а завтра ты захочешь разнести логику начислений и удержаний по разным модулям, и вот тут-то начнется веселье...
   ДенисЧ
 
62 - 09.08.19 - 16:33
(61) А тебе кто-то запрещает оформить всё это функциями, а в верхней звать их по очереди? Это и есть уровни абсрации
   Dotoshin
 
63 - 09.08.19 - 16:34
(59) А почему у тебя страховые взносы к удержаниям относятся? Это же налоги, то есть отдельный уровень.
   Конструктор1С
 
64 - 09.08.19 - 16:47
(62) мне мешает соблюдение некоторых важных принципов написания кода. Начнешь ты свою функцию раделять, а там... упс. "Внезапно" окажется, что какая-нибудь табличка, нужная для расчета удержаний, инициализируется где-то в начале расчета начислений, заполняется где-то в середине расчета начислений, и потом ещё в трёх местах корректируется. И вот тут-то ты пойдешь писать эти уродливые функции, которые возвращают разные значения. А ещё через несколько доработок настанет состояние дзен говнокодерства: когда в одном месте меняешь, а в двух других местах, вроде бы и не связанных с первым, начинает ломаться.
   Конструктор1С
 
65 - 09.08.19 - 16:59
(63) это был лишь банальный спотолочный пример, а не выдержка из реальной программы. Могу иначе расписать
Черный ВАЗ и красный мерседес - легковые автомобили
Легковые и грузовые автомобили - автотранспорт
Автотранспорт и ж.д. транспорт - транспорт
...

Да, в этом примере тоже есть до чего докапаться, есть ещё множество видов транспорта. Но согласись, автотранспорт и черный ВАЗ должны стоять на разных полках.
   VS-1976
 
66 - 09.08.19 - 17:13
(65) Никто не запрещает писать в 1С используя "ООП" для подобных задач.
А вообще 1С без ООП ( наследование, частично решаемое расширением ) не торт... Дальше всё более будет походить на монстра...
 
 Рекламное место пустует
   3achem
 
67 - 09.08.19 - 17:20
(0) Самый главный лайфхак это вызов запроса в цикле! Очень ускоряет работу!
   olo_lo1
 
68 - 09.08.19 - 17:45
(67) это как ?
   palsergeich
 
69 - 09.08.19 - 17:47
(68) не даёт остыть Кешу.
Всегда горячий кеш под рукой
   Garykom
 
70 - 09.08.19 - 17:47
(64) Ничего страшного, со временем достигнешь дзена когда пофиг будет на глубину говнокода.
Нырять или нет будет зависеть только от предлагаемой суммы.
   Garykom
 
71 - 09.08.19 - 17:50
(70)+ Да есть хорошая методика ускорения выхода на этот уровень дзена!
Достаточно отказаться от применения отладчика, пару лет пострадаешь зато потом в голове будешь код отлаживать сразу в куче мест находящийся...
   Вафель
 
72 - 09.08.19 - 18:02
(64) так тесты нужно писать
   Garykom
 
73 - 09.08.19 - 18:05
(72)+ хотя бы в голове
   Вафель
 
74 - 09.08.19 - 18:06
(73) нет, именно что не в голове
   Garykom
 
75 - 09.08.19 - 18:23
(74) Тесты "не в голове" нужны когда над одним кодом много разработчикой трудятся, причем одновременно.
Если несколько по очереди в принципе тоже желательно но не обязательно, если скиллы последующего не меньше скиллов предыдущего.
   Вафель
 
76 - 09.08.19 - 18:27
(75) а как же рефакторинг?
   АнализДанных
 
77 - 09.08.19 - 18:56
(0) Часто использую такой лайфхак:

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

Работает так:

Если Ложь Тогда
  ТабЗначения = Новый ТаблицаЗначения;
КонецЕсли;

//далее нужный код
   Сияющий в темноте
 
78 - 09.08.19 - 19:05
проще,если не клиент и не сервер,тогда гарантированно выполняться не будет
   Cyberhawk
 
79 - 09.08.19 - 20:11
(76) В мире 1С не особо принято рефакторить. Тащить уродца до конца - вот кредо.
   Cyberhawk
 
80 - 09.08.19 - 20:13
(77) Вредные советы.
Гораздо кошернее некомпилируемый вариант:
    #Если Сервер И НЕ Сервер Тогда

        ЗаказПоставщику = Документы.ЗаказПоставщику.ПустаяСсылка();
        ТЗ = Новый ТаблицаЗначений;
    #КонецЕсли
   pavig
 
81 - 09.08.19 - 21:08
(26)
Маразм какой-то
   Mort
 
82 - 09.08.19 - 21:45
Что же за книга такая Листа, которой 80 постов аналог ищут. Подскажите товарищи эрудиты.
   Mort
 
83 - 09.08.19 - 21:49
(26) а в сильно типизированных ЯП мне нужно под каждую функцию свою структуру описывать?
   Злопчинский
 
84 - 09.08.19 - 21:52
(77) этому лайфхаку тыща лет в обед, это еще в 77 работало
   Злопчинский
 
85 - 09.08.19 - 21:53
в 77 даже еще кошернее можно было

ТЗ = ФункцияКотораяВозвращаетТЗ();//:ТаблицаЗначений
   АгентБезопаснойНацио
 
86 - 10.08.19 - 07:11
(84) лайфхак - использовать в 7.7 опенконф, а в 8.@ - турбоконф?


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.