Ректальное программирование: основы для практикующих 1С-программистов

19.12.18

Разработка - Математика и алгоритмы

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

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

Что это?

Итак, прежде всего ответим на вопрос - что вообще есть ректальное программирование? Чем оно отличается от других методик? Какие преимущества даёт для программиста и его работодателя?

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

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

Несколько постулатов философии ректального программирования

 
 Главное, чтобы работало
 
 Код - это искусство
 
 Всё новое - хорошо забытое старое

Несколько базовых приёмов ректального программирования

Приведём несколько широкораспространённых приёмов ректального программирования, чтобы читатель имел общее представление о практическом применении данной методики.

 
 1. Комментарии в коде
 
 2. Через точку
 
 3. Копирование кода
 
 4. Форматирование
 
 5. Общие модули
 
 6. God object
 
 7. Попытки
 
 8. Загрузить-выгрузить
 
 9. Юзерфрендли
 
 10. Кэш
 
 11. Хардкодинг

Заключение

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

программирование практика успешный программист методика

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1870    stopa85    12    

34

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4661    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7650    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7928    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4545    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8932    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.

31.08.2021    7956    dusha0020    8    

70
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
278. genayo 21.12.18 08:52 Сейчас в теме
(277) Во, сразу виден культурный и умный человек, уважаю...
unknown181538; Гриффин; saandreev; starik-2005; +4 1 Ответить
106. for_sale 971 20.12.18 11:36 Сейчас в теме
(99)
Ректальное программирование - это не о производительности и не об архитектуре. Это об уверенности в том, что можно писать говно в одном случае и красиво в другом. Это о том, что "да ладно, тут же не миллиард строк, напишу вот так, а вот когда миллиард будет, тогда, конечно, напишу как надо!". Это о том, что вообще вместо того, чтобы просто писать правильно, без оглядки на фантазии о количестве, начинается философия и оценки средней температуры по больнице.

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

Ректальное программирование - это путь состоявшегося программиста, уверенного в своём абсолютном превосходстве и компетенции, не нуждающегося в поучениях и не поддающегося стадному инстинкту постоянно обучаться.
109. json 3304 20.12.18 11:45 Сейчас в теме
(106)
Построчный обход в 1С и построчный обход на низкоуровневом языке - это не одно и то же.

Почему вы так уверены в своей гипотезе?
Можете предложить как ее проверить?
Spartan; bestsader; +2 Ответить
113. for_sale 971 20.12.18 11:56 Сейчас в теме
(109)
У меня нет доступа к исходникам платформы, чтобы быть уверенным в методах. Но обычная логика говорит о том, что если я получаю таблицу, значит:
1. Результат запроса был уже обойдён той же самой выборкой (может, и не той, но примерно такой же).
2. Была создана таблица и сохранена в памяти (с метаданными, колонками и типами)
3. Эта таблица была обойдена (с созданием и хранением итератора в том числе) и помещена в ТЧ.

Как я уже выше написал, ректальное программирование не занимается такими проблемами. Ректальное программирование - это полёт творческой мысли, у которой нет времени на такие мелочи.
134. starik-2005 3036 20.12.18 12:29 Сейчас в теме
(113)
У меня нет доступа к исходникам платформы, чтобы быть уверенным в методах. Но обычная логика говорит о том, что
А вот в С++ обычная логика будет говорить совсем другое, ибо компилятор оптимизирует код. Я бы на месте 1С-ников точно бы проверял на эту самую "загрузку->выгрузку" и реализовал бы поведение механизма в один проход, как оптимизацию (предположу, что не совсем идиоты пилят платформу).
unknown181538; bestsader; +2 Ответить
140. json 3304 20.12.18 12:45 Сейчас в теме
(113)

А вас не смущает, что в стандартах 1С об этом не прописано?

Вы не допускаете возможность, что в ваших рассуждениях может быть изъян, коль скоро вы не имеете доступа к исходникам платформы?
145. for_sale 971 20.12.18 13:15 Сейчас в теме
(140)
А вы не допускаете, что коль скоро у меня нет исходников, то я могу воспользоваться тем, что у меня остаётся - логикой. А не плодить сущности и изобретать оправдания тому, что я пишу Г-код.
151. json 3304 20.12.18 13:28 Сейчас в теме
(145)
А давайте добавим в ваши рассуждения недостающие переменные

При выборке на прикладном уровне В ЦИКЛЕ вызываются методы: Следующий(), Таблица.Добавить(),
ЗаполнитьЗначенияСвойств()

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

В итоге вы утверждаете, что совокупность методов при обходе выполняется эффективнее? При этом вы не знаете, какие дополнительные действия вызываются в перечисленных высокоуровневых методах по сравнению с низкоуровневыми
Spartan; Гриффин; CodeNull; klinval; h00k; w.r.; +6 1 Ответить
154. w.r. 644 20.12.18 13:37 Сейчас в теме
(151) Я тоже думаю, что один платформенный вызов (Выгрузить->Загрузить) более оптимален, чем тысячи платформенных вызовов при обходе выхоборки и заполнения по одной стороке ТЧ
bestsader; +1 1 Ответить
158. for_sale 971 20.12.18 13:56 Сейчас в теме
(151) Опустим такую мелочь, как то, что 1С вроде как компилируется на низкий уровень перед запуском, т.е. никакой компиляции на лету Следующий и т.п. не будет.

