Антидот

22.01.19

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

Необходимое лекарство для тех, кто случайно передозировал чтение статей о хорошем-плохом программировании на 1С.

Предисловие

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

Я как-то не задумывался об этом, пока не попробовал пошутить с одним из авторов, у которого "накипело". Я выразился примерно в следующем смысле:

"Вот вы обличаете нехорошие практики, а какая у вас самого практика в нехороших практиках? Сами-то этим занимались когда-нибудь?"

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

Или вот совсем свежий пример от другого автора. Он рассказывает нам, как некие нехорошие люди пишут программы тяп-ляп и абы как. Его благородная ярость все вскипает и вскипает. И наконец достигает чуть ли не высшей своей точки, когда он сообщает нам, что вот, дескать, горе-разработчики знать ничего не знают про ФИФО, просто списывают самую старую партию. И в качестве подтверждения своих слов приводит текст запроса... Вы писали когда-нибудь запрос для ФИФО? Если да, то вы будете смеяться вместе со мной. Это был тот самый запрос. Я этому автору говорю: "вы нам код после запроса покажите, там должно быть самое интересное". Думал, он сам посмотрит и скажет: извините, погорячился... Нет. Взял и поправил свою публикацию. Выложил код. Правда обрезал его посередине. Так и оставил в непонятках. То ли совсем ничего про ФИФО не знает, то ли стесняется. 

Не будем, впрочем, затягивать вступление и перейдем к антидоту.

Антидот

Для надежности я решил сделать антидот двухкомпонентным. Я возьму два простых утверждения, которые кажутся очевидными. И продемонстрирую, что получится, если подумать над ними, как следует.

Часть 1. Имена переменных должны быть осмысленными и понятными.

В этом месте я всегда предлагаю подумать на тему, что лучше:

СуммаПервогоИВторого=Первое*Второе;

или 

х=Первое*Второе;

Тут обычно начинают задавать вопрос по поводу первого варианта: что это вообще такое и зачем я так написал. Зачем, зачем... Пишу я так. На тысячу строк кода два-три раза нечто подобное и напишу. Но это потому, что я опытный. У других может и все 20 или 30 раз получиться. Мы все делаем ошибки. Нет ничего удивительного в том, чтобы написать "*" вместо "+". Лично я не перестаю удивляться другому. А именно тому, что можно часами сидеть, смотреть на первый вариант и не видеть проблемы. Здесь может спасти только "взгляд со стороны", когда ваш коллега сдвигает вас с мертвой точки. Но вся проблема в том, что вы можете зависнуть не на:

СуммаПервогоИВторого=Первое*Второе;

а на чем-то другом, типа:

Периметр=СуммаПервогоИВторого+СуммаПервогоИВторого;

И тут вам коллега уже ничем не поможет.

Мне как-то привели вот такой пример:

Если ((ПН И ПНП) И (РН И РНП)) ИЛИ 
    (( ПН = Ложь ) И (РН И РНП)) ИЛИ 
    ((ПН И ПНП) И (РН = Ложь)) Тогда 
    Док.Обработан = Истина;
    Док.ДанныеОбработан = ТекущаяДата();
    Док.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;

И спросили: "Ну и как? Это хороший код по-твоему?"

Нет. Это - плохой код. Вместо трех строчек условий следует оставить одну с одним "ИЛИ".

(* Внимательные читатели заметили, что здесь я был не прав. Это выражение на самом деле не сокращается)

А насчет имен переменных... Ну, допустим, они будут понятными. Что вам это даст? Если человек путается в условиях, то где гарантия, что он ничего не напутал ранее с установкой значений?

Но самый главный аргумент против моих рассуждений следующий:

"Зачем спецом портить программу? Ведь тогда все станет непонятным." 

И вот здесь надо разобраться как следует. Во-первых, непонятным станет не все. У нас с вами есть имена справочников, документов, регистров. Есть имена их реквизитов. А также имена модулей и методов. Переменные - это далеко не все, что есть в нашем коде.

Взгляните на картинку, которую я взял отсюда: https://ru.wikipedia.org/w/index.php?curid=6775969

Представьте себе, что точки - это имена предметных сущностей, а линии - это переменные.

Теперь посмотрите на вторую картинку:

Некоторые полагают, что сам смысл работы программиста заключается в переходе от первого ко второму. Дескать, первое вам кто угодно сделает, а для второго уже нужна квалификация. Для этого есть даже специальный термин: decoupling. Его невозможно хорошо перевести на русский без мата, поэтому я его оставлю, как есть. Если вы присвоили переменной некоторое значение, а потом используете ее через 1000 строк вашего кода - это плохо. Хуже этого могут быть только глобальные переменные. Как говорится: самый лучший префикс для глобальной переменной это //.  В идеале, вы объявляете переменную. Используете ее в следующей строке, через строку, через две-три. Но не далее чем вы можете "схватить" за один свой "рабочий такт". После чего, вы можете забыть о ней навсегда. Единственное, о чем вам стоит позаботиться, так это о том, чтобы хорошо различать переменные, если их будет несколько. Идеальный код должен обладать таким свойством, что если взять и заменить в нем все имена переменных на случайно подобранные, то он нисколько не потеряет в читабельности.

Что из всего этого следует. Имена переменных должны быть хорошо различимы в своем локальном контексте. Будут они осмысленными или нет - дело вкуса. Более того, начинающим было бы разумно рекомендовать использовать только абстрактные имена. Это будет естественным образом подталкивать их к созданию более совершенного кода. 

 

Часть 2. Копирование кусков кода - зло.

 

		если зеленый тогда

            ///////////////////////////////////////////////
			новкоординаты=новыекоординаты(текузелрез);
			нсрез=текузелрез.строки.добавить();
			нсрез.ид=Новый УникальныйИдентификатор;
			нсрез.тип="ГРУППА";
			нсрез.имя=текузел.имя;
			нсрез.РПШирина=19;
			нсрез.РПВысота=12;
			нсрез.РПВерх=новкоординаты.верх;
			нсрез.РПЛево=новкоординаты.лево;
  			нкорсв=своуз.строки.добавить();
			нкорсв.узел=нсрез.ид;
			стузелрез=текузелрез;
			текузелрез=нсрез;
            //////////////////////////////////////////////

			связь="";
			подключение="";
			для каждого св из мсв цикл
				если врег(сокрлп(св.свойство))="СКРЫТЬ" тогда
					нсрез.тип="СКРЫТАЯГРУППА";
				иначеесли врег(сокрлп(св.свойство))="УСЛОВИЕ" тогда
					продолжить;
				иначеесли врег(сокрлп(св.свойство))="ИСКЛЮЧИТЕЛЬНОЕ_УСЛОВИЕ" тогда
					продолжить;
				иначеесли врег(сокрлп(св.значение))="ЗАПИСАТЬ" тогда
					ВыполнитьКоманду(св.свойство,врег(сокрлп(св.значение)));
				иначеесли врег(сокрлп(св.значение))="УДАЛИТЬ" тогда
					ВыполнитьКоманду(св.свойство,врег(сокрлп(св.значение)));
				иначеесли врег(лев(сокрлп(св.значение),6))="НОВЫЙ " тогда
					метаимя=врег(сокрлп(сред(сокрлп(св.значение),6)));
					если лев(метаимя,8)="ДОКУМЕНТ" тогда
						новзн=документы[сокрлп(сред(метаимя,10))].создатьдокумент();
						новзн.дата=текущаядата();
					иначеесли лев(метаимя,10)="СПРАВОЧНИК" тогда
						новзн=справочники[сокрлп(сред(метаимя,12))].создатьэлемент();
					конецесли;	
					записатьвпамять(св.свойство,новзн);
					нсв=нкорсв.строки.добавить();
					нсв.свойство=св.свойство;
					нсв.значение=новзн.ссылка;
					нреф=рефс.добавить();
					нреф.имя=св.свойство;
					нреф.строкасвойств=нсв;
				иначеесли врег(лев(сокрлп(св.значение),5))="НОВАЯ" тогда
					стрзнач=сокрлп(стрзаменить(св.значение,"НОВАЯ",""));
					стрзнач=сокрлп(стрзаменить(стрзнач,"новая",""));
					поз=стрнайти(стрзнач,".");
					если поз>0 тогда
						имяобъекта=лев(стрзнач,поз-1);
						имятаблицы=сред(стрзнач,поз+1);
					иначе
						имяобъекта=стрзнач;
						имятаблицы=неопределено;
					конецесли;
					нс=память.найти(имяобъекта,"имя");
					если нс<>неопределено тогда
						новзн=нс.значение[имятаблицы].добавить();
						записатьвпамять(св.свойство,новзн);
					конецесли;
				иначе
					новзн=ВычислитьЗначение(св.значение);
					записатьвпамять(св.свойство,новзн);
					нсв=нкорсв.строки.добавить();
					нсв.свойство=св.свойство;
					попытка
						нсв.значение=новзн.ссылка;
					исключение
						нсв.значение=новзн;
					конецпопытки;
					если врег(сокрлп(св.свойство))="СВЯЗЬ" тогда
						связь=сокрлп(св.значение);
					иначеесли врег(сокрлп(св.свойство))="ПОДКЛЮЧЕНИЕ" тогда
						подключение=сокрлп(св.значение);
					конецесли;	
				конецесли;
			конеццикла;
			если не пустаястрока(связь) тогда
				нс=списокбаз.найти(текузел.имя,"имя");
				если нс=неопределено тогда
					новб=списокбаз.добавить();
					новб.имя=текузел.имя;
					новб.подключение=подключение;
					новб.связь=связь;
					новб.база=неопределено;
				конецесли;
			конецесли;
			для каждого уз из текузел.строки цикл
				ОбработатьУзел(уз,текузелрез);
			конеццикла;
			текузелрез=стузелрез;
		конецесли;
	иначеесли текузел.тип="ЦИКЛ" тогда

        //////////////////////////////////////////////////
		новкоординаты=новыекоординаты(текузелрез);
		нсрез=текузелрез.строки.добавить();
		нсрез.ид=Новый УникальныйИдентификатор;
		нсрез.тип="ГРУППА";
		нсрез.имя=текузел.имя;
		нсрез.РПШирина=19;
		нсрез.РПВысота=12;
		нсрез.РПВерх=новкоординаты.верх;
		нсрез.РПЛево=новкоординаты.лево;
		нкорсв=своуз.строки.добавить();
		нкорсв.узел=нсрез.ид;
  		стузелрез=текузелрез;
		текузелрез=нсрез;
        /////////////////////////////////////////////////

