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

Публикация № 294285

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

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

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


Считать ли злом копирование фрагментов кода (копипаст) в процессе программировании на 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.

 

 

 

Скачать файлы

Наименование Файл Версия Размер
Отчет "КопиПастаМер"

.erf 12,18Kb
177
.erf 12,18Kb 177 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 1562 18.08.14 14:27 Сейчас в теме
(3)
Потому что лень.
Скопировал и подправил - гораздо же быстрее, чем анализировать и выносить общий код.

вообще-то вся Россия платит за программы 1С, а программа такого качества вызывает много вопросов...
52. qwinter 629 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 829 17.12.18 10:51 Сейчас в теме
(72)
Это не рефакторинг ради рефакторинга. Это избитая уже десятками лет и миллионами написанных программ практика - механизм должен быть чёрным ящиком с подачей на вход и получением на выходе. И три почти одинаковые формы отчётов как раз и говорят о том, что сколько граблей 1С-никам не поставь - они всегда попросят ещё. В какой-то момент нормальному программисту пришло бы в голову, что завтра выйдет ещё одна форма, а потом ещё и ещё и ещё и все они будут использовать 95% от старых и что эти 95% можно вынести куда-то, а потом потратить в 20 раз меньше времени на разработку новых форм. Но это же 1С, молодая отрасль, тут ещё не принято думать, тут пока ещё принято "сделать, чтобы работало и сдать".
4. amon_ra 21 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 6990 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 829 17.12.18 10:58 Сейчас в теме
(29)
Эта тема дискутабельная разве что в 1С. В других, устоявшихся областях разработки это уже давно хороший тон программирования, по которому написаны тысячи книг. Но в 1С всё ещё умудряются на неё дискутировать)

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

2. Не думаю, что кто-то вообще имел в виду, что надо рефакторить что-то неактуальное. Но если на базе неактуального постоянно появляются другие объекты, то надо как минимум задуматься над тем. чтобы неактуальное скопировать куда-то, потом разобрать его на чёрные ящики и в дальнейшем использовать их в работе, а не постоянно копировать неактуальное в актуальное и начинать дорабатывать напильником.
76. Sergey.Noskov 1175 20.12.18 17:17 Сейчас в теме
(75) ну моё мнение и через 4 с лишним года не изменилось)) я не сказал что это хорошо.
Перегибать не стоит "нам надо отчётик подправить, местами колонки поменять, а оказалось, что это будет стоить как три внедрения" явно сказочный пример.
В любых правилах есть исключения. Иначе будет как укладкой асфальта - мне сказали асфальтировать - я асфальтирую, наличие дождя и снега - не мои проблемы.
7. brr 179 30.07.14 17:24 Сейчас в теме
Зачем отчет учитывает пустые строки?
8. ildarovich 6990 30.07.14 17:30 Сейчас в теме
(7) brr, для того, чтобы правильно нумеровать строки и для того, чтобы различать фрагменты, если в них различное количество пустых строк. Впрочем, это можно легко изменить.
9. brr 179 30.07.14 17:36 Сейчас в теме
Было бы неплохо выводить все имена модулей в которых встречается выбранный фрагмент.
13. ildarovich 6990 30.07.14 18:07 Сейчас в теме
(9) brr, думал над этим, но тогда таблица "Повторы" окажется слишком громоздкой - много раз придется повторять длинное имя одного и того же модуля. Вы можете упорядочить строки повторов по колонке "место" и сможете просматривать повторы не перепрыгивая по модулям.
19. brr 179 01.08.14 15:28 Сейчас в теме
(13) место, я так понимаю, номер строки?
21. ildarovich 6990 05.08.14 15:06 Сейчас в теме
10. brr 179 30.07.14 17:44 Сейчас в теме
Если я правильно интерпретирую заголовок колонки "Копия" как количество копий, то проверка поиском не прошла.
12. ildarovich 6990 30.07.14 18:05 Сейчас в теме
(10) brr, нет, "копия" - здесь имелось ввиду место начала копии выделенного фрагмента
15. ildarovich 6990 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 1562 18.08.14 14:08 Сейчас в теме
(17) странно получается: для своих целей облегчения программирования и ведения дальнейших разработок, вы готовы оправдать (оправдаться) словами
не всё так просто, особенно в регл. учете

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

