КопиПастаМер

0. 7195 29.07.14 20:45 Сейчас в теме
Предлагается отчет, который за приемлемое время находит и показывает ВСЕ повторяющиеся фрагменты в текстах программных модулей анализируемой конфигурации. Приводятся подробности реализации отчета, основанного на алгоритме Манбера и Майерса построения суффиксного массива и на алгоритме Касаи построения LCP-массива. В данной реализации поиск повторов ведется до уровня строк. Отчет можно применять для определения повторяющихся последовательностей строк и в любых других текстах.

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. KapasMordorov 428 30.07.14 12:55 Сейчас в теме
+ за алгоритм.
Про вывод 6.
Ну в чём загадка например в БП?
Смотрим отчет "РегламентированныйОтчетБухОтчетность", в нем три формы ФормаОтчета2011Кв1, ФормаОтчета2011Кв3, ФормаОтчета2011Кв4.
Не надо быть ясновидцем, чтобы понять, что код в них будет практически одинаковый.
И так в куче отчетов.
2. kapustinag 30.07.14 13:16 Сейчас в теме
(0), (1) - ну вот именно, о том и речь. Почему разработчик регл.отчета "РегламентированныйОтчетБухОтчетность" не вынес одинаковый код в экспортную функцию модуля отчета, а предпочел оставить его в трех экземплярах в этих формах. Я считаю, что это следствие, во-первых, недостаточного контроля качества кода в фирме-разработчике, и, во-вторых, отсутствия времени/заинтересованности/квалификации (нужное подчеркнуть) у самого разработчика.

Кроме того - пусть владеющие indoor-информацией из фирмы 1С меня поправят - система оплаты труда мотивирует разработчика на быстрейшее изготовление формы ФормаОтчета2011Кв4, а совсем не на наведение порядка во всех трех формах.
Тем более что, по известному закону, предпочитают не трогать сделанные ранее формы. Работает - не трогай! И в этом есть практический смысл. Мегабайты-то очень дешевы.

Теперь о самой статье. Опять очень круто, как и все публикации автора. Снимаю шляпу. Конфигурацию УПП анализировать пытались?
for_sale; Rustig; +2 Ответить
3. bonv 30.07.14 14:02 Сейчас в теме
(2) kapustinag,
Почему разработчик регл.отчета "РегламентированныйОтчетБухОтчетность" не вынес одинаковый код в экспортную функцию модуля отчета, а предпочел оставить его в трех экземплярах в этих формах.

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

во-первых, недостаточного контроля качества кода в фирме-разработчике

Скорей в конкретной команде разработчиков.

система оплаты труда мотивирует разработчика на быстрейшее изготовление формы ФормаОтчета2011Кв4

Вряд ли, разработчики типовых сидят на окладе.

Мегабайты-то очень дешевы.

Ну не так-то в итоге и дешевы получаются.
1. Увеличивается время на сравнение/объединение.
2. Огромные модули не способствуют быстродействию работы например в веб-клиенте.
3. И самый смак, это когда надо что-то поправить во всех этих местах. Вот тут-то и выходит изначальная мнимая скорость разработки к компенсации и даже наоборот увеличению времени.
theshadowco; Rustig; +2 Ответить
50. Rustig 1664 18.08.14 14:27 Сейчас в теме
(3)
Потому что лень.
Скопировал и подправил - гораздо же быстрее, чем анализировать и выносить общий код.

вообще-то вся Россия платит за программы 1С, а программа такого качества вызывает много вопросов...
52. qwinter 628 25.08.14 21:26 Сейчас в теме
(3) doxflow,
Потому что лень.
Скопировал и подправил - гораздо же быстрее, чем анализировать и выносить общий код.
А через месяц, еще раз этот кусок разбивать и выносить еще в отдельные процедуры с условиями, через месяц еще раз и т.д. Через год вы получите общий модуль в котором уже никто не разберется.

Рефакторинг должен быть ради улучшения читаемости и прозрачности кода, а не ради рефакторинга!!
Krio2; andr_andrey; +2 Ответить
53. bonv 29.09.14 12:27 Сейчас в теме
(52) qwinter,
А через месяц, еще раз этот кусок разбивать и выносить еще в отдельные процедуры с условиями, через месяц еще раз и т.д. Через год вы получите общий модуль в котором уже никто не разберется.

Какое-то у вас странное понимание рефакторинга. То что вы описываете больше похоже на подпорку костылями.
И вообще в хорошем продукте, который постоянно развивается, рефакторинг это непрерывный процесс.
Gesperid; dddxddd; Evil Beaver; +3 Ответить
72. sutkin 04.07.18 09:06 Сейчас в теме
(53)
да все правильно. сделали форму, через год - вторую. проанализировали. сделали общую процедуру с десятком параметров... прошел год - надо новую форму, а процедура должна работать почти так же, но немного иначе - добавили еще пару параметров. через год - еще троечку...