Этот типичный пример копирования кода я взял из одной своей работы. Два выделенных мною вверху и внизу фрагмента полностью идентичны. Почему я так поступил? Как говорил Дейкстра, работа программиста сродни искусству жонглера. Только жонглеры крутят в воздухе физические предметы, а мы абстракции в своей голове. Представьте себе артиста в цирке. Вот он крутит три булавы, потом четыре-пять-шесть. Ему подбрасывают еще одну. А ты думаешь: неужели возьмет. Но все равно это когда-нибудь заканчивается. Вот и я не мог в тот раз "взять еще одну булаву". Мне тогда пришлось бы выкинуть что-то другое, более важное. А переделывать после я не стал. С одной стороны - время, а с другой стороны, принцип "работает - не трожь" никто не отменял.

Кто-то скажет, что я тут плохому учу. Ведь есть серьезные проекты. Ты не можешь думать только о себе. Ты должен думать и о тех, кто будет поддерживать твой код.

Хорошо. Давайте подумаем.

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

А теперь следите за руками. Предположим, что в нашей конфигурации есть пять-шесть документов, которые формируют расходные записи в каком-нибудь регистре остатков. Соответствующие куски кода в процедурах обработки проведения у всех этих документов полностью идентичны. Я не буду приводить здесь этот фрагмент кода. Вы и сами легко можете представить себе, что там будет что-то типа:

//Получение данных из документа

//Формирование движений по регистру

//Блокировка

//Запись движений по регистру 

//Контроль отрицательных остатков

Код, повторяю, полностью идентичен. Но мы не хотим просто копировать его в пять-шесть документов, потому что это "фу!". Мы создаем общий модуль. В общем модуле создаем общую процедуру, какую-нибудь ВыполнитьСписаниеПоРегистру...(). Эта общая процедура вызывает другие общие процедуры: ПолучитьДанные...(), СформироватьДвижения..(), ЗаписатьДвиженияСКонтролем...(). В принципе и эти общие процедуры могли бы вызывать какие-нибудь другие общие процедуры. 1С рекомендует делать не менее 7-8 последовательных вызовов общих процедур, но у меня не хватает на это фантазии.

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

То есть, мы, выходит, вовсе не подумали об удобстве для тысячи специалистов. А о чем мы тогда думали? Об удобстве для нескольких наших разработчиков в ущерб удобству тысячи специалистов поддержки? Или просто о том, что копировать код это "фу!"?

Делайте со мной что хотите, но будь я руководителем разработки такой ответственной конфигурации, я бы просто заставил... СКОПИРОВАТЬ КОД.

Что из этого следует. Если вы разработчик-одиночка, перечитывайте почаще Маяковского

умри, мой стих,

                            умри, как рядовой

и старайтесь не преувеличивать значение вашей разработки.

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

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

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

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

См. также

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

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

10 стартмани

02.11.2026    343    1    nedomolkov.ivan    1    

2

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

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

29.10.2026    368    YA_777378709    0    

4

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

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

28.10.2026    481    Pavel791    0    

2

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

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

1 стартмани

23.10.2026    514    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    451    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    511    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    3451    Konstmax13    11    

11

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

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

1 стартмани

12.10.2026    320    Ninel_S    0    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. strrike 22.01.19 12:00 Сейчас в теме
первонакх ))
Интересно, в эту статью понабегут?)
2. genayo 22.01.19 12:13 Сейчас в теме
Про имена переменных - вы приводите слишком примитивный пример, и на нём основываете дальнейшее рассуждения. В чём разница, по вашему, между X = НайтиОбъектПоКоду("12345") И ЭлементСправочникаНоменклатура = НайтиОбъектПоКоду("12345")?
Про копипаст - я даже не знаю, вы это серьёзно?
klinval; sergelemon; MCV; unichkin; spezc; YLioY; awk; for_sale; Andreeei; Yakud3a; +10 – Ответить
5. dachnik 27 22.01.19 12:50 Сейчас в теме
(2)копипаст - очень неудачный пример.
действительно, использование одного и того же обработчика из общего модуля для проведения разных документов существенно усложняет изменение без нарушения работы всех механизмов проведения, ссылающихся на общую процедуру. Поэтому разработчик должен хорошо подумать над тем, как должна выглядеть эта глобальная процедура, какой массив параметров передается на входе и выходе. В большинстве случаев проблема не в общей процедуре как таковой, а в логике ее работы. очень часто вижу говнокод от самой 1С, где в общих процедурах массив переменных обрабатывается в контексте данных документа или еще хуже, формы.
YLioY; for_sale; sergathome; +3 – Ответить
8. mkalimulin 1651 22.01.19 13:39 Сейчас в теме
(2) Дело вкуса. Но начинающему все-таки лучше использовать X.
9. genayo 22.01.19 13:48 Сейчас в теме
(8) А, понял, вы считаете, что начинающему полезно держать весь контекст в своей голове. Так он разовьёт свою память, и станет очень умным программистом.
top_1c; pavlov_dv; for_sale; +3 – Ответить
11. mkalimulin 1651 22.01.19 13:50 Сейчас в теме
(9) Так он научится сокращать контекст до тех размеров, которые помещаются в голове.
12. genayo 22.01.19 13:58 Сейчас в теме
(11) Всё-же, у вас очень неортодоксальные подходы к программированию. Код, написанный таким начинающим программистом, будет легко читаем только программисту, обученному по такой-же системе.
14. ADirks 187 22.01.19 14:08 Сейчас в теме
(11) Так он учится раздувать контекст до размеров, которые не помещаются ни в чьей голове, кроме его собственной.

Да он же реально крут!


P.S. оч. понравилась зелёненькая надпись внизу
27. dachnik 27 22.01.19 15:52 Сейчас в теме
(8) Буквенные переменные использую только очень локально, в основном как счетчики в циклах, либо вспомогательные переменные при расчетах, о которых можно забыть сразу же при переходе к следующему логическому куску процедуры/функции.
59. user623969_dusa 23.01.19 10:31 Сейчас в теме
(8) никогда Х не используется. полностью обезличенные переменные только для итераторов циклов. в остальных переменная должна содержать свой тип.. изучите программирование на java или c очень полезно для разнообразия
3. Vladimir Litvinenko 2949 22.01.19 12:27 Сейчас в теме
Делайте со мной что хотите, но будь я руководителем разработки такой ответственной конфигурации, я бы просто заставил... СКОПИРОВАТЬ КОД.

Не покидает ощущение, что это троллинг, а не всерьёз, так как примеры из разряда крайностей.
Если это троллинг, то не хватает предложения вообще отказаться от общих модулей. И ссылки на партнёрский форум, где Вы предлагаете это сделать разработчикам типовых конфигураций, а они записывают Ваше пожелание ))
klinval; sergelemon; pavlov_dv; qazaz2; mpeg1989; ixijixi; for_sale; bulpi; Andreeei; +9 – Ответить
7. mkalimulin 1651 22.01.19 13:37 Сейчас в теме
(3) От общих модулей не надо отказываться. Все дело в том, что туда писать. Я думаю, что в общие модули должно попадать только то, насчет чего есть 99% уверенности, что это будет общим для 99% пользователей.
15. Vladimir Litvinenko 2949 22.01.19 14:12 Сейчас в теме
(7) Причём здесь пользователи? Мы говорим об информационной системе и ориентироваться нужно на количество объектов в информационной системе. Для пользователя мы создаём UI.

И откуда взялась цифра 99%? Почему не 91%?

Возьмём ваш же пример. В типовых конфигурациях, по крайней мере семейства ERP, контроль остатков построен очень хорошо. Метод ПроведениеСервер.ВыполнитьКонтрольРезультатовПроведения - это ядро. Модификация, как правило, делается в одном месте конфигурации. По каким регистрам выполнять контроль при проведении конкретного документа определяется в методе СформироватьСписокРегистровДляКонтроля() модуля документа.

По поводу наименования переменных есть соглашение https://its.1c.ru/db/v8std#content:2149184103:hdoc и если не включать дурачка, приводя в качестве примера тавтологию, то его следует придерживаться. Тавтология также не рекомендуется в соседнем разделе. Поэтому приводить тавтологию в качестве примера того, к чему может привести разработка по стандартам, также некорректно.

Немного жаль, что это не троллинг. Было бы забавно )) Но своего читателя Вы найдёте конечно )
trumanl; klinval; sergelemon; extrim-style; MCV; nbelyaev; pavlov_dv; for_sale; alexander-pro; ben19791010; Dem1urg; bulpi; sergathome; itriot11; +14 – Ответить
25. sergathome 4 22.01.19 15:18 Сейчас в теме
(15) и это ещё, скажИте, не троллинг:
//Получение данных из документа

//Формирование движений по регистру

//Блокировка

//Запись движений по регистру

//Контроль отрицательных остатков

Ну не может эта кость просто так выпасть.
124. MCV 24.01.19 14:18 Сейчас в теме
(15)
По поводу наименования переменных есть соглашение https://its.1c.ru/db/v8std#content:2149184103:hdoc и если не включать дурачка, приводя в качестве примера тавтологию, то его следует придерживаться.


+1, Именно так.
126. starik-2005 3309 24.01.19 17:20 Сейчас в теме
(124)
...приводя в качестве примера тавтологию, то его следует придерживаться.

Вот по приведенной ссылке сказано, что имена переменных нужно образовывать от предметной области, чтобы было понятно, на кой черт она нужна.
Это, однозначно, не плохо. Но если предметной области нет? Вот у меня есть запрос, который возвращает кучу интересного. И нет там предметной области - там совокупность предметов, явлений и прочего. Почему бы мне не назвать выборку "Выборка", а выборку второго уровня - "Выборка2"?
Или, например, у меня есть универсальная процедура для работы с деревом. Она рекурсивна, в нее передается произвольное дерево. Почему я не могу итератор назвать "ст"? Для меня это очень хорошо и предметно говорит о строке дерева, но при этом мне не нужно писать длинные слова "СтрокаДерева", т.к. внутри у меня есть много всего интересного с этой строкой.

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