лично я считаю, что ответ на последний вопрос зависит от разработчика, то есть нет здесь никакой фундаментальности
49. Rustig 1562 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 6990 13.08.14 19:50 Сейчас в теме
(42) AlexanderKai, (18) AlX0id, в описании я уже говорил, что для такого нужно использовать тот или иной способ "канонизации" текста программы. Можно, например, перед обработкой текста вообще убрать из него все, кроме ключевых слов.
20. logarifm 1086 05.08.14 14:35 Сейчас в теме
За такой код убить можно...
22. ildarovich 6990 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 6990 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 6990 11.08.14 13:39 Сейчас в теме
(28) awk, я уже согласился с тем, что в данном случае не потратил достаточного количества усилий на то, чтобы сделать код понятнее. Я этой цели пока не ставил - тем более, что еще продолжаю переписывать этот кусок, выжимая проценты.
Но вот насчет сокращений - я их не использовал. Индексы я предпочитаю обозначать буквами: ё, ж, у и так далее. И использую, в основном, короткие, но целые русские слова: "Змея", "След" (змеи) - для обозначения пути обхода массива массивов, хранящего порядок обхода массива "Ранг". "Тень" - это копия массива "Ранг". Рост - размер фрагмента. "Плюс" - величина приращения длины фрагмента, "Старший" - наибольший ранг и так далее. В русском языке много коротких и выразительных слов и я это стараюсь использовать. Иногда получается даже забавно. Вот, например, кусок кода из статьи "Наш ответ американским лекторам"
Трус = Новый Соответствие;

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

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

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

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

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

Террариум - это прелестно, но за такое парой штрафуют.
32. ildarovich 6990 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 6990 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 6990 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 6990 08.08.14 10:14 Сейчас в теме
(25) Makushimo, думаю, что такую задачу с помощью данного метода решить нельзя.
51. Rustig 1562 18.08.14 14:47 Сейчас в теме
(25) я тоже думал о такой задаче: чтобы из статьи вытащить наибольшее кол-во повторяющихся фраз, на основе этой информации скорректировать статью таким образом, чтобы как можно больше попадалось именно "ключевых слов". Затем готовую статью можно выкладывать в интернет и ждать яндекс-индексацию
36. vis_tmp 30 13.08.14 05:09 Сейчас в теме
Столкнулся с ошибкой при использовании обработки - см. картинку.

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

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

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

Также добавлен вывод некоторой статистики: общее количество строк, число различных строк, средняя длина повтора. Статистика отображается в заголовке формы после выполнения анализа.
45. ildarovich 6990 14.08.14 14:31 Сейчас в теме
(36) vis_tmp, отмеченная Вами ошибка несколько раз воспроизводилась у моих коллег, поэтому я переписал присваивание - сделал циклом. Чуть медленнее, зато надежнее. Выложил исправленный вариант.
Кроме того, обратил внимание, что при анализе текстов в УПП, где 5 миллионов строк, обработке иногда не хватает памяти (хотя внутри обработки память регулярно освобождается). Возможно, нужно вообще избавиться от использования многократного выделения памяти под порядок обхода. Для этого нужно изменить алгоритм. Это в будущем. Сейчас помогает сворачивание - разворачивание окна обработки в процессе ее работы.
46. vis_tmp 30 15.08.14 07:47 Сейчас в теме
(45) Спасибо, теперь заработало!
41. ildarovich 6990 13.08.14 14:50 Сейчас в теме
Эх! - 13-е число. Перезалил новую версию отчета не на старое, а на новое место. В результате потерялось общее количество скачиваний. Их было 46.
47. CheBurator 3437 16.08.14 14:27 Сейчас в теме
если бы еще показывад "совпадающие" куски до уровня похожести - то есть где-то есть очень похожие блоки текста, различающиеся незначительно...
54. ildarovich 6990 07.11.14 21:48 Сейчас в теме
За это время появилось два соображения в пользу копипаста:
1) Снижение зависимостей. Таким образом, например, в модуль внешней печатной формы переносятся функции из одной конфигурации, чтобы она могла работать в других конфигурациях. С другой стороны, это означает, что все функции для построения универсальных печатных форм, предназначенных для разных конфигураций, должны быть в БСП.
2) Подстановка. Это когда код из тела функции подставляется в тело ее вызова. Она обычно применяется для ускорения выполнения программ. Но в 1С ее применяют для улучшения понимания программы - когда для понимания поведения программы не нужно углубляться в работу модулей - так как весь код оказывается на одном длинном листе. С другой стороны, невозможность прочесть и понять программу на верхнем уровне свидетельствует о неправильном разделении функционала между вызывающей и вызываемыми программами. Также, наверное, можно создать редактор кода, умеющий на этапе прочтения кода выполнять подстановку. Также интересен набор кода по шаблонам. Почему эта техника не бесспорна? - Да потому, что коллекция проверенных и отточенных шаблонов просто обязана быть превращена в функции и добавлена в БСП.
60. cool.vlad4 45 07.07.15 14:10 Сейчас в теме
(54) первый пункт - он не совсем 'за' . основная задача программиста упраление сложностью системы при решении ряда задач. при копипасте у тебя действительно может быть псевдоснижение зависимостей от конкретной части системы , но только сложность системы увеличивается. при обновлении тебе придется обновлять все места копипасты. при ошибке, тебе придется исправлять все места ошибки. сложность увеличилась.
55. ildarovich 6990 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 6990 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 6990 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 6990 21.08.15 11:31 Сейчас в теме
63. olbu 03.09.15 17:25 Сейчас в теме
может я не правильно им пользуюсь:
1) сохраняю модуль в файл
2)сохраняю другой модуль в файл
3)сохраняю эти файлы в одну папку
4)выбираю в обработке эту папку
Сформировать.
вываливается ошибка:
{ВнешнийОтчет.КопиПастоМер.МодульОбъекта(81)}: Индекс находится за границами массива
Ящик = Змея[Ранг[ё]];
64. ildarovich 6990 03.09.15 20:39 Сейчас в теме
(63) olbu,
Перед использованием отчета тексты программных модулей анализируемой конфигурации необходимо выгрузить в некоторую папку. Это можно сделать через конфигуратор с использованием пункта меню "Конфигурация\Выгрузить файлы конфигурации".

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

