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

11.09.17

Разработка - Инструментарий разработчика

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Отчет "КопиПастаМер"
.erf 12,18Kb
182
182 Скачать (1 SM) Купить за 1 850 руб.


Считать ли злом копирование фрагментов кода (копипаст) в процессе программировании на 1С – решайте сами. Есть другой интересный вопрос – как найти и измерить копипаст в уже написанной программе. Одна из возможностей - использование предлагаемого отчета.

Перед использованием отчета тексты программных модулей анализируемой конфигурации необходимо выгрузить в некоторую папку. Это можно сделать через конфигуратор с использованием пункта меню "Конфигурация\Выгрузить файлы конфигурации". Далее можно запустить формирование отчета, указав ту папку, в которую были выгружены файлы. Через несколько минут (время зависит от общего числа строк в программных модулях) отчет покажет список повторов в виде таблицы, каждая запись которой содержит размер повторяющегося фрагмента в строках, место фрагмента и его копии в сквозной нумерации строк всех модулей. Выделив конкретный повтор в списке, можно увидеть сам фрагмент, имя содержащего его модуля и номер строки начала фрагмента в данном модуле, а также имя модуля и номер строки копии фрагмента. 

 

Применив отчет к некоторым типовым конфигурациям, можно увидеть, что например, в 1С: Бухгалтерии 2.0 общее число строк всех модулей конфигурации превышает 3,5 миллиона (на их анализ ушло порядка 20 минут). При этом имеется очень большое количество повторений фрагментов. В основном повторяются тексты модулей в регламентированной отчетности. Длина цельнотянутых кусков достигает 10 тысяч строк! А повторение тысячи строк в этой подсистеме - вообще норма. В других подсистемах также можно встретить очень большие повторяющиеся куски. Впрочем, лучше один раз увидеть, чем сто раз услышать: смотрите и удивляйтесь!

Несколько слов о реализации.

Основная идея метода - использование LCP-массива, который строится по конкатенации текстов модулей анализируемой конфигурации.