Всё бы хорошо, но вы, не зная реалий, предлагаете их допридумать и оправдать свой Г-код. А я предлагаю, не зная реалий, просто писать качественный продуманный код.

Потому что язык - это всего лишь инструмент. А вот умение писать качественный код - это важное умение, которое может помочь всегда и везде. Как и умение аналитически мыслить, интересоваться, что там, под капотом, может помочь не только в коде, но и иногда в самых неожиданных А не просто беспокоиться о своей зоне комфорта.
167. json 3304 20.12.18 14:03 Сейчас в теме
(158)
Я не пытаюсь оправдывать г-код.
Просто я вам не верю и хочу получить от вас более менее убедительную аргументацию вашего утверждения.
Пока вся ваша аргументация основана ТОЛЬКО НА ВАШИХ СОБСТВЕННЫХ ПРЕДПОЛОЖЕНИЯХ.

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

И еще - я не знаю какой вариант из двух работает оптимальнее: Выборка или Выгрузить-Загрузить.
И ваши предположения не являются основанием для признания такого метода г-кодом.
CodeNull; +1 Ответить
172. for_sale 971 20.12.18 14:16 Сейчас в теме
(167)
Я, как грамотный специалист, проводил такие тесты. Как и тесты получения информации через точку и ещё много чего.

Логика, о которой я говорю уже в пятый, кажется, раз, и о которой вы не слышали или, видимо из за своей эмоциональной привязанности к каким-то, упомянутым в статье участкам кода, не хотите слышать, - так вот, логика, в случае отсутствия информации, говорит мне - у тебя есть два обхода или один, что ты выберешь? Я выбираю один. Вы выбираете то, что легче писать. Вот такая разница. Поэтому я и написал в статье, что это - "магические" методы. Потому что, например, вы, действительно верите, что можно из запроса получить данные вначале в таблицу, а потому и в ТЧ без обхода.
177. json 3304 20.12.18 14:29 Сейчас в теме
(172)
А где вы видели, чтобы я утверждал, что один метод лучше другого?
Я такого не утверждал. Как и не утверждал обратного.

Хотелось бы узнать результаты тестов, которые вы проводили.


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

Вы приведите результаты тестов: что при этом страдает производительность, память, процессор?
Я всего лишь хочу узнать, почему вам можно верить.
Вдруг вы действительно можете подтвердить свои слова на практике, а дело не в вашем ЧСВ, которое подталкивает вас отстаивать свою правоту.
unknown181538; Гриффин; +2 Ответить
179. oleg-x 26 20.12.18 14:31 Сейчас в теме
(177)(172) Кстати, можно было бы даже отдельную маленькую статью оформить. Мне бы было бы интересно (хотя в ближайшие пару лет уж точно не пригодится).
181. for_sale 971 20.12.18 14:34 Сейчас в теме
(177)
Так там же выше я уже всё написал. Что и, главное, почему, из написанного мною и уже несколько раз скопированного, вам непонятно?
183. json 3304 20.12.18 14:42 Сейчас в теме
(181)
Я увидел только ваши рассуждения и предположения.

Ваши предположения - это просто слова.
Вы не тот авторитетный специалист в предположения которого можно верить просто на слово.
Вы просто "какой-то пользователь на инфостарте", также как и я.
Поэтому ваши предположения-рассуждения нужно подтвердить цифрами.

Какой именно пост(ы) вы имеете ввиду?
Есть конкретные замеры?
oleg-m; Гриффин; CodeNull; klinval; +4 Ответить
192. starik-2005 3036 20.12.18 15:24 Сейчас в теме
(172)
Потому что, например, вы, действительно верите, что можно из запроса получить данные вначале в таблицу, а потому и в ТЧ без обхода.
Вот тут интересная фича приведена.
Без оптимизации -O0:
  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С. Такая оптимизация языковых конструкций широко используется в языках программирования, и я не думаю, что разработчики платформы про это ничего не знают. А вот сделали они это или нет - вопрос интересный.
204. for_sale 971 20.12.18 15:56 Сейчас в теме
(192)
Всё так. Но я вспоминаю притчу из коммунистического детства - когда дети пошли в поход и никто не взял нитку с иголкой потому, что каждый подумал, что возьмёт другой.