не надо рефакторинга рада рефакторинга. в конкретном обсуждаемом случае старые формы рег.отчета со временем меняться не будут, их функционал не надо развивать. нет смысла тратить время на анализ кода ради выноса в общие процедуры, которые все равно больше ниоткуда не используются.
Winstoncuk; Vasas2007; +2 Ответить
74. for_sale 832 17.12.18 10:51 Сейчас в теме
(72)
Это не рефакторинг ради рефакторинга. Это избитая уже десятками лет и миллионами написанных программ практика - механизм должен быть чёрным ящиком с подачей на вход и получением на выходе. И три почти одинаковые формы отчётов как раз и говорят о том, что сколько граблей 1С-никам не поставь - они всегда попросят ещё. В какой-то момент нормальному программисту пришло бы в голову, что завтра выйдет ещё одна форма, а потом ещё и ещё и ещё и все они будут использовать 95% от старых и что эти 95% можно вынести куда-то, а потом потратить в 20 раз меньше времени на разработку новых форм. Но это же 1С, молодая отрасль, тут ещё не принято думать, тут пока ещё принято "сделать, чтобы работало и сдать".
4. amon_ra 22 30.07.14 14:40 Сейчас в теме
(2) kapustinag, (3) doxflow, А может у разработчиков в 1С оклад как у индусов от кол-ва строк написанного кода)
for_sale; +1 Ответить
5. KSy 30.07.14 15:04 Сейчас в теме
(4) amon_ra, Похоже, там давно одни индусы сидят))) А разработчики в бизнес ушли,...
6. kapustinag 30.07.14 16:35 Сейчас в теме
(4) amon_ra, Такая мысль у меня тоже давно появлялась. А также такой показатель "Количество выпущенных обновлений конфигурации в месяц".

(3) doxflow, "Ну не так-то в итоге и дешевы получаются, и далее по тексту" - так это все уже вне фирмы-разработчика. Не ее головная боль.
Только последнее - насчет если нужно подправить - бьет непосредственно по фирме-разработчику. Так это головная боль фирмы, потому что сам разработчик, может быть, уже уволился давно. То есть текучка кадров - один из факторов, увеличивающих объем копипаста.
14. bonv 30.07.14 19:20 Сейчас в теме
(6) kapustinag,

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

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

Только последнее - насчет если нужно подправить - бьет непосредственно по фирме-разработчику.

Ну почему же, сравнение/объединение есть и в 1С. Они же собирают конечные конфигурации из библиотек.

То есть текучка кадров - один из факторов, увеличивающих объем копипаста.

Не согласен. Копипаста - это состояние души конкретного разработчика.
pallid; ZOMI; +2 Ответить
11. ildarovich 7195 30.07.14 18:03 Сейчас в теме
(2) kapustinag, вот скриншот для УПП:
Прикрепленные файлы:
29. Sergey.Noskov 11.08.14 12:51 Сейчас в теме
(2) kapustinag,
Тема дискутабельная, но копи-паст это вовсе не означает что то однозначно плохое, это решение имеет место быть для случаев:
1. снизить себестоимость разработки (например делаем свою независимую подсистему на базе готового решения, находящегося на поддержке)
2. оставить стабильно работающую версию решения
Какой смысл делать рефакторинг регламентного отчета не актуального более года? Он уже имеет законченный вид и не будет дорабатываться, а рефакторинг ради рефакторинга это всегда риск привнесения ошибок.
hiduk; Krio2; sergathome; eeeio; Rustig; Sol; +6 Ответить
75. for_sale 832 17.12.18 10:58 Сейчас в теме
(29)
Эта тема дискутабельная разве что в 1С. В других, устоявшихся областях разработки это уже давно хороший тон программирования, по которому написаны тысячи книг. Но в 1С всё ещё умудряются на неё дискутировать)

1. Снизить стоимость разработки, конечно можно. Благодаря таким снижениям стоимости разработки у нормальных программистов всегда будет работа:) Потому что после таких снижателей заказчик в панике прибегает к условному мне и в слезах кричит - нам сделали внедрение, нам надо отчётик подправить, местами колонки поменять, а оказалось, что это будет стоить как три внедрения, потому что для этого нужно будет переписать не только внедрённый кусок, но и вообще всё, что у нас было ещё до внедрения! И условный я тратит кучу времени, чтобы сделать по-человечески, чтобы и эта, и последующие доработки требовали минимум ресурсов.

