Ректальное программирование: основы для практикующих 1С-программистов
Разработка - Математика и алгоритмы
В тоже время данная тема освещена довольно скудно и программистам, даже опытным, приходится тратить тысячи часов на изучение ярких примеров ректального программирования. Иногда даже программисты со стажем затрудняются ответить на базовые вопросы, скажем - "Что лучше, запрос в цикле или получение данных через четыре точки"? Данный материал призван дать хотя бы базовое представление о методике ректального программирования и его успешного применения на проектах внедрения продуктов 1С любой сложности.
Что это?
Итак, прежде всего ответим на вопрос - что вообще есть ректальное программирование? Чем оно отличается от других методик? Какие преимущества даёт для программиста и его работодателя?
Ректальное программирование - это, прежде всего, программирование свободного человека, если хотите - венца творения. Это программирование, свободное от всяких предрассудков, навязанных рамок следования стандартам, параноидальной боязни демонстрировать свой код другим участникам проекта. Ректальное программирование - это путь состоявшегося программиста, уверенного в своём абсолютном превосходстве и компетенции, не нуждающегося в поучениях и не поддающегося стадному инстинкту постоянно обучаться.
В свою очередь работодатель, нанимая такого программиста, может быть уверен в том, что такой сотрудник почти наверняка органично впишется в коллектив таких же программистов, и будет двигаться в общем векторе развития компании.
Несколько постулатов философии ректального программирования
Задача даётся для того, чтобы её выполнили. Если задача выполнена, значит цель достигнута. Не нужно думать о призрачных перспективах, возможностях развития, доработках или переработках. Мы живём в очень нестабильном мире, а жизнь коротка. Незачем думать об оптимизации, производительности, рефакторинге, стиле, стандартах - вдруг завтра ядерная война?
Шедевр не может быть простым, доступным каждому. Если бы Толстой втиснул Войну и мир в брошюру между статьями о садоводстве и скандвордами, а Шопен играл бы на ложках - кто сейчас знал бы этих гениев и их шедевры? Шедевральность шедевра в его сложности. Поэтому, если хочешь достичь совершенства в программировании - уходи от простого к сложному. Все эти комментарии, понятные имена переменных и прочий сахар - удел плебеев и гуманитариев. "Если ты не можешь разобраться в несчастной паре тысяч строк моего кода - зачем ты вообще пришёл в программирование?" Программирование - это джунгли, слабых здесь затаптывают.
Если не забывать старое - не будет потребности в новом. Учить новым трюкам надо собаку, а не взрослого состоявшегося программиста, который всё уже знает. Всё что было в 8.0 отлично работает и в 8.3, что ещё нужно?
Несколько базовых приёмов ректального программирования
Приведём несколько широкораспространённых приёмов ректального программирования, чтобы читатель имел общее представление о практическом применении данной методики.
не нужны. Мало кто знает, что слово "комментарий" происходит от слова "закомментировать"! Комментарии придуманы для того, чтобы программист мог закомментировать десяток-другой процедур и функций и продолжать экспериментировать в коде, выражая своё творческое "Я". Но иногда комментирование используют не по назначению - за двумя слэшами пишут какую-то информацию о том, что делает код. Это очень вредная практика. Во-первых, что за странная фантазия - писать комментарии по коду, если ты и так знаешь, что в нём происходит? Во-вторых, что может быть непонятного в модуле с несчастными 15 тысячами строк и тремя сотнями процедур? Или тем более в пакетном запросе из двадцати составляющих? И, в-третьих, кому вообще придёт в голову лезть в твоё бессмертное творение, созданное на века?
Всем известно, что данные в 1С можно получать через точку. Например:
РеализацияТоваровУслуг.Заказ.Контрагент.Партнер.КонтактноеЛицо.Телефон
Когда-то кто-то запустил слух, что, якобы, это плохо, мол, из базы тянется куча ненужных объектов, не учитываются права и прочий бред. Но подумайте сами, для чего тогда Господь создал 1С с возможностью получать данные через точку? Любому умному человеку очевидно, что это бессмысленно! Бесспорным фактом является то, что раз 1С создана с такими возможностями, значит их и нужно использовать, а не слушать еретиков. Более того, как вы себе представляете другие способы получения информации? Программист что, ещё и запрос должен писать для этого?? Конечно же нет! Шах и мат атеисты!
Одно из важнейших умений программиста - пользоваться уже написанным кодом для создания нового. Если уже есть какой-то код, который выполняет нужное действие - зачем изобретать велосипед и писать его ещё раз, если его можно просто скопировать? Более того, его можно копировать ещё и ещё, столько раз, сколько нужно! Это в разы сокращает трудозатраты, ведь не нужно искать закономерности, придумывать новые функции, пытаться абстрагировать какие-то части. Исключив таким образом огромное количество бессмысленных действий, мы получаем повышение производительности труда программиста в разы, даже в десятки раз! Копирование кода - одно из важнеших умений в ректальном программировании!
не нужно. Форматирование кода, как и многие другие ненужные украшательства, призвано ограничить волю самовыражения программиста, отучает мыслить нестандартно, загоняет в рамки, обезличивает работу программиста-творца. Зачастую, среди серости и монотонности "стандартного" программирования очень сложно показать свою избранность, не говоря уже о том, что часто потомки просто не смогут идентифицировать авторство такого кода. Как же обидно будет, создав памятник ректального програмирования, использовать стандартное форматирование, заставив таким образом нобелевский комитет будущего (когда будет учреждена премия в сфере 1С-программирования) сомневаться в авторстве! Не правда ли, ужастная участь? Именно поэтому не нужно стесняться писать такой код:
процедура создатьдокумент(отказ,сс,массив,тч,сообщпользчтнельзсозддок=ложь)
если отказ=истина тогда отказ=ложь; возврат; конецесли;
если типзнч(сс)=тип("документссылка.заказклиенту")тогда
Да и в конце концов, имеет человек право иметь неработающие Enter, Shift и Tab на клавиатуре или нет??
Очень часто можно увидеть, как неопытные, некомпетентные, слабые духом программисты создают целую кучу общих модулей, умудряясь даже делать модули почти для одинаковых целей, но с разными контекстами и возможностями - клиентные, серверные, клиентсерверные, повторные, с вызовом сервера и т.п. Между тем большое количество модулей говорит о душевных метаниях, неуверенности в себе и отсутствия понимания вообще, как устроена работа платформы. А ведь всё очень просто:
сервер не может работать с клиентом, а клиент с сервером - может, если у модуля стоит флажок "Вызов сервера"!
Думаю, специалисты ректального программирования уже поняли, каким должно быть решение. Для остальных же вот правильный ответ: можно просто создать один общий модуль, назвать его ОбщийМодуль1, поставить у него флажки "Сервер" и "Вызов сервера" - и всё!
Так в загнивающей капиталистической литературе называют объект в системе, который хранит все данные и/или весь функционал. Не правда ли - гениальная в своей простоте идея? Ведь действительно, как удобно иметь в системе объект, где хранится всё! Представьте, как упрощается разработка! Все запросы в системе пишутся по одному объекту, а программист больше никогда не задаётся вопросом - а откуда брать данные? Вот они, все здесь. Таким объектом может быть, например, регистр сведений (обязательно периодичекий), или ещё лучше регистр накопления. А все реквизиты всех хозяйственных операций в деятельности можно сделать как измерения такого регистра. В дальнейшем, при последующей разработке, можно просто добавлять измерения. Пользоваться таким регистром очень просто - заполняются только нужные реквизиты, а остальные остаются пустыми. Вот и всё! Мы добавили один объект, создали в нём 2-3 сотни измерений для всех случаев жизни, а насколько просто стало работать с базой! Только теперь становится ясен истинный смысл выражения "целостность данных". Если же поместить вообще всю деятельность в один объект не получается, можно хотя бы стремиться к этому, создать два-три объекта. Например, один справочник, один объект и один регистр, который двигается этим документом.
Иногда в работе кода могут происходить ошибки, к сожалению, это неизбежно. Но цель программирования - выполнение задачи без ошибок. Как же быть? А что, если я скажу вам, что ваш код может работать всегда! Вообще всегда!! Без ошибок!!! Магия? Шарлатанство? Нелегальные способы? Нет, нет и нет! Всего лишь "Попытка"! Да, это такая конструкция, которая позволяет как бы попробовать выполнить кусочек кода, а если случилась какая-то ошибка, то можно просто аккуратненько её обойти. А если заключить весь код в попытку, а в исключении ничего не писать, то ваш код всегда будет работать без ошибок. Представьте - так просто и всё всегда работает, пользователь никогда не получит какую-нибудь страшную ошибку в работе. Всё что нужно - это писать все функции-процедуры вот так:
Процедура ВыполнитьОбмен() Экспорт
Попытка
// сюда помещаете всё тело процедуры
...
Исключение
// здесь ни в коем случае ничего не писать, иначе можно напугать пользователя!!!
КонецПопытки;
КонецПроцедуры
Вот и всё. И забудьте об ошибках. Кстати, это чудо возможно только в ректальном программировании, никакая другая методика не даёт таких впечатляющих результатов, поэтому она и ценится как среди программистов, так и среди их работодателей.
В 1С есть множество волшебных методов, которые магически выполняют свою работу без нагрузки на железо и при этом очень упрощают работу программиста. Например, методы "Выгрузить" у результата запроса и "Загрузить" у таблицы.
Представим, что у вас есть запрос, который получает миллиард строк из вашего богобъекта из п.6 и вам нужно их поместить в ТЧ объекта. Слабые духом скорее всего сделают выборку и будут построчно загонять в ТЧ. Но для чего, если можно просто написать:
ТЧ.Загрузить(Запрос.Выполнить().Выгрузить());
И всё сделается само за одно действие! Никаких циклов, никаких обходов, никакой вообще нагрузки на аппаратную часть. Строки просто волшебным способом оказываются внутри ТЧ.
И таких волшебных методов в 1С много. Ещё один пример: <...>.Найти(). Очень удобно использовать в цикле вместо, например, получения данных в запросе, ведь запросы писать сложно.
Пользователь - существо само по себе безвольное и находится на гораздо более низкой ступени развития, чем программист. Поэтому делать интерфейсы, ориентируясь на пользователя, дело неблагодарное, бессмысленное и даже опасное. Вместо этого программист, как создание гораздо более умное и просветлённое, должен помогать пользователю, придумывая за него, как ему удобнее и что ему вообще нужно. А также развивать у пользователя нестандартное мышление и мелкую моторику, создавая интерфейсы с секретами, тайнами и загадками. В дальнейшем пользователь только спасибо скажет за такую помощь.
Ведь кто ещё смог бы научить его определять по звуку вентилятора охлаждения процессора, что операция, которая висела в 1С 40 минут, уже завершилась? Страшны ли пользователю какие-то излучения, если он годами смотрел на форму цвета фуксии с зелёно-красными кнопками? Убьёт ли такой человек в порыве гнева свою жену, если он каждый день заполнял форму с сотней полей, в которой если перевыбрать одно значение, форма сбрасывается в ноль, но при этом выжил и сохранил рассудок? Болью и страданиями от использования доработанных ректальным способом интерфейсов выложена пользователю дорога в нирвану.
не нужен. Ещё один из небольших трюков увеличения производительности труда программиста - не обращать внимание на мелочи, следуя широкими шагами к завершению задачи. Например, как вы думаете, что можно улучшить в коде:
Если ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПредставлениеОбъекта = "Справочники"
ИЛИ ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПредставлениеОбъекта = "Документы"
ИЛИ ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПредставлениеОбъекта = "Планы видов характеристик"
ИЛИ ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПредставлениеОбъекта = "Планы счетов"
ИЛИ ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПредставлениеОбъекта = "Задачи"
ИЛИ ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПредставлениеОбъекта = "Бизнес-процессы"
ИЛИ ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПредставлениеОбъекта = "Планы обмена"
Тогда
ПлчЭлмнт = ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПолучитьЭлементы();
КонецЕсли;
или
Для Каждого а ИЗ МассивНаСтоТысячСтрок Цикл
а.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(
СтрЗаменить(Справочники.Организации.НайтиПоНаименованию("ООО Лютик").Наименование, "ООО", ""));
КонецЦикла;
Правильно - ничего! Код лаконичен, не засоряет память ненужными переменными и работает, а больше ничего и не нужно для выполнения задачи.
Ещё одно иностранное слово, которое означает, что внутри кода зашиты какие-то значения. Например:
Если Имя = "Вася" Тогда
Сообщить(Имя);
КонецЕсли;
Здесь хардкодинг - это "Вася". Непонятно, зачем они там заграницей придумали для этого отдельное слово, ведь если тебе нужно проверить "Васю", то как ещё это можно сделать?
Заключение
Итак, это было краткое введение в основы ректального программирования. Надеюсь, данный материал поможет программистам, особенно начинающим, влиться в ряды, начать успешную карьеру и стать своими в среде программистов 1С.
Вступайте в нашу телеграмм-группу Инфостарт
программирование практика успешный программист методика
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Математика и алгоритмы Разработчик 1С 8.3 Абонемент ($m)
Данная внешняя обработка для платформы 1С:Предприятие реализует усовершенствованный алгоритм Левенштейна для вычисления схожести строк с учетом различных лингвистических особенностей русского языка. В отличие от классической реализации, этот алгоритм учитывает фонетические, визуальные и контекстные особенности набора текста.
1 стартмани
07.11.2025 7001 18 InFlach 17
Математика и алгоритмы Запросы Разработчик 1С:Предприятие 8 Бесплатно (free)
Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.
08.07.2024 9160 ivanov660 9
Математика и алгоритмы Разработчик 1С:Предприятие 8 1C:Бухгалтерия Россия Абонемент ($m)
На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.
1 стартмани
30.01.2024 16970 stopa85 12
Математика и алгоритмы Бесплатно (free)
Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.
19.10.2023 25228 user1959478 57
Математика и алгоритмы Разное 1С:Предприятие 8 1C:Бухгалтерия Россия Абонемент ($m)
Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.
2 стартмани
29.09.2023 15716 maksa2005 8
Математика и алгоритмы Инструментарий разработчика Разработчик 1С:Предприятие 8 Россия Абонемент ($m)
Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.
1 стартмани
09.06.2023 25518 11 SpaceOfMyHead 20
Математика и алгоритмы Разработчик 1С:Предприятие 8 Бесплатно (free)
Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.
03.04.2023 17726 RustIG 10
Механизмы платформы 1С Математика и алгоритмы Разработчик 1С:Предприятие 8 Россия Бесплатно (free)
В статье анализируются средства платформы для решения системы линейных уравнений в 1С. Приводятся доводы в пользу некорректной работы встроенных алгоритмов, а значит потенциально некорректного расчета себестоимости в типовых конфигурациях.
23.11.2022 16616 gzharkoj 17
1) Комментарии - тут главное не переборщить, а то есть такие, кто "романы" пишут и пойди разберись что там в действительности творится.
2) Через точку - через точку писать плохо, даже в рекомендациях 1С это написано, но что то даже у 1С я встречаю такие конструкции (не такие длинные, но все же). А вообще все должно быть в пределах разумного, если код позволяет, то и через точку можно иногда обратиться, если это не влияет на производительность.
8) Выгрузить-Загрузить - а тут не просвятите чем плох этот метод? Ни разу не встречал, ничего плохого про него. На всякий случай провел тесты, вариант базы клиент-сервер, в запросе три выбранных реквизита. результат:
Тест1
Обход запроса: 9с. количество строк: 254 740
Выгрузка-загрузка: 3с. количество строк: 254 740
Тест2
Обход запроса: 192с. количество строк: 2 811 306
Выгрузка-загрузка: 130с. количество строк: 2 811 306
Как видим, выгрузка-загрузка выполняется быстро.
Возможно при
Обход запроса: 9с. количество строк: 254 740
Выгрузка-загрузка: 3с. количество строк: 254 740
Тест2
Обход запроса: 192с. количество строк: 2 811 306
Выгрузка-загрузка: 130с. количество строк: 2 811 306
Как видим, выгрузка-загрузка выполняется быстро.
Тест1
Обход запроса: 9с. количество строк: 254 740
Выгрузка-загрузка: 3с. количество строк: 254 740
Тест2
Обход запроса: 192с. количество строк: 2 811 306
Выгрузка-загрузка: 130с. количество строк: 2 811 306
Как видим, выгрузка-загрузка выполняется быстро.
Проблема этого метода не в скорости выполнения, а в потреблении памяти, о чём написано на ИТС.
Но часто бывает так:
Лишние, свободные 64 или 128 Гб мы отведем под рамдрайв, но будем экономить <10Мб и бомбить выборками файловую систему под 1с сервером.
А кто нибудь проводил анализ пожирания памяти скулем? На больших базах сразу гигабайты неоптимальных выборок кэшируются. По сравнению с 1С сервером - это вообще смех. Вот где нужно искать потребление озу!
вроде на ИТС речь об Обходе результата запроса. Лучше обходить результат запроса через выборку, а не через таблицу значений.
Но автор утверждает, что если нужно заполнить табличную часть, то необходимо использовать только выборку.
Иначе это ректальное программирование.
Либо уменьшаем время выполнения за счёт увеличения объёма памяти, либо на оборот.
Хром допустим есть 200мб (150-250 мб за страницу в среднем) (мозила больше там до 500 может доходить).
Берем 10 пользователей, которые открывают по 5 страниц итого уже съедено 10000МБ памяти только браузером на сервере.
И в целом всегда надо руководствоваться разумным и не впадать в крайности.
А если мне, например, время выполнения критичнее, а память менее критична?
Если я такую операцию выполняю каждую минуту - то лучше делать через выборку,
Но если такая операция делается по запросу пользователя, например, по понедельникам несколько раз в день, то почему бы не сделать через Выгрузить-Загрузить.
Вот это логично.
Причем, если результате запроса заведомо мало данных, например заполнение услуг при заказе товаров в интернет магазине, то никакой разницы в производительности и памяти вообще не будет
А однозначно утверждать, что "Выгрузить-Загрузить всегда ректально" - неправильно.
Тут мы имеем дело с предпочтениями автора и не более того.
И ставить это в одну линейку с таким злом, как например "дублирование кода" - не справедливо.
(101)
Как я понял автору не нравится непосредственно конструкция:
ТЧ.Загрузить(Запрос.Выполнить().Выгрузить());
и вместо этого, я уверен, он предложил бы что-то вроде:
ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
ТЧ.Загрузить(ТаблицаРезультат);
Вот есть код:
ФлагЗавершения = Ложь;
Для Каждого Х ИЗ Данные Цикл
Для Каждого У ИЗ Х Цикл
Если У = А Тогда
ФлагЗавершения = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ФлагЗавершения Тогда
Прервать
КонецЕсли;
КонецЦикла; ПоказатьА теперь упростим:
Для Каждого Х ИЗ Данные Цикл
Для Каждого У ИЗ Х Цикл
Если У = А Тогда
Перейти ~ПослеЦикла
КонецЕсли;
КонецЦикла;
КонецЦикла;
~ПослеЦикла:Кстати, попытайтесь аргументированно доказать, что циклы - это хорошо. Ведь программу можно написать как без ГОТО, так и без использования циклов Зачем нам циклы тогда? Ведь по-сути в функциональной парадигме можно и на 1С писать отчасти (в той части, где нужны циклы - точно),
Вообще, если относится без религиозности к разработке софта, то любой переход оправдан (например, если после выполнения итерации необходимо ее по какой-то причине повторить не меняя счетчика цикла, то это вполне вариант - не писать же в самом деле внутренний цикл "Для ДВА = 1 по 2" - такой код еще более диким выглядит, тем более, что необходимость повторного выполнения не возникает каждый раз).
А условие на измерение виртуальной таблицы РН в секции ГДЕ?
А соединение по Наименование?
. . . . . . .
Предлагаю выкладывать здесь в комментах примеры shit-кода.
Материал ознакомительный, так сказать, некоторые примеры базовых вещей, и конечно же, не призван охватить всю огромную палитру средств ректального программирования.
Я понимаю разницу. А так же то что для каждой системы есть свои правила и подходы. И если что то не рекомендуется использовать в конкретной платформе то спорить с этим можно долго. А можно просто не использовать.
С телефона пишу. Доступа на ИС нет.
Олдскульные кодеры, понятно, читали книгу Хьюз и Мичтом "Структурный подход к программированию", а также книги Дейкстры и Йодана, издававшиеся в СССР. Но, очевидно, 1С-кодирование изначально не рассчитано на узкий круг снобов, а пролетариату куда же без goto, для пролетария послать кого-то - естественная потребность :)
В Java оператора goto нет. Понятно, на пролетариев умственного труда она не ориентирована изначально.
В среде быдлокодеров — программирование методом копипаст из книжек «для чайников»: (или )
В дополнение к применению в операторах switch и циклах break можно также использовать отдельно, в качестве "цивилизованной" формы оператора goto. Java не содержит оператора goto, потому что он выполняет переход произвольным и неструктурированным способом. Код, интенсивно использующий goto, обычно трудно понять и поддерживать. Он также отменяет некоторые оптимизации компилятора. Существует, однако, несколько мест в программе, где goto — ценная и законная конструкция управления потоком выполнения. Например, goto может быть полезен, когда вы выходите из глубоко вложенного набора циклов. Чтобы обрабатывать такие ситуации, Java определяет расширенную форму оператора break. Используя ее, вы можете выйти из одного или большего количества блоков кода. Этим блокам не нужно быть частью цикла или оператора switch. Это может быть любой блок. Далее, вы можете определить точно, где выполнение будет продолжено, потому что данная форма break работает с меткой и обеспечивает преимущества goto, минуя его проблемы. Оператор break с меткой имеет следующую общую форму:
break label;
Здесь label — имя метки, которая идентифицирует некоторый блок кода. Когда эта форма break выполняется, управление передается из именованного блока кода (чья метка указана в операторе break) на следующий за этим блоком оператор. Помеченный блок кода обязательно должен включать данный оператор break, но не требуется, чтобы это включение было непосредственным (т. е. break может включаться не прямо в блок со своей меткой, а во вложенный в него блок, возможно, тоже помеченный). Это означает, что вы можете использовать помеченный оператор break, чтобы выйти из набора вложенных блоков. Но вы не имеете возможности использовать break для передачи управления блоку кода, который не включает оператор break.
Только не надо о том, что "break label" - это не ГОТО. Это тот самый ГОТО, только для идиотов, которые не могут его правильно использовать..
А вообще там можно сказать, что и рекурсия - зло и то самое ректальное программирование. Но это не от большого ума, а от наличия стереотипов, зацементировавшихся в сознании.
И да, без циклов можно написать чтг угодно. Надо объявить все эти for, while, repeat, e.t.c. - плохим говнокодом.
Торвальдс - практик, его никто не называл ученым. А Дейкстра, пожалуй, знал больше об эффективности алгоритмов, чем весь наш форум вместе взятый да еще в 10 степени. И если такой человек, как Дейкстра, говорил, что в языках высокого уровня можно обойтись без goto ВСЕГДА, то трудно это проигнорировать.
Вообще мы говорим, видимо, об одном и том же. Не собственно о goto, а о его неадекватном применении, приводящем к "лапше". Дейкстра предлагал, чтобы этого избежать, вообще не использовать безусловный переход. Радикально? Но приемлемо. Бо говнокодеры :)
Поэтому это уже просто холивар, как лет 30 назад между "сионистами" и "пасквилянтами", или между фанатами процедурной и объектной парадигмы.
Но все-же рискну...
«Я по-прежнему считаю, что создавать монолитное ядро в 1991 году — фундаментальная ошибка. Скажите спасибо, что вы не мой студент: за такой дизайн я бы не поставил высокой оценки :-)» (из письма к Линусу Торвальдсу). Свой пост Таненбаум озаглавил «Linux устарел»[5].
Кроме монолитного ядра, Таненбаум критиковал Linux за отсутствие переносимости. Таненбаум предсказывал, что процессоры 80x86 в недалёком будущем исчезнут, уступив место архитектуре RISC.
Критика сильно задела Торвальдса. Таненбаум был знаменитым профессором, и его мнение имело значение. В данном вопросе, однако, он ошибался. Линус Торвальдс настаивал на своей правоте.
Ссылаться на авторитетов - моветон, а на устаревших авторитетов - вдвойне. Но даже пользуясь его постулатами о программировании можно однозначно сказать, что современные языки далеки от них, а современная практическая разработка даже близко не соотносится со следующим:
Вы только ГОТО не юзаете из-за Дейкстры, или Вы и теорему доказываете каждый раз, когда пишите программу? <<Ведь кто сказал "не убий", сказал и "не укради". Если не убьешь, но украдешь - то также виновен перед законом>> (Древний эпос)
Применяю GoTo, например, в случае когда используется вызов пользовательского кода, задаваемого в режиме предприятия.
Типа такого:
// Тут обычный код
…
// Тут выполняется пользовательский код, заданный в режиме предприятия
Выполнить(ПользовательскийКод);
// Тут опять обычный код
…
ПоказатьТак вот, когда пишешь тот самый пользовательский код, GoTo очень помогает, например, в таком случае:
Основной код:
…
А = ПолучитьЗначениеА();
…
Выполнить(ПользовательскийКод);
…
Пользовательский код:
Если НЕ ЗначениеЗаполнено(А) Тогда
Перейти ~Выход;
КонецЕсли;
…
~Выход:
То есть GoTo применяется для начальной проверки переменных контекста и прекращения выполнения кода, иначе получается большая вложенная конструкция Если…КонецЕсли.
Сначала было волосы дыбом встали, под вечер не въехав в название темы, начал читать первую часть и кровь закипала, т.к всегда пишу не для того чтобы работало, а ещё учесть что-то) но потом въехал, спохватился и долго смеялся ) оставлю ссылку на статью в комментариях в подобном коде, всем кто не полностью соблюдал принципы данной практики, пусть соблюдают все принципы ректального программирования)
З.Ы.: Да чуть не забыл. Поля даты (почти все) были типа Character(10). А почему бы и нет. Работает ведь. И бизнес доволен. Можно написать 30.02.2010 или 72 нояб. А можно слово на 3 буквы. Идеальная система)
Автор, а может для таких "коллег" визуально проиллюстрировать эту методику?..
А вот №2 это что-то явно эндемичное. В современных языках ООП всё представляется объектам, обращайся через точку к чему угодно, читаешь бывает с утра stackoverflow, там таких примеров вагон и маленькая тележка и для Java и для Python и для Kotlin.
Моё любимое и всегда первое место в рейтинге - это проверка на фамилию директора в коде.
у нас тут своя, 1С-атмосфера
Автор указал, что касается запроса с миллионами строк, в случае когда строк очень много, выборка самый оптимальный выбор, т.к данные считываются не все сразу, в случае же с Таблица.Загрузить(РезультатЗапроса.Выгрузить()) можно получить ошибку недостаточно памяти или заметную деградацию выполнения, а в целом я часто пользуюсь Таблица.Загрузить(РезультатЗапроса.Выгрузить()) где точно знаю, что не может быть большое(от 1 тысячи) количество строк.
С Запрос.Выполнить().Выгрузить() легко можно потечь по памяти и часто люди, привыкшие работать с мелкими базами на этом попадаются. Все меняется при работе с большими базами с миллиардами строк
Входные параметры:
Количество номенклатуры порядка 14000;
Магазинов около 1500;
Количество дней - 30.
Но что тут сразу бросается в глаза? Это отчет, или эти данные нужно вставить в один результирующий документ? Если первое, то как оно относится к "Загрузить->Выгрузить"? И если это отчет, то какой идиот будет фильтровать его в Excel вместо того, чтобы отфильтровать выборку и не тянуть в рот все подряд, чтобы потом с этим мучиться в Excel (и какой Excel на какой машине откроет этого монстра)?
А если нужно сформировать один документ, то сам по себе этот документ - плохое решение, являющееся тем самым "ректальным" из пункта о всех данных в одном месте.
Давайте конкретизируем задачу, чтобы понять, что нужно пользователю (ведь именно для него все это задумывается, правда, а не чтобы потешить внутреннее "Я" - ну я надеюсь на это).
Для чего и удобство такого огромного массива данных опустим, это реальная задача.
Вопрос был в том, что
Про загрузить - Выгрузить. Все хорошо работает, пока данных мало. Но произошло накопление данных или резкий скачок, и база колом встала. Не всегда можно предугадать, что будет через год, сколько магазинов и РЦ откроется, сколько данных придется обрабатывать.
И вот представить ситуацию, описанную выше, когда человеку нужно в отчете обработать весь массив, или завтра попросят переработать эти данные в какой-то другой вид и выдать оператору только результат.
Как в данном случае построить логику? Как бы сделали Вы?
П.С. большой объем данных в том числе история за пару лет это требование бизнеса, а не лень программистов
С того и надо было начинать,
Вы же в свою очередь устроили балаган, не предложив ни одной светлой мысли.
На этом предлагаю разойтись краями и больше в эту ветку попрошу не писать
Ректальное программирование - это не о производительности и не об архитектуре. Это об уверенности в том, что можно писать говно в одном случае и красиво в другом. Это о том, что "да ладно, тут же не миллиард строк, напишу вот так, а вот когда миллиард будет, тогда, конечно, напишу как надо!". Это о том, что вообще вместо того, чтобы просто писать правильно, без оглядки на фантазии о количестве, начинается философия и оценки средней температуры по больнице.
Даже на самом верхнем уровне логики, загрузить-выгрузить - это ДВА обхода, а выборка это ОДИН обход. Но адепты ректального программирования, конечно, будут и дальше использовать описанные в статье приёмы, потому что они не задумываются о таких мелочах, им неинтересно, что там внутри, для них 1С - это божий дар с кучей волшебных методов, которые просто превращают БД в ТЧ. Потому что:
У меня нет доступа к исходникам платформы, чтобы быть уверенным в методах. Но обычная логика говорит о том, что если я получаю таблицу, значит:
1. Результат запроса был уже обойдён той же самой выборкой (может, и не той, но примерно такой же).
2. Была создана таблица и сохранена в памяти (с метаданными, колонками и типами)
3. Эта таблица была обойдена (с созданием и хранением итератора в том числе) и помещена в ТЧ.
Как я уже выше написал, ректальное программирование не занимается такими проблемами. Ректальное программирование - это полёт творческой мысли, у которой нет времени на такие мелочи.
А давайте добавим в ваши рассуждения недостающие переменные
При выборке на прикладном уровне В ЦИКЛЕ вызываются методы: Следующий(), Таблица.Добавить(),
ЗаполнитьЗначенияСвойств()
При выгрузке-загрузке это все вызывается на низком уровне.
При этом вы предлагаете, что на низком уровне нет возможности скопировать таблицу значений в табличную часть без обхода. Ну предположим, вы правы (хотя это только предложение), но в этом случае может использоваться низкоуровневый итератор и заполнение, которые могут работать быстрее.
В итоге вы утверждаете, что совокупность методов при обходе выполняется эффективнее? При этом вы не знаете, какие дополнительные действия вызываются в перечисленных высокоуровневых методах по сравнению с низкоуровневыми
Всё бы хорошо, но вы, не зная реалий, предлагаете их допридумать и оправдать свой Г-код. А я предлагаю, не зная реалий, просто писать качественный продуманный код.
Потому что язык - это всего лишь инструмент. А вот умение писать качественный код - это важное умение, которое может помочь всегда и везде. Как и умение аналитически мыслить, интересоваться, что там, под капотом, может помочь не только в коде, но и иногда в самых неожиданных А не просто беспокоиться о своей зоне комфорта.
Я не пытаюсь оправдывать г-код.
Просто я вам не верю и хочу получить от вас более менее убедительную аргументацию вашего утверждения.
Пока вся ваша аргументация основана ТОЛЬКО НА ВАШИХ СОБСТВЕННЫХ ПРЕДПОЛОЖЕНИЯХ.
Выше коллеги привели результаты тестов, которые подтверждают, что ваши предположения как минимум верны не во всех случаях.
Как грамотный специалист, вы тоже могли бы проверить свои утверждения, а потом уже пускаться в споры.
И еще - я не знаю какой вариант из двух работает оптимальнее: Выборка или Выгрузить-Загрузить.
И ваши предположения не являются основанием для признания такого метода г-кодом.
Я, как грамотный специалист, проводил такие тесты. Как и тесты получения информации через точку и ещё много чего.
Логика, о которой я говорю уже в пятый, кажется, раз, и о которой вы не слышали или, видимо из за своей эмоциональной привязанности к каким-то, упомянутым в статье участкам кода, не хотите слышать, - так вот, логика, в случае отсутствия информации, говорит мне - у тебя есть два обхода или один, что ты выберешь? Я выбираю один. Вы выбираете то, что легче писать. Вот такая разница. Поэтому я и написал в статье, что это - "магические" методы. Потому что, например, вы, действительно верите, что можно из запроса получить данные вначале в таблицу, а потому и в ТЧ без обхода.
А где вы видели, чтобы я утверждал, что один метод лучше другого?
Я такого не утверждал. Как и не утверждал обратного.
Хотелось бы узнать результаты тестов, которые вы проводили.
Просто вы поймите, что просто одних ваших предположений - недостаточно.
Я, например, впервые слышу такое утверждение, и для меня ваши выводы неубедительны, также как для вас неубедительны мои аргументы.
Вы приведите результаты тестов: что при этом страдает производительность, память, процессор?
Я всего лишь хочу узнать, почему вам можно верить.
Вдруг вы действительно можете подтвердить свои слова на практике, а дело не в вашем ЧСВ, которое подталкивает вас отстаивать свою правоту.
Я увидел только ваши рассуждения и предположения.
Ваши предположения - это просто слова.
Вы не тот авторитетный специалист в предположения которого можно верить просто на слово.
Вы просто "какой-то пользователь на инфостарте", также как и я.
Поэтому ваши предположения-рассуждения нужно подтвердить цифрами.
Какой именно пост(ы) вы имеете ввиду?
Есть конкретные замеры?
400816: ba 19 00 00 00 mov $0x19,%edx
40081b: be 00 00 00 00 mov $0x0,%esi
400820: 48 89 c7 mov %rax,%rdi
400823: e8 a8 fc ff ff callq 4004d0 <memset@plt>С оптимизацией -O3:
4007f4: 48 c7 04 24 00 00 00 00 movq $0x0,(%rsp)
4007fc: 48 c7 44 24 08 00 00 00 movq $0x0,0x8(%rsp)
400805: 48 c7 44 24 10 00 00 00 movq $0x0,0x10(%rsp)
40080e: c6 44 24 18 00 movb $0x0,0x18(%rsp)К чему я это? К тому, что разработчики платформы 1С могли подумать и оптимизировать работу "Загрузить->Выгрузить", сделав один обход вместо двух за программиста 1С. Такая оптимизация языковых конструкций широко используется в языках программирования, и я не думаю, что разработчики платформы про это ничего не знают. А вот сделали они это или нет - вопрос интересный.
Всё так. Но я вспоминаю притчу из коммунистического детства - когда дети пошли в поход и никто не взял нитку с иголкой потому, что каждый подумал, что возьмёт другой.
Если я программирую участок, я за него отвечаю. Очень хорошо, если программисты платформы знают, что в 1С широко распространено ректальное программирование, поэтому сделали какие-то скрытые ускорения. Но всё же я свой код всё равно буду писать так, чтобы он оптимально работал в худшем случае, т.е. как если бы разработчики платформы ничего для меня не улучшили. Во всяком случае до тех пор, пока не будет документированных подтверждений тому, что надо обязательно пользоваться Загрузить-Выгрузить, потому что разработчики платформы гарантируют, что это быстрее.
НО! Не нужно такие большие результаты обрабатывать вообще. Их не должно быть в принципе. Ректальность тут как раз в запросе, а не в выгрузить->загрузить, который, повторюсь, может работать в один проход, если разработчики платформы немного подумали мозгом и используют best practices.
Не знаю почему, но спорили на 300+ сообщений про Выгрузить/загрузить, говорили прямыми цитатами с ИТС, но так никто не кинул ссылку:
Если "потенциально неограниченных выборках данных из ИБ" в примере взят Справочник.Номенклатура, то получается неограниченные выборки это по сути всё что угодно. А такой схемы обработки данных в типовых я ни разу не видел....
Очень многие говорят о производительности, что бы код работал быстро, но это метод работает быстрее, нежели обхода. А огромные данные встречаются в основном в крупных проектах, где логика работы данных уже совсем другая.
По крайне мере, здесь я слышу об этом впервые и по результатам теста (выше), этот метод даже лучше.
Ваш самый весомый аргумент, насколько я полагаю - это ДВА ОБХОДА.
Но вы не учитываете, что обход ВЫБОРКИ - это возможно в несколько раз более затратная операция, чем обход Таблицы.
При обходе выборки происходит переключение рекордсета + преобразование из примитивных типов данных в типы 1С.
При обходе таблицы - таких действий не происходит.
Таким образом соотношение Обход1:Обход2 по времени это не 50%:50%, а может значительно отличаться от этого соотношения.
Но адепты ректального программирования могут не учитывать этот факт, и считать, что Выборка.Следющий() по времени равно Для каждого СтрокаТаблицы из Таблица Цикл
Ваша логика это только ваше представление о том как должно быть.
Совсем не очевидно, что реальность должна совпадать с вашими представлениями о ней.
Замер сделайте и проверьте.
т.е. сделал
переменная1 = ссылка.реквизи1;
переменная2 = ссылка.реквизит2;
и получил 2 запроса к базе
В статье и не написано, что что-то не так. Там наоборот сказано - отличный способ. Строки из запроса магическим способом оказываются внутри ТЧ. Это же 1С, тут нет никаких "о большое".
однако, "ГЛАВНОЕ ЧТО БЫ РАБОТАЛО" это спорный пункт... возможно он не входит в ректальное программирование...
Есть ведь и поклонники антиректального программирования, когда безумно красиво, стильно, стандартно, разложено по полочкам, отформатировано, откомментировано, всё в километровых запросах, НО не работает, глючит, вылетает и логика просто фантастическая...
Оператор GoTo обвиняли в том, что он производит код называемый "взрыв на макаронной фабрике", но запросы подчас выглядят много хуже, особенно если в них много вкраплений конструирующего их кода...
И почему только 1С? Этот стиль живет в любых средах и языках, он универсален и вечен...
ТЧ.Загрузить(Запрос.Выполнить().Выгрузить());
На строке Запрос.Выполнить() - весь результат запроса помещается в память. Вы напрасно думаете, что создание выборки и добавление в цикле даных в ТЧ будет хоть как-то оптимальнее. Это заблуждение.
Единственное отличие - кода будет выполнено больше на миллиард*количество строк кода цикла.
На 32х битной платформе если памяти не достаточно то результат запроса помещается на диск и от туда считывается по средствам "Выборка.Следующий()".
Выборку первым запросом таблицы в ВТ, а потом последующие выборки из ВТ что ли? Или что имеется ввиду?
Использование выборки, по сравнению делает код более предсказуемым и гибким в своём поведении, независимо от объема данных. При этом нельзя отрицать, что в 99% процентов случаев выгрузка данных в таблицу ни к чему плохому не приведёт.
Так в загнивающей капиталистической литературе называют объект в системе, который хранит все данные и/или весь функционал.
в нашей литературе его назвали регистром бухгалтерии
п.9 про вентилятор охлаждения ... супер! РжуНеМогу ( КаталсяПодСтолом )
"Шедевральность шедевра в его сложности" - надо в рамочку и на стену...
её даже можно попробовать измерить
если она больше 30-50 (а я встречал до 90 ! ) - надо рефакторить... т.е. переписывать заново
п.3 - любимое дело копи-пастить... его можно тоже попробовать измерить,
как раз недавно переделывал обработку ...
п.9 к сожалению иногда Попытка реально нужна ... как защита уже от руко-жопых менеджеров
и сообщение (а ещё лучше отдельная форма на пол-экрана!) с сообщением о том, что же они сделали...
P.S. фото с ежегодной Премии - Рукожоп года... (HandAssMan) (см. youtube . com)
Завтра распечатаю и повешу в офисе на стену!
ОформитьЖирнымСтрокуПоNew_НОВАЯ(ЛистПрайса_Excel, ТекИндСтр, КолВоКолонокПрайса, ЭтоNew, ЭтоСпецЗаказ, ПризнакАкцииПоТовару = Ложь, РезПримечание = "", ЭтоРаспродажныйТовар = Ложь, КраситьЦветомНовинкиРаспродажи = Ложь, КраситьЦветомСнижениеЦен = Ложь, КраситьМинУпаковку = Ложь)
Ведь ни один клиент как правило в код не лезет до расставания с программистом.
А в случае получения конкурентами такого клиента возникнет законное желание найти и спасти всех остальных пострадавших-т.е. получить всю клиентскую базу программиста.
Потому что я не понимаю разницы между модулями Сервер и ВызовСервера. Точнее, я не вижу смысла в модуле Сервер, если есть ВызовСервера.
Можете пояснить?
Как пример, довольно абстрактный. Есть метод Перевести(Сумма, Источник, Приемник) Экспорт на сервере, без каких либо проверок внутри, просто метод использующийся в разных местах. Если у нас есть возможность вызывать этот метод напрямую - то раскопав протокол обмена можно будет дергать его с клиента прямо без всяких ограничений.
А вот если ВызовСервера у модуля не стоит, зато есть другой модуль с этим признаком который по обращению с клиента осуществляет проверки и только потом что то переводит - это уже другое дело. В таком случае у теоретического злоумышленника не получится без проверок что то перевести.
Или например у нас есть десяток экспортных процедур позволяющих разные действия, но с клиента должна вызываться только одна из них. Чтобы не делать злоумышленнику доступными все - заводим модуль прокси с ВызовСервера который пробрасывает вызов единственного нужного метода, а к остальному десятку доступа так и не будет.
P.S. Еще раз уточняю что это просто предположения и тоже интересно было бы послушать о причинах.
всё гораздо проще, хотя озвученный вариант мне тоже нравится.
Просто модуль Сервер компилируется только на сервере. А модуль с Вызовом сервера компилируется и там, и там. Т.е. увеличивается время компиляции на клиенте. Поэтому в него нужно помещать только методы, которые действительно надо вызывать с клиента.
[но мы то знаем, все методы тру-копро-кодера обернуты в попытку, поэтому всё норм]
Как всегда, пути 1С неисповедимы и код платформы закрыт. Но рискну предположить что где-то на уровне ниже создаётся какая-то прослойка, которая доступна на клиенте и которая дёргает сервер. Но в любом случае, гугление постоянно даёт именно информацию о компиляции на клиенте этого серверного модуля. Чтобы это не значило.
Но просто помню примеры из типовых. Например, в УТ 11 есть модули ОбщегоНазначенияУТ и ОбщегоНазначенияУТВызовСервера. И там, и там есть очень полезная функция ЗначениеРеквизитаОбъекта (которая как раз работает по п.2). Так вот в ОбщегоНазначенияУТВызовСервера она просто вызывает ОбщегоНазначенияУТ! Какой в этом смысл?
В этом и смысл.
Представьте, что у вас есть серверный модуль с миллиардом функций. А одну из них вы хотите вызвать с клиента. Ректальное программирование говорит - сделай его с вызовом сервера и не парь себе мозг. Ну а программисты послабее духом возьмут и сделают отдельный модуль с вызовом сервера, где сделают эту одну функцию, но вызывать будут вот ту, в серверном.
1 Копирование. Часто при изменении типовой конфигурации копирую куски кода дабы максимально следовать логике разработчиков, понимаю что можно было сделать по другому и возможно даже немного лучше но пусть будет так, в дальнейшем оправдывается. (Из текста этого пункта недостаточно явно следует о том что верх мастерства это повторяющиеся куски кода большого размера которые можно выделить в отдельные сущности, к сожалению этой ступени мастерства я еще не достиг)
2 Попытка. Попытка это изобретение дьявола, например последнее из моего творения: по тексту типового запроса в типовой конфигурации был уверен что теоретически может возникнуть ситуация когда запрос вернет не ноль а Null причем не этого значения группировки, делать две правки типового кода в совершенно разных местах... нет попытка и навыки "ректального" программиста мой выбор
3 Юзерфрендли. Да я считаю что придумаю интерфейс лучше чем пользователь и постараюсь не дать ему возможности "фантазировать" на эту тему, единственный свой минус я тут вижу в следовании общей концепции интерфейса даже если он ущербен изначально
Я достаточно развил свои навыки ректального программиста для того чтоб причислить себя к этому гениальному сообществу?
ЗЫ а вообще статься понравилась автору плюс
Модифицируй при записи!
Пользователи обязательно должны чувствовать Силу Автоматизации, и знать что программист позаботился, чтобы скрытый с формы, но очень полезный служебный реквизит заполнился автоматически. Пусть при записи на форме, пусть ему, пользователю пришлось два раза записать объект. Но это лучше, чем бы это поле присутствовало на форме и пользователь сам вводил поле "датаизмслужеб" (тут и ошибиться и забыть можно в конце концов)
Самым оптимальным и эффективным способом разделить права на просмотр, запись, редактирование реквизитов является проверка
РольДоступна("МожноОткрыватьЗаказФилиалСибирь") И Ответственный.реквподразделение.Наименование = "Сибирь"
или
РольДоступна("ВидимостьСкладаВТребованииНакладной")
Чего может быть проще? Добавил в ветку "Роли" нужное право и проверил нехитрым способом, в нужных методах поставив Отказ=Истина или Форма.Закрыть().
Не зря в современных конфигурациях разработчики вендора столько ролей придумали. Правда используют их не так эффективно, эРэЛэС-шмэрэлэс - непонятно, долго, да и тормозит систему, сами же говорили - противоречивые ребята
Еще есть какие-то ПВХ доп.права, но там надо копаться, опять в чужие стандартные методы лезть. То ли дело элегантный и лаконичный РольДоступна(), работающий в любой конфигурации. Делаешь больше ролей в УПП - приближаешь её к ERP
Выполнить(Строка)Настоящий Творец собирает программный код динамически, а потом элегантно и оптимально одной строкой кода его выполняет.
Добавлю 5 копеек. Пунктуация афтора сохранена.
Данные по ресурсной спецификации изделия хранить в виде дерева... выгруженного в файл на сервере.
// Вставить содержимое обработчика.
ЗначениеВФайл("\\srv1\spec\"+СокрЛП(СтрЗаменить(Оборудование.Наименование,"/"," ")),ТабличноеПоле1);
здесь даже без попытки....
и загружать обратно на форму:
Попытка
ПолученноеЗначение = ЗначениеИзФайла("\\srv1\spec\"+СокрЛП(СтрЗаменить(Оборудование.Наименование,"/"," ")));
Если ТипЗнч(ПолученноеЗначение) = Тип("ДеревоЗначений") Тогда
ТабличноеПоле1=ПолученноеЗначение;
КонецЕсли;
Исключение
КонецПопытки;
// Вставить содержимое обработчика.
Показатьбез возможности редактировать состав изделия при запуске в производство....
А еще 2 года назад таким образом, ооооочень большая часть спецификаций, были зашифрованы... вирусом... (бэкапов не делалось... зачем?)
Не совсем понял, при чем в нашем случае транзакция.
Тут дело даже не в производительности. Мы все любим стандарты и рекомендации от 1С.
Но когда приходит некий Вася и начинает предлагать свои стандарты.
И при этом пишет, что отклонение от его стандартов - ректально, то сразу возникают возражения.
Некий Вася - мы его не знаем, он с нами в школе не учился, денег в долг не давал, по нашим обязательствам не поручился. В нашем успехе в общем случае не заинтересован, а заинтересован в получении а) денег, б) опыта, в) хороших рекомендаций для того чтобы получить со следующих клиентов еще больше денег.
Вот (в) это ТОЖЕ транзакция.
И то как он предлагает свои стандарты (не свои конечно же, а других клиентов, с которыми раньше работали 1с-ники) - тоже транзакция.
И то что он утвержает что если вы направите его изучать другие варианты в процессе исполнения проекта - то времени на освоение Васей новых вариантов может не хватить для того чтобы ваш проект хотя бы как то пошел и тогда непременно придется делать как-нибудь, что может привести к неожиданностям.
Представьте себе, что вам дали 2 минуты на то чтобы поговорить с генеральным директором. Что именно вы ему должны сказать, чтобы он купил сразу и именно у вас проект на внедрение ЕРП за 10 миллионов?
Просто некий Вася - может заблуждаться, но сам этого не понимать.
И если я ему поверю на слово, то могу получить не совсем тот результат, который я ожидал.
Вот раз предлагаешь стандарт, то нужно как минимум предложить его обоснование.
Причем не только в виде умозаключений через предположения, а в виде тестов, замеров и цифр.
Проблемы с памятью - какие конкретно? Сталкивался ли автор с этими проблемами? Пусть опишет. Если не сталкивался, так может проблем то и нет. И он их придумал.
Проблемы с производительностью - какие конкретно?
1) Возмите айфон
2) Положите в пакет.
3) Пакет положите в микроволновку.
4) Поставьте на 1 минуту
Все как минимум 10% прироста будет.
И ведь потом можно почитать гневные комментарии, что производительность не только не улучшилась, а еще и теперь не работает
P.S. Не увидел в статье, что это шутка.
Чччёрт, простите, пожалуйста! То, что вы не поняли шутки - это полностью моя вина, согласен. Как мне загладить свою вину? Назовите цифру нанесённого вам морального ущерба - возьму ипотеку, но выплачу))
Нет, просто приходит тысяча обидившихся, узнавших себя программистов и каждый требует от автора объясниться)) Я объяснил одному-второму-третьему, но на всех меня не хватит. Если вам интересно лично моё мнение - читайте комменты, тут уже всё это было. Если вам интересно как оно всё "на самом деле" - ищите информацию, проводите тесты. спрашивайте у специалистов. Для этого и создаётся такой контент - чтобы "ректальные" программисты обижались, но не шли швыряться говном, а шли в гугл и искали-изучали-подтверждали-опровергали.
А я уже, пожалуй, пойду займусь делом, а то целый день тут обидки выслушиваю))
На комментарии с требованием пруфов - "отвечать я так вижу".
Нормальная практика. Что уж.
На ваше личное мнение всем глубоко насрать, вот серьезно.
Ну удачи вам в ваших делах.
А потом приходит некий "гениальный" Вениамин, который в статье узнал себя, и начинает плеваться слюной и доказывать, что не он ректальный программист, это все вокруг - Васи))
В статье нет моих-твоих-наших стандартов, есть вещи, которые были известны ещё задолго до появления 1С. Слава Богу, до 1С программирование существовало и вполне себе устоялось. Но в 1С почти все самоучки, поэтому развелось очень много таких гениальных Вень, которые считают себя предвестниками новой эры, а 1С - божьим волшебным даром, где всё сделано для их удобства, что думать об оптимизации там не надо, да и вообще неинтересно, как там оно внутри, ведь можно же просто ляпать через десять точек получение информации.
Я пару лет назад статью про НайтиПо... писал - было примерно то же самое нашествие таких вот "ректальных гениев")) В мире даже слово такое есть - хардкодинг, в Андроиде даже систему борьбы с литералами в среду разработки встроили. Но местные ректальные пророки сказали, что КГ/АМ)) Так что сейчас я уже морально готов к вашей реакции и даже готов сделать дарственную подпись, когда вы мою статью распечатаете и сделаете официальным регламентом разработки у себя в организации))
Ну про то, что я применяю ректальные практики - это лишь ваши фантазии. На каком основании вы сделали такой вывод?
И не плевался я в вас слюной.
Мне не понятно откуда вы сделали такой вывод.
Я даже лайкнул статью, т.к. она очень даже удачная.
Я лишь попытался выяснить подробнее про пункт 8.
Но вы себе придумали гипотезу и поверили в нее.
И вместо того, чтобы её проверить, начинаете в ней убеждать других.
И более того, все факты, которые ей противоречат, воспринимаете как негатив.
Игнорируете тесты, проведенные другими, а также вас не смущает, что об этом нет упоминания на ИТС.
Золотой постулат и зря автор начинает ерничать. Только "работает", это не в 10 случаях из 100 или даже в 90. Это в 100 случаях из 100. И если работает в 100 случаях из 100, то не важно как все там написано
Вообще, есть другая крайность у программистов, гораздо более губительная для решения задачи - перфекционизм. Оптимизировать код можно до бесконечности, только от этого задача не решается или решается крайне медленно. Поэтому самое лучшее - написать быстро чтобы работало, а потом, если будет время уже оптимизировать свой код
Вот именно! Поэтому нужно распечатать им настольную книгу настоящего, ректального программиста и пусть работают по ней)
Статью писал в шутку, но подозреваю, что многие её распечатают и будут использовать как регламент разработки))
я вот иногда каюсь грешен постулатами адептов, но блин видно ж сразу где стёб
Все в принципе зависит от задач и целей.
Главное не допустить ошибок на стадии проектирования, остальное можно будет поправить.
Тут палка о двух концах, где то читал статью про хорошего и плохого программиста, суть такова:
Плохой программист написал свой корявый продукт и выпустил на рынок, и дорабатывал в процессе эксплотации и вылизывал код.
А хороший программист писал долго и тчательно свой продукт, но когда он закончил, то выйдя на рынок, он обнаружил, что ниша уже занята и его продукт не нужен.
Да там не так все хорошо, но оно работает, а вкладывать деньги в еще один продукт, уже мало кто будет.
А хороший программист писал долго и тчательно свой продукт, но когда он закончил, то выйдя на рынок, он обнаружил, что ниша уже занята и его продукт не нужен.
MS Windows vs IBM OS/2 )
Windows сейчас наше все, а про OS/2 мало кто поминит
База УТ 10.3 хотели провести корректировку долга по одной организации и закрыть все задолженности по ней.
Всегда до этого делали корректировку долга и проблем не было, но тут не по конкретному контрагенту, а в целом по организации решили закрыть. И получилось что то около 12000 строк в двух таблица. И документ не моли провести, выдавало ошибку выполнения запроса, слишком много параметров. я не считал, но там за 1000 получилось.
Пришлось переписывать всю процедуру, а она не маленькая была. Ну и как это бывает, нужно срочно :-)
Занимаюсь разработкой недавно и многие рассмотренные вопросы для меня актуальны.
Из написанного понятно "как не нужно делать". А где можно почитать про то, как нужно?
Ну вот также лаконично и доходчиво. И было бы совсем замечательно, если было бы разъяснение, почему вот так плохо.
Ведь только жопорукие программисты тешат свое тщеславие, что давно все знают, не нужно ни с кем делиться драгоценным опытом с форумов и вообще аргументы с комментариями для людей, которые не знают, куда потратить лишнее время.
У меня в университете был товарищ, ярый FreeBSDшник и ругающий HTTP - ужаснейший костыль. Он был шокирован моментами, когда обновления с сервера тянулись периодическими обращениями клиента. Однако в ряде систем поверх HTTP я наблюдаю сейчас именно такую картину. Учетные системы с громкими именами и большой долей на рынке.
Вот именно поэтому и хотелось бы видеть комментарии к рукожопому коду. й = 1 или итератор = 1? Где-то код по стандартам может быть избыточным, а где-то попросту необходим.
Лично мне по душе преодолевать собственную лень и нежелание учиться новому в угоду стремления улучшить навыки. Отчасти для того, чтобы люди не плевались, если увидят мой труд, отчасти из внутреннего стремления к структурированию, упорядочиванию и желанию "делать правильно", которое наверно сродни стремлению грамотно писать.
Пытался поймать ваш ракурс, не вышло.
Нет, речь только о контексте, не более. Хотя не исключен контекст, в котором "код ради кода" может быть оправдан и востребован.
//--------------------------------------------------------------------------//
// "ПРИНУДИТЕЛЬНОЕ" удаление "минусовых" позиций. //
// Код добавлен с 17.02.2014 года из-за "неустранимых" косяков диспетчеров. //
// //
//----------//
// 17.02.14 //
//----------//
//----------------------------------------------------------------------------
СтруктураПоиска_ЗапускДеталей_102971_Деталь_1010_110101_04 = Новый Структура;
СтруктураПоиска_ЗапускДеталей_102971_Деталь_1010_110101_04.Вставить("ДокументЗапуска", Документы.ЗапускДеталей.НайтиПоНомеру(102971));
СтруктураПоиска_ЗапускДеталей_102971_Деталь_1010_110101_04.Вставить("Номенклатура", Справочники.Номенклатура.НайтиПоКоду("939691"));
СтруктураПоиска_ЗапускДеталей_102971_Деталь_1010_110101_04.Вставить("Количество", (-1));
МассивУдаляемых = ТЗ_Программы_ИменаDXF.НайтиСтроки(СтруктураПоиска_ЗапускДеталей_102971_Деталь_1010_110101_04);
Если МассивУдаляемых.Количество() = 1 Тогда
ТЗ_Программы_ИменаDXF.Удалить(МассивУдаляемых[0]);
КонецЕсли;
//----------------------------------------------------------------------------
СтруктураПоиска_ЗапускДеталей_102971_Деталь_1010_110201_06 = Новый Структура;
СтруктураПоиска_ЗапускДеталей_102971_Деталь_1010_110201_06.Вставить("ДокументЗапуска", Документы.ЗапускДеталей.НайтиПоНомеру(102971));
СтруктураПоиска_ЗапускДеталей_102971_Деталь_1010_110201_06.Вставить("Номенклатура", Справочники.Номенклатура.НайтиПоКоду("939698"));
СтруктураПоиска_ЗапускДеталей_102971_Деталь_1010_110201_06.Вставить("Количество", (-1));
МассивУдаляемых = ТЗ_Программы_ИменаDXF.НайтиСтроки(СтруктураПоиска_ЗапускДеталей_102971_Деталь_1010_110201_06);
Если МассивУдаляемых.Количество() = 1 Тогда
ТЗ_Программы_ИменаDXF.Удалить(МассивУдаляемых[0]);
КонецЕсли;
//----------------------------------------------------------------------------
ПоказатьКому не жалко тратить время, напишите статью, почему такие неректальные программисты могут быть хуже ректальных.
...
Правило 5. Программист испытывает страсть к обобщению.
Программист всегда всеми силами стремится сделать работу наиболее общим способом, чтобы потом только настраивать и прилаживать готовую систему.
...
Поэтому программирование в наиболее общем виде нужно категорически запрещать.
...
Баланс между обобщением и текущими требованиями рынка достигается опытом и соображениями бизнеса. Программистам доверять здесь абсолютно бессмысленно, как бессмысленно обсуждать с пьяницей семейный бюджет...
Правило 6. Нельзя делать "по-хорошему".
Всякий программист свою страсть к обобщению оправдывает похвальным желанием наконец-то всё сделать по-хорошему...
Делать по-хорошему - теоретически неправильно и практически вредно для бизнеса. Нужно делать так, чтобы всё работало, удовлетворяло клиентов (ровно на уровне цены продукта) и бизнес развивался...
Суть реализации.
Для каждого ЭлементТЗ из ТаблицаВходная Цикл
//Поиск документа по ИНН и еще как-нибудь.
Если Нашли Тогда
ДокументОбъект = Создать();
Иначе
ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
// Заполнение шапки документа
КонецЕсли;
// Ищем товар в ТЧ, заполняем по входным данным ОДНУ строку.
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
ПоказатьНе трудно догадаться, что такой подход к обработке сильно увеличивается по времени в геометрической прогрессии от количества строк в ТаблицаВходная + блокировки, и т.д. и т.п. "НО у меня (у плохого программиста) все работает, что не так". И действительно, на тестовой базе все работает. Может не так быстро как хотелось. Зато мы "решили" проблему для бизнеса.
Знаете, летчик в гражданской авиации долго летает как второй пилот (по началу), короче долго натаскивается, чтобы приобрести достаточные знания и опыт. Конечно глупо сравнивать программиста и летчика, но как сказал классик: "Если человек дебил, то это надолго".
З.Ы: И вот еще, если у вас нет опыта и знаний, не нужно автоматизировать бизнес и решать (лично) его стратегические задачи. Учитесь, как учиться второй пилот.
Он замечательно иллюстрирует, что типичный программист не мыслит категориями бизнеса, в формулировки задачи у вас нет сроков, бюджета, критериев достижения цели, рентабельности альтернатив.
Правило 8. Разработчик не интересуется бизнесом
Разработчик в среднем не стремится помочь организовать и развить бизнес...
... Низовой разработчик может не иметь даже и авторских амбиций, и интересоваться только работой и зарплатой. Успех продукта или компании в смысле роста прибыли интересует разработчика только опосредованно.
Дурь это. Кому?
Ну разве если жена позвонила и попросила что-то купить... чтобы не забыть...
Для н = 1 По 1000000000000000 Цикл
// яйца, молоко, макароны...
Объект.Удалить(Истина);
// сметана
Забавно. Он даже не узнал себя!
1. Справку писать не надо - ее все равно никто не читает
2. Документация к программе не нужна - через пол года все будет по другому, и вспоминать как это работает не потребуется
3. Имена переменных - н, и, Таблица, Список - чем короче, тем лучше
я , как уважаемые спорщики, так глубоко не копал, но однажды , будучи фрилансером, взялся ускорить некий отчет в сильно измененной УТ 10.3:
- первое что сделал:
воспользовался приемом "Ректального" программирования и заменил обходы выборок на обходы таблиц значений (все ТЗ получил в начале отчета). Скорость формирования отчета повысилась раз в 8 , на чем я работу сдал довольному заказчику и занялся другими делами. Этот отчет работает уже лет 8 и никаких проблем с памятью и прочим у заказчика нет и не было.
я это к тому написал, что хорошее качество - уверенность в собственной правоте, но отрицать реальность (преимущество выборки или ТЗ в конкретной ситуации) тоже не стоит.
цейнот тоже в некоторых ситуациях имеет решающее значение - поэтому Имя = "Вася" понятно откуда берется,
хранение больших кусков закомментированного старого кода тоже важно, т.к. бывают случаи что эти старые коды помогают подсказать заказчику "...что 2 года назад было так как ты сейчас хочешь, но год назад мы это дело по твоей же просьбе убрали.. - точно ли нужно то что ты сегодня хочешь ?"
переходы GoTo действительно экономят код, когда выполняются всякие не стандартные проверки …
на мой взгляд в некоторых случаях - в некоторых!! - прозрачность, читаемость кода важнее оптимизации
усталость программиста - это тоже серьезный стимул "здесь и сейчас" перейди на "ректальное" программирование.
в общем черно белого не бывает, хотя стремится к совершенству нужно :-)
в итоге пожелаю автору развить тему - первая статья получилась чуть провокационной, но во второй на эту же тему можно более серьезно разобрать типовые причины , по которым даже опытные программисты иногда выбирают не оптимальное решение - будет более интересно.
но если начале пути у заказчика был 1 ПК + УТ 10.х в файловом варианте. И заказчик развивая бизнес уже вырастил БД до 1 ГБт . Плюс годами нанимает фрилансеров на разовые доработки. То закомментировать то что меняешь - это хороший тон в отношении будущего фрилансера , который возможно через год или более будет менять в этом месте что-то еще по очередному требованию заказчика.
хочу донести мысль - догма это всегда плохо.
Предпочтение отдаю методу Выбрать(). Особенно при работе с большими выборками. Лучше, когда отчет будет работать дольше, но результат выдаст. При использовании Выгрузить() может просто не хватить памяти. И результат никакого пользователь не получит.
При малых выборках конечно это не критично. Выгрузить() использую только в тех ситуациях, когда точно знаю, что выборка будет небольшая.
О каких "дцать" раз идет речь? Есть конкретная информация о разнице времени выполнения? Давайте тесты, а не выброс непроверенной информации.
Неполенился и провел тесты.
Результат = Запрос.Выполнить();
МассивВремяЗаполненияВыбрать = Новый Массив;
МассивВремяЗаполненияВыгрузить = Новый Массив;
Выборка = Результат.Выбрать();
Для н=1 По 10 Цикл
Выборка.Сбросить();
// выбрать
ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
Пока Выборка.Следующий() Цикл
Стр = Объект.ТЧ.Добавить();
ЗаполнитьЗначенияСвойств(Стр, Выборка);
КонецЦикла;
ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах();
МассивВремяЗаполненияВыбрать.Добавить((ВремяОкончания - ВремяНачала)/1000);
// выгрузить
ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
Объект.ТЧ.Загрузить(Результат.Выгрузить());
ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах();
МассивВремяЗаполненияВыгрузить.Добавить((ВремяОкончания - ВремяНачала)/1000);
Объект.ТЧ.Очистить();
КонецЦикла;
ПоказатьДва тестовых случая заполнения табличной части. на 100 элементов и на 100000.
На 100 время выполнения практически одинаковое. Есть небольшая разница только на большой выборке.
На 100 время выполнения практически одинаковое. Есть небольшая разница только на большой выборке.
Тест1
Обход запроса: 9с. количество строк: 254 740
Выгрузка-загрузка: 3с. количество строк: 254 740
Тест2
Обход запроса: 192с. количество строк: 2 811 306
Выгрузка-загрузка: 130с. количество строк: 2 811 306
Как видим, выгрузка-загрузка выполняется быстро.
Возможно при
Сейчас сам интереса заради проверю...
Из них:
Загрузить->Выгрузить: среднее 267,423 мс, лучшее: 248 мс
Выборка: среднее 328,306 мс, лучшее: 307 мс
Да, не в "дцать" - соглашусь, но быстрее (15-20%).
А по поводу использования памяти - никакого дополнительного выделения памяти процессу rphost не было при использовании загрузки и выгрузки (я на Linux запускап - тут есть хороший инструментарий для того, чтобы посмотреть, что и как у процесса происходит, платформа 8,3,12,1412).
МассивПериодовРаботы = Новый Структура;
СтруктураПериодовРаботы = Новый Массив;
ТоЛиМассивТоЛиСтруктура = Новый Таблица;
ЭтоНеГраница = Новый Граница;
ДиалогВыбораФайла = Новый ДиалогВыбораЦвета;
HTTPСоединение = Новый HTTPЗапрос;
И вишенка на торте:
ТаблицаЗначений = Новый ТабличноеПоле;Мало кто вообще знает, чем таблица значений отличается от табличного поля, так давайте же внесем сюда дополнительную интригу
Задайте в Яндексе фразу "ректально это как" и получите ответ "через ж.пу". Ха,ха,ха ... Но не скрою, Вы добились своего - всем очень весело! ))
Возможно, стоит просто расширять свой кругозор и круг общения.
Вы похоже это слово впервые в жизни видите. Но оно вполне обиходное и никакого прямого отношения к неприличному не имеет.
Посмотрите в том же Яндексе:
- ректальные свечи,
- ректальный градусник.
Вот вам и посоветовали расширить свой кругозор.
Все значительно хуже чем я думал. Недостаток эрудиции восстановить гораздо проще, чем недостаток здравого смысла и чувства юмора.
Есть еще один не охваченный ректально-архитектурный момент, который часто продвигается поголовно фирмами франчайзи: необходимо на предприятии создавать как можно больше различных баз данных и обменов между ними, т.к. каждая задача - по своему уникальна и для нее нет места в единой системе с другими аналогичными задачами, т.к. "пути господни не исповедимы" и развитие должно идти у каждой системы независимое.
Отдельными базами решается сразу куча проблем: важнейшая - не надо настраивать права - можно (и нужно!) давать всем пользователям полные - для улучшения производительности, т.к. производительность и удобство пользователей - главное на что стоит обращать внимание при разработке любой системы.
К счастью есть такая конфигурация как "Конвертация данных" (КД). Ее необходимо использовать для любых проектов на постоянное использование обменов. Это очень удобно и соответствует освещенной автором важной концепции ректальной разработки и проектирования.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 966234
Создание 19.12.18 16:20
Обновление 19.12.18 16:20
Просмотры 67931
Загрузки 0
Рейтинг
349
Комментарии 360
Код открыт Да
Рубрики Математика и алгоритмы
Кому Разработчик
Тип файла Нет файла
Платформа Не имеет значения
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)