Если я программирую участок, я за него отвечаю. Очень хорошо, если программисты платформы знают, что в 1С широко распространено ректальное программирование, поэтому сделали какие-то скрытые ускорения. Но всё же я свой код всё равно буду писать так, чтобы он оптимально работал в худшем случае, т.е. как если бы разработчики платформы ничего для меня не улучшили. Во всяком случае до тех пор, пока не будет документированных подтверждений тому, что надо обязательно пользоваться Загрузить-Выгрузить, потому что разработчики платформы гарантируют, что это быстрее.
Fox-trot; Артано; neikist; acanta; +4 1 Ответить
206. starik-2005 3036 20.12.18 15:59 Сейчас в теме
(204)
Но всё же я свой код всё равно буду писать так, чтобы он оптимально работал в худшем случае, т.е. как если бы разработчики платформы ничего для меня не улучшили.
Т.е. если в 99% случаях код работает лучше, а в гипотетическом 1% случаев, когда результат запроса на столько огромен, что все встает колом, Вы все-равно попытаетесь через цикл это все ректально-отданное запросом обработать? ИМХО, пусть лучше rphost умрет сразу от out of memory, чем встанет колом на обработке такого большого результата.

НО! Не нужно такие большие результаты обрабатывать вообще. Их не должно быть в принципе. Ректальность тут как раз в запросе, а не в выгрузить->загрузить, который, повторюсь, может работать в один проход, если разработчики платформы немного подумали мозгом и используют best practices.
uncle_Vasya; CodeNull; klinval; ben19791010; Артано; +5 Ответить
329. klinval 338 14.01.19 17:06 Сейчас в теме
(167)
Не знаю почему, но спорили на 300+ сообщений про Выгрузить/загрузить, говорили прямыми цитатами с ИТС, но так никто не кинул ссылку: https://its.1c.ru/db/v8std#content:-2145782922:hdoc

Если "потенциально неограниченных выборках данных из ИБ" в примере взят Справочник.Номенклатура, то получается неограниченные выборки это по сути всё что угодно. А такой схемы обработки данных в типовых я ни разу не видел....
for_sale; +1 Ответить
110. oleg-x 26 20.12.18 11:47 Сейчас в теме
(106) А кроме двух обходов, какие еще аргументы против Загрузить(Выгрузить())?
Очень многие говорят о производительности, что бы код работал быстро, но это метод работает быстрее, нежели обхода. А огромные данные встречаются в основном в крупных проектах, где логика работы данных уже совсем другая.
По крайне мере, здесь я слышу об этом впервые и по результатам теста (выше), этот метод даже лучше.
112. for_sale 971 20.12.18 11:52 Сейчас в теме
(110)
А двойного обхода мало?)
114. neikist 20.12.18 11:58 Сейчас в теме
(110) Это ведь все равно по факту увеличение потребления памяти на 50%. (результат запроса + ТЗ в которую данные выгрузились + ТЧ или ТЗ в которую данные загрузили)
for_sale; +1 Ответить
159. json 3304 20.12.18 13:56 Сейчас в теме
(106)
Ваш самый весомый аргумент, насколько я полагаю - это ДВА ОБХОДА.

Но вы не учитываете, что обход ВЫБОРКИ - это возможно в несколько раз более затратная операция, чем обход Таблицы.
При обходе выборки происходит переключение рекордсета + преобразование из примитивных типов данных в типы 1С.
При обходе таблицы - таких действий не происходит.

Таким образом соотношение Обход1:Обход2 по времени это не 50%:50%, а может значительно отличаться от этого соотношения.
Но адепты ректального программирования могут не учитывать этот факт, и считать, что Выборка.Следющий() по времени равно Для каждого СтрокаТаблицы из Таблица Цикл
Гриффин; +1 Ответить
164. for_sale 971 20.12.18 14:00 Сейчас в теме
(159)
Я вам уже там в другом месте ответил. Ключевые слова - если не известно, что происходит, то можно или пользоваться логикой или оправдывать свой Г-код
228. Sashares 34 20.12.18 17:06 Сейчас в теме
(164)Что вы вашу логику суете везде =)
Ваша логика это только ваше представление о том как должно быть.
Совсем не очевидно, что реальность должна совпадать с вашими представлениями о ней.
Замер сделайте и проверьте.
ixijixi; CodeNull; Гриффин; Асов; +4 2 Ответить
233. for_sale 971 20.12.18 17:44 Сейчас в теме
(228)
Простите, всё время забываю, что в ректальном программировании логика вредит конечному продукту)
238. Sashares 34 20.12.18 18:12 Сейчас в теме
(233)Не зная как работает платформа полагаться только на свои представления о ней... Да, с такой логикой в вашем ректальном программировании вы далеко пойдете)))
CodeNull; Гриффин; Асов; starik-2005; +4 1 Ответить
227. Sashares 34 20.12.18 16:57 Сейчас в теме
(59) Глупости. У вас все свалится еще на строке Запрос.Выполнить().
Albert_2008; +1 Ответить
15. starik-2005 3036 19.12.18 18:50 Сейчас в теме
А что не так с Загрузить->Выгрузить? Или Вы думаете, что результат запроса памяти не занимает? А по поводу "Найти" и запросов, то текущий объект может еще не быть сохранен, а что-то найти (например, в связанной табличной части) нужно. Хотя бы в той же УТ с установкой цен и их хитрым деревом.
bulpi; h00k; vano-ekt; +3 1 Ответить
39. vano-ekt 124 19.12.18 20:17 Сейчас в теме
(15) не успел спросить) присоединюсь, ну и так и чем не угодило? Магия 1С порой быстрее работает, тот же метод ЗаполнитьЗначенияСвойств() сработает быстрее присваивания 50 реквизитам
42. for_sale 971 19.12.18 20:47 Сейчас в теме
(15)
А что не так с Загрузить->Выгрузить?