См. также

FormCodeGenerator Программная доработка форм. Часть 2 (Режим работы "Режим сравнения форм") на примере ERP 2.5 Промо

Практика программирования Адаптация типовых решений Прочие инструменты разработчика v8 1cv8.cf Абонемент ($m)

Данная публикация является продолжением описания функционирования обработки "FormCodeGenerator " в режиме сравнения форм и генерирования кода на основании сравнения. Подходит для перевода уже доработанных форм с интерактивной доработки на программную. Данный режим работы обработки снизит издержки при дальнейших обновлениях конфигураций.

5 стартмани

21.12.2020    1966    12    huxuxuya    11    

Отладчик запроса 1С 8.3 (управляемые формы), бета-версия

Консоль запросов v8 v8::УФ 1cv8.cf Абонемент ($m)

По просьбам некоторых своих коллег и пользователей Инфостарта, выкладываю первую версию обработки "Отладчик запросов by Акулов А.С.", переделанной под управляемые формы. Реализованы почти все возможности из отладчика запросов, которые присутствовали в версии под обычные формы, а также добавлено немного нового.

1 стартмани

28.09.2020    7599    99    DrAku1a    27    

Конвертация данных 3 расширение: Редактор кода.

Инструментарий разработчика Адаптация типовых решений v8 КД Россия Абонемент ($m)

Расширение для конфигурации “Конвертация данных 3.0” добавляет на все формы, где используется код языка 1С, консоль кода для управляемых форм. В результате работать с кодом в пользовательском режиме становится намного удобнее - появляется привычная расцветка кода, а также контекстная подсказка.

1 стартмани

08.09.2020    5990    19    Viktor_Ermakov    28    

А1Э - альтернативная стандартная библиотека для 1С

Инструментарий разработчика v8 Абонемент ($m)

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

14.08.2020    8735    2    Enigma    45    

Управляемая консоль запросов, отчетов 3.8.9 (расширение, внешняя обработка) Промо

Консоль запросов v8 v8::УФ v8::Запросы v8::СКД 1cv8.cf Абонемент ($m)

Работа с запросом и СКД, Полная поддержка пакетных запросов, временных таблиц, Сравнение результатов, текстов, Разбор структуры запроса в виде дерева, Анализ плана запроса, Групповая обработка

5 стартмани

14.08.2018    100249    2579    Evg-Lylyk    679    

Консоль кода для управляемых форм

