Про простой и понятный код

03.12.21

Разработка - Рефакторинг и качество кода

Внимание! Данная публикация с большой долей вероятности не добавит ничего нового к Вашим знаниям и Вашему опыту, поэтому если Вы читаете Инфостарт исключительно для целей "прокачки" своих навыков, не тратьте на её чтение своё время и перейдите сразу к следующей!

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

Кстати, а как мы вообще тут оказались? Не в смысле как мы оказались на этой планете, а в таких вот обстоятельствах?

Давайте возьмём, например, такую, казалось бы, тривиальную операцию, как инкремент значения переменной. 

Когда-то давным-давно мастера "старой школы" писали код вроде этого:

А = А + 1;

Сейчас, конечно же, кроме "фу, цэ мерзость!" ничего про такой код и сказать нельзя. Но программисты в те далёкие времена не были ещё избалованы многочисленными фреймворками и БСП, поэтому писали как Кнут на душу положит.

Шло время, виски программистов старой школы седели, страницы книжки Макконнелла "Совершенный код" безвозвратно желтели, а прогресс не стоял на месте.
И вот в наши замечательные времена, чтобы выполнить инкремент, уже имеет смысл написать хотя бы что-то вроде этого:

А = ОбщегоНазначения.Инкремент(А);

В общем модуле ОбщегоНазначения разместить функцию:

Функция Инкремент(ИнкрементируемоеЗначение) Экспорт 
	
	Возврат МатематическиеФункцииКлиентСервер.ВыполнитьАрифметическуюОперацию(
				ИнкрементируемоеЗначение,
				1,
				МатематическиеФункцииКлиентСервер.ИдентификаторОперацииСложение()
				);
	
КонецФункции

И, соответственно, в общем модуле МатематическиеФункцииКлиентСервер следующие функции:

Функция ВыполнитьАрифметическуюОперацию(Операнд1, Операнд2, ИдентификаторОперации) Экспорт 
	
	Результат = Неопределено;
	
	Если ИдентификаторОперации = ИдентификаторОперацииСложение() Тогда
		Результат = Операнд1 + Операнд2;
	ИначеЕсли ИдентификаторОперации = ИдентификаторОперацииВычитание() Тогда
		Результат = Операнд1 - Операнд2;
	ИначеЕсли ИдентификаторОперации = ИдентификаторОперацииУмножение() Тогда
		Результат = Операнд1 * Операнд2;
	ИначеЕсли ИдентификаторОперации = ИдентификаторОперацииДеление() Тогда
		Результат = Операнд1 / Операнд2;
	Иначе 
		ВызватьИсключение "Неподдерживаемая операция " + ИдентификаторОперации;
	КонецЕсли; 
	
	Возврат Результат;
	
КонецФункции

Функция ИдентификаторОперацииСложение() Экспорт
	
	Возврат "Сумма";
	
КонецФункции

Функция ИдентификаторОперацииВычитание() Экспорт
	
	Возврат "Вычитание";
	
КонецФункции

Функция ИдентификаторОперацииУмножение() Экспорт
	
	Возврат "Умножение";
	
КонецФункции

Функция ИдентификаторОперацииДеление() Экспорт
	
	Возврат "Деление";
	
КонецФункции

Внимательный читатель может меня упрекнуть, что во-первых, по сравнению с передовыми методиками разработки, в данном примере слишком малое количество вложенных вызов процедур и функций (например, совершенно не используется потенциал общих модулей с суффиксами "Служебный", "ПовтИсп", "Переопределяемый" и т.п.), во-вторых, что параметры в вызываемые функции передаются как позиционные аргументы, хотя логично было бы упаковать их в структуру, преобразовать в строку таблицы значений, поместить во временное хранилище и потом хотя бы пару раз сериализовать-десериализовать из/в xml или json. Ну и наконец, самый очевидный минус - это то, что вызов идёт не через ДлительныеОперации.ВыполнитьВФоне(...)! Ведь пока "хрустит" весь этот код, пользователь должен иметь возможность насладиться анимацией с котиками! Абсолютно с этим согласен. Просто хочу заметить, что это не готовая разработка, а всего лишь иллюстрация идеи, так сказать концепт, сильно упрощённый учебный пример для демонстрации современных тенденций в 1С-программировании. И при этом, хочу заметить, что несмотря на все описанные недостатки, пример всё же вполне рабочий и инкрементирует исправно!

Что нас ждёт в будущем? Скажу честно, я не футуролог. Но судя по общим тенденциям, открывая Конфигуратор (да-да, его родимый, а не эту вечную бету буржуйской EDT) мы скоро увидим что-то вроде:

 

 

P.S. На всякий случай, если вдруг найдутся такие, кто не поймёт: это был САРКАЗМ!

 

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Нейросети Рефакторинг и качество кода Запросы Разработчик 1С 8.3 Абонемент ($m)

Нейросеть написала запрос или процедуру для вашей базы 1С, и непонятно, все ли имена в нём настоящие. Обработка компилирует текст без выполнения, сверяет его с метаданными этой базы и к каждой ошибке пишет настоящее имя, например ВНаличииОстаток вместо выдуманного КоличествоОстаток. Список ошибок с подсказками одной кнопкой копируется обратно в чат с моделью.

10 стартмани

02.11.2026    324    1    nedomolkov.ivan    1    

2

Рефакторинг и качество кода Разработчик 1С:Предприятие 8 Россия Бесплатно (free)

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

29.10.2026    350    YA_777378709    0    

4

Рефакторинг и качество кода Разработчик Бесплатно (free)

Рассказываем, почему качественный код – это не техническая прихоть, а актив, который помогает бизнесу быстрее адаптироваться к изменениям и запускать новые фичи без бесконечного преодоления техдолга. Показываем, как объяснить бизнесу ценность рефакторинга через понятные признаки: замедление разработки, неточные оценки, страх перед legacy и хрупкость системы. Разбираем, почему неправильный рефакторинг может быть дороже его отсутствия, какие анти-паттерны ломают процесс и как не превратить улучшения в бесконечную переделку ради переделки. Объясняем, как сделать рефакторинг частью культуры команды: договориться с бизнесом, научить разработчиков видеть проблемные места, закрепить правила и поддерживать улучшения на уровне тимлидов, архитекторов и всей команды.

28.10.2026    467    Pavel791    0    

2

Рефакторинг и качество кода HighLoad оптимизация Системный администратор Разработчик Стажер 1С 8.3 Абонемент ($m)

Если к HTTP-сервису 1С обращаются сразу несколько программ, сколько запросов в секунду он успеет обработать? Я опубликовала простой HTTP-сервис на нашей "подопытной" конфигурации «Нано-УТ» (файловая база, Apache, без прав администратора) и нагрузила его скриптом на Python. Ответ: около 15-16 запросов в секунду, сколько бы клиентов ни обращалось одновременно. Запросы ждут своей очереди, и при 32 клиентах ответ приходит через 2 секунды вместо 64 мс. Заодно разобрала скрипт из первого варианта статьи: он «проверял» сервер, который отвечал по одному, и считал ошибки вместе с успешными ответами. В архиве исправленный скрипт, учебный сервер, HTTP-сервис для 1С и инструкция по запуску.

1 стартмани

23.10.2026    503    Ninel_S    3    

2

Рефакторинг и качество кода Разработчик 1С 8.3 Абонемент ($m)

Запустили Analyzer 1C 2.7.65 на промышленной конфигурации (596 модулей, 13 669 функций) и исследовали перегруженные функции (до 1887 строк), циклические зависимости и экран «Циклы» (кольцо из 64 модулей). Разобрали, почему популярные метрики (McCabe, связность) не представлены в продукте вендора, и составили пошаговый план разделения модуля. Привели проверенный платформой 8.3.27 пример до и после рефакторинга и выявили скрытую ловушку загрузки модулей с точкой в имени.

9 стартмани

19.10.2026    442    Ninel_S    2    

2

Рефакторинг и качество кода EDT СКД Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)

Одиннадцать граблей схем компоновки, которые не видно в конструкторе и не ловит EDT, на реальных отчетах БП КОРП. Формат числа задается в двух местах, и условное оформление варианта перебивает формат поля. Ресурс складывает штуки с часами, и помогает выражение «только когда единица одна». Ресурс пуст в детальных записях, параметр не появляется в шапке без userSettingID, valueListAllowed ломает границы периода, Остатки и СрезПоследних с параметром периода падают с «Несоответствием типов», title без xsi:type дает «Исключение XDTO» при загрузке. В конце код проверки схемы из файла до обновления базы, сводная таблица и чеклист.

16.10.2026    501    Konstmax13    2    

2

Инструментарий разработчика Нейросети Рефакторинг и качество кода EDT Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)

Как ИИ-агент (Claude Code) работает в живом EDT-проекте 1С:Бухгалтерии КОРП 3.0: из чего собрать стенд с MCP-сервером для EDT, как ставить задачи агенту, где он ломает проект и какие проверки это ловят. Реальные случаи: рукописные метаданные, ронявшие конфигуратор; четыре дня зависшего обновления из-за порядка блоков в Rights.rights; ошибки, которые EDT пропускает, а платформа нет; сплошная сверка вместо «вроде работает». В приложении шаблон CLAUDE.md, шаблон правила, чеклист перед обновлением базы и скрипты проверки ролей и схем СКД.

15.10.2026    3431    Konstmax13    11    

11

Рефакторинг и качество кода Тестирование QA Разработчик 1С 8.3 Абонемент ($m)

Инженерный анализ влияния (Impact Analysis) при изменении общего метода в 1С:Предприятии: почему штатный поиск ссылок скрывает 99% зависимостей и как обратный обход графа вызовов выявляет 370 скрытых потребителей на глубине 3 уровней. В статье — верификация сквозной цепочки обмена с маркетплейсом; в архиве-компаньоне — автономный BFS-анализатор на Python, слепки графа и план регрессионного тестирования.

1 стартмани