НО! Всегда плохой код можно прикрыть высокими стандартами разработки. К сожалению не нашел примера кода, чтобы посмотреть, на сколько он хорош по существу, а не по стандарту )))
128. ADirks 187 24.01.19 17:38 Сейчас в теме
(126) Когда пишешь универсальный алгоритм для работы с деревом, то термины Дерево и СтрокаДерева (ст - вполне понятно, и даже предпочтительно) являются терминами предметной области. Так что, всё по стандарту.
for_sale; klinval; Octopus; itriot11; +4 – Ответить
130. herfis 525 24.01.19 18:14 Сейчас в теме
Лично я не люблю использовать сокращения в именах переменных и методов. Да и в коде типовых конфигураций "резкие" сокращения обычно не используются - в итоге код органичнее выглядит.
Мне не лень писать слова полностью - слепой десятипальцевый и автодополнения рулят. Мое мнение - что переменные и методы с полными именами (но максимально короткими, исходя из контекста) читаются как раз легче и быстрее, чем с сокращениями. При "тяжелом" контексте "вживаться" в кучу сокращений сложно. Особенно если эти сокращения придумывал не ты :) Мозгу приходится делать маппинг имен переменных на реальные сущности. А я люблю, чтобы код читался как проза и даже комментариев не требовалось. Комментарии в основном для описания работы блоков использую, чтобы навигацию по бизнес-логике можно было делать быстро, даже не вчитываясь в код.
Я вообще считаю, что выбор имен - это своего рода искусство :) Потому что в идеале имя переменной должно быть без сокращений, но при этом не слишком длинное. А для этого нужно изящно учитывать контекст и постоянно контролировать читабельность. С именами методов легче - им можно и подлиннее/пополнее имена давать. Ессно, общепринятые сокращения или принятые в контексте кодируемой бизнес-логики использовать можно. Читабельность - главный критерий. Что такое читабельность? Читабельность - это насколько мало придется морщить мозг вашему коллеге (не вам!), разбирая ваш код.
Да, важное дополнение - все вышесказанное касается кодирования бизнес-логики. На математические и системные алгоритмы это ессно нет смысла натягивать. Но мы же про 1С говорим. А 99,99% кода 1с-программиста - это чистая бизнес-логика.
Артано; Olenevod; Octopus; json; +4 – Ответить
131. starik-2005 3309 24.01.19 18:28 Сейчас в теме
(130)
Лично я не люблю использовать сокращения в именах переменных и методов.
Лично я "люблю" использовать сокращения в итераторах и временных переменных. Какие-то относительно стабильные переменные внутри кода "люблю" называть "лапидарно".

ЗЫ: да, а еще я не люблю называть результат результатом, а люблю называть рез'ом, то же самое с "ДополнительныеПараметры" - слишком длинно. Достаточно "доп". Если кому-то такие сокращения непонятны, то я просто снимаю шляпу перед интеллектуальной нищетой этих товарищей.
132. herfis 525 24.01.19 18:35 Сейчас в теме
(131)
Лично я "люблю" использовать сокращения в итераторах и временных переменных.

Избегаю и там тоже. Если это временная переменная в текущем скоупе, добавляю впереди слово "Текущий"/"Текущая".
Если это итератор - стараюсь именовать так, чтобы можно было понять, что он итерирует.
ЗЫ. Всегда пишу полностью "Результат" и "ДополнительныеПараметры" :) Я снисходителен к чужим слабостям :)
133. starik-2005 3309 24.01.19 19:20 Сейчас в теме
(132) есть такой диагноз - маниакальный педантизм. Да и вообще фанатизм в любом деле несет больше вреда, чем пользы)))
Артано; ADirks; +2 – Ответить
134. herfis 525 25.01.19 10:04 Сейчас в теме
(133) У программистов часто подобные профдеформации :) Но я тихий пациент, и снисходителен к не познавшим дзен. Какой от меня вред? Сплошная польза :)
itriot11; +1 – Ответить
136. mkalimulin 1651 25.01.19 10:20 Сейчас в теме
(134) Ээээ... программирование эта такая штука...
Вот программист сел, полчаса посидел и избавил десять(сто,тысячу, сто тысяч) человек от необходимости выполнять тупую работу.
Но этот ножик заточен с двух сторон. Программист сел, полчаса посидел и создал для десяти(ста,тысячи, ста тысяч) человек необходимость выполнять тупую работу.
У каждого программиста свое сальдо. Оно может быть как дебетовым, так и кредитовым. Подумайте об этом.
137. herfis 525 25.01.19 10:23 Сейчас в теме
(136) Уже думал. Видимо слишком много и слишком долго. Ибо в итоге получилось то, что получилось :)
138. mkalimulin 1651 25.01.19 10:28 Сейчас в теме
(137) Программист сел, посидел, вынес в общий модуль алгоритмы проведения документов. И создал для десятков тысяч других пограммистов необходимость выполнять тупую работу.
Согласны?
139. herfis 525 25.01.19 10:31 Сейчас в теме
(138) Нет. И даже обсуждать эту тему с вами не хочу :) Я достаточно уже наблюдал подобных дискуссий с вашим участием.
Вы любитель натягивать сову на глобус (сводить все трейдоффы к крайним случаям). Только время потратим и все равно при своем останемся.
json; starik-2005; genayo; itriot11; Octopus; +5 – Ответить
142. starik-2005 3309 25.01.19 10:49 Сейчас в теме
(139)
сводить все трейдоффы к крайним случаям
А вот это, кстати, очень верное замечание.
140. genayo 25.01.19 10:46 Сейчас в теме
(138) И дал возможность миллионам пользователей оперативно получать обновления конфигураций в соответствии с изменяющимся законодательством не прибегая к услугам программиста. Ну, это в теории. Реальность типовых от 1С не такова, к сожалению :)
144. mkalimulin 1651 25.01.19 11:02 Сейчас в теме
(140) Эта возможность и так и так есть. Что с алгоритмами в общем модуле, что с алгоритмами в модулях документов. Если пользователь не заказывал никаких изменений, то легко обновится в обоих случаях.
НО. Если пользователь заказал и ему сделали изменение типового документа, то в моем случае (когда алгоритмы дублируются) пользователь тоже может легко обновиться без программиста. Он просто снимет галочку с измененного документа и все.
Скажете, что обновление может потребовать внесение изменений в кастомизированный документ?
А вот сядьте и подсчитайте - как часто это происходит. У меня есть на поддержке одна КА. Там РТиУ изменен. Третий год снимаю галочку, и ничего. Работает, как работало.
145. genayo 25.01.19 11:44 Сейчас в теме
(144) С алгоритмами в общих модулях разработчики решения быстрее внесут изменения и выпустят работающий продукт. И вот такое дело - если кастомизировать документы нужно 1-2% пользователей, стоит ли с коммерческой точки зрения думать о них?
146. mkalimulin 1651 25.01.19 12:14 Сейчас в теме
(145) На очередном цикле обновления они съэкономят 10 человеко-часов, но их партнёры за этот же период потратят лишних 10 000 человеко-часов. Где здесь профит?
147. genayo 25.01.19 12:56 Сейчас в теме
(146) Какой профит, вы о чём? Партнёров никто не заставлял кастомизировать так, чтобы при обновлении были проблемы.
148. mkalimulin 1651 25.01.19 13:11 Сейчас в теме
(147) Вы теряете нить разговора. Затраты времени будут при кастомизации, а не при обновлении.
149. genayo 25.01.19 13:24 Сейчас в теме
(148) Значит, в (146) я вас не так понял. Хорошо, тогда другой вопрос - 10 000 часов вы откуда взяли? И сколько часов будет потрачено, если бы процедуры были в модулях проведения? Почему думаете, что при общих модулях в разы больше, собственный опыт или есть какая-то статистика?
150. mkalimulin 1651 25.01.19 14:39 Сейчас в теме
(149) Если процедуры продублированы, то времени будет потрачено МЕНЬШЕ. Тут даже не сильно важно насколько меньше. Разработчиков типовых, условно говоря, 10 человек. А внедренцев 10 000. Вот это соотношение важно. Если найдется какой-то способ съэкономить хотя бы две минуты рабочего времени внедренца, то уже имеет смысл потратить МЕСЯЦ работы одного разработчика 1С на реализацию этого способа. Экосистема 1С в целом от этого выиграет. Как вы думаете - дополнительного месяца работы разработчику 1С хватит на то чтобы внести изменения не в один модуль, а в пять-шесть?
154. genayo 25.01.19 15:20 Сейчас в теме
(150) Если разработчик партнёра не знаком с устройством проведения документов в типовой конфигурации - да, в первый раз им будет потрачено больше времени. Но во все последующие - столько-же. Развивают типовые решения на 1С не партнёры, а разработчики. 10 часов разработчика должны давать больше развитию решения, чем 10 000 часов партнёра. Еще раз оговорюсь, в типовых от 1С пока не так.
155. mkalimulin 1651 25.01.19 15:48 Сейчас в теме
(154) Этот спор можно продолжать бесконечно. Тут только надо понимать, что если доводить вашу позицию до логического конца, то мы получим закрытый код и бинарные файлы от разработчиков. Если цель - прийти сюда, тогда да, дублирование кода бессмысленно.
165. genayo 26.01.19 08:52 Сейчас в теме
(155) Как вам удаётся из таких посылок делать столь глобальные выводы - загадка...
166. mkalimulin 1651 26.01.19 10:01 Сейчас в теме
(165) А что тут сложного? Если вы говорите, что внедренцы не должны лезть в код, то логично же этот код закрыть.
167. genayo 26.01.19 10:56 Сейчас в теме
(166) Это где я такое говорил? Между строк читаете что-ли? "Лезть в код" можно по-разному, благо платформа теперь много вариантов позволяет...
168. mkalimulin 1651 26.01.19 11:01 Сейчас в теме
(167) Как только вы полезете в код. Неважно зачем. Вы начнете тратить рабочее время. Это неочевидно?
169. genayo 26.01.19 12:23 Сейчас в теме
(168) Я ННП о чём вы :( Но очень интересно.
172. mkalimulin 1651 26.01.19 12:43 Сейчас в теме
(169) Ничего сложного. Код открыт. Широкие народные массы лезут в код. Они при этом тратят свое время?
173. genayo 26.01.19 13:04 Сейчас в теме
(172) Я потерял нить разговора. Поэтому просто предлагаю вам переписать типовую УТ 11 без использования общих модулей. Когда закончите - продолжим.
170. TODD22 20 26.01.19 12:31 Сейчас в теме
(165)
Как вам удаётся из таких посылок делать столь глобальные выводы - загадка...

Он вроде обещал "поделится" в прошлой теме, так и не отсыпал?
171. mkalimulin 1651 26.01.19 12:41 Сейчас в теме
153. itriot11 74 25.01.19 15:15 Сейчас в теме
(149) Да оставьте автора в покое) Образ о себе он уже сформировал - специалист тех поддержки, который меняет пару символов в течении 10 000 человеко-часов, в чем виноваты разработчики преувеличивающие значение своего продукта. Предлагаю просто набраться терпения и подождать выхода следующей статьи от Максима.