Прочие инструменты разработчика v8 v8::УФ 1cv8.cf Абонемент ($m)

Консоль кода для управляемых форма с подсказками и подсветкой синтаксиса.

1 стартмани

17.07.2020    15058    232    salexdv    235    

Консоль запросов 9000

Консоль запросов v8 v8::Запросы 1cv8.cf Абонемент ($m)

Простая и удобная консоль запросов 1С для управляемых форм 8.3, работает на любой конфигурации без ее модификации. Возможность использования как внешней обработки или в составе расширения. С перехватом любых запросов и поддержкой всех типов данных во временных таблицах. Анализ плана запроса, запроса на уровне СУБД. Обработка результата кодом.

1 стартмани

24.02.2020    14015    288    kuza2000    128    

Помощник работы с идентификаторами объектов

Прочие инструменты разработчика Поиск данных v8 1cv8.cf Абонемент ($m)

Инструмент для расширенного анализа идентификаторов объектов.

2 стартмани

24.01.2020    11366    45    YPermitin    32    

Установка предопределенных элементов: просмотр, исправление и поиск ошибок (задвоенных и отсутствующих) Промо

Инструментарий разработчика Универсальные обработки v8 1cv8.cf Абонемент ($m)

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

2 стартмани

06.10.2014    155189    2622    ekaruk    166    

Инструменты оптимизации для 1С на MS SQL Server

Прочие инструменты разработчика v8 v8::УФ 1cv8.cf Абонемент ($m)

Набор базовых инструментов для поиска узких мест в работе 1С на MS SQL Server.

1 стартмани

15.12.2019    17455    215    berezdetsky    23    

CF & SQL : конструктор прямых запросов к БД 1С

Инструментарий разработчика Администрирование СУБД v8 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

02.10.2019    21528    218    dmitrydemenew    48    

Конвейер проверки качества кода

Инструментарий разработчика Практика программирования Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Jenkinsfile для выполнения проверки качества кода. Собирает информацию с АПК, EDT и BSL-LS. Сопоставляет ошибки с гит-репозиторием, выгруженным ГитКонвертором. Отправляет в Сонар.

3 стартмани

04.09.2019    27433    22    Stepa86    46    

[Расширение] Контроль отрицательных остатков по регистру бухгалтерии при проведении Промо

Универсальные функции Инструментарий разработчика Учет ТМЦ Учет ТМЦ v8 1cv8.cf Россия БУ Абонемент ($m)

Расширение позволяет без изменений конфигурации проверять остатки по регистру бухгалтерии при проведении каждого документа и запрещает проведение при появлении отрицательных остатков после проведения.

1 стартмани

17.08.2015    48472    166    ekaruk    32    

Модель объекта

Инструментарий разработчика v8 Абонемент ($m)

Подсистема позволяет описать модель данных объекта, где описана зависимость между реквизитами, и затем использовать эту модель в разных сценариях работы с объектом. Версия платформы: 8.3.6 и выше. С небольшими доработками будет работать на 8.2.

1 стартмани

30.06.2019    13357    0    vadim1980    5    

Переводим рутину ручного тестирования 1C на рельсы Jenkins-а и ADD

Инструментарий разработчика Jenkins v8 Абонемент ($m)

Вы все еще тестируете свои конфигурации 1С вручную? Да вы просто тратите жизнь впустую! В данном туториале попробуем скрестить ADD и jenkins для автоматического запуска тестов.

1 стартмани

03.06.2019    27753    6    ripreal1    90    

Универсальный HTTP-сервис на платформе 1С, аля HTTP-сервер с примером

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

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

1 стартмани

13.05.2019    31154    135    Diversus    42    

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

Инструментарий разработчика v8 1cv8.cf Россия Абонемент ($m)

Программа Faster 9.4 позволяет ускорить процесс работы программиста (работает в любом текстовом редакторе). Подсказка при вводе текста на основе ранее введенного текста и настроенных шаблонов. Программа Faster позволяет делится кодом с другими программистами в два клика или передать ссылку через QR Код. Исправление введенных фраз двойным Shift (с помощью speller.yandex). Переводчик текста. Переворачивает текст случайно набранный на другой раскладке. Полезная утилита для тех, кто печатает много однотипного текста, кодирует в среде Windows на разных языках программирования. Через некоторое время работы с программой у вас соберется своя база часто используемых словосочетаний и кусков кода. Настройка любых шорткатов под себя с помощью скриптов. Никаких установок и лицензий, все бесплатно.