12.10.2026    314    Ninel_S    0    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. reset2 20 03.12.21 17:33 Сейчас в теме
Не ной. Запутанность кода в типовых конфигурациях - увеличивает ценник на программистов.
P.S. На всякий случай, если вдруг найдутся такие, кто не поймёт: это был САРКАЗМ!
silly; Maneki; serejkin; teyana; MaxTolya; oleg-m; sergant500; DrAku1a; FesenkoA; kirabr; programmarket; ~Ponk@~; +12 –5 Ответить
2. Leon75 03.12.21 22:10 Сейчас в теме
(1)А содержание десятков пустых функций и процедур в БСП просто написано шрифтом белого цвета.
serejkin; torbeev; sergant500; DrAku1a; Award; ice-net; FesenkoA; San4eZ1C; maxim_1c; ipoloskov; awk; t278; +12 – Ответить
8. muskul 06.12.21 09:29 Сейчас в теме
(1)Скоро ценник и сложность повысится настолько что за исправление простой вещи (например что бы упд помещалась на одну страницу надо убрать разделитель строк) будут брать по 10 тысяч, а заказчики крутить у виска и слать куда подальше
Romkin25; sergant500; DrAku1a; ASKiselev; ice-net; AlexGr00vy; rusmil; +7 – Ответить
20. RustIG 1990 06.12.21 11:18 Сейчас в теме
(8) почему "скоро"? - это уже наступило сейчас...
об этом как раз статья, имхо
Romkin25; AlexandrN; sergant500; DrAku1a; ASKiselev; ice-net; +6 – Ответить
23. muskul 06.12.21 11:26 Сейчас в теме
(20)Вот и непонятно зачем. Неужели те кто "руководит" не понимают что это не нужно, зато пилят непонятных котиков.
25. RustIG 1990 06.12.21 11:32 Сейчас в теме
(23) в части усложнения архитектуры и логики программ спорный вопрос - я бы разделил алгоритмы и методики программирования для конфигураций - для файловых режимов, для клиент-серверных режимов и для веб-клиентов....
сейчас разработчики стараются вместить в одну конфу все технологии, чтобы можно было одну конфу использовать в любом режиме... отсюда и усложнение ...
159. serejkin 29.12.21 21:45 Сейчас в теме
(25) ИМХО сейчас разработчики бесятся с жиру... ибо "горе от ума" проглядывается с каждой новой рев. БСП
после крайнего обновления вообще ошалел от количества "закладок" при этом тайминг выполнения кода увеличилась, а утилизация ресурса сервера просто лишает слов и приличных выражений...
потратили 2 недели и это еще не все чтоб оптимизировать исполняемый код
160. RustIG 1990 29.12.21 22:24 Сейчас в теме
(159) все верно, только сегодня запускал оценку производительности при запуске КА 2.4 - нашел все "кислые" алгоритмы - на которые тратится много времени и ресурсов только для того, чтобы открыть конфу (!)
для тестирования своего расширения я 50 раз запустил открытие КА 2.4 повторюсь - для тестирования печатной формы в расширении... и каждый раз у них выполняется ненужный кусок кода по 5 минут
3. 7OH 90 03.12.21 23:28 Сейчас в теме
За ЕДТ отдельный плюс бы поставил.
А так да - всё по сути: чтобы передать соседу по столу соль - надо обязательно выехать из города и уже оттуда вернуться по точному указателю - где, кому, что и когда передать.
silly; Albert_2008; Romkin25; user747979; sergant500; JohnyDeath; DrAku1a; METAL; dabu-dabu; korppinen; AlexGr00vy; Areal; Dem1urg; frkbvfnjh; Трактор; mrChOP93; t278; Batman; provadyuga; +19 – Ответить
4. cdiamond 212 06.12.21 08:23 Сейчас в теме
Понятно что примеры упрощенные, но пропускать СКД непростительно. Функция ВыполнитьАрифметическуюОперацию должна была выполнятся на SQL сервере с помощью СКД и механизма представлений, что-то вроде ВЫБРАТЬ Результат Из Представление_Операция ГДЕ "Операция" = ИСТИНА
ЧИА; silly; Albert_2008; Romkin25; sergant500; JohnyDeath; frkbvfnjh; tindir; Dementor; ixijixi; itoptimum; +11 – Ответить
5. ipoloskov 165 06.12.21 08:47 Сейчас в теме
Сарказм понятен, но когда же в 1С будет оператор А+=1? Чай, не в каменном веке живем. Каждый раз матерюсь, когда приходится писать что-то вроде
ГармоничнаяПеременнаяСохраненияСостоянияПроцессаПользователя­ = ГармоничнаяПеременнаяСохраненияСостоянияПроцессаПользователя­ + 1;
Да и типизация не помешала бы. Хотя бы опционально (хочешь - указывай, хочешь - нет)
tdml; Feelthis; Артано; unknown181538; korppinen; ice-net; Cерый; Areal; shard; Dementor; itoptimum; +11 – Ответить
9. dehro 15 06.12.21 09:36 Сейчас в теме
(5)Длина имени переменной тоже минус. Конечно нужно называть переменные так, чтобы было понятно следующему программисту, но не перегибать палку.
11. portwein 06.12.21 09:48 Сейчас в теме
(9)
но не перегибать палку
разработчики Spring Framework на Java с Вами бы не согласились. Уж они то умеют назвать классы и интерфейсы в 50 - 70 символов.
12. dehro 15 06.12.21 09:54 Сейчас в теме
(11) И что?
Преимущества какие? Код становится трудночитаемым. А иногда даже неверно читаемым.

А так ограничений нет, можно и 150 символов в идентификаторе забодяжить.
Olenevod; Areal; +2 – Ответить
111. portwein 07.12.21 18:54 Сейчас в теме
(12)
Преимущества какие?
Это не преимущество. Просто у них выхода нет. В моем понимании 20 - 30 символов, это самый максимум, иначе строка разрастается и взглядом понять ее сложно (а в строке может быть пара переменных и вызов метода).
13. ipoloskov 165 06.12.21 10:13 Сейчас в теме
(9) тут дело даже не в длине переменной, а в потенциальной возможности ошибки. Всегда можно ошибиться и написать
ЗеленыйЧайСМолоком = ЗеленыйЧайБезМолока + 1
Если используется конструкция ЗеленыйЧайСМолоком += 1, то такая ошибка исключена.
15. dehro 15 06.12.21 10:20 Сейчас в теме
(13) Конечно, конечно. Про длинные имена переменных я писал же:
...иногда даже неверно читаемым...


Только вот с инкрементом это никак не связано.
Если боитесь запутаться в именах переменных: напишите функцию в глобальном модуле Инкремент(аЗначение, аДельта=1)

Лёгкий бред, конечно. Но переубедить называть переменные так, чтобы не путаться не получится((
Darklight; +1 – Ответить
18. Sashares 35 06.12.21 10:33 Сейчас в теме
(13)
Если используется конструкция ЗеленыйЧайСМолоком += 1, то такая ошибка исключена.

Да бросьте, с чего вдруг ошибка будет исключена? Вы больше эту переменную не используете в коде?
Если не используете, зачем тогда инкремент?
А если используете, то на одно использование меньше, это вообще ни о чем.
Используйте Ctrl+пробел, если у вас есть опасения в потенциальной возможности такой ошибки.
19. ipoloskov 165 06.12.21 11:17 Сейчас в теме
(18) скажем так - ошибка исключена в этой строке
21. Aftee 06.12.21 11:21 Сейчас в теме
(13) Следуя вашей логике, будет такая ошибка:
ЗеленыйЧайБезМолока += 1
Darklight; +1 – Ответить
129. oleg-m 10.12.21 07:27 Сейчас в теме
(13) Для этого есть подсветка текущего идентификатора в редакторе кода.
Olenevod; pavlov_dv; +2 – Ответить
49. panvartan 06.12.21 16:03 Сейчас в теме
(9) какой смысл, если ПеречислимыеСвойстваОбъектовМетаданных.РежимИспользованияСинхронныхВызововРасширенийПлатформыИВнешн­ихКомпонент
16. 7OH 90 06.12.21 10:29 Сейчас в теме
(5)
ГармоничнаяПеременнаяСохраненияСостоянияПроцессаПользователя­

ГармоничнаяПеременнаяСохраненияСостоянияПроцессаПользователя­­ = ? + 1;
salt7; user_Andryushka; Dementor; ipoloskov; +4 – Ответить
81. mrChOP93 100 07.12.21 05:41 Сейчас в теме
(16) это же подтвержденный баг платформы и в будущих релизах от него должны избавиться, если не ошибаюсь.
90. 7OH 90 07.12.21 10:36 Сейчас в теме
(81) Ой, я вас умоляю )
Паузу допроситься не можем 10-й год.
А тут "баг", который не выложен на трекере.
Плюс, уверен, там на этот "баг" внутри завязаны фундаментальные вычисления (отсыл к острову с вентиляторами).
danjer74; +1 – Ответить
93. 7OH 90 07.12.21 10:53 Сейчас в теме
(91) Ааа.
А я ищу на публичном - там этого бага нет.
Зато есть "Зарегистрирована: 20.11.2014" ;)
Ну и хорошо, если не переедет в раздел "не является багом" - они его очень любят
158. serejkin 29.12.21 21:37 Сейчас в теме
(90) какой 10й? мы еще в бородатом 2001 просили Сергея Нуралиева добавить... на что тогда получили ответ "мы подумаем".
как то говориться: "а воз и ныне там"
73. shard 293 06.12.21 21:55 Сейчас в теме
(5)еще по непонятной причине в запросах 1с отсутствуют функции abs и sign... сколько раз уже в типовых куски кода вида
ВЫБОР КОГДА Расчеты.Долг < 0
					ТОГДА -Расчеты.Долг
				ИНАЧЕ Расчеты.Долг
			КОНЕЦ
tdml; ELInfinito; sergant500; 7OH; bilex; +5 – Ответить
84. Darklight 38 07.12.21 10:08 Сейчас в теме
(5)Следуя статье автора - я бы просто ввёл функцию, о боже, глобального модуля, о чёрт, с коротким именем "Инк" (зато давно устоявшимся, хотя уже и подзабытым), и инкрементировал ей так как это было ещё до Си - Инк(А); Инк(ГармоничнаяПеременнаяСохраненияСостоянияПроцессаПользователя­­);
Например у меня давно есть такие глобальные функции как ЗЗ(Значение,ИгнорироватьПримитивные=Ложь,РежимПустого=0), НЗ(Значение), ЗН(Значение, ЗначениеПоУмолчанию=неопределено,ИгнорироватьПримитивные=Ложь,РежимПустого=0), Лог(Текст, Статус=неопределено, Приоритет=неопределено, Режим=неопределено, Данные=неопределено, Метаданные=неопределено), ОТ(ТипИлиИмяТипа,Длина=неопределено,ТочностьИлиРежим=неопределено,Знак=неопределено) - да читающему может быть поначалу не понятно, но таких функций не много, и они очень сильно ускоряют ввод кода - а с быстрым привыканием и его анализ.
Есть ещё подобны не глобальные, но давно думаю сделать их таковыми
Массив1(ЕдЗначение=неопределено), Свойство(Коллекция, ИмяСвойства, ЗначениеПоУмолчанию=неопределено, РежимПоУмолчанию=0, ДобавлятьВСлучаеОтсутсвия=Ложь), Скопировать(Коллекция, Рекурсивно=Истина), Кешировать(Ключ, ВычислениеЗначенияСтрока), ДополнительныйПараметр(Имя, ЗначениеПоУмолчанию=неопределено, Дата=неопределено, Организация=неопределено, Пользователь=неопределено, Узел=неопределено)
И некоторые другие....
Потому что, очень часто они используются!
Будь язык посовременнее - я бы из забацал как хэлперы/расширители для соответствующих типов, или даже инъекцировал бы в базовые прототипы этих типов!