В статье и не написано, что что-то не так. Там наоборот сказано - отличный способ. Строки из запроса магическим способом оказываются внутри ТЧ. Это же 1С, тут нет никаких "о большое".
CodeNull; lunjio; bulpi; Vladimir Litvinenko; TreeDogNight; Крококот; neikist; gd4ojhnng8se; +8 Ответить
45. leemuar 19.12.18 22:21 Сейчас в теме
(15) занимает, но при работе с курсором - меньше. При таком подходе помимо памяти на результат запроса на сервере СУБД будет дополнительно аллоцироваться память под выгрузку в таблицу и время на аллокацию и заполнение этой памяти на сервере 1С. Становится ощутимо при больших выборках (тысячи, десятки тысяч строк). Видимо в статье таким образом говорится о нежелании думать о работе с большим объемом данных (в т.ч. о росте объема данных в будущем)
h00k; TreeDogNight; lunjio; TODD22; for_sale; +5 Ответить
48. for_sale 971 19.12.18 22:40 Сейчас в теме
(45)
и не будем забывать о двойном обходе
95. starik-2005 3036 20.12.18 10:32 Сейчас в теме
(45)
Видимо в статье таким образом говорится о нежелании думать о работе с большим объемом данных (в т.ч. о росте объема данных в будущем)
Большие объемы данных - это не для 1С. Она их только хранить может (и то не она, в СУБД, ибо файловая ограничена по размерам и назвать ее "большой" язык не поворачивается) и обрабатывать маленькими кусочками за бесконечное время. Поэтому Загрузить-выгрузить для маленьких кусочков данных маст хэв, а большие куски отдайте роботу на Java и не мучайтесь с Выборка.Следующий() до скончания веков.
125. leemuar 20.12.18 12:10 Сейчас в теме
(95) не знаю о чем вы говорите, я использую emacs
102. mpeg1989 131 20.12.18 11:07 Сейчас в теме
(45) А вы где видели документы с ТЧ на десятки тысяч строк? Даже в 1С рекомендуют документ разбить на несколько документов.
starik-2005; +1 Ответить
124. leemuar 20.12.18 12:09 Сейчас в теме
(102) а где я писал про документы? ;)
108. w.r. 644 20.12.18 11:44 Сейчас в теме
Может быть имелось ввиду то, что при этом очищаются все данные, которые были до этого в табличной части
17. IvanovAV 132 19.12.18 18:50 Сейчас в теме
"Вася" - лучший продажник, "Васю" - любим мы все)
18. Perfolenta 204 19.12.18 18:53 Сейчас в теме
прикольно, все пункты по делу...

однако, "ГЛАВНОЕ ЧТО БЫ РАБОТАЛО" это спорный пункт... возможно он не входит в ректальное программирование...

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

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

И почему только 1С? Этот стиль живет в любых средах и языках, он универсален и вечен...
unknown181538; +1 Ответить
19. IvanovAV 132 19.12.18 18:53 Сейчас в теме
А че вы имеете против моего любимого цвета фуксии с зелено - красными кнопками? Ваша 1С с желто-мордым Такси ничего не понимает в истинном дизайне!
Асов; Gluk_1C; TreeDogNight; for_sale; +4 Ответить
21. Sashares 34 19.12.18 18:56 Сейчас в теме
(0)
Представим, что у вас есть запрос, который получает миллиард строк из вашего богобъекта из п.6 и вам нужно их поместить в ТЧ объекта. Слабые духом скорее всего сделают выборку и будут построчно загонять в ТЧ. Но для чего, если можно просто написать:

ТЧ.Загрузить(Запрос.Выполнить().Выгрузить());