Формирование отчета состоит из этапов:

  1. Чтение текстов модулей. При этом строки модулей получают сквозную нумерацию в массиве "Ранг", запоминаются размеры модулей (чтобы потом можно было восстановить имя модуля и номер строки в нем), сама строка обрезается от пробелов слева и справа и получает ранг, равный количеству различных строк, встреченных в текстах модулей ранее. Таким образом, все разные строки обозначаются в массиве "Ранг" разными числами от нуля до старшего номера.
  2. Построение суффиксного массива. Входной строкой при этом считается последовательность элементов массива "Ранг". Здесь используется алгоритм, изобретенный в 1993 году Манбером (сейчас вице-президент Гугла) и Майерсом. Особенности данной реализации в том, что строка для удобства зациклена (адресуется по модулю длины строки), а не дополнена сентителами справа. А также в том, что раскладка по корзинам осуществляется с использованием такой структуры данных языка 1С, как массив массивов. При этом первый элемент каждого вложенного массива хранит предыдущий символ, положенный в соответствующую корзину. Смена символа отмечается добавлением к номеру нового символа одной десятой (чтобы не тратить на это дополнительную память). Далее массив "Ранг" обходится "змеей": во внешней цикле по корзинам и во внутреннем цикле - по содержимому корзин и заново нумеруется. Порядок обхода задается следом змеи, а сдвиг (охват) между обрабатываемым символом и корзиной увеличивается каждый раз вдвое, пока все символы в массиве «Ранг» не кажутся разными. Вот код процедуры построения суффиксного массива:
    Процедура ПолучитьСуффиксныйМассив_(Ранг, След, Охват = 1) Экспорт
    	
    	Старший = След.ВГраница();
    	К = Ранг.Количество();
    	
    	Пока Старший < Ранг.ВГраница() Цикл
    		
    		Змея = Новый Массив(Ранг.Количество(), 1);
    		
    		Для у = 0 По След.ВГраница() Цикл 
    			Для ж = 1 По След[у].ВГраница() Цикл 
    				
    				ё = (Цел(След[у][ж]) - Охват + К) % К; 
    				х = Ранг[(ё + Охват) % К]; 
    				Змея[Ранг[ё]].Добавить(ё + 0.1 * (Змея[Ранг[ё]][0] <> х)); 
    				Змея[Ранг[ё]][0] = х 
    				
    			КонецЦикла 
    		КонецЦикла;
    		
    		Старший = - 1;
    		
    		Для у = 0 По К - 1 Цикл 
    			Для ж = 1 По Змея[у].ВГраница() Цикл 
    				
    				ё = Змея[у][ж]; 
    				Старший = Старший + ё % 1 * 10; 
    				Ранг[ё] = Старший 
    				
    			КонецЦикла 
    		КонецЦикла;
    
    		Охват = Охват * 2;
    		
    		След = Змея
    		
    	КонецЦикла
    	
    КонецПроцедуры
  3. Построение LCP-массива. LCP-массив показывает для каждого символа строки (это каждая строка программы в нашем случае) длину наибольшего общего префикса для подстроки, начинающейся в данном месте, и подстроки, следующей за ней в суффиксном массиве. Буквально это и есть длина наибольшего повторяющегося фрагмента, начинающегося в данном месте. Небольшая деталь заключается в несимметричности связи этих одинаковых фрагментов, которая в данном случае оказывается даже выгодной. Поскольку найденная копия окажется в суффиксном массиве позже, то для нее уже не будет копией текущий фрагмент.  Поэтому каждый фрагмент будет встречаться в выдаче алгоритма только один раз. Построение LCP-массива выполняется по алгоритму Касаи. Вот код процедуры построения LCP-массива:
    Процедура ПолучитьДлиныНаибольшихОбщихПрефиксов_(Тень, Ранг, Путь, Рост, Плюс = 0) Экспорт
    	
    	Для ё = 0 По Ранг.ВГраница() Цикл 
    		Путь[Ранг[ё]] = ё 
    	КонецЦикла;
    	
    	Для ё = 0 По Ранг.ВГраница() Цикл 
    		
    		ж = ?(Ранг[ё] < Ранг.ВГраница(), Путь[Ранг[ё] + 1], Ранг.Количество()); 
    		
    		Пока Макс(ё, ж) + Плюс < Тень.Количество() И Тень[ё + Плюс] = Тень[ж + Плюс] Цикл 
    			Плюс = Плюс + 1 
    		КонецЦикла; 
    		
    		Рост[ё] = Плюс; 
    		Плюс = Макс(0, Плюс - 1)
    		
    	КонецЦикла
    	
    КонецПроцедуры
  4. Выделение повторов из LCP-массива. Если представить LCP-массив графиком, то интерес для отображения повторов будут иметь только зубцы этого графика, поскольку другие точки будут соответствовать меньшим по размеру повторам, полностью входящим в бОльший по размеру повтор слева (сверху). Наибольшие повторы отбираются простейшим алгоритмом сравнения текущего значения со значениями слева и справа. При этом в отчете можно задать порог, чтобы не выбирались повторы, число строк в которых меньше этого порога. Вот код выделения повторов:
    Функция ОтборМестПовторов_(Ранг, Путь, Рост) Экспорт
    	
    	Ответ = Повторы.ВыгрузитьКолонки();
    	
    	Для ё = 0 По Рост.ВГраница() Цикл
    		
    		у = Макс(0, ё - 1); ж = Мин(ё + 1, Рост.ВГраница());
    		
    		Если Порог < Рост[ё] И Рост[у] <= Рост[ё] И Рост[ё] >= Рост[ж] Тогда 
    			
    			э = Ответ.Добавить(); 
    			э.Место = ё; 
    			э.Рост = Рост[ё]; 
    			э.Копия = Путь[Ранг[ё] + 1] 
    			
    		КонецЕсли
    		
    	КонецЦикла;
    	
    	Возврат Ответ
    	
    КонецФункции
  5. И, наконец,повторы сортируются в порядке убывания их размеров.

Выводы

  1. Правильно выбранный алгоритм может скомпенсировать недостаточное быстродействие платформы 1С при проведении быстрых массовых вычислений без необходимости применения внешних компонент.
  2. В данной задаче не усматривается необходимости применения более сложных алгоритмов построения суффиксного массива (типа алгоритма Каркайнена – Сандерса и других), так как для разовых применений быстродействия алгоритма достаточно.
  3. Структуры данных платформы 1С позволяют получать компактный и выразительный код при реализации самых хитрых алгоритмов.
  4. Подход,положенный в основу данного отчета, может послужить основой и для более изощренных методов обработки текстов программ. С его помощью можно искать часто встречающиеся полезные шаблоны (оставив в анализируемых текстах только ключевые слова или канонизировав тексты модулей другим способом). Можно автоматически выносить повторяющиеся функции и процедуры в общие модули. Можно искать зависимости при внесении изменений в конфигурации. И так далее.
  5. Приведенные алгоритмы – это совсем небольшая (и довольно простая) часть алгоритмов над строками. Имеющих, кроме показанных в данном отчете, множество других применений. Например, на основе суффиксного массива часто строится индекс, используемый при полнотекстовом поиске. Знание этих алгоритмов позволяет эффективно решать и многие другие практические задачи.
  6. Ну и остался загадкой вопрос: есть ли какие-либо фундаментальные причины у большой избыточности текстов программ типовых конфигураций, замеченной с помощью предлагаемого отчета, или играют роль организационный и человеческий факторы?

 