Ну а хотя бы опциональная типизация да - не помешала бы - но это уже стопудово совсем другой язык выходит - 1С Исполнитель
ipoloskov; +1 – Ответить
156. sashocq 195 23.12.21 16:38 Сейчас в теме
(5) Я для себя держу в арсенале набор глобальных функций для более-менее крупных проектов. В том числе глУвеличить(Число, НаСколько = 1). В результате код у меня выглядит так:
глУвеличить(ГармоничнаяПеременнаяСохраненияСостоянияПроцессаПользователя­);
ipoloskov; +1 – Ответить
6. Yashazz 4931 06.12.21 08:49 Сейчас в теме
Чтобы понять, какой будет 1С 9.Х, достаточно присмотреться к языку Исполнителя и глянуть вот это https://wonderland.v8.1c.ru/blog/novaya-tekhnologiya-razrabotki-prilozheniy/.
И конфигуратор будет выглядеть примерно так: https://wonderland.v8.1c.ru/upload/medialibrary/637/6378e3412d39efef3a5a6a1d073a8ad5.png
CratosX; RustIG; zqzq; ipoloskov; +4 – Ответить
31. ixijixi 2177 06.12.21 12:35 Сейчас в теме
(6) Опять переучиваться =((
Четвертый раз на моей памяти: 7.7 - 8.0 - 8.3, теперь вот это вот всё.
85. Darklight 38 07.12.21 10:10 Сейчас в теме
(31)кто-то ещё припомнить 6.0 и 7.0
vadeem_13; +1 – Ответить
154. Поручик 4611 23.12.21 09:46 Сейчас в теме
(85) Я помню не только 6.0, но и один из первых ДОСовских вариантов и даже ТурбоБухгалтер. Макроязык, просто чудо. В последний раз с 6.0 сталкивался в 2006 году, когда поправлял счёт-фактуру у заказчика. Это магазин музыкальных инструментов. Благополучно работает много лет, ни один кризис и пандемия не свалили.
155. Darklight 38 23.12.21 10:25 Сейчас в теме
(154)До 6.0 разве были существенные изменения в ЯП 1С Предприятие - про которую тут речь?
По-моему 6.0 была первой вехой в серии - и вообще первой платформой, получившей название 1С Предприятие. Но допустим... раз сохранили нумерацию с предшествующими платформами с именами 1С Бухгалтерия - то были ли кардинальные изменения в системе "программирования" 1С Бухгалтерии 1.0 - 5.0 у кого-то сохранившиеся в памяти - навряд ли - потому что программирования так как такового то и не было вовсе! Первые зачатки только стали появляться с 1С Предприятие 6.0
7. Трактор 1297 06.12.21 09:06 Сейчас в теме
Разработчики из 1С читают Инфостарт. Минус поставили. Не любят они...
m_aster; sergant500; gucci76; FesenkoA; Lemmonbri; portwein; +6 – Ответить
27. RustIG 1990 06.12.21 11:36 Сейчас в теме
(7) читают и смеются
33. ixijixi 2177 06.12.21 12:37 Сейчас в теме
(27) Примерно так
Прикрепленные файлы:
teyana; m_aster; FesenkoA; Darklight; shard; +5 – Ответить
35. capitan 2609 06.12.21 12:43 Сейчас в теме
(33)Может так ?
Romkin25; METAL; FesenkoA; +3 – Ответить
37. ixijixi 2177 06.12.21 12:44 Сейчас в теме
(35) Я не смотрел Нашу Рашу (это же она?), так что не могу уловить юмор
38. пользователь 06.12.21 12:45
Сообщение было скрыто модератором.
...
39. пользователь 06.12.21 12:47
Сообщение было скрыто модератором.
...
10. dehro 15 06.12.21 09:43 Сейчас в теме
Почему сарказм? Чистая правда:
Прикрепленные файлы:
tdml; CratosX; Vinzor; ice-net; Romakon92; gucci76; mrChOP93; shard; frkbvfnjh; FesenkoA; Dementor; +11 –1 Ответить
22. Aftee 06.12.21 11:23 Сейчас в теме
128. oleg-m 10.12.21 07:12 Сейчас в теме
(10) Функции-константы - популярный и полезный прием в программировании. Что смущает?
Артано; pavlov_dv; +2 – Ответить
131. dehro 15 10.12.21 11:02 Сейчас в теме
(128) Динамически изменяемая константа (например, версия библиотеки) это нормально.
Даже можно понять дату изменения параметров учёта.

Функцию Отчет() которая всегда возвращает "Отчет" понять не могу.
135. oleg-m 11.12.21 14:29 Сейчас в теме
(131)
Функцию Отчет() которая всегда возвращает "Отчет" понять не могу.


Заменили литерал на ссылку. Что тут непонятного?
Артано; +1 – Ответить
138. Darklight 38 13.12.21 13:57 Сейчас в теме
(135)На самом деле это интересный паттерн. Просто пока в 1С от него толку не много - как он используется. Но в целом - это очень даже мощная практика. Она позволяет как минимум две(три) вещи:
1. Произвести дополнительные операции при получении результата - от логирования и контроля доступа, до каких-то более хитрых операций ветвления. Кстати иногда может быть полезно и для отладки и отслеживания/поиска мест вызова.
2. Произвести подменю объекта - или даже просто произвести конструирование нового объекта, или произвести настройку типового.
То есть в первом случае это что-то типа эмуляции полиморфизма.
Во втором случае - эта фича перерастает в паттерн фабрик-классов.
Но да - без своих классов это дело трудное. Хотя - вот можно обработками, например, эмулировать.
Понятно - что такое вмешательство нужно не всегда и не всем - но когда это понадобится - то всё уже будет готово и не нужно будет перелопачивать весь кода - отсюда вытекает и:
3. Преемственность и прочность структуры кода - если в будущем возвращаемое значение изменится - не нужно будет (лукавлю конечно) переделывать все места применения, но получение нового значения - ведь функцию то они будут вызывать общую. При необходимости тут ветвление-версионирование организовать можно будет.
Причём (если совместимость конфигурации позволяет) - то эти функции можно менять не только напрямую, но в расширениях.
Но это всё в теории (и практике на других платформах программирования) - в 1С всё это далеко не так красиво работает. Но целом в таком подходе ничего плохого нет. Вот был бы ещё полноценный ООП.....
144. oleg-m 14.12.21 08:32 Сейчас в теме
(138) Очень сильно усложняете. Все же просто...

Ссылка вместо литерала полезна, например, при производстве кода:

- позволяет однозначно найти всех потребителей константы (например, командой "Найти использование", вместо глобального поиска по тексту) и, соответственно, найти потребителей текущей подсистемы (библиотеки)

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

- упрощает отладку

...и много чего еще

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


Вот был бы ещё полноценный ООП.....


Это уже будет другой продукт, со своей историей (удачной или нет). Будет ли он с такой же рентабельностью для конечного потребителя приносить ему пользу - вопрос очень спорный.
Артано; +1 – Ответить
145. Darklight 38 14.12.21 09:47 Сейчас в теме
(144)
Очень сильно усложняете. Все же просто

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

Это уже будет другой продукт

С Этим не спорю - ООП - никогда не будет в типовой 1С Предприятие 8. Я просто сказал - что ООП XXI века вместе с данным подходом открыл бы поистине колоссальные возможности!

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

ОПП всегда был спорной парадигмой. Но сейчас ООП + функциональное программирование - это основа современного программирования. Фактически наступило перемирие между двумя самыми рьяными противниками - теперь у них симбиоз! Да и тот, не особо "красивый" ООП от Smaltalk до C++ уже почти канул в лету - сейчас в ООП наступила гармониям высокоуровневое упорядочивание.

Да и не стоит говорить, что ООП вообще нет в 1С - он есть ещё с 1С 7.0 - поросто его почти нельзя кастомно расширять - а от этого теряется бОльшая часть всех преимуществ его наличия. Сейчас в других платформах программирования ООП в тренде (как и функциональные аспекты) - было бы опрометчиво не включить его полноценную современную поддержку в новые продукты 1С с ЯП - так эти продукты были бы более понятны и более привлекательны новой волне современных программистов, которые уже со школы изучают ООП, и очень расстраиваются - когда нет его поддержки - к хорошему привыкаешь быстро!

А ещё на ООП базируется АОП (хотя частично можно и без него - и это делается уже в 1С хотя бы на примере Расширений конфигурации) - полноценного аспектного программирования очень нехватает в 1С Предприятие - это сильно упростило интеграционные моменты, модификацию и сопровождение модифицированного "типового" программного кода и метаданных.

Но ООП, конечно, не панацея - нужно и сами типовые конфигурации и библиотеки грамотно выстраивать с его применением. И на курсах прививать преимущества его использования - нужно перестраивать менталитет существующего 1С сообщества - а вот это куда сложнее. Когда человек привыкает ходить на карачках - неимоверно трудно приучить его ходить прямо, и обосновать что так гораздо удобнее и надёжнее!
Ну и ООП - это лишь некоторое удобство по выстраиванию алгоритмов. Само по себе оно 1С Предприятие не превратит в революционную новую платформу (в отличии, например, от параллельного и тем более распределённого программирования например на промисах/тасках).
Тут нужны более кардинальные изменения в принципах построения и интеграции и метаданных, и программного кода, и пользовательского интерфейса.
Поэтому я ратую не за расширение ЯП 1С8 - а за полный переход на новые ЯП, принципиально отличные от нынешнего. Тоже и с метаданными и способом их интеграции друг с другом - но этот будет уже совсем другая платформа!
14. Hans 3 06.12.21 10:18 Сейчас в теме
Программисты горе от ума.
17. capitan 2609 06.12.21 10:31 Сейчас в теме
Вспоминается...
В деревне программистом называют того кто умеет включать компьютер.
Полностью согласен с автором. В принципе лучший стиль программирования это А = А + ААВ + ААБ
Кто вообще использует осмысленные имена переменных, тех надо гнать из программистов.
А взамен набирать водителей автобусов.
У них будут переменные У002УО77 + Х003УМ78
Главное чтобы в глухом далеком селе программисты 1С не грустили, что им логика непонятна из-за большого количества буков.
Кстати с точки зрения не умеющего читать эта статья вообще полная фигня.
Отсюда мораль - надо не буквы писать а смайлики
За это автору и минус
Надо было написать 1С гы гы гы лол и все бы все поняли
Да и компьютеры это бесовское наваждение
Всю бухгалтерию можно спокойно вести на счетах и с налоговой проверкой проблем не будет.
Артано; m_aster; Поручик; tindir; +4 –14 Ответить
24. пользователь 06.12.21 11:27
Сообщение было скрыто модератором.
...
26. Hans 3 06.12.21 11:35 Сейчас в теме
(17) Тут вроде посыл об усложнении на ровном месте?
30. capitan 2609 06.12.21 12:09 Сейчас в теме
(26)Не все то, что вы не понимаете, является усложнением.
Кто то не может понять логику андронного коллайдера, а кто то десятичных дробей.
У каждого свой порог вхождения
При этом на ИС есть раздел Курилка, где можно вполне запостить такую статью и собрать бурю оваций
Но никак не Приемы и методы разработки - Практика программирования
И да. Мастера старой школы НИКОГДА не писали А = А + 1
По той простой причине что
1. переменные шли нижним регистром
2. а надо было предварительно объявить и типизировать
3. односимвольные переменные рекомендовались ТОЛЬКО КАК счетчики циклов и для этого были общепринятые буквы, какие попробуйте ответить за х мин
4. было ++а, зачем оно было нужно попробуйте ответить за х мин
это вам потом пригодится чтобы понять почему ТекстЗапроса = ТекстЗапроса + ... это нехорошо даже в мире 1С

А = А + 1 можно было встретить в лабораторных студентов 1 курса идущих в армию

И я не считаю ровным местом проект на котором работает 100+ программистов
Артано; m_aster; Yashazz; +3 –1 Ответить
32. Hans 3 06.12.21 12:35 Сейчас в теме
(30) спрошу более прямо. Зачем из а = а + 1 делать Общиймодуль.Инкремент(а).
34. capitan 2609 06.12.21 12:39 Сейчас в теме
(32)Спрошу еще прямее.
Слышали про ООП ?
Что то вроде
public final class Integer
extends Number
implements Comparable<Integer> ?
Кто вам сказал что а это не Справочник.Контрагенты например ?
Поручик; +1 –1 Ответить
40. Hans 3 06.12.21 12:51 Сейчас в теме
Ничего об этом не знаю.
45. capitan 2609 06.12.21 13:54 Сейчас в теме
(40)Тогда у вас есть два пути
1. Узнать
2. Примкнуть к автору публикации и до старости бегать накатывать обновления на 1С и костерить программистов 1С
68. Hans 3 06.12.21 17:08 Сейчас в теме
(45)
1. Узнать


Слышали про ООП ?
Что то вроде
public final class Integer
extends Number
implements Comparable<Integer> ?


ни на одних курсах Одинес этого ничего нет. Насколько это нужно? большой ли от этого выхлоп? И какому уровню прошраммиста 1С (Джун, мидл, синьер) эти знания соответствуют?
69. capitan 2609 06.12.21 17:30 Сейчас в теме
(68)Ну вот вы ответили на вопрос о выборе пути
95. Трактор 1297 07.12.21 12:01 Сейчас в теме
(69) классный ответ. Тут собрались 1Сники. Это их путь.
Остальным - в горы!
Прикрепленные файлы:
98. capitan 2609 07.12.21 12:24 Сейчас в теме
(95)Может вы и не обратили внимание, когда регистрировались, но ИС это в принципе ресурс для 1Сников.
140. Darklight 38 13.12.21 14:09 Сейчас в теме
(32)В таком виде смысла особого может и не быть. Хотя.... вы знаете точный тип значения в а? и точно знаете - что а + 1 отработает согласно заложенной логике данной операции?
Кстати, в функции Инкремент несть несменное преимущество - именно в том, что она ФУНКЦИЯ
функция Инк(Знч, Пред=Истина) экспорт
     предЗнч = Знч;
     Знч = Знч + 1;
     возврат ?(Пред<>Ложь,предЗнч,Знч);
КонецФункции
М = Массив(100);
А = ПолучитьСтартовуюПозицию();
Б = 0;
М[Инк(А)] = ПолучитьЗначение(Инк(Б));
М[Инк(А)] = ПолучитьЗначение(Инк(Б));
М[Инк(А)] = ПолучитьЗначение(Инк(Б));
М[Инк(А)] = ПолучитьЗначение(Инк(Б));
М[Инк(А)] = ПолучитьЗначение(Инк(Б));
М[Инк(А)] = ПолучитьЗначение(Инк(Б));

А = ПолучитьСтартовуюПозицию2();
Б = 0;
Пока М[А] = неопределено Цикл
     М[Инк(А)] = ПолучитьЗначение2(Инк(Б));
КонецЦикла;
Показать


Это надуманный пример - но тем не менее - мне кажется он достаточно хорошо отражает суть таких подмен
141. Hans 3 13.12.21 14:14 Сейчас в теме
(140) нельзя использовать выражения функций в параметрах.
142. Darklight 38 13.12.21 14:23 Сейчас в теме
28. RustIG 1990 06.12.21 11:39 Сейчас в теме
(17) у вас тонкий юмор... не все поймут ваш сарказм...
29. capitan 2609 06.12.21 12:02 Сейчас в теме
(28)Вспоминается...
В кинотеатре. — Врач! В зале есть врач? — Я врач! — Что за фигню нам показывают, коллега?
Мне и не надо чтобы все поняли.
Мне надо чтобы поняли врачи )

На Хабре люди более категоричны в суждениях.
Там считают что массовый наплыв экспертов в области программирования связан с появлением широкополосного интернета в отдаленных деревнях страны.

В принципе это видно и по комментарующим
6 лет на ИС - 0 плюсов
12 лет на ИС - 1 плюс
Поручик; +1 – Ответить
44. reset2 20 06.12.21 13:15 Сейчас в теме
(29) самый интересное, что так считают эти самые иксперты, которые наплыли
163. o.nikolaev 219 24.02.23 14:06 Сейчас в теме
(29) А потом начинаешь задавать вопросы "категоричным экспертам с Хабра" и выясняется, внезапно, что кроме понтов никакой экспертностью и не пахнет. Но, экспертно рассуждают про "деревни" и "водителей автобусов". Пусть им в конце-то концов. Всевышний любит разнообразие.
53. dehro 15 06.12.21 16:21 Сейчас в теме
(17)Чё сказать-то хотел?
Что куча вложенных вызовов подпрограмм удел программистов из глухого дальнего села?
54. Yashazz 4931 06.12.21 16:31 Сейчас в теме
(17) 1С и так в весьма изрядной степени "гы гы гы лол".
103. FesenkoA 61 07.12.21 15:28 Сейчас в теме
(17) Окей, УНФ, типовая, релиза где то начало 2020 года (это на случай если уже там все по-другоому)

ну во-первых 3 обработки подбора номенклатуры в документ (в реализацию, поступление, перемещение) а аткже отдельная (!) общая форма для списания. В этой общей форме список номенклатуры (динамический список), запрос которого переопределяется динамически кодом. В обработке поступления и реализации запрос не перопределяется, в перемещении - не помню.Но помню что после поиска (поле вверху) открывается ДРУГОЙ динамический список. И еще один динамический список с динамическим запросом для характеристик.

Зачем? Вот как без знаний конфы, не помня об этом быстро разобраться в таком коде? Когда работаешь на конечника - выучил и работаешь, а если франч? Сегодня дорабатываешь типовую УНФ, завтра доработанную 2016 года, послезавтра УТ на 8.1, потом КА... Или программист должен знать все версии БСП, и все конфы сделанные на ней?
104. Aftee 07.12.21 16:42 Сейчас в теме
(103)
Вот как без знаний конфы ... разобраться в таком коде?

Легко!
Слышали про ООП ?
Что то вроде
public final class Integer
extends Number
implements Comparable ?

Ну там еще на самом деле куча всякого. В общем, идите накатывать обновления на 1С
122. FesenkoA 61 08.12.21 10:55 Сейчас в теме
(104) Отлично, вместо того чтобы запилить в 1С нормальный ООП, программное создание интерфейсов (метаданных) в том числе и на основании существующих и допилить нормальный полиморфизм - в процедурном языке изгаляются разными фантазиями на тему "а давайте создадим форму настройки полностью программно, вот все остальные конструктором, а одну - программно!" или "а давайте к каждой форме допилим модуль динамического изменения запроса, в 50 формах использовать не будем, а в одной будем, почему так - ну просто) ".
130. oleg-m 10.12.21 07:43 Сейчас в теме
(122) Т.е. ваш бурный полет фантазий на "нормальном ООП" будет проще разобрать?
143. FesenkoA 61 13.12.21 15:12 Сейчас в теме
(130) Можно ООП не использовать, а писать по старинке, но зачем натягивать сову на глобус?)
36. FesenkoA 61 06.12.21 12:44 Сейчас в теме
Вы что, используете математические операции в 1С??!!!!
Какой кошмар!
Мы пошли дальше, у нас есть тремерный массив, где певый массив [i]- это массив простых чисел, второй массив [j] - массив простых чисел, на пересечении [i] [j] третий массив, каждый элемент которого - это результат математических операций (сложение, вычитание, умножение, процент, степень, логарифмирование итд). Все значения проиндексивароны и записаны в регистр сведений, где измерение - хеш, а показатель - индекс операции. Нам достаточно обратиться к этой базе данных с указанными действиями, она найдет хеш такого же действия, и по индексу операции найдет [i] [j] [к] значения.
segatron; FuJluH; ipoloskov; EvgeniyOlxovskiy; pbabincev; tindir; +6 – Ответить
55. Yashazz 4931 06.12.21 16:33 Сейчас в теме
(36) Я вообще не понимаю, почему люди продолжают писать операторы арифметических операций, когда с 8.3.10 есть нормальные побитовые сдвиги и все бинарные действия! Ну что за пионерство колхозное, аж прям стыдоба.
CratosX; Slava.62.ru; FesenkoA; +3 – Ответить
105. Alxby 1161 07.12.21 18:06 Сейчас в теме
(55)Не претензии ради, а в качестве разминки для ума: как реализовать сложение побитовыми сдвигами и бинарными операциями? и как работать с отрицательными числами (тут вспоминаем про дополнительные и обратные коды)?
41. capitan 2609 06.12.21 12:56 Сейчас в теме
Вспомнилось...