На строке Запрос.Выполнить() - весь результат запроса помещается в память. Вы напрасно думаете, что создание выборки и добавление в цикле даных в ТЧ будет хоть как-то оптимальнее. Это заблуждение.
Единственное отличие - кода будет выполнено больше на миллиард*количество строк кода цикла.
user774630; +1 Ответить
27. lunjio 66 19.12.18 19:10 Сейчас в теме
(21) Да, в 1С про оптимальная порционная выборка это типа Справочники.Справочник.Выбрать(), а с результатом знал, что сразу помещается в память, но думаю что Выбрать() из результата, как-то оптимальное чем пока не утилизирован результат запроса, ещё создавать таблицу значений, которая такой же объем памяти занимать, как сам результат, согласитесь ?)
Артано; for_sale; +2 Ответить
30. for_sale 971 19.12.18 19:21 Сейчас в теме
(21)
статья как раз об этом: один раз обойти миллиард строк = два раза обойти миллиард строк
rpgshnik; gd4ojhnng8se; +2 Ответить
31. spacecraft 19.12.18 19:23 Сейчас в теме
(21) не совсем так. При выборке данные, если не хватает памяти, будут сохранены на диск и будут считываться с диска при Выборка.Следующий(). При Выгрузить() можно получить нехватку памяти.
h00k; for_sale; +2 Ответить
33. starik-2005 3036 19.12.18 19:29 Сейчас в теме
(31) табличная часть ограничена 100к строк - это современным компам ниачом.
35. spacecraft 19.12.18 19:33 Сейчас в теме
(33) это тут причем? Вопрос был про механику.
Fox-trot; Vladimir Litvinenko; for_sale; +3 Ответить
32. TODD22 18 19.12.18 19:25 Сейчас в теме
(21)
На строке Запрос.Выполнить() - весь результат запроса помещается в память.

На 32х битной платформе если памяти не достаточно то результат запроса помещается на диск и от туда считывается по средствам "Выборка.Следующий()".
gd4ojhnng8se; +1 Ответить
34. starik-2005 3036 19.12.18 19:31 Сейчас в теме
(32) так и на диске может памяти нехватить. Но тут забыли указать в примерах выборку всей таблицы во временную, а ткм уже селекты из нее. Вот нафига так делать? Вот это истиный пример того самого терморектального криптоанализа
37. TODD22 18 19.12.18 19:50 Сейчас в теме
(34)
Но тут забыли указать в примерах выборку всей таблицы во временную, а ткм уже селекты из нее. Вот нафига так делать?

Выборку первым запросом таблицы в ВТ, а потом последующие выборки из ВТ что ли? Или что имеется ввиду?
TreeDogNight; gd4ojhnng8se; +2 Ответить
36. Арчибальд 2707 19.12.18 19:36 Сейчас в теме
(32) (33) Статья-то не о запросах. И даже не о программировании 1С. Я увидел самоидентификацию Программиста.
56. Артано 762 20.12.18 02:40 Сейчас в теме
(21) Вы не правы. Затраты будут двойными. Больше или меньше чем выборка зависит от конкретного оборудования и объема данных. Поясню: Метод "Выгрузить" результата запроса, выполняет копирование одной таблицы в другую, с соответствующими издержками на обслуживание операции и хранение данных. При выборке вы парсите одну таблицу.

Использование выборки, по сравнению делает код более предсказуемым и гибким в своём поведении, независимо от объема данных. При этом нельзя отрицать, что в 99% процентов случаев выгрузка данных в таблицу ни к чему плохому не приведёт.
starik-2005; +1 Ответить
22. IvanovAV 132 19.12.18 18:56 Сейчас в теме
Пункт №6 - это к разработчикам типовых конф, аля УГ11 чего только стоит справочник Номенклатура с больше сотни реквизитов Числитель_Вес_Заменатель_ЕГАИС_ГИС. И регистр накопления Себестоимости в котором живет все на свете.
portalUg; bulpi; for_sale; +3 Ответить
23. vermouth 19.12.18 18:59 Сейчас в теме
Ух, так большинством этих базовых приемов я виртуозно владею!!! ) Приятно, что идешь в ногу со временем
uncle_Vasya; YaroslavHolovatiy; Дмитрий74Чел; denismal; bulpi; user598655_ilia-bers; Aggressorak; h00k; for_sale; +9 Ответить
29. Арчибальд 2707 19.12.18 19:13 Сейчас в теме
Конечно же плюс. Хотя, насчет ректальности готов поспорить.
38. shard 279 19.12.18 19:59 Сейчас в теме
Встречал в одной конфе (для ЦБ, это вам не хухры-мухры!), разрабатываемой франчем, выполнение запроса в двойном(!) цикле - вот мастерство настоящих гуру. А мы, с нашими проверками на "Васю" - жалкие подражатели. Самое главное - исправить не дали, т.к. пострадал бы авторитет разработчика.
bulpi; user598655_ilia-bers; TreeDogNight; boln; for_sale; +5 Ответить
41. boln 1040 19.12.18 20:34 Сейчас в теме
(38)
Встречал в одной конфе (для ЦБ, это вам не хухры-мухры!), разрабатываемой франчем
Интересно, нахрена им франчи? Я недавно проводил выездной курс для одинэсников ЦБ, у них там свои кадры и довольно неслабые. Уж точно запрос в цикле делать не будут.
51. shard 279 19.12.18 23:50 Сейчас в теме
(41) Полагаю бабло пилили. Либо свои эту ахинею не пожелали писать и крайними за внедрение быть.
andreypahov; +1 Ответить
52. acanta 20.12.18 00:04 Сейчас в теме
(51) Во втором случае предметная область непонятна программисту и нет желания/времени осваивать.
40. vano-ekt 124 19.12.18 20:23 Сейчас в теме
6. God object
Так в загнивающей капиталистической литературе называют объект в системе, который хранит все данные и/или весь функционал.