1 стартмани

24.05.2012    79370    959    moolex    147    

Групповая проверка доработок

Прочие инструменты разработчика v8 v8::УФ 1cv8.cf Абонемент ($m)

Обработка для массовой проверки доработок конфигурации: Открытие форм, Печать, Формирование отчетов, Проведение документов, Запись справочников, ПВХ, ПВР. Выдает список обнаруженных ошибок. Рекомендуется применять для тестирования обновленной конфигурации, перед установкой пользователям. В коде используются универсальные методы поэтому подходит для большинства конфигураций, построенных на базе библиотеки стандартных подсистем. Проверялась на Зарплата и управление персоналом КОРП 3.1.8.216, Управление торговлей 11, 1С:ERP Управление предприятием 2.4.7.141, Бухгалтерия предприятия КОРП 3.0.68.66.

2 стартмани

05.05.2019    16230    107    sapervodichka    23    

Расширение "Быстрая проверка кода" для конфигурации 1С:Автоматизированная проверка конфигураций

Инструментарий разработчика v8 v8::УФ 1cv8.cf Абонемент ($m)

Расширение для конфигурации "1С:Автоматизированная проверка конфигураций", позволяющее проверять произвольный код.

1 стартмани

26.03.2019    20877    60    Bazil    27    

Настройка отладки на сервере 1С

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Обработка для настройки отладки на сервере, включение отладки COM-соединений и отладки Web-сервисов.

1 стартмани

26.03.2019    29086    122    frkbvfnjh    41    

Консоль запросов + ТЗ как параметры Промо

Консоль запросов v8 1cv8.cf Украина Абонемент ($m)

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

2 стартмани

12.11.2010    37376    437    Kashemir    24    

Методика оптимизации программного кода 1С: проведение документов

Обработка документов Производительность и оптимизация (HighLoad) Инструментарий разработчика v8 v8::УФ Абонемент ($m)

Описание простого метода анализа производительности программного кода 1С, способов его оптимизации и оценки результатов в виде числовых показателей прироста производительности. Не требует сторонних программных продуктов, используются только типовые возможности платформ 1С. Методика проверена на линейке платформ начиная с 1С:Предприятие 8.2 (обычные формы, управляемые формы). Позволяет ускорить проведение проблемных документов в 3 и более раз, провести проверку корректности формирования проводок оптимизированным кодом и подтвердить результаты оптимизации реальными замерами производительности в режиме предприятия. К публикации приложены демонстрационные базы для режимов обычного и управляемого приложения на платформе 1С:Предприятие 8.3 (8.3.9.2033).

1 стартмани

19.03.2019    25873    18    dmitrydemenew    83    

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

Пользователю системы Инструментарий разработчика v8 v8::УФ Россия Абонемент ($m)

Прототип дружелюбного и эффективного инструмента для написания пользовательских экспресс-инструкций. Задействована штатная утилита Windows, о существовании которой многие не знают и которая умеет делать огромную работу по логированию действий и снятию скриншотов на всех ПК с Windows (начиная с версии Win7). "Инструктор" не требует никакой установки и дополнительных библиотек! Это означает, что инструмент будет работать и на домашнем ПК и на "чужом ноутбуке" и на терминальном win-сервере у заказчика, где ваши права сильно ограничены. Вы просто подключаете легкую файловую базу 1С и получаете инструмент по снятию скриншотов с интересной функциональностью...

1 стартмани

15.02.2019    14285    44    ROM_NN    8    

Конструктор мобильного клиента Simple WMS Client: способ создать полноценный ТСД без мобильной разработки. Теперь новая версия - Simple UI (обновлено 14.11.2019)

Инструментарий разработчика Сканер штрих-кода Терминал сбора данных Мобильная разработка Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Учет ОС и НМА Учет ТМЦ Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Учет ОС и НМА Учет ТМЦ v8 v8::Mobile БУ УУ Абонемент ($m)