2. Не думаю, что кто-то вообще имел в виду, что надо рефакторить что-то неактуальное. Но если на базе неактуального постоянно появляются другие объекты, то надо как минимум задуматься над тем. чтобы неактуальное скопировать куда-то, потом разобрать его на чёрные ящики и в дальнейшем использовать их в работе, а не постоянно копировать неактуальное в актуальное и начинать дорабатывать напильником.
76. Sergey.Noskov 1179 20.12.18 17:17 Сейчас в теме
(75) ну моё мнение и через 4 с лишним года не изменилось)) я не сказал что это хорошо.
Перегибать не стоит "нам надо отчётик подправить, местами колонки поменять, а оказалось, что это будет стоить как три внедрения" явно сказочный пример.
В любых правилах есть исключения. Иначе будет как укладкой асфальта - мне сказали асфальтировать - я асфальтирую, наличие дождя и снега - не мои проблемы.
7. brr 179 30.07.14 17:24 Сейчас в теме
Зачем отчет учитывает пустые строки?
8. ildarovich 7195 30.07.14 17:30 Сейчас в теме
(7) brr, для того, чтобы правильно нумеровать строки и для того, чтобы различать фрагменты, если в них различное количество пустых строк. Впрочем, это можно легко изменить.
9. brr 179 30.07.14 17:36 Сейчас в теме
Было бы неплохо выводить все имена модулей в которых встречается выбранный фрагмент.
13. ildarovich 7195 30.07.14 18:07 Сейчас в теме
(9) brr, думал над этим, но тогда таблица "Повторы" окажется слишком громоздкой - много раз придется повторять длинное имя одного и того же модуля. Вы можете упорядочить строки повторов по колонке "место" и сможете просматривать повторы не перепрыгивая по модулям.
19. brr 179 01.08.14 15:28 Сейчас в теме
(13) место, я так понимаю, номер строки?
21. ildarovich 7195 05.08.14 15:06 Сейчас в теме
10. brr 179 30.07.14 17:44 Сейчас в теме
Если я правильно интерпретирую заголовок колонки "Копия" как количество копий, то проверка поиском не прошла.
12. ildarovich 7195 30.07.14 18:05 Сейчас в теме
(10) brr, нет, "копия" - здесь имелось ввиду место начала копии выделенного фрагмента
15. ildarovich 7195 31.07.14 14:11 Сейчас в теме
А вот пример из ЗУП 2.5.82.2. Модуль объекта документа "ОтражениеЗарплатыВРеглУчете". Внутри одного и того же модуля(!) скопировано 1098 строк - все содержимое функции ПолучитьДанныеУчетаСтраховыхВзносов2011 без каких либо изменений перенесено в функцию ПолучитьДанныеУчетаСтраховыхВзносов2014.
16. JohnyDeath 299 01.08.14 00:58 Сейчас в теме
(15)
Странно, почему пропустили 2012-й и 2013-й года. Разработчик в декрете была? )
17. zqzq 21 01.08.14 10:55 Сейчас в теме
(15)
как вариант - ПолучитьДанныеУчетаСтраховыхВзносов2011 не предпологается к развитию (и наоборот зафиксирован, чтобы работал как раньше на старых периодах), а 2014 будет развиваться, и решили скопировать, чтобы не городить внутри процедуры проверки на даты (и не испортить старый период при забытии этой проверки). Я не защищаю копипаст, но не всё так просто, особенно в регл. учете.
stroganov_ru; Sol; Sergey.Noskov; KapasMordorov; +4 Ответить
48. Rustig 1664 18.08.14 14:08 Сейчас в теме
(17) странно получается: для своих целей облегчения программирования и ведения дальнейших разработок, вы готовы оправдать (оправдаться) словами
не всё так просто, особенно в регл. учете

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