Ссылки

  1. Суффиксный массив — удобная замена суффиксного дерева http://habrahabr.ru/post/115346/
  2. MANBER U., MAYERS G.. Suffix arrays: a new methodfor on-line string searches // SIAM Journal on Computing. – 1993. – №22. – P.953–948.
  3. http://en.wikipedia.org/wiki/Suffix_array
  4. Kasai, T.; Lee, G.; Arimura, H.;Arikawa, S.; Park, K. (2001). "Linear-Time Longest-Common-PrefixComputation in Suffix Arrays and Its Applications". Proceedings ofthe 12th Annual Symposium on Combinatorial Pattern Matching. LectureNotes in Computer Science 2089. pp. 181–192. doi:10.1007/3-540-48194-X_17. ISBN 978-3-540-42271-6.

 

 

 

суффиксный массив LCP-массив избыточность

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159392    872    399    

861

SALE! 15%

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7765    55    22    

66

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    23430    68    45    

117

SALE! 15%

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8500 руб.

10.11.2023    10412    36    20    

61

SALE! 15%

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

22200 19980 руб.

06.10.2023    15395    35    7    

70

SALE! 35%

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

4800 3120 руб.

14.01.2013    187971    1138    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17301    6    32    

42

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7694    8    35    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 1560 30.07.14 14:02 Сейчас в теме
(2) kapustinag,
Почему разработчик регл.отчета "РегламентированныйОтчетБухОтчетность" не вынес одинаковый код в экспортную функцию модуля отчета, а предпочел оставить его в трех экземплярах в этих формах.

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

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

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

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

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

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

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

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

Рефакторинг должен быть ради улучшения читаемости и прозрачности кода, а не ради рефакторинга!!
tulakin_s; andr_andrey; +2 Ответить
53. bonv 1560 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 976 17.12.18 10:51 Сейчас в теме
(72)
Это не рефакторинг ради рефакторинга. Это избитая уже десятками лет и миллионами написанных программ практика - механизм должен быть чёрным ящиком с подачей на вход и получением на выходе. И три почти одинаковые формы отчётов как раз и говорят о том, что сколько граблей 1С-никам не поставь - они всегда попросят ещё. В какой-то момент нормальному программисту пришло бы в голову, что завтра выйдет ещё одна форма, а потом ещё и ещё и ещё и все они будут использовать 95% от старых и что эти 95% можно вынести куда-то, а потом потратить в 20 раз меньше времени на разработку новых форм. Но это же 1С, молодая отрасль, тут ещё не принято думать, тут пока ещё принято "сделать, чтобы работало и сдать".
4. amon_ra 61 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 1560 30.07.14 19:20 Сейчас в теме
(6) kapustinag,

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

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

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

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

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

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

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

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

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