Simple WMS Client – это визуальный конструктор мобильного клиента для терминала сбора данных(ТСД) или обычного телефона на Android. Приложение работает в онлайн режиме через интернет или WI-FI, постоянно общаясь с базой посредством http-запросов (вариант для 1С-клиента общается с 1С напрямую как обычный клиент). Можно создавать любые конфигурации мобильного клиента с помощью конструктора и обработчиков на языке 1С (НЕ мобильная платформа). Вся логика приложения и интеграции содержится в обработчиках на стороне 1С. Это очень простой способ создать и развернуть клиентскую часть для WMS системы или для любой другой конфигурации 1С (УТ, УПП, ERP, самописной) с минимумом программирования. Например, можно добавить в учетную систему адресное хранение, учет оборудования и любые другие задачи. Приложение умеет работать не только со штрих-кодами, но и с распознаванием голоса от Google. Это бесплатная и открытая система, не требующая обучения, с возможностью быстро получить результат.

5 стартмани

09.01.2019    47576    259    informa1555    234    

[x1c.ru] 1CDBin: Работа с файлами *.1CD на низком уровне средствами языка 1С с возможностью чтения таблиц (поддерживается формат 8.3.8.0) Промо

Тестирование и исправление Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Обработка позволяет просматривать файловые базы 1CD на низком уровне средствами встроенного языка. Реализована часть функциональности Tool_1CD, но на языке 1С Предприятия. Показываются таблицы, параметры таблиц, поля таблиц, записи таблиц, значения полей BLOB, есть 16-ричный просмотр страниц базы и консоль кода. Можно использовать для изучения структуры файлов 1CD, просмотра баз 1CD для выявления повреждений, создания своих обработок для выгрузки данных без открытия исследуемой базы в 1С:Предприятии.

1 стартмани

07.10.2014    55279    348    GusevNA    76    

Управление задачами в 1С - готовая подсистема с открытым кодом и широким базовым функционалом. Версия 1.0.6

Инструментарий разработчика Управление бизнес-процессами (BPM) Управление проектом v8 Абонемент ($m)

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

2 стартмани

17.12.2018    21684    110    for_sale    38    

КопиПастаМер v.2 (универсальный)

Инструментарий разработчика Рефакторинг и качество кода v8 v8::УФ 1cv8.cf Абонемент ($m)

Обработка для поиска повторов строк - находит одинаковые строки в разных текстовых файлах. Легко настраивается - Мин.порог одинаковых строк, выбор по типу / маске файла, Поиск по вложенным под-каталогам, выбор кодировки UTF-8 / ANSI ...Удобное отражение кода 1С в привычной "раскраске" и открытие файлов в одно нажатие в любом редакторе, таких как NotePad++, Visual Studio Code...или стандартных Блокноте, или Word-е Текст обработки - открыт для доработок.

1 стартмани

30.11.2018    9281    34    Serg O.    13    

Рисуем диаграммы в metadata.js

Инструментарий разработчика Работа с интерфейсом v8 v8::СКД 1cv8.cf Абонемент ($m)

Не одной же литературой заниматься?

1 стартмани

20.09.2018    17904    4    1c-intelligence    77    

Разбираемся со структурой правил конвертации данных Промо

Инструментарий разработчика v8 КД Абонемент ($m)

При переносе данных между различающимися данными частенько приходится смотреть в правила. И часто, чтобы выяснить, к примеру, каким документом формируются остатки по конкретному ПВД, нужно заглядывать в него и искать, какое ПКО в нем вызывается. А может вызываться и алгоритм, в котором вызывается ПКО ;-) А если правил много? Чтобы не мучить себя утомительными поисками, предлагаю воспользоваться этой обработкой.

1 стартмани

14.10.2011    23473    160    Meta    17    

Пользовательское определение языка 1С для Notepad++ и пример использования списка функций для навигации под свои нужды

Инструментарий разработчика v8 Абонемент ($m)

Позволяет редактировать bsl-модули (или просто текст из буфера обмена, как на скриншоте) с традиционной для 1С подсветкой синтаксиса. Рисует список функций слева в 3-х вариантах: 1. Просто список функций 2. Список функций с группировкой по областям 3. Список вызовов 4. Язык запросов

1 стартмани

10.09.2018    12829    52    albert.goncharov    24    

Консоль Внедренца v.3.6.2 (vnedr.cf)

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Идея данной обработки заключается в создании простого, функционального и универсального инструментария для внедренцев и программистов 1С, который будет работать как в толстом клиенте на обычных и на управляемых формах, так и в тонком клиенте. Интерфейс и логика работы максимально идентичны у обычных форм и управляемых. Инструментарий включает в себя: Консоль кода, Консоль запросов, Консоль отчетов (СКД), Универсальную обработку объектов, Средства для работы с таблицами базы данных 1С, Редактирование регистров сведений базы, Инструмент по работе с табличными документами - загрузка данных из табличного документа.