в нашей литературе его назвали регистром бухгалтерии
unknown181538; mirco; FesenkoA; Albert_2008; ixijixi; mr.lynx; bulpi; user598655_ilia-bers; h00k; Max27; TreeDogNight; Krio2; kot30688; Dem1urg; user1113362; acanta; gd4ojhnng8se; for_sale; echo77; +19 Ответить
43. Serg O. 225 19.12.18 20:49 Сейчас в теме
Всё в точку!
п.9 про вентилятор охлаждения ... супер! РжуНеМогу ( КаталсяПодСтолом )

"Шедевральность шедевра в его сложности" - надо в рамочку и на стену...
её даже можно попробовать измерить Анализ цикломатической сложности
если она больше 30-50 (а я встречал до 90 ! ) - надо рефакторить... т.е. переписывать заново

п.3 - любимое дело копи-пастить... его можно тоже попробовать измерить,
как раз недавно переделывал обработку КопиПастаМер v.2 ...

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

P.S. фото с ежегодной Премии - Рукожоп года... (HandAssMan) (см. youtube . com)
Прикрепленные файлы:
user598655_ilia-bers; A7758735; h00k; TreeDogNight; CyberCerber; user1113362; gd4ojhnng8se; for_sale; +8 Ответить
74. TreeDogNight 22 20.12.18 07:40 Сейчас в теме
(43) Если руки золотые, то не важно откуда они растут :)
for_sale; +1 Ответить
44. user779117 19.12.18 22:12 Сейчас в теме
Автор! Ты мой кумир теперь!
Завтра распечатаю и повешу в офисе на стену!
bulpi; TreeDogNight; for_sale; +3 Ответить
47. for_sale 971 19.12.18 22:37 Сейчас в теме +5 $m
(44)
Спасибо)) на подходе ещё статьи из этого цикла
176. brr 182 20.12.18 14:28 Сейчас в теме
Про название метода которое не отражает, что он делает и про количество параметров было? Слабо раскрасить строку жирным с одиннадцатью параметрами?

ОформитьЖирнымСтрокуПоNew_НОВАЯ(ЛистПрайса_Excel, ТекИндСтр, КолВоКолонокПрайса, ЭтоNew, ЭтоСпецЗаказ, ПризнакАкцииПоТовару = Ложь, РезПримечание = "", ЭтоРаспродажныйТовар = Ложь, КраситьЦветомНовинкиРаспродажи = Ложь, КраситьЦветомСнижениеЦен = Ложь, КраситьМинУпаковку = Ложь)
46. acanta 19.12.18 22:31 Сейчас в теме
Премии программисты достойны, факт. Вопрос стоит так - если у этих программистов клиентов много, но только один из них имеет такую стильную конфигурацию-номинант, то в чем разница между этим клиентом и остальными?
Ведь ни один клиент как правило в код не лезет до расставания с программистом.
А в случае получения конкурентами такого клиента возникнет законное желание найти и спасти всех остальных пострадавших-т.е. получить всю клиентскую базу программиста.
49. RustIG 1408 19.12.18 22:44 Сейчас в теме
общий восторг не испытал, пройду мимо
Albert_2008; pm74; Stref75; +3 1 Ответить
50. CyberCerber 853 19.12.18 23:45 Сейчас в теме
Единственный вопрос по пункту 5 про модули... Как я понял, я сам делаю их через одно место.
Потому что я не понимаю разницы между модулями Сервер и ВызовСервера. Точнее, я не вижу смысла в модуле Сервер, если есть ВызовСервера.
Можете пояснить?
TreeDogNight; +1 Ответить
53. neikist 20.12.18 00:13 Сейчас в теме
(50) Могу ошибаться, так как целенаправленно вопрос не изучал и это просто мои выводы: далеко не все методы выполняющиеся на сервере нужны клиенту и логичнее их вызовы осуществлять контролируемо, иначе кто то раскопав протокол обмена между клиентом и сервером 1ски сможет делать что захочет.

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