Люди делятся на 8 типов:
1) ++i;
2) i++;
3) i+=1;
4) i=i+1;
5) i:=i+1;
6) inc(i);
7) add eax, 1
8) Что это?
CratosX; Darklight; +2 – Ответить
57. dehro 15 06.12.21 16:37 Сейчас в теме
(41) И что тут правильного? Замаскированное нецензурное слово?
Детский сад, младшая группа.
mrChOP93; +1 – Ответить
63. capitan 2609 06.12.21 16:48 Сейчас в теме
(57)Видимо для вас надо обязательно писать САРКАЗМ
64. WorkerPavel 06.12.21 16:53 Сейчас в теме
(41) А как же ваше же
это вам потом пригодится чтобы понять почему ТекстЗапроса = ТекстЗапроса + ... это нехорошо даже в мире 1С
106. Alxby 1161 07.12.21 18:24 Сейчас в теме
(41)нет, это не так интересно), гораздо интереснее i+ = i++ + ++i;
Но причем здесь 1С?
ведь можно вспомнить и
(* 2 2),
и int 20h,
и даже DAD D,
но зачем?
Со статьей, кстати, согласен. Хорошо бы авторам таких "шедевров кода" посчитать трудозатраты на создание и поддержку такого кода, желательно в рублях.
frkbvfnjh; +1 – Ответить
108. capitan 2609 07.12.21 18:40 Сейчас в теме
(106)Интереснее

Как тебе такое Илон Маск ?
109. Alxby 1161 07.12.21 18:42 Сейчас в теме
(108)Ну, это больше на внимательность.
110. capitan 2609 07.12.21 18:45 Сейчас в теме
(109)Почему же на внимательность ? Как раз на знания )
112. Alxby 1161 07.12.21 18:55 Сейчас в теме
(110)Ну, тогда можно сказать что и 20 - 10*0.5 = 5!!
113. capitan 2609 07.12.21 18:57 Сейчас в теме
(112)
20 - 10*0.5 = 5!!

5!! ?
Взлетит?
114. Alxby 1161 07.12.21 18:58 Сейчас в теме
(113)Почему нет? Взлетит конечно. 5!! <> (5!)!
116. Alxby 1161 07.12.21 19:05 Сейчас в теме
117. Alxby 1161 07.12.21 19:13 Сейчас в теме
Какая-то ссылка незаметная получилась. Дублирую: https://ru.wikipedia.org/wiki/Двойной_факториал
118. Alxby 1161 07.12.21 19:21 Сейчас в теме
(110)Если интересны задачки для 1С с применением математических знаний, то, в качестве рекламы: https://infostart.ru/1c/articles/1175267/, задачи №4 и №6
119. capitan 2609 07.12.21 20:40 Сейчас в теме
120. Alxby 1161 07.12.21 20:48 Сейчас в теме
(119)Да, спасибо, я видел) Мой комментарий был не только для Вас.
121. tindir 08.12.21 05:02 Сейчас в теме
(110)Вот любите вы, математики, все переусложнить! НАм с 4 классами церковно-приходской это сложна!
starik-2005; +1 – Ответить
146. Darklight 38 14.12.21 09:52 Сейчас в теме
(106)
нет, это не так интересно), гораздо интереснее i+ = i++ + ++i;