1 стартмани

27.08.2018    23240    385    evvakra    42    

HTTP Сервисы: Путь к своему сервису. Часть 3

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

Продолжение статьи «HTTP Сервисы: Путь к своему сервису. Часть 2». В предыдущих частях мы использовали только Get, в этой части поговорим о других методах и длительных операциях.

1 стартмани

27.08.2018    40826    63    dsdred    17    

Интерфейс сопоставления объектов для обмена (для типового регистра СоответствиеОбъектовДляОбмена) Промо

Инструментарий разработчика Универсальные обработки Перенос данных из 1C8 в 1C8 v8 КА1 БП2.0 ЗУП2.5 УТ10 УПП1 Абонемент ($m)

Вы внедряете обмен данными между двумя типовыми или основанными на типовых БД и вам необходим инструмент, чтобы сопоставить между собой справочники этих конфигураций? Вы хотите навести порядок в обмене данными, потому что вам надоело вылавливать дублирующиеся объекты? Вам очень хочется перепоручить сопоставление объектов обменивающихся баз пользователям, но нет подходящего и понятного пользователям интерфейса? Тогда вам нужна именно эта обработка!

4 стартмани

11.11.2015    41174    108    catsam    8    

Позиционирование в помещении с помощью нейросети по сигналу Wi-Fi. Интерактивная карта склада в 1С с показом позиции

Инструментарий разработчика Практика программирования v8 Абонемент ($m)

Данная публикация содержит в себе редактор и интерактивную карту склада или иного помещения, на которой в реальном времени отображается позиция устройства, координаты которого вычисляются по уровням сигнала нескольких роутеров Wi-Fi. В статье и приложенным к ней разработкам предлагаются инструменты и методика для реализации вычисления точной геопозиции внутри помещений с помощью нейронной сети. Конфигурация написана на релизе 1С:Предприятие 8.3.12.1412, клиентское приложение имеет минимальный уровень совместимости SDK -16.

5 стартмани

09.08.2018    29633    26    informa1555    26    

CI/CD для 1С - миф или реальность?

Управление проектом v8 Бесплатно (free)

Разберём плюсы и минусы применения практик CI/CD с учетом ограничения технологической платформы 1С:Предприятие.

02.07.2018    23978    comol    54    

Консоль HTTP-запросов с генерацией кода

Консоль запросов v8 v8::УФ 1cv8.cf Абонемент ($m)

Консоль HTTP-запросов, которая не только выполняет запросы и получает результат их выполнения, но и генерирует необходимый код. Использую на 8.3.11.2899.

1 стартмани

25.05.2018    25996    280    leongl    19    

Exec - Выполнение кода, консоль запросов и не только! Промо

Консоль запросов v8 1cv8.cf Абонемент ($m)

Незаменимый инструмент администратора БД и программиста: Выполняйте произвольный код из режима 1С Предприятие; сохраняйте/загружайте часто используемые скрипты; выполняйте запросы с замером производительности запроса в целом и каждой из временных таблиц в частности, а также с просмотром содержимого временных таблиц; произвольным образом изменяйте любые объекты БД, редактируя даже не вынесенные на формы реквизиты и записывая изменения в режиме "ОбменДанными.Загрузка = Истина"; легко узнавайте ИД объектов БД; выполняйте прямые запросы к SQL с замером производительности и не только!

5 стартмани

10.11.2015    42134    75    catsam    11    

Регистры правил [Расширение]

Инструментарий разработчика Информационная безопасность v8 v8::Права УТ11 Абонемент ($m)

Регистры правил - права доступа, запрет редактирования, автоподстановка реквизитов и т.д.

10 стартмани

15.03.2018    18850    28    33lab    1    

Тестирование интерфейса в обычном приложении 8.2 при помощи SikuliX

Инструментарий разработчика Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

Как же не хватает клиента тестирования на платформе 8.2. Не кликнешь на кнопку, не выберешь из списка, не проверишь видит ли надпись пользователь. Воспользуемся внешним инструментом SikuliX, который позволит нам протестировать функционал форм. Данный инструмент легко встраивается в линию сборки и может "дружить" с уже известным многим Open-source продуктами.