P.S. Еще раз уточняю что это просто предположения и тоже интересно было бы послушать о причинах.
for_sale; +1 Ответить
54. for_sale 971 20.12.18 00:19 Сейчас в теме
(53)
всё гораздо проще, хотя озвученный вариант мне тоже нравится.
Просто модуль Сервер компилируется только на сервере. А модуль с Вызовом сервера компилируется и там, и там. Т.е. увеличивается время компиляции на клиенте. Поэтому в него нужно помещать только методы, которые действительно надо вызывать с клиента.
bulpi; h00k; rpgshnik; lunjio; neikist; acanta; +6 Ответить
55. neikist 20.12.18 00:21 Сейчас в теме
(54) Хм, просто я когда то слышал именно в контексте темы безопасности, но в чем именно опасность/безопасность так и не искал, вот и сделал предположение.
63. vano-ekt 124 20.12.18 06:36 Сейчас в теме
(55) физическая опасность для конкретного копрокодера невелика(особенно, если отдел разработки состоит из него одного), при этом возможность передать что-то мутабельное между к-с вполне себе реальна
[но мы то знаем, все методы тру-копро-кодера обернуты в попытку, поэтому всё норм]
TreeDogNight; for_sale; +2 Ответить
121. CyberCerber 853 20.12.18 12:03 Сейчас в теме
(54) А можно подробнее про "компилируется"? Не слышал раньше об этом... И как может серверный модуль компилиться на клиенте? Ведь там в коде если объекты, которые не доступны на клиенте. И разве вообще что-то компилится в 1С? Ведь это интерпретируемый язык. Или вы говорите о создании индекса методов для вызова?
129. for_sale 971 20.12.18 12:20 Сейчас в теме
(121)
Как всегда, пути 1С неисповедимы и код платформы закрыт. Но рискну предположить что где-то на уровне ниже создаётся какая-то прослойка, которая доступна на клиенте и которая дёргает сервер. Но в любом случае, гугление постоянно даёт именно информацию о компиляции на клиенте этого серверного модуля. Чтобы это не значило.
118. CyberCerber 853 20.12.18 12:00 Сейчас в теме
(53) Тоже так подумал, плюс еще как защита от передачи объектов, которые не могут ходить с клиента на сервер, например, ТЗ.
Но просто помню примеры из типовых. Например, в УТ 11 есть модули ОбщегоНазначенияУТ и ОбщегоНазначенияУТВызовСервера. И там, и там есть очень полезная функция ЗначениеРеквизитаОбъекта (которая как раз работает по п.2). Так вот в ОбщегоНазначенияУТВызовСервера она просто вызывает ОбщегоНазначенияУТ! Какой в этом смысл?
130. for_sale 971 20.12.18 12:21 Сейчас в теме
(118)
В этом и смысл.
Представьте, что у вас есть серверный модуль с миллиардом функций. А одну из них вы хотите вызвать с клиента. Ректальное программирование говорит - сделай его с вызовом сервера и не парь себе мозг. Ну а программисты послабее духом возьмут и сделают отдельный модуль с вызовом сервера, где сделают эту одну функцию, но вызывать будут вот ту, в серверном.
131. CyberCerber 853 20.12.18 12:24 Сейчас в теме
(130) Да, в общем, понятно... Но почему бы тогда реализацию этой функции и не сделать в модуле ВызовСервера, чтобы избежать доп. вызова? Тогда возвращаемся к вопросу о компиляции?
57. TimoninD 20.12.18 02:46 Сейчас в теме
Автор постарался от души! Ждем продолжения..
for_sale; rpgshnik; +2 Ответить
93. for_sale 971 20.12.18 10:24 Сейчас в теме
58. Артано 762 20.12.18 02:48 Сейчас в теме
Спасибо автору за прекрасный иллюстративный материал, у меня никогда бы не хватило душевных сил и времени чтобы так с огоньком описать, то с чем мне приходится бороться
TreeDogNight; for_sale; madonov; +3 Ответить
60. AlexCherdakov 20 20.12.18 06:00 Сейчас в теме
Виртуозно владею тремя пунктами ректального программирования:
1 Копирование. Часто при изменении типовой конфигурации копирую куски кода дабы максимально следовать логике разработчиков, понимаю что можно было сделать по другому и возможно даже немного лучше но пусть будет так, в дальнейшем оправдывается. (Из текста этого пункта недостаточно явно следует о том что верх мастерства это повторяющиеся куски кода большого размера которые можно выделить в отдельные сущности, к сожалению этой ступени мастерства я еще не достиг)
2 Попытка. Попытка это изобретение дьявола, например последнее из моего творения: по тексту типового запроса в типовой конфигурации был уверен что теоретически может возникнуть ситуация когда запрос вернет не ноль а Null причем не этого значения группировки, делать две правки типового кода в совершенно разных местах... нет попытка и навыки "ректального" программиста мой выбор
3 Юзерфрендли. Да я считаю что придумаю интерфейс лучше чем пользователь и постараюсь не дать ему возможности "фантазировать" на эту тему, единственный свой минус я тут вижу в следовании общей концепции интерфейса даже если он ущербен изначально

Я достаточно развил свои навыки ректального программиста для того чтоб причислить себя к этому гениальному сообществу?

ЗЫ а вообще статься понравилась автору плюс
TreeDogNight; for_sale; user1114895; +3 1 Ответить
65. vano-ekt 124 20.12.18 06:44 Сейчас в теме
(60)
Да я считаю что придумаю интерфейс лучше чем пользователь и постараюсь не дать ему возможности "фантазировать" на эту тему