Зачем Вы тут пробелы поставили - без них же занятнее (хотя что-то под С++ у меня без пробелов:
i=1;
i+=i+++++i;
Чему будет равно i?
Но это всё пережитки прошлого - такое надо запрещать прям в IDE - впрочем на практике такое почти никогда не встречается - только как головоломка, обычно в задачках на знание принципов синтаксического разбора ЯП, который такое допускает!
147. Darklight 38 14.12.21 12:09 Сейчас в теме
(146)(хотя что-то под С++ у меня без пробелов не компилируется)
i+=i+++++i;
Может уже внесли коррективы с компилятор - чтобы запрещал такое! Хотя помню в институте на курсе Си таким грузили на коллоквиумах - хотя точно пример уже и не вспомню! Хотя, вот, под Python скомпилировалось и отработало!
Ну да ладно - меня больше удивило другое - это ответ если написать так
var i = 1;
i+=i++ + ++i;
C# = 5
C++ = 7
Python = 3
JS = 5
Java = 5
Kotlin = 5
Swift = не поддерживает ++
Удивительными являются результаты С++ и Python - но для C++ компиляторов свойственно выпендриваться - тут нет четкого правила разбора таких выражений и разные компиляторы могут разбирать по-разному - но я попробовал и VS и Online - везде было 7
Но почему Python выдал 3? Проигнорировал все инкременты "++" - вот такая вот особенность работы Python, в котором нет переменных (там даже такой код i+=++++i; вернёт 2 ; а такой вообще не отработает i+=i++;)
А вот 7 в C++ куда забавнее
А вот такой код
i = 1;
i = i++ + ++i;
Выдаст 5
А такой
i = 1;
i = ++i + ++i;
Выдаст 6
i += i + ++i;
И такой выдаст 6
Не логично?
Другие ЯП выдадут в первом случае 5, а во втором 4
Вот и думай после такого - а надо ли оно вообще?
Лично я бы посчитал
i = 1;
i+=i++ + ++i;
Как 7 - т.е. с моей точки зрения прав С++
У меня логика такая - считаем выражение справа
i = 1;
v1 = i; //получаем значение i до инкрементирования, та как ++ стоит справа - и является постфиксной унарной операцией, т.е. сначала нужно вернуть значение в выражение, а потом применять операцию к источнику значения) = 1
i = i + 1; //i++ = 2
i = i + 1; //++i - а тут мы сразу применяем операцию к источнику и только потом возвращаем значение из источник (уже изменённого)
v2 = i; // = 3
r = v1 + v2; // 1 + 3 = 4
И осталось добавить правый результат к левому (но там i - который к этому моменту уже изменился на значение 3)
i = i + r; // = 3 + 4 = 7

Если по-другому считать слагаемые - ведь их можно считать независимыми - ведь для сложения не важно в какой последовательности посчитаны его операнды
i = 1;
i = i + 1; //++i = 2
v2 = i;
v1 = i;
i = i + 1; //i++ = 3
r = v1 + v2 //=4
i = i + r //3 + 4 = 7

Но как в других ЯП выходит 5 - просто так отрабатывает += - значение i фиксируется = 1 до подсчёта правого выражения
i = 1;
v0 = i;
v1 = i; // =1
i = i + 1; //i++ = 2
i = i + 1; //++i = 3
r = v1 + v2; // 1 + 3 = 4
И осталось добавить правый результат к левому (но там i - который к этому моменту уже изменился на значение 3)
i = v0 + r; // = 1 + 4 = 5

Это объясняет как получается 5 и 4 в жвух других примерах соотвественно на языках, отличных от С++ - а как С++ в этих двух других примерах получает 6

Да потому что C++ считает с права на лево
i = 1;
i += i + ++i;
Это
i = i + 1;
v2 = i; // = 2
v1 = i; // = 2
r = v1 + v2; // = 4
i = i + r; // = 2 + 4 = 6

ну и

i = 1;
i = ++i + ++i;
Это
i = i + 1;
v2 = i; // = 2
i = i + 1;
v1 = i; // = 3
r = v1 + v2; // = 5
i = r; // = 5
А реально выходит 6

Причём так
i = 1;
i = i + i++;
Будет 3 = 2 + 1 Ок

А так
i = 1;
i = i + ++i;
Будет 4 = 2 + 2 Ок

И даже так
i = 1;
i = i++ + ++i;
Будет 4 = 2 + 2 Ок

Так уже
i = 1;
i = ++i + i++;
Будет 5 =/= 3 + 1 = 4

Совсем я запутался в этих выражениях....
Да и прошу прощения за оффтопик....

Унарные операции это конечно хорошо - но их применение в выражениях может быть весьма нетривиально понятным!
Вот как и в примерах выше - где-то я согласен со значениями, получаемыми в C++ - а где-то согласен со значениями в других ЯП
Ну а в 1С такое вообще не написать даже с ?-ками
149. Alxby 1161 14.12.21 17:53 Сейчас в теме
(147)Во-первых, если операцию "++" считать функцией, то очевидно, что она не является чистой - у нее присутствуют побочный эффект, да еще какой! А во-вторых каждый язык каждая реализация языка по-своему интерпретирует момент времени, когда надо производить инкремент - перед началом вычисления выражения, или перед обращением к значению переменной. Также возможно компилятор может оптимизировать выражение, нарушив тем самым порядок вычислений. Как ни странно, в 1С тоже можно столкнуться с подобными проблемами - если в логическом выражении с "Или", "И" используются нечистые функции, то их выполнение может быть пропущено, и не будут выполнены необходимые побочные действия.
150. Darklight 38 15.12.21 12:23 Сейчас в теме
(149)Не все функции обязаны быть чистыми. И не всегда стоит считать операции функциями.
По поводу ЯП - спорить не хочу - просто про С++ читал что у них там разнобой даже в рамках разных компиляторов. Другие ЯП все отработали одинаково - кроме Питона - у него самый непривычный результат!
Но дело в другом - вот даже разные комбинации операторов в разных ЯП отрабатывают не так как ожидается - в ЯП мне нравятится как одни сочетания операторов в выражении отрабатывают - в других - как другие - вот это больше всего и напрягает! Хочется порядка, и чёткого выполнения операторов! Но да - когда есть побочные эффекты - с этим всё сложно становится! Но инкремент/декремент - уж больно полезные операторы - и часто используемые в ЯП где они есть.
По мне так в настройках проекта должна быть опция - как считать выражения - слева на право или справа на лево. И ЯП обязательно должны быть выделены функции, с побочным эффектом (когда значение передаётся по ссылке - это уже сразу намёк на побочный эффект, в случае надобности - можно помечать это отдельно или наоборот помечать - что даже при наличии передачи по ссылке - функция не имеет побочного эффекта; аналогично - некоторые операторы не являются симетричными - для них тоже важна чёткая последовательность - это тоже должно быть помечено) - тогда если выражение не имеет побочного эффекта в своих членах - то его оптимизатор ещё может как-то оптимизировать по своему усмотрению - даже распараллеливать вычисления. Но если пробочки есть - то только прямое вычисление согласно заданному направлению в настройках - всё должно быть под контролем программиста и он должен чётко знать об этих нюансах!
Соответственно все операторы и функции должны вычисляться в строгой последовательности.

"Или", "И" используются нечистые функции, то их выполнение может быть пропущено, и не будут выполнены необходимые побочные действия

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

Лично мне нравится иной подход - когда все операции над данными сводятся к двум вариантам:
1. Функции - всегда чистые (могут не иметь явного возвращаемого значения - тем самым заменяя процедуры)
2. Команды - чаще всего не чистые, но не обязательно (при этом могут неявно принимать несколько выражений, причём как левых так и правых - это задаётся в их определении; а так же могут влиять на поток выполнения)

И те и другие могут быть глобальными (или локальными в текущем контексте), так и заданными у объектов (так сказать - персонально определённые, в этом случае переопределяющие глобальные, но не локальные).

Все остальные операции над данными сводятся только к последовательному применению данных объектов.

Из ключевых слов - возможно стоит только оставить операции определения различных сущностей и выделения ветви кода (отдельного потока инструкций) - всё остальное по сути сводится к командам.
Соответственно все мат. операции лучше считать командами - значит не стоит из считать 100% чистыми!
Так же всякие циклы и условные операторы - это всё тоже нужно считать командами - они тоже не 100% чистые!
Но команда может быть помечена - как 100% чистая - тогда это даст возможности компилятору к оптимизации её применения!

Пример:
def command send (message) -> Console.Writeln(message)
(1..100) -> elm % 2 ? elm send "odd" ~> elm send "even"
151. Darklight 38 15.12.21 17:07 Сейчас в теме
(150)Пример не удачный я привёл - в тот момент не было времени подумать.
Вот лучше такой - как бы правильно развернуть запись
i+=i+++++i

которую без пробелов почти ни один их протестированных мною ЯП вообще не компилирует (что я считаю правидльно, что не компилируют - несколько не буквенно-цифровых операций подряд ВСЕГДА должны быть друг от друга отделены символами табуляции или буквенно-цифровыми элементами - искусственное ограничение дающее понимание - ну или IDE самодельна тут же в конце ввода (строки) принудительно расставить пробелы - как запись поймёт анализатор) - иначе они должны восприниматься как единая операция (в данном случае "+++++" - если такая будет определена - то она имеет право на существование)
Я считаю, что такие короткие математически операции (хотя не обязательно могут быть арифметическими - ведь i - формально может быть любого типа, строкой, коллекцией, портом ввода-вывода - главное чтобы данные операции над данным типов и экземпляром были определены) вполне себе допустимы и легко читаемы (i += i++ + ++i), тем не менее - строго в командах это выглядело бы так:
i add getinc i add incget i

и вот так если расставить скобки - согласно области действия команд (тут add правая команда с операндом, а две другие левые команды без операнда - это всё помечено при определении команд)
i add ( (getinc i) add (incget i) )

Каждая такая команда является атомарной (помечена при определении) - это важно при параллельном выполнении (либо оптимизируется отдельной инструкцией процессора, либо блокирует объект на время выполнения от других параллельных потоков).
В итоге на высоком уровне абстракции это всё может транслироваться в следующий поток инструкций
v1 = memmngr.newmem(typeof(i))
typeof(i).getinc(i)
set v1 
v2 = memmngr.newmem(typeof(i))
typeof(i).incget(i) v2
typeof(i).add(v1,v2)
typeof(i).add(i,v2)
memmngr.freemem(v1)
memmngr.freemem(v2)
Показать

Здесь уже команды превращаются просто в статические вызовы подпрограмм (функций)
И все они не является чистыми!
Подразумевается, что все команды есть у тип экземпляра i - используются его собственные реализации команд
(v1,v2 - адреса ячеек памяти - я тут не уточняю как и где они выделяются и освобождаются, все операции идут через неявную буферную ячейку результата)
152. Alxby 1161 15.12.21 21:08 Сейчас в теме
(150)Не надо так делать (я имею в виду фокусы с i++). Вообще не надо. И в 1С не надо писать вот так:
Функция Инкремент(а)
	а = а + 1;
	Возврат а;
КонецФункции 

Это все хорошо в исследовательских целях, в институте или в качестве развлечения, но не в бизнес-программировании.
153. Darklight 38 16.12.21 10:19 Сейчас в теме
(152)Ну вот - заговорили о бизнес программах!
Тогда уж давайте упомяну то - что я за то, что все программы (алгоритмы) которые можно встретить в учетной системе лучше сразу разделить на несколько направлений программирования - отличных по ЯП и правила построения кода:
1. Алгоритмы обработки данных
2. Алгоритмы взаимодействия с системами хранения данных
3. Алгоритмы построения пользовательского интерфейса
4. Алгоритмы описания нечёткой логики для AI системы
5. Алгоритмы описание бизнес логики прикладного уровня
6. Алгоритмы описания самотестирования

У каждого направления свои цели и свои подходы в написании алгоритмов!
Но замечу, что математические операции так или иначе свойственны всем направлениям. И операция инкремента вполне себе имеет право на существование как математическая операция. Хотя таковой не совсем является - ибо наделена побочными эффектами. Просто так уже сложилось в среде многих ЯП - эта операция очень старая и очень популярная! Но в сложных выражениях как "i+=i++ + ++i" она встречается крайне редко.
Но замечу, что при грамотном современном проектировании ЯП (и его базовых библиотек) - потребность в этой операции действительно можно свести к минимуму - но пока наиболее частое применение это что-то вроде такого кода

arr = new Array[src.Count];
var i = 0;
while src.Next() 
{
     arr[i++] = src.Data;
}


Просто экономия листинга кода без снижения его понятности - часто такие простые циклы ещё пишу в одну строку - и я не вижу в этом ничего плохого

arr = new Array[src.Count];
var i = 0;
while src.Next()  arr[i++] = src.Data;


Коненчо - можно было это сделать циклом for (

arr = new Array[src.Count];
for (var i = 0 ; i < src.Count ; i++)
{ 
     src.Next();
     arr[i] = src.Data;
}


Но мне такой код нравится меньше

Хотя можно было бы и так

arr = new Array[src.Count];
for (var i in (0..src.Count) )
{ 
     src.Next();
     arr[i] = src.Data;
}


Но мне больше нравится вот такая фантастическая форма
arr = new Array[src.Count];
(0..src.Count) -> next src, arr[i] = src.Data;


Ну и в идеале так
arr = Array();
(src.Data) -> arr


Хитрый декларативный код выше направляет поток src (выделяя из него поле Data) в поток arr - определение размера ту не важно - они оптимизируются при кодогенерации - так что тут в итоге буде что-то типа первого примера с циклом "while".
Вот так должен выглядеть такой алгоритм на ЯП бизнес логики по моему мнению - коротко - минимум деталей к тонкостям устройства обращения к потокам и знания того, как они устроены - просто инструкция - требующая переместит (скопировать) указанное содержимое из одного источник в другой. В таком коде потребность в операциях "++" будет минимальна (но я бы всё равно их ввёл бы - скорее как дань традиции большинству ЯП).

Ну и как написал выше - я за то, чтобы отделять функции от команд - функции лучше всегда считать чистыми - без побочных эффектов. Команды - всегда считать априори возможно имеющие побочные эффекты. Тогда операция "++" не должна быть функцией - это команда ("++" - это синтаксическая обёртка для вызова атомарной команды "getinc" или "incget" - как я и показал в предыдущем посте) с побочным эффектом (на то она и команда - она вызывает внутренний процесс в объекте своего применения).
Как и в примере выше команда "next" - для смещения позиции менеджера потока на следующий элемент - тоже команда с побочным эффектом - но про команды не стоит говорить "побочный эффект" - это скорее целевое действие!

И ещё - замечу - что "++" - это атомарная команда - т.е. неделимая! Это важно в ЯП, когда есть параллельные потоки (какими бы они не были - реальными потоками ОС или их эмуляцией на корутинах - квазипотоки с управляемым самой платформой ЯП переключением активного контекста выполнения). Такая операция не может быть прервана переключением контекста выполнения - что исключает ошибки параллельного доступа к неполностью сформированному значению. В машинных командах для такой операции даже есть отдельная инструкция процессора. Виртуальные машины тоже выполняют её всегда целиком!
Конечно такую запись "i+=1" и такую "i=i+1" тоже можно оптимизировать в атомарную инструкцию - но вот в большинстве ЯП они не являются выражением - ведь суть атомарной инструкции инкремента в том, чтобы не просто изменить значение - но и вернуть (либо строго предыдущее, либо строго новое, даже если оно параллельно меняется в другом потоке) - поэтому инкремент это не процедурная команда - а функциональная - возвращающая гарантировано точный результата, согласно своему описанию!

Ну а современный мир программирования - это асинхронность и распределённость - и следующая платформа 1С не должна упустить этот тренд в своём развитии!
42. coollerinc 189 06.12.21 13:00 Сейчас в теме
Я не понял, автор ноет и ругает типовые конфигурации за усложнение и кучу однообразных процедур и функций? Ну так по-другому невозможно в процедурном языке и для поддержания модульности. Если кто то этого не понимает, для чего это усложнение делается, то вы отстаете от прогресса современных конфигураций 1с.
Артано; capitan; +2 – Ответить
43. capitan 2609 06.12.21 13:07 Сейчас в теме
(42)Все правильно вы поняли
Забавнее сколько +/- наберет эта публикация
46. RustIG 1990 06.12.21 13:57 Сейчас в теме
(42) Автор не ноет. На ИС нет нытиков.
Откуда такая тенденция пошла - токсично отвечать оппоненту - написавшему пост или статью сразу приписывают ярлык "нытика"?
Мы же не считаем, что вы ноете или оправдываете глупость с умным видом в этом месте:

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


Вы просто высказали свое мнение, а мы просто его прочитали без навешивания на вас ярлыков.... Это так легко - просто делиться мнениями....
uri1978; Трактор; mrChOP93; +3 – Ответить
47. coollerinc 189 06.12.21 15:28 Сейчас в теме
(46) согласен с вами, погорячился. Сейчас исправлю свой коммент.
Блин на изменение дается 30 минут всего.
Короче, не хотел обидеть автора. Просто хотел высказаться в защиту усложнения конфигураций и считаю, что в 1с идут правильным путем
87. Darklight 38 07.12.21 10:15 Сейчас в теме
(47)Осталось выяснить - это правильный путь куда? И насколько он прямой?
61. Yashazz 4931 06.12.21 16:45 Сейчас в теме
(46) Ну вот я старательно отыгрываю мрачного злобного критикана, токсичного до невозможности. Некоторые даже верят))
Ах да, да. Статья фигня, околопредметная болтовня, не понимаю, откуда столько плюсов. И комменты флуд сплошной. Беспредел, короче.
67. RustIG 1990 06.12.21 17:04 Сейчас в теме
(61) у вас предметная критика - порой необходимая, чтобы оппонент притормозил -задумался,
а у других встречается личная : "не ной", "нытик" и т.д.
имхо, это токсично во всех смыслах...
ITSun; mrChOP93; +2 – Ответить
127. ITSun 09.12.21 15:36 Сейчас в теме
(67) "Не ной", "нытик" - это скорее неуважение (рядом с оскорблением), попытка возвыситься за счет унижения другого.
96. Трактор 1297 07.12.21 12:05 Сейчас в теме
(46) можно взглянуть иначе
Это capitan ноет, что есть люди, которых не устраивает излишняя запутанность типовых решений.
99. RustIG 1990 07.12.21 13:06 Сейчас в теме
(96) вы верно заметили, что он пишет с сарказмом
что есть люди, которых не устраивает излишняя запутанность типовых решений.