P.S. 10 000 и 10 - почему именно так и очень часто? Это какие-то сакральное числа?)
156. mkalimulin 1651 25.01.19 15:53 Сейчас в теме
(153) Они делятся на 10 без остатка )))
А кто такой Максим?
157. itriot11 74 25.01.19 16:03 Сейчас в теме
(156) Извините, Михаил. Меня проглючело к концу недели. Конечно Вас имел ввиду.
158. mkalimulin 1651 25.01.19 16:22 Сейчас в теме
(157) Следующая статья будет немного о другом. И не такая спорная. Но тему, конечно буду развивать в дальнейшем.
129. MCV 24.01.19 17:45 Сейчас в теме
(126)
Ключевое слово там было "придерживаться" ;-)
Если нет предметной области , то и флаг Вам в творческие руки для образования этих имен.
135. genayo 25.01.19 10:14 Сейчас в теме
(126) А если переменные выборки назвать X и Y, то как, нормально?
141. starik-2005 3309 25.01.19 10:48 Сейчас в теме
(135)
А если переменные выборки назвать X и Y, то как, нормально?
Если выбирать декартовы координаты, то даже очень нормально, но, боюсь, некоторые любители стандартов такое не смогут оценить )))
143. genayo 25.01.19 10:50 Сейчас в теме
(141) Ну не надо уподобляться автору, рассматривая только крайние случаи :)
10. nyam-nyam 22.01.19 13:48 Сейчас в теме
(3)Да троллинг и есть. Решил поддеть всех кто с его "СуммаПервогоИВторого=Первое*Второе;" не согласился в предыдущей статье. :)
Типа:
Все говорят, что "копипастить" нельзя,
Все говорят, что "копипастить" нельзя,
Все говорят, что "копипастить" нельзя,
А я говорю, что буду.
alalsl; pavlov_dv; for_sale; Plotks2017; Vladimir Litvinenko; +5 – Ответить
4. itriot11 74 22.01.19 12:40 Сейчас в теме
надо внести какое-нибудь плевое изменение в модуль проведения одного из документов. Реквизит регистра заполнить по-своему или контроль подправить

На мой взгляд, пример не самый подходящий, не говорит о сложности доработки. Поправьте меня, если я ошибаюсь, но задачу в приведенную Вами можно решить подписками на события буквально за минуты.
Про обновление - тут все таки стоит указывать контекст...Например, раз разобравшись в параметрах формирования движений Учета затрат(УПП), потом совершенно не составит труда поддерживать этот функционал. Зато можем надеется, что после изучения механизма, наш специалист поддержки узнает, что есть что-то большее, чем примеры из методички, а далее сможет выработать навык работы со сложным кодом.
В целом, Ваш пример о частной, мелкой задаче. Давайте попробуем рассмотреть что-то покрупнее, что будет касаться не только одного реквизита одного из документов? Боюсь, вывод может оказаться не таким однозначным как сейчас Вы привели))
sergathome; Andreeei; acanta; +3 – Ответить
51. user614213_vluminous 23.01.19 09:37 Сейчас в теме
(4) В общем случае, если пробовать использовать подписку для изменения пары символов в случае большой конфигурации, в которой все вынесено в общие модули - скорей всего не получится. А если получится, то буквально за минуты такое не сделаешь.
6. Evg-Lylyk 5530 22.01.19 13:11 Сейчас в теме
Не понял что хотел донести автор. Я художник я так вижу )
for_sale; +1 – Ответить
13. acanta 22.01.19 14:04 Сейчас в теме
Это скорее квантование - определение минимального объема кода, допустимого для копипаста.
16. burmsergey 22 22.01.19 14:30 Сейчас в теме
Потому что человека с опытом вряд ли может удивить и, тем более, возмутить что-либо в чужом коде.

Насчёт удивить - согласен. А вот по поводу возмутить - скорее, наоборот.
pavlov_dv; bulpi; +2 – Ответить
17. burmsergey 22 22.01.19 14:47 Сейчас в теме
// Идеальный код должен обладать таким свойством, что если взять и заменить в нем все имена переменных на случайно подобранные,
// то он нисколько не потеряет в читабельности.

В читабельности - может быть.
А вот в понимаемости - не думаю (мягко говоря)!

P.S.
Это откуда такая мысль ?
for_sale; +1 – Ответить
21. genayo 22.01.19 15:00 Сейчас в теме
(17) Источник - голова автора. Больше источников не обнаружено.
for_sale; +1 – Ответить
23. Vovan1975 13 22.01.19 15:01 Сейчас в теме
(17) меня больше интересует вопрос что автор слышал про обфускаторы
for_sale; burmsergey; +2 – Ответить
55. for_sale 901 23.01.19 10:15 Сейчас в теме
(23)
ему не нужно, он код пишет сразу обфусцированным)
pavlov_dv; +1 – Ответить
18. profiprog1c 260 22.01.19 14:52 Сейчас в теме
Иногда человек пытается сказать что-то умное, чтобы казаться умным, но всем тут же становится понятно, что он глуп. Тут все также - очередной сферический конь в вакууме.
User_south; klinval; pavlov_dv; for_sale; bulpi; Vovan1975; +6 – Ответить
20. genayo 22.01.19 14:59 Сейчас в теме
(18) Может ли хороший программист быть дураком?
22. Vovan1975 13 22.01.19 15:00 Сейчас в теме
(20) Специалист подобен флюсу - он односторонен. (с)К.Прутков
for_sale; acanta; +2 – Ответить
19. acanta 22.01.19 14:57 Сейчас в теме
В конфигурации 1с все совпадения с реальностью случайны и непредумышлены.
alalsl; Aggressorak; dachnik; sergathome; +4 – Ответить
24. brr 184 22.01.19 15:03 Сейчас в теме
А потом во всех местах копипасты нужно будет поменять одну строчку. Автор убейся об стену.
klinval; alalsl; pavlov_dv; litonchik; rintik; Plotks2017; bulpi; Jkero; +8 – Ответить
26. Vovan1975 13 22.01.19 15:26 Сейчас в теме
(24) в тему призываются страдальцы по ндс 20%
neuromancer_aza; namazi74; alalsl; pavlov_dv; litonchik; Kirill_K; +6 – Ответить
28. Jkero 22.01.19 16:02 Сейчас в теме
А теперь представим, приходит новый прогер с задачей разобраться, что с этим регистром не так. И ему надо, вместо одного общего модуля просмотреть все модули документов, которые являются регистратором. А они одинаковые, отличаются только на 5-10 строк, которые ему нужно найти. Думаю, он не будет рад такой схеме.
barneotec; +1 – Ответить
29. Petr54-ru 95 22.01.19 16:57 Сейчас в теме
Я стараюсь пользоваться стандартами кодирования, описанные на ИТС (тут уже в каментах была туда ссылка) и внимать методическим рекомендациям с ИТС.

Еще я в комментариях в коду описываю бизнес-логику (что конкретно эта фигня должна делать и зачем это нужно). И не вычищаю рабочие комментарии описывающие поведение этого куска кода. Заглушки и служебные комментарии вычищаю.

И еще я стараюсь делать свой код дружественным к читателю, а не к платформе или железу. Будут проблемы с быстродействием, буду их решать - не вылезут такие проблемы - не буду решать. Хаз, хаз и в продакшен. Ну вы поняли.

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

Меня чужой говнокод не напрягает, и я своего тоже не стесняюсь. Работает - не трогай! Вот и все что могу сказать про эти "coding standards".
32. starik-2005 3309 22.01.19 18:22 Сейчас в теме
(29)
Меня чужой говнокод не напрягает, и я своего тоже не стесняюсь. Работает - не трогай! Вот и все что могу сказать про эти "coding standards".
Хорошее solution, как сказал бы какой-нибудь любитель best practice.

Вообще, стандарты, которых стоило бы придерживаться при программировании, достаточно просты и сформулированы уже не менее тысячи лет логиками древности:
1. Оккам - не стоит плодить сущности без необходимости. Если они есть - код, каким бы красивым ни был, - не так хорош, как без них. И чем больше бессмысленных сущностей - тем хуже код.
2. Вместе с тем лучшее - враг хорошего. Да, Шекспиры и Вольтеры жили чуть позднее, но первоисточник подобного подхода сокрыт временем куда более древним. Данный момент может вступать в противоречие с первым пунктом, но золотая середина всегда разумнее бесконечной замороченности на тему поисков лишнего. Сделай хорошо с может быть небольшим количеством лишнего - и это будет куда лучше бесконечного выкидывания лишнего из кода до передачи его в "продакшн".
3. Все гениальное - просто. Этак Геббельс перефразировал (упростил) фразу да Винчи, который тоже, предположу, не сам оное придумал. Отсюда как бы мораль: не усложняй простое, старайся упростить сложное.
4. Глаза боятся - руки делают. Главное - начать. Ну и сотня похожих фраз. Тут мораль проста - лучше начать делать что-то, чем год думать о том, как "упростить". Часто за год все сильно усложняется, т.е. если не делать - не перейдешь к отладке, которая и занимает основное время разработки. Все эти TDD и прочие тесты - это попытка вкорячить отладку в код, автоматизировать ее каким-то образом и потом передть обратно в виде многостраничных инцидентов. Тоже, конечно, вариант.
5... Могу много написать, но может быть потом статью накатаю.
TABEZI1234; Alex_E; pavlov_dv; alexander-pro; dachnik; Dem1urg; sergathome; acanta; +8 – Ответить
52. Dem1urg 403 23.01.19 09:54 Сейчас в теме
(32) А накатайте!
69. starik-2005 3309 23.01.19 14:16 Сейчас в теме
(52) накатал. Думаю, сегодня ее отмодерируют )))
EVKash; Светлый ум; acanta; Octopus; +4 – Ответить
70. starik-2005 3309 23.01.19 15:06 Сейчас в теме
127. Светлый ум 509 24.01.19 17:37 Сейчас в теме
(69) а неплохо накатал!)
30. herfis 525 22.01.19 17:10 Сейчас в теме
Что из этого следует.
Если вы разработчик-одиночка и не работаете дольше года на одном проекте, то вам сюда.
Vladimir Litvinenko; +1 – Ответить
34. mkalimulin 1651 22.01.19 20:20 Сейчас в теме
(30) Спасибо, я уже видел эти джинсы. Рукава из карманов. Очень смешно. Просто обхохочешься.
78. for_sale 901 23.01.19 16:24 Сейчас в теме
(30)
Эту статью автор видел. Это от неё у него подгорело так, что уже третью пишет)
79. mkalimulin 1651 23.01.19 16:27 Сейчас в теме
(78) А вы чего не пишите? Смешную картинку не можете найти?
80. for_sale 901 23.01.19 16:34 Сейчас в теме
(79)
Боюсь!
Одна моя статья средней руки вон как вас покоробила. Боюсь дальше что-то писать, вдруг вы от злости или зависти (так и не понял, чему завидовать, но все симптомы на лицо) ещё что-то непоправимое с собой сделаете или, не дай Бог, ещё пачку статей с вашими недоценёнными для своего времени мыслями напишете! Да и зачем из пустого в порожнее переливать? Для этого у нас есть вы)) "Одну статью заминусовали - я ещё одну напишу, такого же содержания. Эта не вылезет - ещё одну. Буду писать, пока они от страха перед новыми моими статьями не будут старые бешено плюсовать!" А мы ведь будем! Не дай боже ваш код мне ночью приснится - да я для этого сколько скажете вам плюсов поставлю, только бы вы перестали))
82. mkalimulin 1651 23.01.19 16:38 Сейчас в теме
(80) Вы лучше ответьте на вопрос.
Один стартмани - это деньги или не деньги?
81. herfis 525 23.01.19 16:36 Сейчас в теме
(78) Неправда. Он давно уже "топит" в этом направлении. Что мол у правильного программиста должен быть особый мозг и правильный код должен быть заточен под этот особый мозг. Даже циркули какие-то выкладывал для отсеивания неправильных программистов. Шутка :)
Но пикантность в том, что частично постулаты с этой статьей пересекаются, поэтому я про нее и вспомнил :)
83. for_sale 901 23.01.19 16:42 Сейчас в теме
(81)
Вот циркуль мне понравился, там хотя бы смешно было :) А тут прям как фильм ужасов!
31. starik-2005 3309 22.01.19 17:58 Сейчас в теме
Предположу, что народ, который не совсем согласен со статьей, просто не смог преобразовать логическое выражение в "(ПН И ПНП) ИЛИ (РН И РНП)". Но религия - такая штука. Предположу, что автор, упомянув Дейкстру, сам является адептом религии "ГОТО - это плохо". Но, конечно, не факт.
33. mkalimulin 1651 22.01.19 20:18 Сейчас в теме
(31) Нет, конечно. Я адепт религии использовать текст для программирования - это плохо )))
50. pm74 208 23.01.19 08:17 Сейчас в теме
(31)
преобразовать логическое выражение в "(ПН И ПНП) ИЛИ (РН И РНП)