лично я считаю, что ответ на последний вопрос зависит от разработчика, то есть нет здесь никакой фундаментальности
49. RustIG 1747 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 7930 13.08.14 19:50 Сейчас в теме
(42) AlexanderKai, (18) AlX0id, в описании я уже говорил, что для такого нужно использовать тот или иной способ "канонизации" текста программы. Можно, например, перед обработкой текста вообще убрать из него все, кроме ключевых слов.
20. logarifm 1122 05.08.14 14:35 Сейчас в теме
За такой код убить можно...
22. ildarovich 7930 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 204 06.08.14 08:52 Сейчас в теме
(22) я вот тоже считаю, что выкладывать такой код - неуважение к коллегам. Если уж возникло решение транслировать код функции с С++ на встроенный язык 1С, вполне можно сделать это таким образом, чтобы код был хотя бы читабельным. У языка С++ есть своя специфика, которую не имеет смысла переносить в код на 1С. К тому же на дисках ИТС есть руководство по оформлению кода конфигураций 1С, советую ознакомиться.
А в общем и целом - публикация довольно познавательная. Однозначно - "плюс". Я сам не часто использую технологию copy-past, но в некоторых случаях, просто приходится это делать. В целях, например, сокращения сроков разработки (особенно, если эти сроки поджимают). В любом случае, полезно время от времени производить рефакторинг своих разработок и механизм, предложенный автором, вполне подходит для выявления проблемных фрагментов кода.
24. ildarovich 7930 06.08.14 10:58 Сейчас в теме
(23) premier, в данном конкретном случае у меня не было цели сделать код предельно понятным. Акцент был сделан на быстродействии (кстати, уже есть более быстрая версия). Код приведен для того, чтобы был виден его весьма небольшой объем и используемые структуры данных. Также хочу сказать, что код написан с нуля "по мотивам другого алгоритма" на структурах данных 1С и никак не может является трансляцией кода приведенной функции С++ на 1С. А функция (очень просто читаемая, кстати) приведена для того, чтобы было понятно, в каком коде приходится разбираться, программируя не только на 1С и без всяких мыслей, что его авторы тебя не уважают.
27. brr 184 08.08.14 12:50 Сейчас в теме
(24) с нетерпением жду более быструю версию :)
28. awk 744 08.08.14 22:38 Сейчас в теме
(22) В аглицком - понятно. Ибо аглицкие сокращения известны. А русские - нет.
30. ildarovich 7930 11.08.14 13:39 Сейчас в теме
(28) awk, я уже согласился с тем, что в данном случае не потратил достаточного количества усилий на то, чтобы сделать код понятнее. Я этой цели пока не ставил - тем более, что еще продолжаю переписывать этот кусок, выжимая проценты.
Но вот насчет сокращений - я их не использовал. Индексы я предпочитаю обозначать буквами: ё, ж, у и так далее. И использую, в основном, короткие, но целые русские слова: "Змея", "След" (змеи) - для обозначения пути обхода массива массивов, хранящего порядок обхода массива "Ранг". "Тень" - это копия массива "Ранг". Рост - размер фрагмента. "Плюс" - величина приращения длины фрагмента, "Старший" - наибольший ранг и так далее. В русском языке много коротких и выразительных слов и я это стараюсь использовать. Иногда получается даже забавно. Вот, например, кусок кода из статьи "Наш ответ американским лекторам"
Трус = Новый Соответствие;

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

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

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

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

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

Террариум - это прелестно, но за такое парой штрафуют.
32. ildarovich 7930 11.08.14 14:39 Сейчас в теме
(31) awk, про рекомендацию не использовать ё ни разу не слышал. С чего бы это? ё - очень нарядная буква, напоминает по звучанию английские итераторы.
ит - дурацкое и уродливое сокращение от английского слова.
Сч - мне не нравится своей обрезанностью.
"Принято в 1С" - где принято? Не видел такого документа (про Сч и ит). Если так пишут многие, то это не значит, что так лучше. Многие и книжек по "computer science" не читали: так и мы не будем читать?
"Чем запутаннее, тем круче" - я к этому не стремлюсь, честно. Думаю, так может показаться по трем причинам:
1) Алгоритмы, которыми я занимаюсь, не просты. Может быть, их вообще невозможно записать так, чтобы было всем понятно.
2) Я злоупотребляю краткостью. Из двух вариантов записи я часто выбираю более короткий.
3) Я стараюсь писать "красивый" для себя код, а понятие о красоте кода у меня свое, сформировавшееся при программировании не только на 1С.
Ну а штрафов я не боюсь.
Perfolenta; stroganov_ru; Yashazz; +3 Ответить
33. awk 744 11.08.14 15:12 Сейчас в теме
(32)
1. От русского "итератор". Правда имеющего англоязычные корни.
2. Читайте ИТС - там есть рекомендации по оформлению кода.
3. Не надо писать что бы было понятно всем. Надо писать что бы было понятно себе через три года.
4. Краткость - хорошо. Помнится написал процедуру _(__,___) - которая выполняла произвольный код в контексте формы, для целей тестирования.
5. Самый красивый код - это функция копирования строк С. strcpy(char* src,char* dst) { while (*src=*dst); )
34. ildarovich 7930 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 7930 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 160 12.08.14 05:04 Сейчас в теме
(32)
В этом есть какой-то смысл. В попытках понять реализацию метода (и сам метод) проходишь тот (или свой) путь автора в размышлениях. Когда понял - твое.

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

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

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

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

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

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

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

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

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