подн**рал 1С тебе со своими уф в этом деле...
66. AlexCherdakov 20 20.12.18 06:46 Сейчас в теме
(65)сначала я его ненавидел, потом тихо презирал, а теперь... я похоже его даже люблю
61. al_zzz 309 20.12.18 06:01 Сейчас в теме
Когда устроился во франчайзи, дали мне клиента, которого до этого обслуживал фрилансер. Когда заглянул в код - волосы встали дыбом. Там присутствовали примеры почти из всех кейсов статьи. Спросил бухшу, кто им такую "красивость" написал? Сказала, что программист их обслуживал. Такой хороший, ну такой хороший! Но потом, к сожалению, уехал Москву автоматизировать...
bulpi; CyberCerber; TreeDogNight; TimoninD; user1114895; lunjio; rpgshnik; +7 Ответить
78. &rew 49 20.12.18 08:49 Сейчас в теме
(61)Нарушен первый постулат 1С. Не "копрохвали" коллегу своего, ибо потом про тебя так же скажут. Именно из-за этого у 1С ников такая "слава".
79. al_zzz 309 20.12.18 08:54 Сейчас в теме
(78)Тут вроде все свои, нет?
80. &rew 49 20.12.18 09:02 Сейчас в теме
(61)
Спросил бухшу, кто им такую "красивость" написал?
96. vano-ekt 124 20.12.18 10:32 Сейчас в теме
(61) это хорошо, что в вашем франче принято переписывание чужого гамнокода (хоть и рабочего) за свой счет, а свой код проверять системным архитектором и покрывать тестами. Таким сотрудникам франчам надо платить все 34% вместо 33 от часа
62. nomadon 367 20.12.18 06:14 Сейчас в теме
ничиго не понял а что смешного
105. TreeDogNight 22 20.12.18 11:31 Сейчас в теме
(62) Это же очень тонкий сарказм)
64. user811769 13 20.12.18 06:37 Сейчас в теме
Так, нужно продолжение
bulpi; TreeDogNight; for_sale; +3 Ответить
94. for_sale 971 20.12.18 10:24 Сейчас в теме
67. vano-ekt 124 20.12.18 06:53 Сейчас в теме
ещё один крутой прием в ректокодинге
Модифицируй при записи!
Пользователи обязательно должны чувствовать Силу Автоматизации, и знать что программист позаботился, чтобы скрытый с формы, но очень полезный служебный реквизит заполнился автоматически. Пусть при записи на форме, пусть ему, пользователю пришлось два раза записать объект. Но это лучше, чем бы это поле присутствовало на форме и пользователь сам вводил поле "датаизмслужеб" (тут и ошибиться и забыть можно в конце концов)
unknown181538; bulpi; CyberCerber; for_sale; user1114895; lunjio; fancy; +7 Ответить
68. torbeev 20.12.18 06:54 Сейчас в теме
Не угадал автора по заголовку.
h00k; CyberCerber; +2 Ответить
69. rpgshnik 3645 20.12.18 06:59 Сейчас в теме
Просто восхитительно всё собрано во едино!


for_sale; user1114895; lunjio; +3 Ответить
71. user828972 20.12.18 07:15 Сейчас в теме
Сегодня вроде не 1 апреля
Degrement; +1 5 Ответить
73. Hans 2 20.12.18 07:37 Сейчас в теме
Еще один тру кодер?
Degrement; +1 6 Ответить
77. Degrement 126 20.12.18 08:41 Сейчас в теме
Напомнило старый анекдот:
Стадии развития программиста:
1) Ваш код гавно.
2) Мой код гавно.
3) Весь код гавно.
4) Жизнь гавно.
5) Выступает на конференции с темой: "Как структурировать гавно, чтобы оно не растекалось."

Автор похоже начинающий программист...
azard@inbox.ru; bomber99544; Sagat777; bulpi; elizarovs; rintik; Артано; forseil; Hans; +9 3 Ответить
75. vano-ekt 124 20.12.18 08:02 Сейчас в теме
Каждому Праву по Роли!
Самым оптимальным и эффективным способом разделить права на просмотр, запись, редактирование реквизитов является проверка

РольДоступна("МожноОткрыватьЗаказФилиалСибирь") И Ответственный.реквподразделение.Наименование = "Сибирь"
или
РольДоступна("ВидимостьСкладаВТребованииНакладной")

Чего может быть проще? Добавил в ветку "Роли" нужное право и проверил нехитрым способом, в нужных методах поставив Отказ=Истина или Форма.Закрыть().
Не зря в современных конфигурациях разработчики вендора столько ролей придумали. Правда используют их не так эффективно, эРэЛэС-шмэрэлэс - непонятно, долго, да и тормозит систему, сами же говорили - противоречивые ребята
Еще есть какие-то ПВХ доп.права, но там надо копаться, опять в чужие стандартные методы лезть. То ли дело элегантный и лаконичный РольДоступна(), работающий в любой конфигурации. Делаешь больше ролей в УПП - приближаешь её к ERP
krollzlat; bulpi; Tangram; user828972; +4 2 Ответить
Оставьте свое сообщение