лично я считаю, что ответ на последний вопрос зависит от разработчика, то есть нет здесь никакой фундаментальности
49. Rustig 1664 18.08.14 14:09 Сейчас в теме
(17) да уж, согласен, не все так просто, особенно в регл.учете: http://infostart.ru/public/195627/
18. AlX0id 01.08.14 15:10 Сейчас в теме
А при копипастомеринге учитывается то, что алгоритм один, а имена переменных разные? ) Это было бы круто )
monkbest; +1 Ответить
42. AlexanderKai 13.08.14 15:58 Сейчас в теме
(18) AlX0id,
Я думаю, такое возможно. Будет время - попробую сделать.
44. ildarovich 7195 13.08.14 19:50 Сейчас в теме
(42) AlexanderKai, (18) AlX0id, в описании я уже говорил, что для такого нужно использовать тот или иной способ "канонизации" текста программы. Можно, например, перед обработкой текста вообще убрать из него все, кроме ключевых слов.
20. logarifm 1087 05.08.14 14:35 Сейчас в теме
За такой код убить можно...
22. ildarovich 7195 05.08.14 15:23 Сейчас в теме
(20) logarifm, а вот так понятнее?
int pn[maxlen], cn[maxlen];
for (int h=0; (1<<h)<n; ++h) {
	for (int i=0; i<n; ++i) {
		pn[i] = p[i] - (1<<h);
		if (pn[i] < 0)  pn[i] += n;
	}
	memset (cnt, 0, classes * sizeof(int));
	for (int i=0; i<n; ++i)
		++cnt[c[pn[i]]];
	for (int i=1; i<classes; ++i)
		cnt[i] += cnt[i-1];
	for (int i=n-1; i>=0; --i)
		p[--cnt[c[pn[i]]]] = pn[i];
	cn[p[0]] = 0;
	classes = 1;
	for (int i=1; i<n; ++i) {
		int mid1 = (p[i] + (1<<h)) % n,  mid2 = (p[i-1] + (1<<h)) % n;
		if (c[p[i]] != c[p[i-1]] || c[mid1] != c[mid2])
			++classes;
		cn[p[i]] = classes-1;
	}
	memcpy (c, cn, n * sizeof(int));
Показать


Также рекомендую почитать вот эту статью https://ru.wikipedia.org/wiki/%D0%90%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D0%B2%D0­%BD%D0%BE%D1%81%D1%82%D1%8C
Там говорится, что
Причинами агрессивности могут выступать разного рода конфликты, в том числе внутренние, при этом такие психологические процессы как эмпатия, идентификация, децентрация — сдерживают агрессию, так как являются ключом к пониманию других и осознанию их самостоятельной ценности
pavlov_dv; pallid; brr; ojiojiowka; Rustig; +5 Ответить
23. premierex 06.08.14 08:52 Сейчас в теме
(22) я вот тоже считаю, что выкладывать такой код - неуважение к коллегам. Если уж возникло решение транслировать код функции с С++ на встроенный язык 1С, вполне можно сделать это таким образом, чтобы код был хотя бы читабельным. У языка С++ есть своя специфика, которую не имеет смысла переносить в код на 1С. К тому же на дисках ИТС есть руководство по оформлению кода конфигураций 1С, советую ознакомиться.
А в общем и целом - публикация довольно познавательная. Однозначно - "плюс". Я сам не часто использую технологию copy-past, но в некоторых случаях, просто приходится это делать. В целях, например, сокращения сроков разработки (особенно, если эти сроки поджимают). В любом случае, полезно время от времени производить рефакторинг своих разработок и механизм, предложенный автором, вполне подходит для выявления проблемных фрагментов кода.
24. ildarovich 7195 06.08.14 10:58 Сейчас в теме
(23) premier, в данном конкретном случае у меня не было цели сделать код предельно понятным. Акцент был сделан на быстродействии (кстати, уже есть более быстрая версия). Код приведен для того, чтобы был виден его весьма небольшой объем и используемые структуры данных. Также хочу сказать, что код написан с нуля "по мотивам другого алгоритма" на структурах данных 1С и никак не может является трансляцией кода приведенной функции С++ на 1С. А функция (очень просто читаемая, кстати) приведена для того, чтобы было понятно, в каком коде приходится разбираться, программируя не только на 1С и без всяких мыслей, что его авторы тебя не уважают.
27. brr 179 08.08.14 12:50 Сейчас в теме
(24) с нетерпением жду более быструю версию :)
28. awk 725 08.08.14 22:38 Сейчас в теме
(22) В аглицком - понятно. Ибо аглицкие сокращения известны. А русские - нет.
30. ildarovich 7195 11.08.14 13:39 Сейчас в теме
(28) awk, я уже согласился с тем, что в данном случае не потратил достаточного количества усилий на то, чтобы сделать код понятнее. Я этой цели пока не ставил - тем более, что еще продолжаю переписывать этот кусок, выжимая проценты.
Но вот насчет сокращений - я их не использовал. Индексы я предпочитаю обозначать буквами: ё, ж, у и так далее. И использую, в основном, короткие, но целые русские слова: "Змея", "След" (змеи) - для обозначения пути обхода массива массивов, хранящего порядок обхода массива "Ранг". "Тень" - это копия массива "Ранг". Рост - размер фрагмента. "Плюс" - величина приращения длины фрагмента, "Старший" - наибольший ранг и так далее. В русском языке много коротких и выразительных слов и я это стараюсь использовать. Иногда получается даже забавно. Вот, например, кусок кода из статьи "Наш ответ американским лекторам"
Трус = Новый Соответствие;

Трус["Крик"] = "Ой, мама!";

Балбес = Трус;

Балбес["Крик"] = "Ура!";