Любой факт (пере)использования чего либо, явно или неявно рожает зависимость на эту штуку. И там где для меня благо (эффективное переиспользование) и, как следствие, увеличение продуктивности, то для людей создающих платформу, на которой предполагается одновременный запуск сотен плагинов, различных версий и от десятка не знающих друг о друге вендоров любая лишняя зависимость — зло.
61. cool.vlad4 2 07.07.15 14:21 Сейчас в теме
(55) вот как раз в приведенной тобой цитате опровержение первого пункта из (54) . (помню еще слушал какой-то выпуск Радио-Т , там была такая точка зрения, что реюза кода не существует, это миф. в каждой задачи свои НУ, свои требования и т.п., с другой стороны при копипасте, потом все равно код модифицируется. от себя добавлю . что вопрос я бы ставил по другому. - вопрос не в копипасте или нет, вопрос в наличии дизайна и архитектуре и их качестве)
56. kolya_tlt 88 06.07.15 08:41 Сейчас в теме
Добрый день. Подскажите, а как читать результаты работы обработки?
57. ildarovich 7930 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 88 07.07.15 09:31 Сейчас в теме
спасибо, а что делать с информацией в колонках
4.2) Место - это сдвиг (в строках) от начала всех файлов. Нумерация строк сквозная;
4.3) Копия - сдвиг копии фрагмента (в строках) от общего начала всех файлов.
?
ведь требуется увидеть как часто и где встречается тот или иной фрагмент кода, а с местом и копией что делать?
59. ildarovich 7930 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 7930 21.08.15 11:31 Сейчас в теме
63. olbu 03.09.15 17:25 Сейчас в теме
может я не правильно им пользуюсь:
1) сохраняю модуль в файл
2)сохраняю другой модуль в файл
3)сохраняю эти файлы в одну папку
4)выбираю в обработке эту папку
Сформировать.
вываливается ошибка:
{ВнешнийОтчет.КопиПастоМер.МодульОбъекта(81)}: Индекс находится за границами массива
Ящик = Змея[Ранг[ё]];
64. ildarovich 7930 03.09.15 20:39 Сейчас в теме
(63) olbu,
Перед использованием отчета тексты программных модулей анализируемой конфигурации необходимо выгрузить в некоторую папку. Это можно сделать через конфигуратор с использованием пункта меню "Конфигурация\Выгрузить файлы конфигурации".

В папке для анализа должны быть ТЕКСТОВЫЕ ФАЙЛЫ, содержащие ТЕКСТЫ программных модулей конфигурации.
Если в папке, которую вы задавали в параметрах обработки, действительно тексты, то такой ошибки быть не должно.
65. olbu 04.09.15 08:50 Сейчас в теме
(64) да так и сделал: выделил процедуру скопировал текст ее в буфер, создал текстовой файл в блокноте, вставил текст процедуры - получил текстовой файл... положил его в папку...
может я что - то упустил?
66. ildarovich 7930 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 7930 14.02.16 18:54 Сейчас в теме
(67) lustin, буду разбираться, сейчас у меня в коде вот такой комментарий
// вообще говоря, против зацикливания строки нужно бы добавить сентител - последний одиночный символ, 
	// равный Нумератор.Количество(), но в данной реализации пока есть еще "ПоАлфавиту", поэтому оставляем так - "на авось"
	// зациклится тогда, когда будут только одинаковые файлы из всех разных строк
Буквально это означает, что "строка" вида 123123123123 зацикливает алгоритм, поскольку при циклическом сдвиге превращается в саму себя. "Строка" тут состоит из "хешей" строк анализируемых файлов.
Значит, пока одинаковые файлы из разных строк алгоритм обрабатывать не может. - Вскорости исправлю.
69. boogie 490 13.04.16 09:27 Сейчас в теме
Подскажите, исправлена ли эта ошибка:
Прикрепленные файлы:
70. ildarovich 7930 13.04.16 14:25 Сейчас в теме
(69) boogie, судя по скриншоту, вы пытаетесь запустить обработку в режиме управляемых форм, а она для обычных. Попытайтесь открыть ее в УТ10.3, ЗУП 2.5, УПП1.3, БП2 и т.п. Собственно, сама конфигурация значения не имеет, главное, что не УФ.
71. SurmachAU 20 25.01.18 17:17 Сейчас в теме
Пока в избранном, тк хорошая тема для доработанной конфиурации. Чуть позже оценю на своей базе. На самом деле полезно при финальном анализе проекта по доработкам, а так же при первом чтении доработанной базы.
Оставьте свое сообщение