не равносильно исходному при

ПН = Истина; ПНП = Истина; РН = Истина; РНП = Ложь;
Шаблон = ((ПН И ПНП) И (РН И РНП)) ИЛИ (( ПН = Ложь ) И (РН И РНП)) ИЛИ ((ПН И ПНП) И (РН = Ложь));
Сообщить("Шаблон =  " + Шаблон);  // Ложь
Выражение1 = (ПН И ПНП) ИЛИ (РН И РНП); 
Сообщить("Выражение1 =  " + Выражение1); // Истина

//  как и  при  ПН = Истина; ПНП = Ложь;  РН = Истина; РНП = Истина;
 
Показать


з.ы. не особо силен в БА поэтому лучше чем (aa1bb1)+(!abb1)+(!baa1) => bb1(!a+a1) + !baa1 ничего в голову не пришло
или так (НЕ РН ИЛИ РНП) И (НЕ ПН ИЛИ ПНП) И (РН И РНП ИЛИ ПН И ПНП)
35. TODD22 20 22.01.19 21:01 Сейчас в теме
Этот типичный пример копирования кода я взял из одной своей работы.

Клавишу "шифт" так и не завезли?



"Сон разума рождает чудовищ"

но будь я руководителем разработки такой ответственной конфигурации, я бы просто заставил... СКОПИРОВАТЬ КОД.

По этому видимо и не светит.... стать руководителем такой ответственной конфигурации... тут бы шифт на клавиатуре освоить и имена переменных.
User_south; sergelemon; for_sale; +3 – Ответить
36. mkalimulin 1651 22.01.19 21:06 Сейчас в теме
(35) Да не люблю я "КонецЕсли", вы же знаете. Выглядит уродливо )))
37. genayo 22.01.19 21:31 Сейчас в теме
(36) Э... Да вы эстет, однако.
38. bulpi 219 22.01.19 21:59 Сейчас в теме
1)Минусы принципиально не ставлю, а то бы поставил.
2)Автор поставляет материал для очередного продолжения "Ректального программирования". Спасибо ему!
3)
но будь я руководителем разработки такой ответственной конфигурации, я бы просто заставил... СКОПИРОВАТЬ КОД.

А я бы на йух послал немедленно и свалил.
barneotec; sergelemon; товарищ Ын; json; +4 – Ответить
39. mkalimulin 1651 22.01.19 22:14 Сейчас в теме
(38) Это хорошо, что вы такой принципиальный.
А что по-вашему важнее? Сделать продукт, который будет удобен узкой группе разработчиков продукта или тем, кто его поддерживает?
40. itriot11 74 22.01.19 22:30 Сейчас в теме
(39) судя по обратной связи к публикации, похоже, что в узкой группе разработчиков находитесь Вы)
barneotec; sergelemon; Reaper_1C; for_sale; +4 – Ответить
41. mkalimulin 1651 22.01.19 22:58 Сейчас в теме
(40) На вопрос есть что ответить?
42. itriot11 74 22.01.19 23:31 Сейчас в теме
(41) Я Ваш вопрос воспринимаю как - "что по-вашему важнее? Сделать продукт, который будет удобен разработчикам придерживающихся общих стандартов или тем, кто солидарен с подходом приведенным в публикации?" Иначе, увы, не выходит. Так вот при такой трактовке, вынужден выбрать первый вариант. Я б не прочь изменить мнение, и даже отчасти понимаю ход мысли, да только аргументы, на мой взгляд, у Вас слабоваты.
sergelemon; +1 – Ответить
43. mkalimulin 1651 22.01.19 23:42 Сейчас в теме
(42) То, что с высокой вероятностью кастомизируется, то копируется. То, что с высокой вероятностью не кастомизируется, то выносится в общий модуль. Вы можете сказать - чем плох такой подход?
Aggressorak; +1 –5 Ответить
44. itriot11 74 23.01.19 00:02 Сейчас в теме
(43) Сперва, я Вас попрошу развернуть понятие "вероятность кастомизации" и каким образом ее можно вычислить. Желательно на конкретных примерах типовых конфигуаций, поскольку признаюсь, у меня плохо с абстракцией(ну да, имею грешок именовать переменные характерно принимаемым ими значениям).
sergelemon; +1 – Ответить
75. bulpi 219 23.01.19 15:54 Сейчас в теме
(39)
ТОЛКОВО написанная конфигурация удобна для всех :
1)разработчиков
2)поддержки
3)главное - пользователей.
Ни одной типовой конфигурации, толково написанной, я не видел. Думаю, там задачи другие - не сделать толковое ПО, а срубить бабла.
76. mkalimulin 1651 23.01.19 16:03 Сейчас в теме
(75) Так-то оно так. Но..
Иногда бывает конфликт интересов. Я и попытался до вас этот момент донести.
Если разработчики конфигурации пять раз скопируют код, тогда им будет труднее его поддерживать (а кстати, насколько сложнее, в самом деле? есть же автоматический рефакторинг), зато специалистам "последней мили" будет значительно проще. Весь вопрос в том, что имеет смысл экономить. Человеко-часы разработчиков или человеко-часы специалистов поддержки? Что более оправдано экономически и что более экологично?
77. acanta 23.01.19 16:22 Сейчас в теме
(76) Никаких но. Конфликт интересов присутствует всегда.
Вопрос в том, кто ими поступается. Работа по найму предусматривает что вам платят за то, чтобы вы соблюдали интересы других людей.
А то что бывает "иногда" - это те ситуации, когда работник не исполняет свои обязанности.

Проблема в отношениях внедренцы 1С и разработчики 1С - это непонимание кто кого нанял.