но он не "ноет" ... само слово "ноет" и "нытик" - токсично на форумах ...

так и про меня можно написать - что я "ною", что кто-то употребляет слово "ноет".....

а можно без этого слова взаимодействовать?
102. Aftee 07.12.21 15:00 Сейчас в теме
126. ITSun 09.12.21 15:34 Сейчас в теме
(46) Лучше ответить откуда и зачем пошло слово "токсичность".
От демагогов и манипуляторов, которым неудобны определенные комментарии.
:)
48. programmarket 06.12.21 15:40 Сейчас в теме
Все нормально с типовыми. При использовании расширений постоянно появляется мысль - придется использовать Изменение&Контроль, а могли бы и это в отдельную процедуру вывести.
88. Darklight 38 07.12.21 10:16 Сейчас в теме
(48)Вот даже не знаю плюсовать или минусовать такой комментарий - или тут не хватает слова "САРКАЗМ" - тогда надо плюсовать, наверное
50. profiprog1c 260 06.12.21 16:11 Сейчас в теме
Статья веселая, посмеялся)) А так да, все новые конфигурации специально усложняются, как по мне, для двух целей. Первая: поднять порог вхождения, чтобы были оправданы курсы, обучения, мастер классы и прочие связанные с этим вещи, ну возможно чтобы показать, что и 1С может быть сложно. И вторая цель, это отсекание бухгалтеров, сисадминов и прочих не программистов, которые в той же 7-ке самостоятельно могли менять что-то в печатных формах, какие-то простые вещи. В 8-ке на обычных формах все это было усложнено, ну и все конфигурации с интерфейсом такси завершили этот процесс. У меня есть знакомый, он не программист, но на 8-ке на обычных формах пытался там какие-то простейшие вещи делать, мелкие обработки, но вот на конфигурациях с такси его энтузиазм иссяк, говорит теперь слишком сложно и ничего не понятно.
v3132; frkbvfnjh; +2 – Ответить
52. frkbvfnjh 825 06.12.21 16:21 Сейчас в теме
(50) У меня тоже такое впечатление складывается, что усложнение делают намеренно, но верить в это не хочется, ведь изначально 1С боролась за другую философию - что бы уровень вхождения был минимальным и изменения в конфигурацию могли вносить в том числе и сами бухгалтера. И ведь раньше даже считалось, что на 1С не программируют, а конфигурируют, и что стало теперь?
56. profiprog1c 260 06.12.21 16:35 Сейчас в теме
(52) Во времена 7 так и считалось. Но потом подходы поменялись, возможно по объективным причинам. В любом случае, усложнение в новых такси делается намеренно, как по мне, а конкретно причины нам конечно никто не скажет, хотя основная цель это деньги, потом уже остальные производные.
79. tindir 07.12.21 04:30 Сейчас в теме
(52)ИМХО абсолютно неверное впечатление. Есть коллеги, которые не понимают и ненавидят механику работы с данными в ЗУП3 (когда все складывается в ВТ через вызов общих модулей с передачей структуры), а я прям "владошкихлопал", когда осознал как это работает. Ведь это настолько удобно! тебе не надо хранить кучу "заготовок" для разработки (как было например в ЗУП2.5). Нужны текущие данные по сотрудникам? ОК. Инициализировал МВТ, вызвал общий модуль, все, у тебя есть данные о сотрудниках, пиши свою логику дальше. По поводу "однострочных" вызовов - это стандартная декомпозиция и инкапсуляция. Сложно конечно представить, что может возникнуть потребность "переключить" механизм расчета НДС, но вот с этим же шаблоном/паттерном разработки очень весело и легко было переключить механизм хранения тех же файлов. Для конечного "пользователя" НИЧЕГО не поменялось, а файлы хранятся вообще подругому ;).

И конспирология вида - они усложняют, что бы было сложно и оттого дорого - это какой-то детский максимализм.
Octopus; mrChOP93; +2 – Ответить
89. Darklight 38 07.12.21 10:24 Сейчас в теме
(52)Да они и сейчас борются за лёгкость вхождения в профессию (но очень специфично борются) - не хотят усложнять язык - делая его привычным и удобным современным программистам - зато с радостью усложняют код на этом языке! Тут скорее всего война старой гвардии и новой волны - старпёры не хотят меняться - новички - не хотят изучать динозавров - от того идёт отток программистов из мира 1С, а новых (чтобы надолго) приходит мало!
В итоге - придётся ждать когда старая гвардия внутри компании 1С окончательно отойдёт от дел - главное чтобы новая волна к тому времене не успела интеллектуально разложиться и перегореть - вот тогда и стоит ждать новых веяний и, вероятно, новую платформу 1С Предприятие 9 (или под другим именем) - ранее кардинально менять ЯП внутри 8-ки никто не будет! Хотя, небольшие изменения в ЯП можно было бы сделать - но это уже будет как минимум 8.4 - а даже её что-то не торопятся выпускать (хотя даже анонсировать успели, как успели уже поскорее забыть про эти анонсы). Хотя... вон асинхронные (почти бесполезные в нынешнем виде) вызовы всё-таки внесли в ЯП не меняя версию редакции платформы 8.3 на 8.4 - что в очередной раз говорит, что со скоростью улитки ЯП 1С всё-таки развивается, не меняя редакции - но по мне - так это всё как мёртвому припарки!
Аналогично - в последнем релизе платформы (8.3.20) внесли новые функции в язык запросов (а несколько лет назад - даже новые синтаксические конструкции) - развитие есть - или это только видимость развития - на многочисленные стоны и жалобы сообщества?
58. Yashazz 4931 06.12.21 16:38 Сейчас в теме
(50) Согласен. Когда запрос собирается по 10 разным функциям, потом ещё временки в него пихаются, всё это в фоновом, которое вызвано из другого фонового, а на клиенте через стопицот описаний оповещений... Да ещё "Асинх", да ещё в модели сервиса или хоть в расчёте на веб-клиент... Тут любой бухгалтер пасует и зовёт крутых спецов! Которые потом тоже вкуривают двое суток вместо часа, как было на 8.2 хотя бы...
segatron; FesenkoA; +2 – Ответить
92. Darklight 38 07.12.21 10:52 Сейчас в теме
(58)Я вот, вообще сетую за кардинальное изменение в подходе к программированию прикладных решений. Я за разделение ЯП 1С (помимо языка запросов) на целых два:
1. Типизированный - для описания "математических" алгоритмов обработки данных и всякого рода относительно низкоуровневого взаимодействия.
2. Императивно-функционально-декларативный - для описания логики выполнения и взаимодействия процессов с высоким уровнем абстракции. Эдакий ЯП 4-го или в идеале уже 5-го поколения!