Сообщить(Трус["Крик"])
31. awk 725 11.08.14 14:13 Сейчас в теме
(30) Не важно, потратил или нет. Просто код напоминает творение первокурсника (чем запутаннее - тем круче).

1. Буква Ё не рекомендуется к использованию в 1С
2. Для итераторов и счетчиков приняты (в 1С) обозначения: "ит", "Сч".

Террариум - это прелестно, но за такое парой штрафуют.
32. ildarovich 7195 11.08.14 14:39 Сейчас в теме
(31) awk, про рекомендацию не использовать ё ни разу не слышал. С чего бы это? ё - очень нарядная буква, напоминает по звучанию английские итераторы.
ит - дурацкое и уродливое сокращение от английского слова.
Сч - мне не нравится своей обрезанностью.
"Принято в 1С" - где принято? Не видел такого документа (про Сч и ит). Если так пишут многие, то это не значит, что так лучше. Многие и книжек по "computer science" не читали: так и мы не будем читать?
"Чем запутаннее, тем круче" - я к этому не стремлюсь, честно. Думаю, так может показаться по трем причинам:
1) Алгоритмы, которыми я занимаюсь, не просты. Может быть, их вообще невозможно записать так, чтобы было всем понятно.
2) Я злоупотребляю краткостью. Из двух вариантов записи я часто выбираю более короткий.
3) Я стараюсь писать "красивый" для себя код, а понятие о красоте кода у меня свое, сформировавшееся при программировании не только на 1С.
Ну а штрафов я не боюсь.
Perfolenta; stroganov_ru; Yashazz; +3 Ответить
33. awk 725 11.08.14 15:12 Сейчас в теме
(32)
1. От русского "итератор". Правда имеющего англоязычные корни.
2. Читайте ИТС - там есть рекомендации по оформлению кода.
3. Не надо писать что бы было понятно всем. Надо писать что бы было понятно себе через три года.
4. Краткость - хорошо. Помнится написал процедуру _(__,___) - которая выполняла произвольный код в контексте формы, для целей тестирования.
5. Самый красивый код - это функция копирования строк С. strcpy(char* src,char* dst) { while (*src=*dst); )
34. ildarovich 7195 11.08.14 16:37 Сейчас в теме
(33) awk, да читал я ИТС - там только про комментарии, отступы, на одной строке, а про имена переменных ничего нет.
39. sergei2k 13.08.14 11:14 Сейчас в теме
(34)
Правила образования имен переменных
http://its.1c.ru/db/v8std#content:-2145783193:1
40. ildarovich 7195 13.08.14 11:59 Сейчас в теме
(39) sergei2k, спасибо за ссылку. Не находил ее поиском. Буду иметь ввиду.
43. AlexanderKai 13.08.14 16:10 Сейчас в теме
(33) awk,
Самый красивый код - это функция копирования строк С. strcpy(char* src,char* dst) { while (*src=*dst); )

Это такой тонкий сарказм, да? :)
35. Makushimo 157 12.08.14 05:04 Сейчас в теме
(32)
В этом есть какой-то смысл. В попытках понять реализацию метода (и сам метод) проходишь тот (или свой) путь автора в размышлениях. Когда понял - твое.

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

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

Если ildarovich не против, раскурю как нибудь эту и другие его статьи и переведу на понятный чайникам (как я) язык.

38. bonv 13.08.14 10:34 Сейчас в теме
(31)awk,
2. Для итераторов и счетчиков приняты (в 1С) обозначения: "ит", "Сч".

Это принято у Вас в компании видимо
73. sutkin 04.07.18 09:10 Сейчас в теме
(31)
предлагаю вместо "ё" использовать "ѣ"
25. Makushimo 157 08.08.14 03:36 Сейчас в теме
Можно ли с помощью этого решить такую задачу:
Есть произвольный текст: например, рассказ или статья на одну страницу. Нужно получить из этого текста основные ключевые фразы или слова, которые проявляют смысловой скелет написанного текста?
26. ildarovich 7195 08.08.14 10:14 Сейчас в теме
(25) Makushimo, думаю, что такую задачу с помощью данного метода решить нельзя.
51. Rustig 1664 18.08.14 14:47 Сейчас в теме
(25) я тоже думал о такой задаче: чтобы из статьи вытащить наибольшее кол-во повторяющихся фраз, на основе этой информации скорректировать статью таким образом, чтобы как можно больше попадалось именно "ключевых слов". Затем готовую статью можно выкладывать в интернет и ждать яндекс-индексацию
36. vis_tmp 30 13.08.14 05:09 Сейчас в теме
Столкнулся с ошибкой при использовании обработки - см. картинку.