Нас наняли как торговых представителей фирмы 1С (обучили, выдали сертификаты и отправили на предприятия) - мы продаем/модифицируем то что наш прямой работодатель разработал. Такое отношение и приводит к процедуре в глобальном модуле "проведение всего - если это накладная тогда так, если это банковская выписка тогда этак". В этом случае можно копипастить в каждый документ одну строчку - глПроведение.ПроведениеВсего(Объект).
86. mkalimulin 1651 23.01.19 16:53 Сейчас в теме
(77) Ну хорошо. Пусть так. Пускай, мы все работники одной большой компании.
Внимание, вопрос! Компания должна стремится к повышению производительности труда или к понижению?
88. acanta 23.01.19 17:23 Сейчас в теме
(86) Вы, как внедренец, предлагаете измерять собственную производительность?
И планируете информировать фирму 1С о том что потратили на доработку типовой конфигурации 1С в соответствии с пожеланиями клиента 10 минут, а на то, чтобы разобраться с кодом типовой 2 года?
И вам удастся убедить фирму 1С в том, что клиент должен заплатить за 10 минут исходя из минимальной месячной оплаты труда (11тыс/158 часов)/60*10, а за 2 года - вы согласны получать стипендию студента техникума?
89. mkalimulin 1651 23.01.19 17:29 Сейчас в теме
(88) А зачем два года разбираться с типовой? В предлагаемой мною модели внедренец выучит только, что документы двигают регистры, а в модуле документа есть процедура ОбработкаПроведения(). Ему не потребуется на это ни двух лет, ни даже двух часов. После чего, он найдет в модуле документа нужное место и сделает свою работу за 2 минуты.
90. acanta 23.01.19 17:34 Сейчас в теме
(89) Вы хотите написать собственную конфигурацию по собственным стандартам разработки с расчетом на то, что любой разработчик/внедренец на месте сможет дорабатывать ее за 2 минуты?
91. mkalimulin 1651 23.01.19 17:39 Сейчас в теме
(90) Для этого, в частности, было бы достаточно просто скопировать модули проведения документов.
Можно взять актуальную типовую. Провести рефакторинг. Вернуть бизнес-логику из общих модулей в модули документов. И у вас будет в принципе та же самая конфигурация. Но значительно лучше.
Или значительно хуже. Зависит от того как вы относитесь к бесконечной генерации бессмысленной деятельности.
92. acanta 23.01.19 17:42 Сейчас в теме
(91) Как вы отличаете бессмысленную деятельность от разумной и время, потраченное впустую от времени, которое потрачено с пользой?
93. genayo 23.01.19 17:46 Сейчас в теме
(92) Автор, к сожалению, никого, кроме себя, слышать не в состоянии...
94. mkalimulin 1651 23.01.19 17:50 Сейчас в теме
(92) Если для достижения одного и того же результата в одном случае было потрачено 10 человекочасов а в другом 1000, тогда можно сказать, что вторая деятельность была почти полностью бессмысленной. Не так ли?
95. acanta 23.01.19 17:56 Сейчас в теме
(94) Если вы про использование экскаватора или лопаты для рытья траншей, то затраты в 10 человекочасов необходимо сложить с разработкой и созданием экскаватора, а так же с его обслуживанием, ремонтом и доставкой горючего. Лопата в 1000 человекочасов выгоднее, а для Робинзона Крузо - еще и единственно возможный вариант.
Но если мы оцениваем только наши собственные 10 человекочасов при наличии готового и работающего продукта, то вы правы.
Глупо заглушать экскаватор под парами и браться за лопаты, только потому что заканчивается бензин.
97. mkalimulin 1651 23.01.19 18:00 Сейчас в теме
(95) Тут нет никаких экскаваторов и лопат. Есть человеко-часы разработчиков и человеко-часы внедренцев.
98. mpeg1989 135 23.01.19 18:03 Сейчас в теме
(91) Типичная ломка программиста, переходящего с неуправляемых (ут 10.3) на управляемые формы (ут 11). Полгодика опыта и тоже сможете быстро ориентироваться в процедурах проведения.
114. Nenaviju1C 24.01.19 08:33 Сейчас в теме
(39)мне, как разработчику, не важно кто продукт будет поддерживать.
Если поддержкой занимается квалифицированный специалист - такой разберется в любом коде. А без знаний и опыта даже простейший кусоу кода будет вызывать затруднения.
Теперь про важность )) важна масштабируемость, а не какие то там группы для кого ВЫ пишите. Решение разрабатывается для бизнеса, а не для групп разработчиков. Отсутствие масштабируемости приводит к нехорошим последствиям по более серьезной и глубокой доработки решений.
ПыСы: а вот руки надо за копипаст прям под корень;)
sergelemon; mpeg1989; itriot11; +3 – Ответить
118. mkalimulin 1651 24.01.19 09:14 Сейчас в теме
(114) Представьте себе две компании и два продукта. Одна и та же задача клиента для одного продукта решается за 2 минуты. А для другого за 4 часа. Как долго будут конкурировать эти два продукта? И что в принципе вторая компания может противопоставить?
Проблема нашей ситуации в том, что у нас только одна компания. Она может себе позволить вести себя неэкологично. И позволяет.
119. itriot11 74 24.01.19 10:53 Сейчас в теме
(118)
Представьте себе две компании и два продукта. Одна и та же задача клиента для одного продукта решается ручками пользователя. А другая только тех поддержкой. Как долго будут конкурировать эти два продукта? И что в принципе вторая компания может противопоставить?
120. mkalimulin 1651 24.01.19 11:42 Сейчас в теме
(119) Следите внимательнее за ходом дискуссии. Дублирование кода в модулях проведения никак не отразится на пользователях. Есть два продукта. В одном модули дублированы, в другом вынесены в общий модуль. Для пользователя эти два продукта неразличимы.
121. itriot11 74 24.01.19 12:00 Сейчас в теме
(120) Я Вашей публикации звездочку не поставлю, даже несмотря на то, что она заняла не мало моего внимания. Однако, не могу не признать, что считаю обязанным отметить ее для себя. А сделаю я это следующим образом - добавлю в закладки, но только не под тем наименованием, которое Вы ей дали, а назову скажем "Лакмус". Буду давать почитать ее в качестве одного из вариантов задания к собеседованиям. А мнение кандидата о написанном, буду учитывать при окончательном решении. Да, пожалуй тут любопытны не только тезисы описанные в самой статье, сколько ход дискуссии, в особенности ваши аргументы приведенные, так скажем, в динамике. В таком качестве Ваша публикация становится для меня весьма полезной, а значит благодарю за труд над ней)
122. mkalimulin 1651 24.01.19 12:04 Сейчас в теме
(121) Спасибо за отзыв.
123. Nenaviju1C 24.01.19 13:20 Сейчас в теме
(118)
Представьте себе две компании и два продукта

Для бизнеса чем быстрее, тем лучше, и это понятно, но ...
Все манипуляции с кодом, которые мы делаем, мы делаем только для себя, а для бизнеса слово "рефакторинг", к примеру, ни говорит ни о чем, за то нам о многом и плохо пахнующий код добавляет только трудности нам, в том числе возрастает вероятность ошибки из разряда "забыл что еще надо поправить похожую логику метода в 10 модулях ..."
А противопоставить есть что - озвучивать реальные сроки выполнения задачи, с учетом всех требований к разработки решений.
125. mpeg1989 135 24.01.19 14:40 Сейчас в теме
(123) ... и после того, как поправил копипаст не во всех местах, деятельность организации встает, и фирма теряет ежечасно более 100к рублей. После этого приходится делать динамические обновления, которые могут начисто положить базу еще на несколько часов.

Такой способ программирования подходит если внедрили что-то крупное, а оно не взлетело, и надо быстро подправить костылями, чтобы пользователи сейчас начали работать, а ты уже вечерком сделаешь как надо.
sergelemon; +1 – Ответить
45. mkalimulin 1651 23.01.19 00:05 Сейчас в теме
(44) Пересчет суммы по курсу валюты имеет низкую вероятность кастомизации.
Логика работы любого документа - высокую.
48. genayo 23.01.19 06:31 Сейчас в теме
(45) Что вы подразумеваете под "логика работы документа"? Пересчёт суммы при изменении количества, расчёт НДС, контроль остатков? Можно поконкретнее?
46. script 128 23.01.19 00:43 Сейчас в теме
Ох автор и провокатор.
У меня его утверждения вызывают отторжение на подсознательном уровне.
Но его хитрый замысел я скорее всего понял, поэтому ставить плюс не буду.

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

Кроме того глядя на стремление кодинга в сторону функционального программирования, без осмысленных названий будет вообще никуда. Тогда уже и сам кодинг нужно тоже перекладывать на машину.
47. acanta 23.01.19 03:01 Сейчас в теме
Вот смотрите, есть в КА 2 отражение документа в бух.учете. В расходной накладной есть ссылка на заказ.
В УНФ в заказе есть несколько вариантов заказа.
Есть версионирование БСП и даже может быть появится история в платформе.
Но, когда бухгалтер видит свежеизмененные документы (которые в бух.учете необходимо отразить повторно) он теоретически может узнать по какой версии отражение происходило, и чем эта версия отличается от последней и только в том случае, если это версионирование включено.
Но реальной привязки версии основания к накладной или версии любого бухгалтерского документа к отражению нет. Зато есть куча спотыкалок, например, если у документа есть корректировка, его уже нельзя изменить. Вероятность кастомизации высокая, а 1с этого не поддерживает.
Почему так, как вы думаете?

А как красиво получается, открыл накладную, перешел по ссылке заказ, открывается заказ той версии по которой сделана накладная и в подзаголовке написано (как в консультанте) вы открыли не последнюю версию. Но это уже не 1С.
49. pm74 208 23.01.19 07:18 Сейчас в теме
(0)
  Если ((ПН И ПНП) И (РН И РНП)) ИЛИ 
    (( ПН = Ложь ) И (РН И РНП)) ИЛИ 
    ((ПН И ПНП) И (РН = Ложь)) Тогда   


И спросили: "Ну и как? Это хороший код по-твоему?"

Нет. Это - плохой код. Вместо трех строчек условий следует оставить одну с одним "ИЛИ".


какую строчку нужно ввести , эквивалентную исходному выражению ?
63. mkalimulin 1651 23.01.19 11:34 Сейчас в теме
(49) Проверил. Действительно не сокращается.
Вставил комментарий в статью. Спасибо за поправку.
65. pm74 208 23.01.19 11:48 Сейчас в теме
(63)
Действительно не сокращается.


((ПН И ПНП) И (РН И РНП)) ИЛИ (( ПН = Ложь ) И (РН И РНП)) ИЛИ ((ПН И ПНП) И (РН = Ложь))
<=> РН И РНП И (НЕ ПН ИЛИ ПНП) ИЛИ НЕ РН И ПН И ПНП
<=> (НЕ РН ИЛИ РНП) И (НЕ ПН ИЛИ ПНП) И (РН И РНП ИЛИ ПН И ПНП)

последние 2 все таки короче
53. for_sale 901 23.01.19 10:04 Сейчас в теме
Жесть! Михаил, опять вы))) Вот жеж накипело у вас! Да оставьте вы это, ну вы же видите - не ваше это - писать код и статьи!

Этот типичный пример копирования кода я взял из одной своей работы

Это просто жесть! Вспоминается фильм "Зелёный слоник". С такой гордостью вывалить ЭТО прямо в лицо неподготовленному читателю...
User_south; profiprog1c; +2 –1 Ответить
54. genayo 23.01.19 10:14 Сейчас в теме
(53) Не стреляйте в пианиста, он играет как умеет (с)
Ну и у статьи плюсов больше чем минусов, публике нравится :)
56. for_sale 901 23.01.19 10:17 Сейчас в теме
(54)
конечно нравится! он же не один так пишет) Я бы уже с голоду помер, если бы не было таких "программистов", за которыми потом приходится проекты переделывать.
sergathome; Octopus; Vladimir Litvinenko; itriot11; +4 – Ответить
57. ADirks 187 23.01.19 10:23 Сейчас в теме
(53) И что характерно, автор выделяет скопипащенные блоки, но при этом совершенно равнодушен к лютейшей копипасте фрагментов
врег(сокрлп(св.свойство))
и
врег(сокрлп(св.значение))

Мне интересно, кто-то вообще обратил на это внимание?
Такое чувство, что все к этому привыкли настолько, что не замечают.
for_sale; +1 – Ответить
58. genayo 23.01.19 10:28 Сейчас в теме
(57) Нет, мы, как вежливые люди, обсуждаем контент статьи, а не личность автора :)
60. for_sale 901 23.01.19 10:34 Сейчас в теме
(57)
Я даже не вчитывался особо, мне показалось там то ли машинный код, то ли обфусцированный. Всё мелкими буквами, ни одного пробела. Странно, что отступы использует.

