Ректальное программирование: основы для практикующих 1С-программистов
1C-admin
19.12.2018
Одной из самых популярных и зарекомендовавших себя методологий программирования в 1С является так называемое ректальное программирование. Редкий проект внедрения и сопровождения учётных систем на платформе 1С обходится без его использования. Зачастую без знания данной методологии программистам даже бывает сложно найти работу в сфере 1С, потому что работодатели, особенно фирмы-франчайзи, в основном отдают предпочтение классическим, зарекомендовавшим себя методикам, а не новомодным заграничным веяниям.
В тоже время данная тема освещена довольно скудно и программистам, даже опытным, приходится тратить тысячи часов на изучение ярких примеров ректального программирования. Иногда даже программисты со стажем затрудняются ответить на базовые вопросы, скажем — "Что лучше, запрос в цикле или получение данных через четыре точки"? Данный материал призван дать хотя бы базовое представление о методике ректального программирования и его успешного применения на проектах внедрения продуктов 1С любой сложности.
Что это?
Итак, прежде всего ответим на вопрос — что вообще есть ректальное программирование? Чем оно отличается от других методик? Какие преимущества даёт для программиста и его работодателя?
Ректальное программирование — это, прежде всего, программирование свободного человека, если хотите — венца творения. Это программирование, свободное от всяких предрассудков, навязанных рамок следования стандартам, параноидальной боязни демонстрировать свой код другим участникам проекта. Ректальное программирование — это путь состоявшегося программиста, уверенного в своём абсолютном превосходстве и компетенции, не нуждающегося в поучениях и не поддающегося стадному инстинкту постоянно обучаться.
В свою очередь работодатель, нанимая такого программиста, может быть уверен в том, что такой сотрудник почти наверняка органично впишется в коллектив таких же программистов, и будет двигаться в общем векторе развития компании.
Несколько постулатов философии ректального программирования
Задача даётся для того, чтобы её выполнили. Если задача выполнена, значит цель достигнута. Не нужно думать о призрачных перспективах, возможностях развития, доработках или переработках. Мы живём в очень нестабильном мире, а жизнь коротка. Незачем думать об оптимизации, производительности, рефакторинге, стиле, стандартах — вдруг завтра ядерная война?
Шедевр не может быть простым, доступным каждому. Если бы Толстой втиснул Войну и мир в брошюру между статьями о садоводстве и скандвордами, а Шопен играл бы на ложках — кто сейчас знал бы этих гениев и их шедевры? Шедевральность шедевра в его сложности. Поэтому, если хочешь достичь совершенства в программировании — уходи от простого к сложному. Все эти комментарии, понятные имена переменных и прочий сахар — удел плебеев и гуманитариев. "Если ты не можешь разобраться в несчастной паре тысяч строк моего кода — зачем ты вообще пришёл в программирование?" Программирование — это джунгли, слабых здесь затаптывают.
Всё новое — хорошо забытое старое
Если не забывать старое — не будет потребности в новом. Учить новым трюкам надо собаку, а не взрослого состоявшегося программиста, который всё уже знает. Всё что было в 8.0 отлично работает и в 8.3, что ещё нужно?
Несколько базовых приёмов ректального программирования
Приведём несколько широкораспространённых приёмов ректального программирования, чтобы читатель имел общее представление о практическом применении данной методики.
не нужны. Мало кто знает, что слово "комментарий" происходит от слова "закомментировать"! Комментарии придуманы для того, чтобы программист мог закомментировать десяток-другой процедур и функций и продолжать экспериментировать в коде, выражая своё творческое "Я". Но иногда комментирование используют не по назначению — за двумя слэшами пишут какую-то информацию о том, что делает код. Это очень вредная практика. Во-первых, что за странная фантазия — писать комментарии по коду, если ты и так знаешь, что в нём происходит? Во-вторых, что может быть непонятного в модуле с несчастными 15 тысячами строк и тремя сотнями процедур? Или тем более в пакетном запросе из двадцати составляющих? И, в-третьих, кому вообще придёт в голову лезть в твоё бессмертное творение, созданное на века?
Всем известно, что данные в 1С можно получать через точку. Например:
РеализацияТоваровУслуг.Заказ.Контрагент.Партнер.КонтактноеЛицо.Телефон
Когда-то кто-то запустил слух, что, якобы, это плохо, мол, из базы тянется куча ненужных объектов, не учитываются права и прочий бред. Но подумайте сами, для чего тогда Господь создал 1С с возможностью получать данные через точку? Любому умному человеку очевидно, что это бессмысленно! Бесспорным фактом является то, что раз 1С создана с такими возможностями, значит их и нужно использовать, а не слушать еретиков. Более того, как вы себе представляете другие способы получения информации? Программист что, ещё и запрос должен писать для этого?? Конечно же нет! Шах и мат атеисты!
Одно из важнейших умений программиста — пользоваться уже написанным кодом для создания нового. Если уже есть какой-то код, который выполняет нужное действие — зачем изобретать велосипед и писать его ещё раз, если его можно просто скопировать? Более того, его можно копировать ещё и ещё, столько раз, сколько нужно! Это в разы сокращает трудозатраты, ведь не нужно искать закономерности, придумывать новые функции, пытаться абстрагировать какие-то части. Исключив таким образом огромное количество бессмысленных действий, мы получаем повышение производительности труда программиста в разы, даже в десятки раз! Копирование кода — одно из важнеших умений в ректальном программировании!
не нужно. Форматирование кода, как и многие другие ненужные украшательства, призвано ограничить волю самовыражения программиста, отучает мыслить нестандартно, загоняет в рамки, обезличивает работу программиста-творца. Зачастую, среди серости и монотонности "стандартного" программирования очень сложно показать свою избранность, не говоря уже о том, что часто потомки просто не смогут идентифицировать авторство такого кода. Как же обидно будет, создав памятник ректального програмирования, использовать стандартное форматирование, заставив таким образом нобелевский комитет будущего (когда будет учреждена премия в сфере 1С-программирования) сомневаться в авторстве! Не правда ли, ужастная участь? Именно поэтому не нужно стесняться писать такой код:
процедура создатьдокумент(отказ,сс,массив,тч,сообщпользчтнельзсозддок=ложь)
если отказ=истина тогда отказ=ложь; возврат; конецесли;
если типзнч(сс)=тип("документссылка.заказклиенту")тогда
Да и в конце концов, имеет человек право иметь неработающие Enter, Shift и Tab на клавиатуре или нет??
Очень часто можно увидеть, как неопытные, некомпетентные, слабые духом программисты создают целую кучу общих модулей, умудряясь даже делать модули почти для одинаковых целей, но с разными контекстами и возможностями — клиентные, серверные, клиентсерверные, повторные, с вызовом сервера и т.п. Между тем большое количество модулей говорит о душевных метаниях, неуверенности в себе и отсутствия понимания вообще, как устроена работа платформы. А ведь всё очень просто:
сервер не может работать с клиентом, а клиент с сервером — может, если у модуля стоит флажок "Вызов сервера"!
Думаю, специалисты ректального программирования уже поняли, каким должно быть решение. Для остальных же вот правильный ответ: можно просто создать один общий модуль, назвать его ОбщийМодуль1, поставить у него флажки "Сервер" и "Вызов сервера" — и всё!
Так в загнивающей капиталистической литературе называют объект в системе, который хранит все данные и/или весь функционал. Не правда ли — гениальная в своей простоте идея? Ведь действительно, как удобно иметь в системе объект, где хранится всё! Представьте, как упрощается разработка! Все запросы в системе пишутся по одному объекту, а программист больше никогда не задаётся вопросом — а откуда брать данные? Вот они, все здесь. Таким объектом может быть, например, регистр сведений (обязательно периодичекий), или ещё лучше регистр накопления. А все реквизиты всех хозяйственных операций в деятельности можно сделать как измерения такого регистра. В дальнейшем, при последующей разработке, можно просто добавлять измерения. Пользоваться таким регистром очень просто — заполняются только нужные реквизиты, а остальные остаются пустыми. Вот и всё! Мы добавили один объект, создали в нём 2-3 сотни измерений для всех случаев жизни, а насколько просто стало работать с базой! Только теперь становится ясен истинный смысл выражения "целостность данных". Если же поместить вообще всю деятельность в один объект не получается, можно хотя бы стремиться к этому, создать два-три объекта. Например, один справочник, один объект и один регистр, который двигается этим документом.
Иногда в работе кода могут происходить ошибки, к сожалению, это неизбежно. Но цель программирования — выполнение задачи без ошибок. Как же быть? А что, если я скажу вам, что ваш код может работать всегда! Вообще всегда!! Без ошибок!!! Магия? Шарлатанство? Нелегальные способы? Нет, нет и нет! Всего лишь "Попытка"! Да, это такая конструкция, которая позволяет как бы попробовать выполнить кусочек кода, а если случилась какая-то ошибка, то можно просто аккуратненько её обойти. А если заключить весь код в попытку, а в исключении ничего не писать, то ваш код всегда будет работать без ошибок. Представьте — так просто и всё всегда работает, пользователь никогда не получит какую-нибудь страшную ошибку в работе. Всё что нужно — это писать все функции-процедуры вот так:
Процедура ВыполнитьОбмен() Экспорт
Попытка
// сюда помещаете всё тело процедуры
...
Исключение
// здесь ни в коем случае ничего не писать, иначе можно напугать пользователя!!!
КонецПопытки;
КонецПроцедуры
Вот и всё. И забудьте об ошибках. Кстати, это чудо возможно только в ректальном программировании, никакая другая методика не даёт таких впечатляющих результатов, поэтому она и ценится как среди программистов, так и среди их работодателей.
В 1С есть множество волшебных методов, которые магически выполняют свою работу без нагрузки на железо и при этом очень упрощают работу программиста. Например, методы "Выгрузить" у результата запроса и "Загрузить" у таблицы.
Представим, что у вас есть запрос, который получает миллиард строк из вашего богобъекта из п.6 и вам нужно их поместить в ТЧ объекта. Слабые духом скорее всего сделают выборку и будут построчно загонять в ТЧ. Но для чего, если можно просто написать:
ТЧ.Загрузить(Запрос.Выполнить().Выгрузить());
И всё сделается само за одно действие! Никаких циклов, никаких обходов, никакой вообще нагрузки на аппаратную часть. Строки просто волшебным способом оказываются внутри ТЧ.
И таких волшебных методов в 1С много. Ещё один пример: <…>.Найти(). Очень удобно использовать в цикле вместо, например, получения данных в запросе, ведь запросы писать сложно.
Пользователь — существо само по себе безвольное и находится на гораздо более низкой ступени развития, чем программист. Поэтому делать интерфейсы, ориентируясь на пользователя, дело неблагодарное, бессмысленное и даже опасное. Вместо этого программист, как создание гораздо более умное и просветлённое, должен помогать пользователю, придумывая за него, как ему удобнее и что ему вообще нужно. А также развивать у пользователя нестандартное мышление и мелкую моторику, создавая интерфейсы с секретами, тайнами и загадками. В дальнейшем пользователь только спасибо скажет за такую помощь.
Ведь кто ещё смог бы научить его определять по звуку вентилятора охлаждения процессора, что операция, которая висела в 1С 40 минут, уже завершилась? Страшны ли пользователю какие-то излучения, если он годами смотрел на форму цвета фуксии с зелёно-красными кнопками? Убьёт ли такой человек в порыве гнева свою жену, если он каждый день заполнял форму с сотней полей, в которой если перевыбрать одно значение, форма сбрасывается в ноль, но при этом выжил и сохранил рассудок? Болью и страданиями от использования доработанных ректальным способом интерфейсов выложена пользователю дорога в нирвану.
не нужен. Ещё один из небольших трюков увеличения производительности труда программиста — не обращать внимание на мелочи, следуя широкими шагами к завершению задачи. Например, как вы думаете, что можно улучшить в коде:
Если ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПредставлениеОбъекта = "Справочники"
ИЛИ ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПредставлениеОбъекта = "Документы"
ИЛИ ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПредставлениеОбъекта = "Планы видов характеристик"
ИЛИ ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПредставлениеОбъекта = "Планы счетов"
ИЛИ ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПредставлениеОбъекта = "Задачи"
ИЛИ ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПредставлениеОбъекта = "Бизнес-процессы"
ИЛИ ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПредставлениеОбъекта = "Планы обмена"
Тогда
ПлчЭлмнт = ЭтаФорма["ДеревоМетаданных"].НайтиПоИдентификатору(ТекСтрока).ПолучитьЭлементы();
КонецЕсли;
или
Для Каждого а ИЗ МассивНаСтоТысячСтрок Цикл
а.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(
СтрЗаменить(Справочники.Организации.НайтиПоНаименованию("ООО Лютик").Наименование, "ООО", ""));
КонецЦикла;
Правильно — ничего! Код лаконичен, не засоряет память ненужными переменными и работает, а больше ничего и не нужно для выполнения задачи.
Ещё одно иностранное слово, которое означает, что внутри кода зашиты какие-то значения. Например:
Если Имя = "Вася" Тогда
Сообщить(Имя);
КонецЕсли;
Здесь хардкодинг — это "Вася". Непонятно, зачем они там заграницей придумали для этого отдельное слово, ведь если тебе нужно проверить "Васю", то как ещё это можно сделать?
Заключение
Итак, это было краткое введение в основы ректального программирования. Надеюсь, данный материал поможет программистам, особенно начинающим, влиться в ряды, начать успешную карьеру и стать своими в среде программистов 1С.
Это просто генитально!!!
Ух, кажется, это одна из лучших, если не лучшая статья на ИС за последний год!
(1) всё генитальное — просто!
А оператор безусловного перехода?
А условие на измерение виртуальной таблицы РН в секции ГДЕ?
А соединение по Наименование?
. . . . . . .
Предлагаю выкладывать здесь в комментах примеры shit-кода.
Богостатья)
Прямо первая глава настольной книги программиста фирмы-франчайзи!)))
2. поясните чем лучше внутренее соединение.
Спасибо автору, за то что потратил время и написал такой генитальный шедевр)
Сначала было волосы дыбом встали, под вечер не въехав в название темы, начал читать первую часть и кровь закипала, т.к всегда пишу не для того чтобы работало, а ещё учесть что-то) но потом въехал, спохватился и долго смеялся ) оставлю ссылку на статью в комментариях в подобном коде, всем кто не полностью соблюдал принципы данной практики, пусть соблюдают все принципы ректального программирования)
(4)
Материал ознакомительный, так сказать, некоторые примеры базовых вещей, и конечно же, не призван охватить всю огромную палитру средств ректального программирования.
(8)
Спасибо))
Отправил ссылку на статью своему директору с пожеланием, чтобы все мои «коллеги» (прости Господи) программисты, за которыми я потом подтираю, прочли.
Смешно. Кейс №11 даже недавно видел собственными глазами. Так проверялся пользователь «Администратор», не то, что у него роль администратора, а то, что зовут его так. В тот момент было не смешно, а немного даже страшно.
А вот №2 это что-то явно эндемичное. В современных языках ООП всё представляется объектам, обращайся через точку к чему угодно, читаешь бывает с утра stackoverflow, там таких примеров вагон и маленькая тележка и для Java и для Python и для Kotlin.
(13)
Моё любимое и всегда первое место в рейтинге — это проверка на фамилию директора в коде.
у нас тут своя, 1С-атмосфера
(13)
Это не про об’ектную БД. Тут каждая точка — неявный запрос.
(15)
Автор указал, что касается запроса с миллионами строк, в случае когда строк очень много, выборка самый оптимальный выбор, т.к данные считываются не все сразу, в случае же с Таблица.Загрузить(РезультатЗапроса.Выгрузить()) можно получить ошибку недостаточно памяти или заметную деградацию выполнения, а в целом я часто пользуюсь Таблица.Загрузить(РезультатЗапроса.Выгрузить()) где точно знаю, что не может быть большое(от 1 тысячи) количество строк.
(20)
— заблуждение.
(4) Друг, Господа… я приоткрою вам кладезь примеровhttps://www.govnokod.ru/1c
(24) может Вам на курсы походить?
С Запрос.Выполнить().Выгрузить() легко можно потечь по памяти и часто люди, привыкшие работать с мелкими базами на этом попадаются. Все меняется при работе с большими базами с миллиардами строк
(3) Вкусно и просто!
(12)Боюсь, вы зря это сделали. Все Ваши «»коллеги» программисты, за которыми Вы потом подтираете», 100% примут эту статью как одобрение их стиля написания кода.
Ректальное программирование
Автор, а может для таких «коллег» визуально проиллюстрировать эту методику?..
(11)
Не надо бояться — разрабы отраслевых ни кому не оставят ни шанса. И в этом их поддержит великий дух Франчайзи…
(59)
Не надо в 1С тащить эти миллиарды строк в результат запроса. Это или проблема запросописателя, или проблема архитектуры. Но Вы всегда можете привести пример, когда весь этот «миллиард» строк нужно тащить запросом, а я, как архитектор, всегда могу указать на ошибку такого решения,и, разумеется, предложить верную альтернативу.
(1) Под всеми (кроме одного 8) пунктами подписываюсь, но свои пять копеек все таки вставлю 🙂
1) Комментарии — тут главное не переборщить, а то есть такие, кто «романы» пишут и пойди разберись что там в действительности творится.
2) Через точку — через точку писать плохо, даже в рекомендациях 1С это написано, но что то даже у 1С я встречаю такие конструкции (не такие длинные, но все же). А вообще все должно быть в пределах разумного, если код позволяет, то и через точку можно иногда обратиться, если это не влияет на производительность.
8) Выгрузить-Загрузить — а тут не просвятите чем плох этот метод? Ни разу не встречал, ничего плохого про него. На всякий случай провел тесты, вариант базы клиент-сервер, в запросе три выбранных реквизита. результат:
Тест1
Обход запроса: 9с. количество строк: 254 740
Выгрузка-загрузка: 3с. количество строк: 254 740
Тест2
Обход запроса: 192с. количество строк: 2 811 306
Выгрузка-загрузка: 130с. количество строк: 2 811 306
Как видим, выгрузка-загрузка выполняется быстро.
Возможно при
таком количестве строк, результат будет другой. Но как часто попадаются такие данные, если не брать крупные проекты.
(101)
Обход запроса: 9с. количество строк: 254 740
Выгрузка-загрузка: 3с. количество строк: 254 740
Тест2
Обход запроса: 192с. количество строк: 2 811 306
Выгрузка-загрузка: 130с. количество строк: 2 811 306
Как видим, выгрузка-загрузка выполняется быстро.
Автор по наивности предполагает, что 99% случаев — это сервер с 1 ГиБ памяти и база с миллиардом строк, а остальной 1% случаев он не рассматривает. Жалко его немножечко: переработал, устал…
(99) Предложите архитектуру решения. Необходимо получить остатки и продажи за последний месяц в разрезе номенклатуры, магазина, дня. Причем только для тех магазинов, в которые был приход с РЦ и только по той номенклатуре, для который в этот день была актуальная цена.
Входные параметры:
Количество номенклатуры порядка 14000;
Магазинов около 1500;
Количество дней — 30.
(99)
Ректальное программирование — это не о производительности и не об архитектуре. Это об уверенности в том, что можно писать говно в одном случае и красиво в другом. Это о том, что «да ладно, тут же не миллиард строк, напишу вот так, а вот когда миллиард будет, тогда, конечно, напишу как надо!». Это о том, что вообще вместо того, чтобы просто писать правильно, без оглядки на фантазии о количестве, начинается философия и оценки средней температуры по больнице.
Даже на самом верхнем уровне логики, загрузить-выгрузить — это ДВА обхода, а выборка это ОДИН обход. Но адепты ректального программирования, конечно, будут и дальше использовать описанные в статье приёмы, потому что они не задумываются о таких мелочах, им неинтересно, что там внутри, для них 1С — это божий дар с кучей волшебных методов, которые просто превращают БД в ТЧ. Потому что:
(106)
Построчный обход в 1С и построчный обход на низкоуровневом языке — это не одно и то же.
Почему вы так уверены в своей гипотезе?
Можете предложить как ее проверить?
(109)
У меня нет доступа к исходникам платформы, чтобы быть уверенным в методах. Но обычная логика говорит о том, что если я получаю таблицу, значит:
1. Результат запроса был уже обойдён той же самой выборкой (может, и не той, но примерно такой же).
2. Была создана таблица и сохранена в памяти (с метаданными, колонками и типами)
3. Эта таблица была обойдена (с созданием и хранением итератора в том числе) и помещена в ТЧ.
Как я уже выше написал, ректальное программирование не занимается такими проблемами. Ректальное программирование — это полёт творческой мысли, у которой нет времени на такие мелочи.
(103)ну вы то же наивно полагаете что на компьютере 100гб ОЗУ и 10мб на жд. И примеры такие приводите. Однако то же упражняетесь в манипулировании.
(104)
Хорошая задача, интересная (с)
Но что тут сразу бросается в глаза? Это отчет, или эти данные нужно вставить в один результирующий документ? Если первое, то как оно относится к «Загрузить->Выгрузить»? И если это отчет, то какой идиот будет фильтровать его в Excel вместо того, чтобы отфильтровать выборку и не тянуть в рот все подряд, чтобы потом с этим мучиться в Excel (и какой Excel на какой машине откроет этого монстра)?
А если нужно сформировать один документ, то сам по себе этот документ — плохое решение, являющееся тем самым «ректальным» из пункта о всех данных в одном месте.
Давайте конкретизируем задачу, чтобы понять, что нужно пользователю (ведь именно для него все это задумывается, правда, а не чтобы потешить внутреннее «Я» — ну я надеюсь на это).
(113)
А вот в С++ обычная логика будет говорить совсем другое, ибо компилятор оптимизирует код. Я бы на месте 1С-ников точно бы проверял на эту самую «загрузку->выгрузку» и реализовал бы поведение механизма в один проход, как оптимизацию (предположу, что не совсем идиоты пилят платформу).
(113)
А вас не смущает, что в стандартах 1С об этом не прописано?
Вы не допускаете возможность, что в ваших рассуждениях может быть изъян, коль скоро вы не имеете доступа к исходникам платформы?
(140)
А вы не допускаете, что коль скоро у меня нет исходников, то я могу воспользоваться тем, что у меня остаётся — логикой. А не плодить сущности и изобретать оправдания тому, что я пишу Г-код.
(145)
А давайте добавим в ваши рассуждения недостающие переменные
При выборке на прикладном уровне В ЦИКЛЕ вызываются методы: Следующий(), Таблица.Добавить(),
ЗаполнитьЗначенияСвойств()
При выгрузке-загрузке это все вызывается на низком уровне.
При этом вы предлагаете, что на низком уровне нет возможности скопировать таблицу значений в табличную часть без обхода. Ну предположим, вы правы (хотя это только предложение), но в этом случае может использоваться низкоуровневый итератор и заполнение, которые могут работать быстрее.
В итоге вы утверждаете, что совокупность методов при обходе выполняется эффективнее? При этом вы не знаете, какие дополнительные действия вызываются в перечисленных высокоуровневых методах по сравнению с низкоуровневыми
(128) Это отчет. Таблица(Строки Номенклатура, Среднесуточные продажи по всем магазинам; Колонки: Магазин(Детали: Остаток на начало текущего дня; Среднесуточные продажи))
Для чего и удобство такого огромного массива данных опустим, это реальная задача.
Вопрос был в том, что
Про загрузить — Выгрузить. Все хорошо работает, пока данных мало. Но произошло накопление данных или резкий скачок, и база колом встала. Не всегда можно предугадать, что будет через год, сколько магазинов и РЦ откроется, сколько данных придется обрабатывать.
И вот представить ситуацию, описанную выше, когда человеку нужно в отчете обработать весь массив, или завтра попросят переработать эти данные в какой-то другой вид и выдать оператору только результат.
Как в данном случае построить логику? Как бы сделали Вы?
(128) дополнительно могу сказать, что физическая таблица остатков занимает порядка 150Гб, индексов 505Гб, продажи: 102 и 170 Гб соответственно
(155) И всё это нужно для оперативной работы? Не верю…
(151) Опустим такую мелочь, как то, что 1С вроде как компилируется на низкий уровень перед запуском, т.е. никакой компиляции на лету Следующий и т.п. не будет.
Всё бы хорошо, но вы, не зная реалий, предлагаете их допридумать и оправдать свой Г-код. А я предлагаю, не зная реалий, просто писать качественный продуманный код.
Потому что язык — это всего лишь инструмент. А вот умение писать качественный код — это важное умение, которое может помочь всегда и везде. Как и умение аналитически мыслить, интересоваться, что там, под капотом, может помочь не только в коде, но и иногда в самых неожиданных А не просто беспокоиться о своей зоне комфорта.
(158)
Я не пытаюсь оправдывать г-код.
Просто я вам не верю и хочу получить от вас более менее убедительную аргументацию вашего утверждения.
Пока вся ваша аргументация основана ТОЛЬКО НА ВАШИХ СОБСТВЕННЫХ ПРЕДПОЛОЖЕНИЯХ.
Выше коллеги привели результаты тестов, которые подтверждают, что ваши предположения как минимум верны не во всех случаях.
Как грамотный специалист, вы тоже могли бы проверить свои утверждения, а потом уже пускаться в споры.
И еще — я не знаю какой вариант из двух работает оптимальнее: Выборка или Выгрузить-Загрузить.
И ваши предположения не являются основанием для признания такого метода г-кодом.
(101)
Тест1
Обход запроса: 9с. количество строк: 254 740
Выгрузка-загрузка: 3с. количество строк: 254 740
Тест2
Обход запроса: 192с. количество строк: 2 811 306
Выгрузка-загрузка: 130с. количество строк: 2 811 306
Как видим, выгрузка-загрузка выполняется быстро.
Проблема этого метода не в скорости выполнения, а в потреблении памяти, о чём написано на ИТС.
(184) А можно ссылочку, а то не найти. Если проблема в потреблении памяти, то на сколько она велика? В какой момент один способ хуже другого.
(184)
вроде на ИТС речь об Обходе результата запроса. Лучше обходить результат запроса через выборку, а не через таблицу значений.
Но автор утверждает, что если нужно заполнить табличную часть, то необходимо использовать только выборку.
Иначе это ректальное программирование.
(187)а я не про то что пишет автор. А про то что скорость выполнения не единственная характеристика. Ничего как бы нового или скорость или потребляемая память.
Либо уменьшаем время выполнения за счёт увеличения объёма памяти, либо на оборот.
(186)
В тот самый момент когда система работает в много пользовательском режиме. И чем больше пользователей тем серьёзней проблема.
(188) Но современный тренд именно скорость в ущерб памяти. Ни кто особо не думает о ресурсах, когда разрабатывают продукт. Просто пишут минимальные и рекомендуемые требования. Пример те же браузеры и компьютерные игры.
(190)браузер это многопользовательская учётная система?
(188)
А если мне, например, время выполнения критичнее, а память менее критична?
Если я такую операцию выполняю каждую минуту — то лучше делать через выборку,
Но если такая операция делается по запросу пользователя, например, по понедельникам несколько раз в день, то почему бы не сделать через Выгрузить-Загрузить.
Вот это логично.
Причем, если результате запроса заведомо мало данных, например заполнение услуг при заказе товаров в интернет магазине, то никакой разницы в производительности и памяти вообще не будет
А однозначно утверждать, что «Выгрузить-Загрузить всегда ректально» — неправильно.
Тут мы имеем дело с предпочтениями автора и не более того.
И ставить это в одну линейку с таким злом, как например «дублирование кода» — не справедливо.
(190)
Платформа 1с поддерживает этот тренд?
Платформа это не игра и не браузер. Не очень правильно тащить подходы противоречащие идеологии платформы.
(191) Ну к примеру все работают через тонкий клиент (имею ввиду компьютер) подключаются к серверу.
Хром допустим есть 200мб (150-250 мб за страницу в среднем) (мозила больше там до 500 может доходить).
Берем 10 пользователей, которые открывают по 5 страниц итого уже съедено 10000МБ памяти только браузером на сервере.
(194) К сожалению да. Возьмите те же управляемые формы, они жрут больше чем ОФ, а все для того, что бы можно было открыть базу в браузере.
(193)ваше право следовать или нет рекомендациям 1с. Но сама рекомендация звучит как не стоит при разработке многопользовательской системы исходить из неограниченного объёма ОЗУ.
(195)так не ставьте браузер на сервер.
Ну а так что бы развивать демагогию можно много чего придумать.
(196)читал рекомендацию про то что нужно следить за объёмом ОЗУ. Других не читал. Про тренд «давайте в многопользовательской системе не следить за ОЗУ» не читал. По этому не понятно с чего вы решили что этот тренд применим в 1с.
И в целом всегда надо руководствоваться разумным и не впадать в крайности.
(4)
А кто сказал, что ГОТО — это плохо? Есть ситуации, когда он вполне уместен. Я им пользуюсь раз в год, например.
(202)тем что при программировании в 1с не рекомендуется использовать. О чем написано в документации. Ну и в чем проблема им не пользоваться? Ну кроме разведения демагогии на форуме что раз в год он пригождается? Есть такой пример что задачу без него не решить в платформе 1с?
(207)
Отсюда как бы вытекает простой вопрос: а на куя разработчики платформы его в нее все-таки засунули. Вообще, история вопросатут .
(207)
А кто не рекомендует, кстати? Он в любом случае не умнее вот этого товарища:
(209)историю вопроса я знаю. Ссылки на лурку мне не очень интересны. Я и спросил о практической необходимости при работе, кроме разведения демагогии?
А зачем включили это лучше у разработчика спросить.
(212)
Так вот же:
Слово «PHP» нужно читать в соответствии с тематикой настоящего сайта.
(210)это не ответ на мой вопрос, а разведение демагогии.
(213)то что вы освоили регулярки чем гордитесь в интернете и иногда используете гото, «не быдлом» вас не делает.
К тому же вы так и не привели пример на 1с где без гото ну прям вообще никак.
(214)
Так ответ в статье (или в (213)), которую Вы читать не хотите.
А вообще там можно сказать, что и рекурсия — зло и то самое ректальное программирование. Но это не от большого ума, а от наличия стереотипов, зацементировавшихся в сознании.
(215)
Вы путаете возможность написать без ГОТО с возможностью упростить с помощью ГОТО код. Это сложно понять, но, уверяю Вас, можно (как, собственно, иэто , но и тут следует различать множественное число и персональное обращение).
(217)я не увидел примера сложного алгоритма необходимого в 1с в 213. Там только попытки бросаться фекалиями и пытаться кого нибудь оскорбить. То же не признак ума.
(219)
Так а где Вы видели умных 1С-ников?
(219)
Я уже приводил на просторах инфостарта пример. Его можно через ректальное программирование написать без ГОТО, но с ГОТО получается лучше.
(218)
Я понимаю разницу. А так же то что для каждой системы есть свои правила и подходы. И если что то не рекомендуется использовать в конкретной платформе то спорить с этим можно долго. А можно просто не использовать.
С телефона пишу. Доступа на ИС нет.
(221)ну я думал что Вы из их числа. Но таки после того как Вы доказывали что 1с это платформа для не самых сообразительных то понимаю по какому критерию выбирали себе работу.
(212)
Видимо, потому что 1С изначально позиционировался как «язык для домохозяек», т. е. для не очень искушенной в кодировании публики. Далеко не все сегодня знают, что такое структурное программирование, что уже более 40 лет назад использование безусловного перехода в языках высокого уровня осуждалось как непрофессионализм специалистами с мировым авторитетом.
Олдскульные кодеры, понятно, читали книгу Хьюз и Мичтом «Структурный подход к программированию», а также книги Дейкстры и Йодана, издававшиеся в СССР. Но, очевидно, 1С-кодирование изначально не рассчитано на узкий круг снобов, а пролетариату куда же без goto, для пролетария послать кого-то — естественная потребность 🙂
В Java оператора goto нет. Понятно, на пролетариев умственного труда она не ориентирована изначально.
Работал я как-то в одной конторе лет 8 назад. FoxPro 2.6 (DOS). Начальник отдела — старый программист. В свое время на всякие конференции ездил по Стране и не только для разработчиков. Иногда писал он всякие обработки (процедурные файлы). А кто не писал. Чтобы перезаполнить какую-нибудь табличку(и). При этом он не ничего не выводил на экран. Т.е. понять примерно на каком этапе выполняется обработка, было нельзя (практически… Но это магия). Может зависла он. Его аргументы: Вывод на экран это процессорное время занимать, да и не барское это дело, скажем, рассчитывать процент выполнения, да и еще его выводить. Вот видишь сзади лампочки мигают, куда сетевой шнур вставлен, значить все работает, ничего не зависло.
З.Ы.: Да чуть не забыл. Поля даты (почти все) были типа Character(10). А почему бы и нет. Работает ведь. И бизнес доволен. Можно написать 30.02.2010 или 72 нояб. А можно слово на 3 буквы. Идеальная система)
(207)
Применяю GoTo, например, в случае когда используется вызов пользовательского кода, задаваемого в режиме предприятия.
Типа такого:
Показать
Так вот, когда пишешь тот самый пользовательский код, GoTo очень помогает, например, в таком случае:
Основной код:
Пользовательский код:
То есть GoTo применяется для начальной проверки переменных контекста и прекращения выполнения кода, иначе получается большая вложенная конструкция Если…КонецЕсли.
(258) Гм… Интересно, эта возможность была и в Clipper. А там оператора безусловного перехода тоже нет 🙂
(156) есть как бы сети больше двух киосков
(263) И что? Это автоматически значит, что они работают оптимально?
(264) ну, можешь поучаствовать в обсуждении и предложить свое оптимальное решение. Если нет, то и писать в эту ветку не стоит больше.
П.С. большой объем данных в том числе история за пару лет это требование бизнеса, а не лень программистов
(266) Требование бизнеса точно не такое- «лопатить при оперативной работе огромные массивы данных». Это архитекторы/программисты так реализовали. Оптимальное решение не предложу, конечно, не зная реальных требований бизнеса.
(267)именно такое.
С того и надо было начинать,
а не разводить подъездную лавочку.
(268) И вам доброе утро! Продолжайте решать свои проблемы «в лоб».
(269)я же вынес на обсуждение реальную задачу. Описал количество данных и требование актера процесса. Предложил грамотным архитекторам обсудить самый оптимальный в данной задаче путь решения.
Вы же в свою очередь устроили балаган, не предложив ни одной светлой мысли.
На этом предлагаю разойтись краями и больше в эту ветку попрошу не писать
(270) Уважаемый, ты мне не указывай, куда мне писать, а куда нет.
(271) вот ты и показал из чего состоишь, Гена-джуниор, мечтающий стать экспертом =)
(277) Во, сразу виден культурный и умный человек, уважаю…
(246)
А другие не менее талантливые профессионалы смеялись в голос над теми, кто «осуждал» использование безусловного перехода. А теперь этими баснями питаются придурки, которые программировать не умеют и учиться не хотят, т.к. для них этокульт Карго .
В среде быдлокодеров — программирование методом копипаст из книжек «для чайников»:
(246)
Это Вы от незнания, так что прощается:
В дополнение к применению в операторах 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» — это не ГОТО. Это тот самый ГОТО, только для идиотов, которые не могут его правильно использовать..
(261)
Нет, автор четко говорит о том, что нужно сначала получить результат запроса, потом проверить его, что он непустой, потом уже через выборку пройти по результату и поместить ее в ТЧ через ЗаполнитьЗначениеСаойств(ТабличнаяЧасть1.Добавить(), Выборка). И для очень большой выборки автор по всей видимости прав, ибо на его серверах памяти мало и диски медленные. Но если ориентироваться на то, что даже при 2кк строк скорость работы «Загрузить->Выгрузить» быстрее в разы, чем «Полка Выборка.Следующий()…», аргументы автора лично мне кажутся безосновательными. И если бы я пилил платформу, то для случая «Загрузить->Выгрузить» делал бы один обход на С++ (есть мнение, что так и есть).
(210)
Дейкстра:
http://hosting.vspu.ac.ru/~chul/dijkstra/goto/goto.htm
А тем, у кого ученый с мировым именем «не умнее» клоуна с лурки, читать басню Крылова «Осёл и Соловей».
(298)
Это не goto. Он не способен создать «лапшу» из кода.
(300) лапшу из кода (интересно даже услышать определение) любители культа Карго «гото — это плохо» и без ГОТО с легкостью делают. И в языке 1с нет «прервать метка», так что приходится юзать ГОТО, а кто не умеет — его проблемы.
(299) Дейкстра — не единственный ученый с мировым именем. Его критиковали другие ученые с мироввм именем Торвальдс — тоже ученый с мировым именем, и он такой фигни как Дейкстра не говорил. В функциональном программировании нет циклов, на нем программируют ученые с мировым именем. А такие лохи, как Вы, не могут без циклов — правильная аргументация?
И да, без циклов можно написать чтг угодно. Надо объявить все эти for, while, repeat, e.t.c. — плохим говнокодом.
(301)
Рисунок подойдет?
Просто не нужно. 1С — не система реального времени, чтобы экономить микросекунды.
(302)
Если Торвальдс ученый, то Сталин «большой ученый»© 🙂
Торвальдс — практик, его никто не называл ученым. А Дейкстра, пожалуй, знал больше об эффективности алгоритмов, чем весь наш форум вместе взятый да еще в 10 степени. И если такой человек, как Дейкстра, говорил, что в языках высокого уровня можно обойтись без goto ВСЕГДА, то трудно это проигнорировать.
Просто я никогда не использовал функциональное программирование. Нужно будет — освоим, и без циклов будем ваять, какие наши годы 🙂
Вообще мы говорим, видимо, об одном и том же. Не собственно о goto, а о его неадекватном применении, приводящем к «лапше». Дейкстра предлагал, чтобы этого избежать, вообще не использовать безусловный переход. Радикально? Но приемлемо. Бо говнокодеры 🙂
Поэтому это уже просто холивар, как лет 30 назад между «сионистами» и «пасквилянтами», или между фанатами процедурной и объектной парадигмы.
(189) В целом посыл позиции 1С понятен и правильный.
Но часто бывает так:
Лишние, свободные 64 или 128 Гб мы отведем под рамдрайв, но будем экономить <10Мб и бомбить выборками файловую систему под 1с сервером.
А кто нибудь проводил анализ пожирания памяти скулем? На больших базах сразу гигабайты неоптимальных выборок кэшируются. По сравнению с 1С сервером — это вообще смех. Вот где нужно искать потребление озу!
(303)
Не нужно, или религия не позволяет? Сейчас докажу, что второе.
Вот есть код:
Показать
А теперь упростим:
И что нам мешает писать так, как во втором варианте?
Кстати, попытайтесь аргументированно доказать, что циклы — это хорошо. Ведь программу можно написать как без ГОТО, так и без использования циклов Зачем нам циклы тогда? Ведь по-сути в функциональной парадигме можно и на 1С писать отчасти (в той части, где нужны циклы — точно),
(304)
Ну понятно, что с религиозными взглядами сложно что-то сделать — они цементируют догматикой сознание, делая его малоподвижным, инертным и зависимым от идеологической надствройки разума…
Но все-же рискну…
«Я по-прежнему считаю, что создавать монолитное ядро в 1991 году — фундаментальная ошибка. Скажите спасибо, что вы не мой студент: за такой дизайн я бы не поставил высокой оценки :-)» (из письма к Линусу Торвальдсу). Свой пост Таненбаум озаглавил «Linux устарел»[5].
Кроме монолитного ядра, Таненбаум критиковал Linux за отсутствие переносимости. Таненбаум предсказывал, что процессоры 80×86 в недалёком будущем исчезнут, уступив место архитектуре RISC.
Критика сильно задела Торвальдса. Таненбаум был знаменитым профессором, и его мнение имело значение. В данном вопросе, однако, он ошибался. Линус Торвальдс настаивал на своей правоте.
А теперь давайте ответим на простые вопросы: где сейчас MINIX, кто знал бы Таненбаума, если бы не Торвальдс и, конечно, почему в Linux сейчас есть и монолитное ядро, и микроядро, и перенесен он на все возможные платформы. Почему профессор с мировым именем оказался неправ, а студент (в то время) оказался куда умнее?
Ссылаться на авторитетов — моветон, а на устаревших авторитетов — вдвойне. Но даже пользуясь его постулатами о программировании можно однозначно сказать, что современные языки далеки от них, а современная практическая разработка даже близко не соотносится со следующим:
Что-то ни в одном ТЗ не вижу ничего типа: Дано, Доказательство, Ч.Т.Д. Где это все? Осталось в груде запылившихся школьных тетрадей, которые отдельные отличники, зубрящие учебники, забыли в письменных столах родительского дома? А в голове собственные мысли о правильности бытия сформировались, или тоже были заучены в виде догматов?
Вы только ГОТО не юзаете из-за Дейкстры, или Вы и теорему доказываете каждый раз, когда пишите программу? <<Ведь кто сказал «не убий», сказал и «не укради». Если не убьешь, но украдешь — то также виновен перед законом>> (Древний эпос)
(309) Ладно, подумаю 🙂
Уважаемый, а Вы не пробовали в конфигурации 1с, к примеру УПП запустить глобальный поиск по по «Перейти ~»? Попробуйте, посмеемся… Кодеры не читали документацию?