Причина в том, что имя файла оказалось усечённым.
Файл назывался
"Обработка.ПомощникНастройкиОбменаДаннымиСБухгалтерияПредприятияКОРП.Макет.ПравилаОбмена_БПКОРП_УТ.Макет.txt"
А в переменной Модуль1.Файл было записано
"Обработка.ПомощникНастройкиОбменаДаннымиСБухгалтерияПредприятияКОРП.Макет.ПравилаОбмена_БПКОРП_УТ.Ма".

Подумал, что простое небольшое увеличение размерности реквизита ИмяМодуля в таб. часть Модули до 110 должно решить проблему, но получил другую ошибку...
Прикрепленные файлы:
37. ildarovich 7195 13.08.14 10:29 Сейчас в теме
(36) vis_tmp, я заменил файл отчета. В новой версии длина имени модуля увеличена до 256 знаков. Та ошибка, которая появилась у вас после правки, у меня не воспроизводится. Собственно код, на котором происходит ошибка выполняет безцикловое копирование массива. И, вроде бы, в этот момент неправильно выделяется память (судя по скриншоту). Это проблема платформы, а не отчета.

(27) brr, кроме того, увеличена скорость работы (примерно на 30-40%) за счет оптимизации операций в основных циклах.

Также добавлен вывод некоторой статистики: общее количество строк, число различных строк, средняя длина повтора. Статистика отображается в заголовке формы после выполнения анализа.
45. ildarovich 7195 14.08.14 14:31 Сейчас в теме
(36) vis_tmp, отмеченная Вами ошибка несколько раз воспроизводилась у моих коллег, поэтому я переписал присваивание - сделал циклом. Чуть медленнее, зато надежнее. Выложил исправленный вариант.
Кроме того, обратил внимание, что при анализе текстов в УПП, где 5 миллионов строк, обработке иногда не хватает памяти (хотя внутри обработки память регулярно освобождается). Возможно, нужно вообще избавиться от использования многократного выделения памяти под порядок обхода. Для этого нужно изменить алгоритм. Это в будущем. Сейчас помогает сворачивание - разворачивание окна обработки в процессе ее работы.
46. vis_tmp 30 15.08.14 07:47 Сейчас в теме
(45) Спасибо, теперь заработало!
41. ildarovich 7195 13.08.14 14:50 Сейчас в теме
Эх! - 13-е число. Перезалил новую версию отчета не на старое, а на новое место. В результате потерялось общее количество скачиваний. Их было 46.
47. CheBurator 3439 16.08.14 14:27 Сейчас в теме
если бы еще показывад "совпадающие" куски до уровня похожести - то есть где-то есть очень похожие блоки текста, различающиеся незначительно...
54. ildarovich 7195 07.11.14 21:48 Сейчас в теме
За это время появилось два соображения в пользу копипаста:
1) Снижение зависимостей. Таким образом, например, в модуль внешней печатной формы переносятся функции из одной конфигурации, чтобы она могла работать в других конфигурациях. С другой стороны, это означает, что все функции для построения универсальных печатных форм, предназначенных для разных конфигураций, должны быть в БСП.
2) Подстановка. Это когда код из тела функции подставляется в тело ее вызова. Она обычно применяется для ускорения выполнения программ. Но в 1С ее применяют для улучшения понимания программы - когда для понимания поведения программы не нужно углубляться в работу модулей - так как весь код оказывается на одном длинном листе. С другой стороны, невозможность прочесть и понять программу на верхнем уровне свидетельствует о неправильном разделении функционала между вызывающей и вызываемыми программами. Также, наверное, можно создать редактор кода, умеющий на этапе прочтения кода выполнять подстановку. Также интересен набор кода по шаблонам. Почему эта техника не бесспорна? - Да потому, что коллекция проверенных и отточенных шаблонов просто обязана быть превращена в функции и добавлена в БСП.
60. cool.vlad4 45 07.07.15 14:10 Сейчас в теме
(54) первый пункт - он не совсем 'за' . основная задача программиста упраление сложностью системы при решении ряда задач. при копипасте у тебя действительно может быть псевдоснижение зависимостей от конкретной части системы , но только сложность системы увеличивается. при обновлении тебе придется обновлять все места копипасты. при ошибке, тебе придется исправлять все места ошибки. сложность увеличилась.
55. ildarovich 7195 13.06.15 11:22 Сейчас в теме
Нашел еще одну статью http://habrahabr.ru/post/260149/ , где оправдывается копипаст в коде Eclipse Platform (она называется суперкачественно задизайненной платформой)
Ну так вот, гляжу я внутрь eclipse и не понимаю, что за ерунда. С одной стороны все выглядет красиво, качественно, я бы сказал восхитительно, с другой стороны — вот тут же можно было переиспользовать, и тут, и тут, вот тут вообще чуваки сознательно копи-пастят. Что-то думаю не то, они точно могли переиспользовать код, но не делают этого. Для ответа на вопрос мне надо было выйти за рамки своих детских программистских потребностей и посмотреть на мир глазами взрослых мужчин.