Автор, перестаньте использовать отступы! Вы ломаете всё погружение в матрицу!
pavlov_dv; +1 – Ответить
61. ADirks 187 23.01.19 10:46 Сейчас в теме
(60) На самом деле в данном случае это (отсутствие пробелов и proper case'а) мелочи. Самая главная шляпа именно в отсутствии предварительной нормализации входного потока данных, и тысячекратная нормализация в процессе анализа. Где-то пропустил врег() или сокрлп() - и здравствуй неделя отладки. Непонятно также, отсутствие нормализации в некоторых местах - это глюк или фича?

А так, это некий парсер некоей грамматики, я их даже с прищуреным глазиком узнаю.
Кстати, понятно теперь утверждение автора, о сложности изготовления регистронезависимого парсера. При таком подходе действительно сложно.
for_sale; +1 – Ответить
73. mkalimulin 1651 23.01.19 15:27 Сейчас в теме
(61) У меня не текст на входе.
Насчет нормализации вы абсолютно правы. Я этот момент изначально упустил, потому что был сосредоточен не на тексте.
62. for_sale 901 23.01.19 11:11 Сейчас в теме
Скажу сразу. Всех авторов Инфостарта я люблю и уважаю

"Поэтому давайте сразу же расскажу вам парочку историй о них, в которых я - д'Артаньян, а они... ну вы поняли."
64. mkalimulin 1651 23.01.19 11:36 Сейчас в теме
(62) Рад вас видеть.
Скажите: один стартмани - это деньги или не деньги?
66. dachnik 27 23.01.19 12:50 Сейчас в теме
(64) 94,88 рублей на 23.01
67. genayo 23.01.19 13:04 Сейчас в теме
(66) Не... это не деньги... :)
68. dachnik 27 23.01.19 13:20 Сейчас в теме
(67) так я и не называл деньгами. Одна из отличительных особенностей денег - свободное обращение. sm скорее как купон на получение определенной услуги (типа подарочного сертификата)
71. acanta 23.01.19 15:20 Сейчас в теме
Именно так, и теперь, когда программисты осознали неправильность своего кода, а пользователи - неправильность своей работы, все хотят жить хорошо и быть успешными, но программа этого уже не позволяет.
72. gubanoff 66 23.01.19 15:26 Сейчас в теме
(0) Всегда рекомендую читать классику - "Совершенный код" С. Макконнелл. Там написано все и подробно. А автор статьи, по моему мнению, хотел донести мысль, что между "плохой код"-"хороший код" есть еще промежуточные варианты. Мысль правильная, всегда нужно искать баланс между скоростью и качеством и этот баланс может меняться в разных ситуациях.

Я бы обратил внимание на то, что некоторых разработчиков бросает в крайности и религиозные войны. Адекватного опытного специалиста характеризует его умение менять баланс в зависимости от контекста.
mytg; Aggressorak; for_sale; VladimirMelnychenko; +4 – Ответить
74. mkalimulin 1651 23.01.19 15:29 Сейчас в теме
(72) Спасибо. Прекрасная мысль!
84. json 3438 23.01.19 16:42 Сейчас в теме
Делайте со мной что хотите, но будь я руководителем разработки такой ответственной конфигурации, я бы просто заставил... СКОПИРОВАТЬ КОД


Был у нас один программист.
Написал он отчет.
В этом отчете около 10 колонок и 40 строк.
Каждая строка - это отдельный показатель, который имеет свои особенности в расчете.

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

И мне прилетает задача - добавить колонку в этот отчет.

Вопрос к автору: где тут выигрыш в производительности для поддержки?
for_sale; +1 – Ответить
85. starik-2005 3309 23.01.19 16:48 Сейчас в теме
(84) описание задачи хорошее - добавляем колонку и пишем процедуру на заполнение колонки для 40-ка строк )))

Но это, ИМХО, какой-то уж очень специфичный пример. Такого в жизни вряд ли много.

С другой стороны, автор, опять же ИМХО, не советует всегда делать сто процедур - по штуке на каждую сущность. С другой стороны, когда у нас происходит контроль ввода пользователя в поле, то для каждого документа каждое поле контролируется индивидуально даже в типовых.
87. json 3438 23.01.19 17:10 Сейчас в теме
(85)
ну если как рекомендует автор, вместо одной процедуры проведения в общем модуле скопировать этот код в модуль каждого документа, который двигает наш регистр, то можно попасть на аналогичную проблему.
Если потребуется, например, добавить ресурс или реквизит в регистр, то придется лезть с исправлениями в N документов.
for_sale; +1 – Ответить
96. mpeg1989 135 23.01.19 17:58 Сейчас в теме
Работал я с такой конфигурацией, тоже так же написана была некоторыми людьми. Их, кстати, уже не было, поэтому свою мегаконцепцию донести они не могли. Да, группы разработчиков распадаются, код остается. Что с ним делать дальше - непонятно.

Так вот, любая дописка, которую изначально оценивали в полдня, выливалась в неделю, потому что надо выцепить все куски кода, где есть копипаст, и поправить их, понять что находится в поле выборки под названием "Поле4", и понять замысел создателя. А потом находишь, что просто так в эту хрупкую экосистему ничего не добавить и встаешь перед выбором - дальше на этот карточный домик пытаться надстроить еще этаж или снести все и построить из кирпичей...

ПС
Неиспользование шифта - это просто жесть. Я обычно такое называю "синдром ленивого мизинца". Порождает такие шедевры, как "типполисапуст" и "задень". А в сочетании с лютыми сокращениями, получаются "предвподнямики"!
EVKash; Octopus; pavlov_dv; dachnik; itriot11; herfis; +6 – Ответить
99. herfis 525 23.01.19 18:32 Сейчас в теме
(96)
Неиспользование шифта - это просто жесть. Я обычно такое называю "синдром ленивого мизинца". Порождает такие шедевры, как "типполисапуст" и "задень". А в сочетании с лютыми сокращениями, получаются "предвподнямики"!

Аааааааа! Спасибо за поднятие настроения :)
100. mkalimulin 1651 23.01.19 18:42 Сейчас в теме
(99) "задень" отлично звучит. Мозг к такому легко цепляется. А вот "предвподнямики" какой-то уродец. Я ж говорю, не используйте осмысленные имена.
102. herfis 525 23.01.19 18:52 Сейчас в теме
(100) Лучше всего в качестве имен переменных подходят гуиды.
- никаких ложных абстракций
- никаких проблем с нумерацией
- никаких проблем вообще с придумыванием имен. Нужна новая переменная - сгенерил по месту и все.
103. mkalimulin 1651 23.01.19 18:55 Сейчас в теме
(102) Нет гуиды сложно отличать друг от друга с одного взгляда. И писать их тоже долго и неудобно. Лучше всего подходят имена спутников Юпитера, например. Их там почти 80 и больше половины имеют собственные имена.
104. herfis 525 23.01.19 19:04 Сейчас в теме
(103) Нельзя спутники. Начнут вырабатываться предпочтения и стереотипы, которые начнут тебя же вводить в заблуждение.
Начнешь использовать Ио в качестве счетчика повсеместно, потому что короткий. И все. Хана. Глаз замылится.
105. mkalimulin 1651 23.01.19 19:08 Сейчас в теме
(104) Замылится - можно будет на Сатурн перелететь. Или даже в пояс Койпера.
101. herfis 525 23.01.19 18:42 Сейчас в теме
(96) Мегаконцепция проста и изложена в принципах ректального программирования: "Незачем думать об оптимизации, производительности, рефакторинге, стиле, стандартах - вдруг завтра ядерная война?"
То, что организация смогла пережить это поделие - в каком-то смысле заслуга этой мегаконцепции. Ведь первоначальное набрасывание говнокода стоит очень дешево и делается очень быстро. Организация в итоге сэкономила кучу денег, получила конкурентные преимущества, выжила на рынке и смогла нанять новую команду, которая построит новый мир на обломках старого :)
mytg; dachnik; +2 – Ответить
106. Vortigaunt 102 23.01.19 22:39 Сейчас в теме
С последним категорично не согласен. Копипаст - зло. Вы хотите чтобы программист на поддержке добавил одну строчку кода в процедуру "ОбработкаПроведения()", но совершенно не думаете о тех, кто будет это все сопровождать после него. Очень весело, когда в разных местах конфигурации скопированные куски кода, но все они отличаются, потому что кому-то надо было сделать там или сям дописку.
И дальше, что можно добавить в процедуру списания товаров с регистра остатков такого для одного документа, что не будет использоваться при списании с этого же регистра другими документами? Я вобще за то, чтобы функционал работы с регистрами хранить в менеджере этого регистра, и тогда получается красивый и логичный код вроде
РегистрыНакопления.ОстаткиТоваров.СписатьПоФИФО(ссылкаДок)
sergathome; MCV; acanta; +3 – Ответить
107. mkalimulin 1651 23.01.19 22:46 Сейчас в теме
(106) Так, навскидку. Один документ контролирует отрицательные остатки. Другой то же самое, но с запасом.
108. Vortigaunt 102 23.01.19 22:51 Сейчас в теме
(107) Можно поподробнее, что значит контролировать остатки с запасом?
109. mkalimulin 1651 23.01.19 22:59 Сейчас в теме
(108) Какие тут могут быть варианты?
111. Vortigaunt 102 23.01.19 23:09 Сейчас в теме
(109) Не знаю. Я просто не понимаю что это такое. Вбил в гугл эту фразу. Ближайшее что выдало по смыслу: это поддержание оптимального остатка на складе. Это оно?
112. mkalimulin 1651 23.01.19 23:16 Сейчас в теме
113. mpeg1989 135 24.01.19 07:31 Сейчас в теме
(109) Как насчет "Если"? Зато при изменении первого документа, будет сразу видно, что по второму документу есть нюанс.
110. Vortigaunt 102 23.01.19 23:02 Сейчас в теме
По первому пункту могу привести свой опыт с именами переменных. Когда-то давно я очень любил изобретать велосипеды, а клиенты были готовы хорошо за них платить. При формировании сложных отчетов я сначала собирал данные в список списков списков... короче в многоуровневую структуру из списков значений, каким-то образом обходил это все дело, дополнительно рассчитывал какие-то данные. А потом всю эту структуру выводил в макет отчета. И в таких отчетах очень часто надо было использовать вложенные циклы с итераторами Н1, Н2, Н3 и т.д. Очень часто натыкался на ошибки, когда получаю данные из списка не по тому итератору, по которому обходится этот список. Когда много вложенных циклов, то эти однообразные Н1, Н2, Н3 сливаются в кашу.
Просто взяв за привычку вместо Н1, Н2, Н3 писать что-то вроде номСклада, номТовара, номПартии, я уже существенно облегчил для себя понимание какой итератор куда ставить. Ведь если я вижу в коде текСклад = спСклады.ПолучитьЗначение(номТовара) - это сразу бросается в глаза, то текСклад = спСклады.ПолучитьЗначение(Н1) - можно пропустить, ничего не заподозрив.
Артано; +1 – Ответить
115. pm74 208 24.01.19 08:53 Сейчас в теме
(110) по поводу имен переменных , со временем выработались свои привычки
Коллекции называть с префиксами "м, тз(т), дз(д) , стк , ств " . Хоть это и не рекомендуется , но по мне так здорово упрощает чтение текста .
Итераторы - если связаны с коллекцией называть однообразно напр СтрТаб , Элемент , ЭлементМассива , ЭлементСоответствия итп. , если нет - буквы русского языка , которые не перепутаешь - Ц , Й , Ъ и т.п.
Для обхода дерева часто пользуюсь номерами Уровень1 , Уровень2 с комментариями
 Для  Каждого  Уровень2 из Уровень1.Строки Цикл //   Документы 