Если с первым ЯП более-менее понятно - для меня тут сейчас некий "условный" эталон - это С# или Kotlin или Python или TypeScript.
То второй - должен сохранить трендовую структуру императивно-функционального стиля программирования - но являться декаларативным (не исполняться на прямую, а анлизтироваться умным AI-компилятором-транслятором) с целью получения итоговой логики исполнения - и уже на её основе долже генерироваться конечный код (с применением базы знаний эффективных шаблонов алгоритмов и статистики реального исполнения алгоритмов в конечной прикладной среде) - с максимальной оптимизацией (более того такой итоговый код может даже динамически меняться со временем - по факту накопления реальной статистики и улучшению шаблонов кода).

Но это не всё.
На таком ЯП и исходный декларативный код будет достаточно абстрактным - не конкретным - часто оперирующим не полностью определёнными сущностями - например группой полей (не зная фактического состава) - или интефейсами (не зная какие реальтные объекты на за ними скрываются, и как вообще эти объекты собираются - из скольких частей) или требованиями к выборке данных - не зная фактического запроса к СУБД!
И это и усложнение и упрощение одновременно!
Усложнение в том - что нет чёткого представления о фактического коде - он полностью динамический! Отладка его может бытть затруднительной.
Упрощение в том - что код описывается условно декларативно, т.е. есть некая единая структура (но не обязательно единственная) мест формирования этого кода - и эта структура должна иметь документацию - тогда весь код легко анализировать и модифицировать блочной. Ну а ставка на абстракцию данных - тоже на руку - не при модификации не нужно заботиться о всех местах - нужно модифицировать только место определения или расширения абстракции - а все места её обрабатывающие останутся неизменным! Ну а AI-анализ освободит от необходимости глубокой ручной оптимизации и проблемы простого, разбросанного, но не оптимального кода - AI-компилятор сам всё соберёт в единое оптимальное целое, проанализировав весь код целиком, а не только отдельные его части независимо друг от друга.
Так что моё мнение - сборка кода из разных мест - это не такая уж плохая идея - тут, главное, реализовать это эффективно и понятно (документировано)!

Ну а для упрощения программирования нужно ещё и IDE развивать - сейчас даже в Visial Studio IDE - достаточно примитивна (не говоря уже об EDT или 1С Конфигураторе) - есть ещё много куда можно расти и развиваться, чтобы сделать работу программиста проще даже при усложнении ЯП. Так же нужно развивать о специальные интеллектуальные средства анализа кода - позволяющие выявлять и оптимизировать узкие и ошибочные места! В любом ЯП с этим есть где развернуться!
Но это уже совсем другая тема!
51. frkbvfnjh 825 06.12.21 16:16 Сейчас в теме
Ааааааа! Брат, мы с тобой одной крови! Я ржал в голос на остановке когда читал твою статью, так же проведя пол дня в отладке для поиска и изменения одной долбанной строчки кода. Наконец-то кто то об этом написал. То что происходит с типовыми это не нормально, и я никогда не изменю своего мнения. Я понимаю - универсальность, но ни ни до такой же степени, когда вообще не возможно понять что в коде написано. Из уважения к сообществу не могу написать все, что думаю о тех кто такое сотворил. Единственный плюс типовых это то, что не требуется обфускация кода. Молодцы разрабы типовых - порог вхождения отправили просто в космос. Приходилось писать код на разных языках, но такого беспредела я не встречал нигде - когда тебе приходится отлаживать код вложенностью стека вызовов в 20 уровней, когда запрос буквально по словам собирается из 50 функций, и прочее, и прочее, и прочее, до бесконечности. Как по мне, код вложенностью больше 3-4 уровней вообще запретить нужно на законодательном уровне. Автору респект!
wa1988; dehro; FesenkoA; Трактор; SL81; gucci76; terrorion; EvgeniyOlxovskiy; v3132; +9 – Ответить
59. Yashazz 4931 06.12.21 16:40 Сейчас в теме
(51) Самое интересное, что всё это хозяйство ещё и ни черта не универсально!)) Потому что где-нибудь посередине работы всех этих люто гибких и универсальных механизмов окажется что-то кастомизированное и чуть ли не хардкод. Сто раз натыкался. И горячий привет)
Артано; segatron; Трактор; FesenkoA; +4 – Ответить
62. frkbvfnjh 825 06.12.21 16:45 Сейчас в теме
(59) Я если честно, тоже не особо там наблюдаю суперуниверсальность, но видимо она там есть, иначе на кой черт все это творить?
60. Yashazz 4931 06.12.21 16:42 Сейчас в теме
А насчёт аргументов, которые в функции и процедуры передаются, так я давно понял, зачем они 20-30 параметров подряд пишут отдельно, а не в структуру пихают. Это чтоб такой модуль в расширении не поменяли - нельзя ведь, чтоб количество аргументов менялось, расширение этого не умеет ни в каком виде. Ну вот нам и суют палки в колёса)
66. WorkerPavel 06.12.21 17:04 Сейчас в теме
(60)Ха-ха-ха!
А мы перепишем код так что один из параметров будет обрабатываться как структура а не значение определённого типа. И всё. Наши колёса такие палки ломают на раз.
Yashazz; EvgeniyOlxovskiy; +2 – Ответить
65. capitan 2609 06.12.21 17:03 Сейчас в теме
Под вечер публикация и комментарии начали напоминать разговор с таксистом.
Но не таким который матерый и знает как страной управлять надо, а начинающим, который пока только может все костерить.
Однако стало понятно для чего автор написал САРКАЗМ.
Большая часть не только не понимает ООП, она просто полностью в ауте.
Офигеть раздел Приемы и методы разработки - Практика программирования
Куда модераторы только смотрят

Но приуныл не от того что такие статьи неистово плюсуют. Это как раз мне на руку. Чем больше пишущих А = А +1; тем больше з/п у пишущих по другому.
Раздел этой статьи меня беспокоит.
70. Yashazz 4931 06.12.21 18:33 Сейчас в теме
(65) Я уже смирился. Иной раз тут пионэры радостно постят какое-нибудь "открытие" в духе 2х2=3.141527, и плюсов куча, и раздел самый что ни есть серьёзный. Селяви такая.
72. capitan 2609 06.12.21 19:47 Сейчас в теме
(70)Да как же так то барин ? На это же раздел Курилка есть? Все великие гуры давно уже там
Админам же ржут даже
75. Hans 3 06.12.21 22:31 Сейчас в теме
(72) Холопов из курилки не выпускать!
82. capitan 2609 07.12.21 09:17 Сейчас в теме
(75)Вы путаете или подменяете понятия образование и сословия. Зная вас скорее путаете. Были холопы образованнее иных дворян.
В вашем случае больше подходит поговорка Со свиным рылом в калашный ряд
83. Hans 3 07.12.21 09:33 Сейчас в теме
(82)
Со свиным рылом в калашный ряд

Уровни разработчиков бывают разные, соответственно статьи тоже могут быть для разного уровня разработчиков.
86. capitan 2609 07.12.21 10:15 Сейчас в теме
(83)Вне всяческого сомнения. Но статьи размещенные в данной рубрике должны чему то учить разработчиков.
А для жалоб на тяжкую долю есть рубрики другие
По моему человек знакомый с отладчиком способен понять любую глубину вызовов функций
123. Torin57 45 09.12.21 11:50 Сейчас в теме
(86) Доброго дня.

Не нашел раздел курилка. Искал здесь https://forum.infostart.ru/groups/ Запостите, пож-та, ссылку на раздел.

Заранее спасибо.
125. Torin57 45 09.12.21 12:45 Сейчас в теме
(124) Я понял. Раньше этот раздел назывался "Курилка". Потом на ИС решили что надо бросать курить. Переименовали раздел в "О жизни".
137. Hans 3 13.12.21 10:16 Сейчас в теме
(125) Здоровье шататься начало. Скоро худеть начнут.
148. Torin57 45 14.12.21 14:30 Сейчас в теме
(137) На самом деле я хотел узнать у Капитана почему форум "О жизни" называется "Курилка"? Не знал как задать вопрос в вежливой форме, поэтому озвучил свой домысел. Думаю, кто-нибудь прокомментирует.
162. Артано 803 08.01.22 06:03 Сейчас в теме
(65)
Но приуныл не от того что такие статьи неистово плюсуют. Это как раз мне на руку. Чем больше пишущих А = А +1; тем больше з/п у пишущих по другому.


Позволю себе не согласиться, коллега. Как известно, плохой программист за год работы создаёт дополнительное рабочее место. Так вот, эти плохие программисты, вкупе с ростом спроса создали такое количество рабочих мест, какое не покрыть ничем. И если богатые страны и компании могут себе позволить рекрутировать индусов, то у нас такой возможности нет, а Киргизия с Таджикистаном, почему-то программистов не поставляют. Так что эти игры закончатся плохо.
71. igor_1c 18 06.12.21 18:47 Сейчас в теме
Отладка сложного кода должна быть визуализирована. Почему руководители предприятий хотять видеть отчетность в виде графиков и картинок.
Отладку тоже можно сделать в виде графов - схем, хотя бы как mind map.
или например вот так https://ko.com.ua/vizualizaciya_programmnogo_koda_uvidet_nezrimoe_50261
74. Yashazz 4931 06.12.21 22:03 Сейчас в теме
(71) Я однажды совершил подвиг сделал глупость. Я создал конфу и базу, которая разбирала связи модулей типовых конфигураций. Анализировала тексты, ну, словом, общеизвестный примитив. Переменные, параметры, даже описания оповещений немножко, хотя на передаче и вызове общих модулей как переменных я сдулся. Но не суть. Закончил я эту хрень отлаживать, скормил ей, помню, расчёт себестоимости при закрытии периода, и передал это всё в блок визуализации, он у меня на лету графические схемы строил, т.е. блок-схему, чего откуда куда вызывает и передаёт. Так вот...
...Посмотрел я минут 5 на эту адскую паутину из десятков квадратиков, ромбиков, треугольничков, из сотен стрелочек... Помедитировал... И больше про визуализацию кода никогда не думал даже. Ибо бесполезно.
Артано; terrorion; su_mai; +3 – Ответить
77. Zerkon 97 07.12.21 01:02 Сейчас в теме
(74) Если не ошибаюсь, вы публиковали это дело, правильно? Паутину взаимосвязей помню, было "страшно непонятно" - запятые по вкусу )
78. Yashazz 4931 07.12.21 01:59 Сейчас в теме
(77) Фрагмент функционала публиковал, целиком - нет, т.к. тогдашний работодатель запретил.
94. su_mai 90 07.12.21 11:37 Сейчас в теме
(74) На первоначальном этапе вхождения в профессию визуализатор, большой помощник! Нужен для того, что бы победить страх перед большим кодом, но не более того. Со временем придется делать анализатор на результат визуализации и т.п.
76. Zerkon 97 07.12.21 00:59 Сейчас в теме
Что-то усложнилось, что-то упростилось. Давайте вспомним как в 7.7 для изменения состава колонок в форме списка надо было лезть в конфигуратор. Или кто помнит про работу со слоями на форме вместо человеческого отражения в закладках или группировки по элементам? А рисование макета любого отчета вручную? А тот факт, что сообществу пришлось придумать и сделать 1срр и иже с ним, как ответ на ограниченность языка и конфигуратора?
Да, смотря на код типовых, особенно erp, есть четкое понимание, что ребята из команды разработки забыли золотое правило "Пишите код так, как будто поддерживать его будет склонный к насилию психопат, который знает, где вы живёте" и тупо соревнуются между отделами, кто придумает более извращенный способ сделать простую вещь.
Но неужели кто-то всерьез планирует один раз выучить язык и полсотни лет писать одно и тоже и одинаковым способом? Народ, кто знаком с "трушными" языками, есть такое где? Вон, даже Пролог, который хоронят уже лет 40, до сих пор развивается и меняется
Артано; segatron; Yashazz; +3 – Ответить
80. tindir 07.12.21 04:42 Сейчас в теме
(76) По поводу типовых, все таки иногда, возникает мысль, что по отделам ходит человек в специальной должности и строгой форме, заглядывает через плече программисту и говорит "А чо так просто?!! Ну ка, давай вот сюда наверни половник асихронности". Но после того как я поработал с конфигурациями "на замочке" и с "уснувшими" на 8.1 колегами я понял зачем они так делают. Сон разума рождает отраслевки от ПервыйБит.
97. Alxby 1161 07.12.21 12:11 Сейчас в теме
(76)Всё так, только так не всё(с).
Давайте вспомним как в 7.7 для изменения состава колонок в форме списка надо было лезть в конфигуратор