1 стартмани

03.01.2018    30811    5    kraynev-navi    41    

Программное формирование форматированной строки в стиле html+inline CSS

Работа с интерфейсом Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Если вам приходилось работать с форматированными строками программно, то вы знаете, какая это боль. Данное решение облегчает программное формирование таких строк.

1 стартмани

18.11.2017    34193    37    bonv    10    

КонЗап - консоль запросов с улучшенным интерфейсом и дополнительными функциями Промо

Консоль запросов v8 1cv8.cf Абонемент ($m)

Консоль запросов (Платформа 8.х режим - обычное приложение) с улучшенным интерфейсом и дополнительными функциями (загрузка параметров запроса из файла, работа с временными таблицами, замер времени выполнения, групповая обработка результатов запроса). Часть функций позаимствованы из других обработок, часть разработаны "с нуля".

1 стартмани

16.07.2014    15755    110    serjpsv    18    

Макет в СКД - пример всех возможных типовых вариантов

Практика программирования Инструментарий разработчика v8 v8::СКД 1cv8.cf Абонемент ($m)

Макет СКД: наглядное представление того, что, как и куда выводится при типовых настройках.

1 стартмани

09.11.2017    22983    77    freelancer    4    

Заполнение шаблона Word на сервере, без использования MS Office (docx -> zip -> xml). Предусмотрен вывод табличных частей

Универсальные печатные формы Инструментарий разработчика v8 v8::УФ 1cv8.cf Абонемент ($m)

Шаблон в Word, управляемые формы. Создание заполнение документа Word (docx -> zip -> xml) по шаблону на сервере без использования MS Office. Предусмотрен вывод табличных частей.

2 стартмани

04.10.2017    29233    212    artms    58    

Тестирование: пример из семи шагов создания Unit-теста для платформы 1С

Инструментарий разработчика v8 ERP2 УТ11 Абонемент ($m)

В этой статье мы расскажем, как создать Unit-тест. Опишем как это сделать с использованием Фреймворка xUnitFor1C. Рассмотрим пример максимально приближенный к боевому, покажем процесс отладки теста, поделимся советами и приложим несколько обработок-примеров. Вы сможете убедиться, что создание тестов на самом деле это относительно быстрый и простой процесс.

1 стартмани

29.08.2017    32358    21    ivanov660    46    

"Исследователь" планировщика 1С

Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Сам по себе Планировщик 1С вещь интересная, но чтобы осознать ее с 0 до уверенного владения, может уйти уйма времени. Мой инструмент призван сократить это время до минимума. Все необходимые настройки планировщика вынесены на форму, и их изменение сразу же либо по кнопке "Инициализировать" отображается на планировщике.

1 стартмани

10.08.2017    33082    137    new_user    33    

Трансформатор 1С - SQL

Инструментарий разработчика v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

28.06.2017    37215    360    Synoecium    49    

OneStyle. Улучшенное форматирование кода в конфигураторе

Инструментарий разработчика v8 Абонемент ($m)

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

1 стартмани

19.06.2017    24618    23    Stepa86    46    

"Конвертация данных" + Git. Решение проблемы различий в файлах

Инструментарий разработчика Обмен через XML v8 КД Абонемент ($m)

Как известно, типовая конфигурация «Конвертация данных» обладает одним недостатком, мешающим работать с ней в Git-е. Если выгруженные из нее правила обмена загрузить в другую КД, а потом снова выгрузить, то полученные два файла будут очень сильно отличаться друг от друга, и при сравнении (diff) доработок будет невозможно провести код-ревью, равно как найти сами изменения, которые закоммитил разработчик.

1 стартмани

08.06.2017    26134    42    stas_ganiev    13    

Шаблон внешней обработки регламентного задания с формой настройки параметров выполнения

Инструментарий разработчика Универсальные функции v8 v8::УФ 1cv8.cf Абонемент ($m)

Шаблон внешней обработки призван упростить программисту процесс реализации внешнего регламентного задания. Пригоден к использованию во всех конфигурациях на управляемых формах, в которых присутствует подсистема "Дополнительные отчеты и обработки" из состава библиотеки стандартных подсистем (БСП) версии 2.1 и выше.

1 стартмани

28.05.2017    26952    190    Bassgood    10