Любой факт (пере)использования чего либо, явно или неявно рожает зависимость на эту штуку. И там где для меня благо (эффективное переиспользование) и, как следствие, увеличение продуктивности, то для людей создающих платформу, на которой предполагается одновременный запуск сотен плагинов, различных версий и от десятка не знающих друг о друге вендоров любая лишняя зависимость — зло.
61. cool.vlad4 45 07.07.15 14:21 Сейчас в теме
(55) вот как раз в приведенной тобой цитате опровержение первого пункта из (54) . (помню еще слушал какой-то выпуск Радио-Т , там была такая точка зрения, что реюза кода не существует, это миф. в каждой задачи свои НУ, свои требования и т.п., с другой стороны при копипасте, потом все равно код модифицируется. от себя добавлю . что вопрос я бы ставил по другому. - вопрос не в копипасте или нет, вопрос в наличии дизайна и архитектуре и их качестве)
56. kolya_tlt 24 06.07.15 08:41 Сейчас в теме
Добрый день. Подскажите, а как читать результаты работы обработки?
57. ildarovich 7195 06.07.15 12:53 Сейчас в теме
(56) kolya_tlt,
На форме обработки есть поля:
1) Путь выгрузки. Это папка, куда помещены файлы, повторы в текстах которых нужно найти;
2) Порог. Это минимальное значение длины повторяющихся фрагментов (в строках), которые замечаются обработкой. Когда 0 - все повторы показываются;
3) По алфавиту - несколько замедляет поиск. Параметр нужен был для тестирования, чтобы суффиксный массив строился также, как и другими алгоритмами, чтобы можно было сравнить результаты.
4) Табличная часть с колонками:
4.1) Рост - это длина найденного фрагмента;
4.2) Место - это сдвиг (в строках) от начала всех файлов. Нумерация строк сквозная;
4.3) Копия - сдвиг копии фрагмента (в строках) от общего начала всех файлов.
При выборе строки в табличной части производится переход от сквозной нумерации строк к нумерации внутри отдельных файлов. При этом отображается:
5) Имя файла, содержащего образец (его рост показан в выделенной строке);
6) Сдвиг образца относительно начала указанного файла;
5) Имя файла, содержащего копию (её рост соответствует росту оригинала);
6) Сдвиг копии относительно начала файла, содержащего копию. Файл, содержащий оригинал и копию может быть одним и тем же.
58. kolya_tlt 24 07.07.15 09:31 Сейчас в теме
спасибо, а что делать с информацией в колонках
4.2) Место - это сдвиг (в строках) от начала всех файлов. Нумерация строк сквозная;
4.3) Копия - сдвиг копии фрагмента (в строках) от общего начала всех файлов.
?
ведь требуется увидеть как часто и где встречается тот или иной фрагмент кода, а с местом и копией что делать?
59. ildarovich 7195 07.07.15 13:51 Сейчас в теме
(58) kolya_tlt, вопрос
как часто и где встречается тот или иной фрагмент кода
не требует таких сложных алгоритмов. Тут работает встроенный метод платформы "Найти" и "СтрЧислоВхождений". Скорее всего, при реализации "Найти" используется алгоритм Боурера-Мура, который предельно быстр.

Здесь решалась проблема найти следы копипаста, то есть обнаружить те фрагменты, которые, вероятнее всего, были целиком скопированы из другого места программы. Буквально это и показано: указано место первого (исходного) фрагмента и указано место, где есть его копия. При этом "первичность" фрагмента (у кого кто списал) точно не определяется. Также если фрагмент 1 был скопирован десять раз и были получены фрагменты 2, 3, 4, ... ,11 нет гарантии того, что будут показаны пары 1-2, 1-3, 1-11. Вполне может быть результат 1-2, 2-3, 4-2... . Это зависит от строк "окружения" фрагментов и порядка их записи в цепочке файлов текстов модулей.

Это не означает, что на основе полученных данных нельзя ответить на другие вопросы анализа текстов программных модулей. Но для этого их нужно четко и однозначно сформулировать.
kolya_tlt; +1 Ответить
62. ildarovich 7195 21.08.15 11:31 Сейчас в теме
63. olbu 03.09.15 17:25 Сейчас в теме
может я не правильно им пользуюсь:
1) сохраняю модуль в файл
2)сохраняю другой модуль в файл
3)сохраняю эти файлы в одну папку
4)выбираю в обработке эту папку
Сформировать.
вываливается ошибка:
{ВнешнийОтчет.КопиПастоМер.МодульОбъекта(81)}: Индекс находится за границами массива
Ящик = Змея[Ранг[ё]];
64. ildarovich 7195 03.09.15 20:39 Сейчас в теме
(63) olbu,
Перед использованием отчета тексты программных модулей анализируемой конфигурации необходимо выгрузить в некоторую папку. Это можно сделать через конфигуратор с использованием пункта меню "Конфигурация\Выгрузить файлы конфигурации".