или так
 Для  Каждого  УровеньДокументы из УровеньНоменклатура.Строки Цикл  


Имена функций обычно начинаю со слов Получить , Вернуть и т.п. ,

Имена процедур , соответственно , Выполнить , Расчитать .. и т.п

нижний регистр отлично подходит для шаблонов , чем нелепее название , тем лучше
Например у меня есть такие : покаци , дляка , наклинасер , собить и сопля ;)
Synoecium; +1 –1 Ответить
116. mkalimulin 1651 24.01.19 09:03 Сейчас в теме
(115) "наклинасер" - прекрасен!
117. pm74 208 24.01.19 09:07 Сейчас в теме
(116) фукли , фусер , прокли , просер ;)

зы. кстати копипаста очень помогает для связи реквизитов объектов( элементов коллеций, областей макетов ) через имя
ЗаполнитьЗначенияСвойств - наше всё
151. Equilibre 25.01.19 14:42 Сейчас в теме
Во втором примере видимо Shift сломался, ненавижу людей которые пишут всесмаленькойбуквы!
152. mkalimulin 1651 25.01.19 15:13 Сейчас в теме
(151) Не сломался. Мне было лень нажимать.
159. TODD22 20 25.01.19 16:57 Сейчас в теме
(152)
Не сломался. Мне было лень нажимать.

Да мы помним, бережёте суставы от лишних нажатий.
Но скорее всего машинопись не освоили... потому что читать потом всёсмаленькойбуквыэтомазохизмдаидлязрениявредно ВсёСМаленькойБуквыЭтоМазохизмДаИДляЗренияВредно.
160. mkalimulin 1651 25.01.19 17:00 Сейчас в теме
(159) А у меня нет таких длинных имен. Вы, наверно, не заметили, потому что не стали и читать.
161. mkalimulin 1651 25.01.19 17:03 Сейчас в теме
(159) Это все дело вкуса.
Вот вам нравится:

КонецЕсли

А мне нет. Строка прыгает, скачет, отвлекает, да и для зрения вредно ))) То ли дело:

конецесли

Ровно, спокойно, солидно.
162. TODD22 20 25.01.19 17:10 Сейчас в теме
(161)
Это все дело вкуса.

Скорее его полное отсутствие.

Строка прыгает, скачет, отвлекает, да и для зрения вредно

Строка легко читается, почему так можете подумать на досуге, если ничего не придумаете то не стесняйтесь спрашивайте, расскажу.
163. mkalimulin 1651 25.01.19 17:15 Сейчас в теме
(162) Да прямо сейчас рассказывайте. Чего тянуть?
164. herfis 525 25.01.19 17:26 Сейчас в теме
(162) Вы не осознали всю стройность и красоту теории автора.
У него в принципе отсутствует проблема вычленения слов из строки одного регистра.
Потому что имена переменных априори не должны нести смысл (если вы помните этот его постулат), а системные конструкции просто нет смысла читать - они должны выхватываться мозгом программиста целиком, любовно выращенными для этого нейронами. Вот и получается, что шифт топтать - только код портить.
174. Dementor 1077 29.01.19 12:48 Сейчас в теме
Когда я вижу говнокодище подобное копипасте из второй части, я слышу голос известной актрисы и во мне просыпается желание убивать.

Дело в том, что я и есть тот самый "специалист поддержки", для которого якобы стараются. И это очень вымораживает, когда тупую ошибку нужно исправлять в скопипащенном ИДЕНТИЧНОМ коде в десятке модулей документов, который выкинуть в общий модуль было бы проще простого.

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

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

если нс<>неопределено тогда
	новзн=нс.значение[имятаблицы].добавить();
		записатьвпамять(св.свойство,новзн);
	конецесли;
	иначе
		новзн=ВычислитьЗначение(св.значение);
		записатьвпамять(св.свойство,новзн);
			нсв=нкорсв.строки.добавить();
			нсв.свойство=св.свойство;
попытка
		нсв.значение=новзн.ссылка;
	исключение
	нсв.значение=новзн;
		конецпопытки;
Показать


Еще выбешивает, что авторы подобного кода делают вид, что знают про существование разных типов, только они не слышали ни про ТипЗнч(), ни про Тип(), ни про метод объектов Метаданные(), ни про глобальное свойство конфигурации Метаданные. Когда такие люди пишут только для Российской Федерации возможно ничего страшного, но как только они начинают выпускать релизы для СНГ, то якобы протестированные версии, выпущенные в тираж и установленные покупателям, начинают падать с ошибками. Потому-что в конструкциях типа:

иначеесли лев(метаимя,10)="СПРАВОЧНИК" тогда
	новзн=справочники[сокрлп(сред(метаимя,12))].создатьэлемент();
конецесли;

не происходит срабатывание, потому-что внезапно лев(метаимя,10)="ДОВІДНИК.В" (для справочника валют).

Ну и конечно лучи ненависти проверяющим из 1С, которые берут такое говнище на проверку и одобрительно вешают ярлычок "1С:Совместимо".
Артано; sokir; Vortigaunt; +3 – Ответить
175. Vortigaunt 102 29.01.19 13:41 Сейчас в теме
(174) О, да! У самого чуть истерика не началась, пока не понял, что ошибка возникала из-за строчки:
Если Строка(запись.ВидДвижения) = "Приход" Тогда

И конфигурацию при этом не ставили за рубеж. Всего-то навсего обновили платформу и вместо русского языка поставили украинский.
Берешь себе копию базы, тестируешь - нет ошибки. У клиента ошибка. Код идентичен, данные идентичные.
177. starik-2005 3309 29.01.19 15:55 Сейчас в теме
(174)
пишут все ключевые слова маленькими буквами и делают отступы произвольным образом:
А вот под этим подпишусь. Не делайте так! Особенно отступы - есть же автоформатирование на худой конец.
Dementor; +1 – Ответить
176. sokir 2 29.01.19 14:58 Сейчас в теме
За последнее изречение (про копирование во все места) 100 тысяч минусов.
Я бы сразу ушел с такого проекта - он бы никогда не взлетел с таким подходом, а писать мертвый проект нет желания.

И эту статью надо зиминусовать и чтобы следа не осталось.
Понаплодятся сейчас говнокодеры, после прочтения.
179. mkalimulin 1651 30.01.19 18:00 Сейчас в теме
(176) Для кого разработчики делают проект? Для себя? Для удовлетворения своего чувства прекрасного? Или все-таки для пользователей?
181. herfis 525 30.01.19 19:05 Сейчас в теме
(179) Для пользователей.
Проблема в том, что пользователей интересует совокупная стоимость владения продуктом, в которую входит стоимость сопровождения, доработок и оптимизаций под постоянно изменяющиеся требования (такая уж специфика). Учитывая стоимость работы программистов речь идет об очень крупных суммах и серьезных конкурентных преимуществах. Говнокод дает "ускорение" ровно один раз. При первом его применении. И ложится техническим долгом, который увеличивает стоимость всех последующих изменений и доработок. Злоупотребление говнокодом педалирует наступление ситуации, когда продукт становится фактически непригоден для развития. И это очень неприятный и очень дорогой для компании момент. Фактически говнокодер способен нанести компании громадные финансовые убытки на длительной перспективе.
Если пользователи работают с "замороженным" продуктом при неизменности требований к нему и с устраивающим их результатом - то ессно все равно, какой там говнокод внутри.
mivari; genayo; +2 – Ответить
182. genayo 30.01.19 19:07 Сейчас в теме
(181) Если автор будет пилить свой продукт, и подбирать себе единомышленников на его поддержку, флаг ему в руки. Главное, чтобы он этот продукт никому со стороны не продал :)
178. stepan_s 30.01.19 03:51 Сейчас в теме
"Назло бабушке уши отморожу" :) зачем свои такие патерны показывать? Или не важно по какому поводу лишь бы общество запомнило?
180. acanta 30.01.19 18:09 Сейчас в теме
Конструктор запросов сам копирует не хуже любого кодера. Разве если вы будете писать запрос вручную - вы напишете его точно так, как создал конструктор запросов? В SQL в коде не используется капслок. В FoxPro необязательно писать окончание команд, достаточно 4 первые буквы. Привычка.
183. Артано 803 05.02.19 07:33 Сейчас в теме
Впечатления от статьи смешанные.
Это отчасти пересекается с темой будущей статьи, поэтому приведу тезисы кратко, чтобы не превращать комментарий в отдельную статью
Изложу важные наблюдения, часто упускаемые разработчиками, но верно подмеченные автором. Кроме позитивных моментов также позволю себе критику там, где автор делая верное наблюдение, скатывается к спекулятивным выводам.

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

2. Размышления о копипасте. Я полностью согласен с утверждением, что бездумное использование Code reuse есть очевидное зло. В некоторых случаях, прямое копирование фрагментов кода оправдано. Некоторые проекты сознательно развиваются именно путем копирования. Поясню мысль. В биологии есть термин "конвергентная эволюция". Конвергенция здесь, обозначает общие формы для двух совершенно несвязанных биологических видов развивающихся в сходных внешних условиях. Нужно понимать, что сходство актуально лишь для текущего момента времени. И возможно в будущем, пути развития этих видов разойдутся, а классификация по морфологическим признакам устараеет. То же самое относится и к коду. Если у двух не связанных участков кода существует сходная реализация, то не стоит реализовывать общую реализацию для двух объектов, сблизившихся лишь в текущий момент времени.
НО! Копирование фрагментов кода внутри одной функции или внутри одного модуля/подсистемы, должно предваряться оценкой обоснованности такого действия. Если при изменении бизнес-логики вам придется править все эти десятки копий кода, то такой подход с большой долей вероятности приведет к превращению поддержки проекта в непрерывный кошмар.


3. Излишная абстракция. Согласен, что в отдельных случаях уровень абстрагированности обработчиков данных слишком высок. Не вполне согласен, что эту критику можно применить к типовым конфигурациям, но зачастую видел подобное в полностью самописных конфигурациях никогда не планировавших стать тиражными. Изолированность компонентов есть почти повседневная необходимость для сложных тиражных продуктов, и далеко не всегда применима в нишевых и корпоративных программах.
НО! Если абстракцию применять как способ изоляции различных слоёв логики, то абстракция обоснована и необходимо. Я достаточно подробно описывал механизм работы абстракции в своей статье о парадигмах программирования, поэтому не буду повторяться здесь все выводы.

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

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