Теперь разработчику при работе с элементами формы, надо учитывать, что пользователь может изменить форму. Многие про это помнят? Я до сих пор часто вижу, что для группы устанавливают Доступность = Ложь, рассчитывая, что гарантированно будут недоступны все подчиненные элементы. А как в таблице формы сделать чтобы все колонки таблицы имели цвет фона, отличный от стандартного? Крупные заказчики хотят иметь интерфейс системы в соответствие с утвержденным корпоративным стандартом.
Или кто помнит про работу со слоями на форме вместо человеческого отражения в закладках или группировки по элементам?

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

Не помню, чтобы у кого-либо вызывало проблемы рисование макета. У меня этим занимались даже пользователи (не программисты) - заказчики отчетов. Вот проблем с получением нужного вида отчетов на СКД помню предостаточно. Зато получившийся макет нагляден, его легко использовать и поддерживать, в нем логичная схема работы с расшифровками, его можно использовать для ввода данных.
Но неужели кто-то всерьез планирует один раз выучить язык и полсотни лет писать одно и тоже и одинаковым способом? Народ, кто знаком с "трушными" языками, есть такое где?

Вряд ли кто-то против прогресса, но являются ли изменения действительно прогрессом? Не надо забывать, что мы все-таки в основном занимаемся бизнес-программированием, а не академическим. Не стоит тащить в 1С все без разбора. Я в свое время много писал на asm x86, мне очень нравился C и Lisp, сейчас поглядываю на haskell, но не думаю что в 1С так уж необходим прямой доступ к памяти и регистрам процессора или работа с функциями высших порядков.
100. Zerkon 97 07.12.21 14:06 Сейчас в теме
(97)
Вот проблем с получением нужного вида отчетов на СКД помню предостаточно

СКД до сих пор причиняет мне боль) Стоит только отойти от простейшей таблицы или списка. Особенно в обычных формах
(97)
Вряд ли кто-то против прогресса, но являются ли изменения действительно прогрессом?

Да нет, конечно, не являются. И никто этого не утверждает. Как обычно это и бывает при поиске своего пути - проблем много. Но если дать волю всем, кто кричит, что он лучше всех знает что нам надо, то получим басню про лебедя, рака и щуку. Радует, что 1С активнее развивает платформу, есть шанс, что неудобное само отомрет))
101. AntonProgma 50 07.12.21 14:16 Сейчас в теме
У меня обратная проблема. Код в 1с принято писать слишком простым. Несколькими небольшими командами делать по сути атомарную операцию. Получается много кода с маленькой плотностью смысла.
107. uri1978 138 07.12.21 18:37 Сейчас в теме
1С в типовых кидает из крайности в крайность.
Сперва процедуры и функции были как "Война и мир". Разбираться в таком длинном коде проблематично и главное он совершенно не гибок. Кто-то подсказал, что есть "декомпозиция", но как ей пользоваться не сказал. Итог - имеем огромную кучу маленьких процедур. Понять целостную картину алгоритма стало еще тяжелее.
Правда она посередине...
134. starik-2005 3309 10.12.21 13:58 Сейчас в теме
(107)
Итог - имеем огромную кучу маленьких процедур. Понять целостную картину алгоритма стало еще тяжелее.
Это как с конвертацией. Студент еще не умеет писать код и ему проще галочек натыкать и полей повыбирать. Но и задачи трансформации данных таким образом будут решаться для связи один к одному/нескольким. Если же ситуация касается выгрузки остатков, например (много к одному), то студент пойдет плакать в жилетку преподавателю с курсов конвертации, что тот не научил его писать запросы.
132. DrAku1a 1803 10.12.21 12:47 Сейчас в теме
Бро, ты не прав. Вот пример.

Было (взято тут):
Функция СведенияОВнешнейОбработке() Экспорт 


	ПараметрыРегистрации = Новый Структура; 

	МассивНазначений = Новый Массив; 
	ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка"); 
	ПараметрыРегистрации.Вставить("Назначение", МассивНазначений); 
	ПараметрыРегистрации.Вставить("Наименование", НСтр("ru = '" +Метаданные().Представление()+ "'"));
	ПараметрыРегистрации.Вставить("Информация", НСтр("ru = '" +Метаданные().Комментарий+ "'"));
	ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина); 
	ПараметрыРегистрации.Вставить("Версия", "1.0"); 
	ТаблицаКоманд = ПолучитьТаблицуКоманд(); 

	ДобавитьКоманду(ТаблицаКоманд, "Открыть форму", "ОткрытиеФормы"+Метаданные().Имя, "ОткрытиеФормы", Ложь, "");

	ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); 

	Возврат ПараметрыРегистрации; 

КонецФункции 


Функция ПолучитьТаблицуКоманд() 

	Команды = Новый ТаблицаЗначений; 
	Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); 
	Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); 
	Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); 
	Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); 
	Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка")); 

	Возврат Команды; 

КонецФункции 


Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "") 

	НоваяКоманда = ТаблицаКоманд.Добавить(); 
	НоваяКоманда.Представление = Представление; 
	НоваяКоманда.Идентификатор = Идентификатор; 
	НоваяКоманда.Использование = Использование; 
	НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение; 
	НоваяКоманда.Модификатор = Модификатор; 

КонецПроцедуры
Показать


Стало:
Функция СведенияОВнешнейОбработке(ВерсияБСП="") Экспорт
	
	Перем ПараметрыРегистрации, ОписаниеКоманды;
	
	//Структура для ответа
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(ВерсияБСП);
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
	ПараметрыРегистрации.Вставить("Наименование", НСтр("ru = '" +Метаданные().Представление()+ "'"));
	ПараметрыРегистрации.Вставить("Информация", НСтр("ru = '" +Метаданные().Комментарий+ "'"));
	ПараметрыРегистрации.Вставить("Версия", "2.0.0.2");
	
	//Команда "ОткрытиеФормы"
	ОписаниеКоманды = ПараметрыРегистрации.Команды.Добавить();
	ОписаниеКоманды.Представление = "Открыть форму """+ПараметрыРегистрации.Наименование+"""";
	ОписаниеКоманды.Идентификатор = Метаданные().Имя;
	ОписаниеКоманды.Использование = "ОткрытиеФормы";
	ОписаниеКоманды.ПоказыватьОповещение = Ложь;
	ОписаниеКоманды.Модификатор = "";
	
	Возврат ПараметрыРегистрации;

КонецФункции
Показать

Примечание 1: "ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка()" вместо просто "ДополнительнаяОбработка" - да, это удобно. Синтаксис-помощник работает и дает больше шансов не налажать с написанием.

Примечание 2: не хватает "ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработкеДобавитьКоманду(...)", хотя может код будет выглядеть менее наглядно.

//---

Ну и мой вариант (если не знаешь, будет ли в конфе БСП, если нет - то чтобы хоть ошибок не было):
Функция СведенияОВнешнейОбработке(ВерсияБСП="") Экспорт
	
	Перем ПараметрыРегистрации, ОписаниеКоманды;
	
	//Структура для ответа
	ПараметрыРегистрации = Новый Структура;
	ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
	ПараметрыРегистрации.Вставить("Назначение", Неопределено);
	ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
	//ПараметрыРегистрации.Вставить("ВерсияБСП", "2.0.1.3"); //БСП не требуется
	ПараметрыРегистрации.Вставить("Наименование", НСтр("ru = '" +Метаданные().Представление()+ "'"));
	ПараметрыРегистрации.Вставить("Информация", НСтр("ru = '" +Метаданные().Комментарий+ "'"));
	ПараметрыРегистрации.Вставить("Версия", "2.0.0.2");
	ПараметрыРегистрации.Вставить("Команды", новый ТаблицаЗначений);
	
	//Колонки команд
	ПараметрыРегистрации.Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
	ПараметрыРегистрации.Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
	ПараметрыРегистрации.Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
	ПараметрыРегистрации.Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
	ПараметрыРегистрации.Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
	
	//Команда "ОткрытиеФормы"
	ОписаниеКоманды = ПараметрыРегистрации.Команды.Добавить();
	ОписаниеКоманды.Представление = "Открыть форму """+ПараметрыРегистрации.Наименование+"""";
	ОписаниеКоманды.Идентификатор = Метаданные().Имя;
	ОписаниеКоманды.Использование = "ОткрытиеФормы";
	ОписаниеКоманды.ПоказыватьОповещение = Ложь;
	ОписаниеКоманды.Модификатор = "";
	
	Возврат ПараметрыРегистрации;

КонецФункции
Показать
Артано; +1 – Ответить
133. starik-2005 3309 10.12.21 13:56 Сейчас в теме
Чета пропустил. Хорошая статья, малопонятная для некоторых )))
136. VladC# 73 13.12.21 00:26 Сейчас в теме
избалованы многочисленными фреймворками и БСП
шта??? Можно поподробнее про многочисленные фреймворки? И вы серьезно считаете вариант с вызовом функции общего модуля приемлемым для реализации инкремента?
139. Поручик 4611 13.12.21 14:02 Сейчас в теме
ОбщегоНазначения в БСП обычно серверный модуль, поэтому А = ОбщегоНазначения.Инкремент(А); выполнить на клиенте не получится, придётся упаковывать в бесконтекстную функцию.
157. serejkin 29.12.21 21:31 Сейчас в теме
Помнится когда-то на БАШе гулял "прикол" про эволюцию кода...
первый год:
Скрытый текст


Через пару лет:
Скрытый текст

еще через пару лет:
Скрытый текст


год 10й...:
Скрытый текст


....
все это к чему. Есть хорошая фраза: "Горе от ума". эволюция БСП огорчает. будем надеяться, что этот "10й год" где-то вот совсем рядом
Lemmonbri; +1 – Ответить
161. Артано 803 08.01.22 05:48 Сейчас в теме
Статья и автором задумывалась дурацкая, судя по приписке "сарказм". но размещена она в серьёзном разделе, так что отвечу серьёзно.

Цикломатическая сложность алгоритмов как БСП так и новых типовых формально очень высока: большое число уровней вложенностей, ветвление вызовов, закладки для переопределения типовых методов (эмуляция ООП).
Но с другой стороны, когнитивная сложность каждого отдельно взятого алгоритма существенно снизилась, и теперь, если вы умеете не только читать, но и представлять в уме структуру алгоритма при чтении его фрагментов, то чтение программы в сумме становится более простым. А если прибавить к этому знание принципов по которым строится архитектура конкретного решения, то задача становится очевидно проще, чем чтение функций на 2к+ строк. Сложность внесения изменений, при этом, стала ниже по тем же причинам.

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

Таким образом, в реально существующих типовых, действительно есть плохая архитектура, не только плохой код. И претензии автора, пусть и шуточные, имеют под собой вполне реальную почву. Но наблюдая за эволюцией типовых в целом, не могу не отметить существенный прогресс в подходах. Давным-давно разработанная мною библиотека и отдельные подсистемы в ней постепенно модифицируется или просто просто режется из поставки для новых типовых по одной просто причине - уже реализовано в БСП или в конкретной типовой. Жаль, что спустя более чем 10 лет, но главное, что процесс идёт.

Посоветовать программистам могу лишь одно - учитесь быть программистами. Просто кодить может абсолютно любой человек умеющий писать.
164. o.nikolaev 219 24.02.23 14:12 Сейчас в теме
вечную бету буржуйской EDT

Вечная бета для того чтобы причаститься использования которой еще надо и железо обновить себе.
Для отправки сообщения требуется регистрация/авторизация