В папке для анализа должны быть ТЕКСТОВЫЕ ФАЙЛЫ, содержащие ТЕКСТЫ программных модулей конфигурации.
Если в папке, которую вы задавали в параметрах обработки, действительно тексты, то такой ошибки быть не должно.
65. olbu 04.09.15 08:50 Сейчас в теме
(64) да так и сделал: выделил процедуру скопировал текст ее в буфер, создал текстовой файл в блокноте, вставил текст процедуры - получил текстовой файл... положил его в папку...
может я что - то упустил?
66. ildarovich 7195 04.09.15 13:52 Сейчас в теме
(65) olbu, если не трудно, сделайте архив с упомянутой папкой с файлами и пришлите мне на почту. Адрес сообщу в личном сообщении.
67. lustin 13.02.16 23:46 Сейчас в теме
(66) ошибки добиться достаточно легко.

1. создаем чистую конфигурацию с одним объектом Документ1
1.2 в документе создаем модуль

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)	
	Сообщить("Тесть");
КонецПроцедуры

Процедура ОбработкаПроверкиЗаполнения2(Отказ, ПроверяемыеРеквизиты)
	Сообщить("Тесть");	
КонецПроцедуры

Процедура ОбработкаПроверкиЗаполнения4(Отказ, ПроверяемыеРеквизиты)
	Сообщить("Тесть");
КонецПроцедуры
Показать


2. делаем магию - нажимаем F9 на Документе1 так чтобы получилось 13 документов (не знаю почему я нажал 12 раз)

3. выгружаем конфигурацию в файлы во временный каталог

4. если используем иерархический режим 8.3.7 - то

* необходимо исправить в копипастамере строку c поиском файлов

Файлы = НайтиФайлы(ПутьВыгрузки, "*.bsl", Истина);


и для удобства меняем Состояние на Сообщить

Сообщить("Построение суффиксного массива: " + Охват + " / " + К);


имеем следующий вывод


Построение суффиксного массива: 1 / 338
Построение суффиксного массива: 2 / 338
Построение суффиксного массива: 4 / 338
Построение суффиксного массива: 8 / 338
Построение суффиксного массива: 16 / 338
Построение суффиксного массива: 32 / 338
Построение суффиксного массива: 64 / 338
Построение суффиксного массива: 128 / 338
Построение суффиксного массива: 256 / 338
Построение суффиксного массива: 512 / 338


и Exception


Индекс находится за границами массива


Собственно проблема в коде в районе

ё = Цел(Шаг[ж] - Охват + К) % К; 				


Эта волшебная Ё как мы видим выше становится отрицательной
68. ildarovich 7195 14.02.16 18:54 Сейчас в теме
(67) lustin, буду разбираться, сейчас у меня в коде вот такой комментарий
// вообще говоря, против зацикливания строки нужно бы добавить сентител - последний одиночный символ, 
	// равный Нумератор.Количество(), но в данной реализации пока есть еще "ПоАлфавиту", поэтому оставляем так - "на авось"
	// зациклится тогда, когда будут только одинаковые файлы из всех разных строк
Буквально это означает, что "строка" вида 123123123123 зацикливает алгоритм, поскольку при циклическом сдвиге превращается в саму себя. "Строка" тут состоит из "хешей" строк анализируемых файлов.
Значит, пока одинаковые файлы из разных строк алгоритм обрабатывать не может. - Вскорости исправлю.
69. boogie 484 13.04.16 09:27 Сейчас в теме
Подскажите, исправлена ли эта ошибка:
Прикрепленные файлы:
70. ildarovich 7195 13.04.16 14:25 Сейчас в теме
(69) boogie, судя по скриншоту, вы пытаетесь запустить обработку в режиме управляемых форм, а она для обычных. Попытайтесь открыть ее в УТ10.3, ЗУП 2.5, УПП1.3, БП2 и т.п. Собственно, сама конфигурация значения не имеет, главное, что не УФ.
71. SurmachAU 19 25.01.18 17:17 Сейчас в теме
Пока в избранном, тк хорошая тема для доработанной конфиурации. Чуть позже оценю на своей базе. На самом деле полезно при финальном анализе проекта по доработкам, а так же при первом чтении доработанной базы.
Оставьте свое сообщение
Вопросы с вознаграждением