├── .gitattributes
├── .gitignore
├── README.md
├── files
└── СравнениеКода1С.epf
├── imgs
├── debug_methods.png
├── debug_regions.png
├── diff-icon-300.jpg
├── main.png
└── method_compare.png
└── src
├── .gitignore
├── СравнениеКода1С.xml
└── СравнениеКода1С
├── Ext
└── ObjectModule.bsl
└── Forms
├── Форма.xml
└── Форма
└── Ext
├── Form.xml
└── Form
├── Items
├── ЛоготипGithub
│ └── Picture.png
├── ЛоготипИнфостарт
│ └── Picture.png
├── ОткрытьНаИнфостарт
│ └── Picture.png
└── ОткрытьРепозиторий
│ └── Picture.png
└── Module.bsl
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Binary file extensions that should not be modified.
2 | *.axdt binary
3 | *.addin binary
4 | Form.bin binary
5 | *.bin binary
6 | *.png binary
7 | *.ico binary
8 |
9 | # Text file extensions
10 | * text=auto
11 | *.htm text eol=crlf
12 | *.html text eol=crlf
13 | renames.txt text eol=crlf
14 |
15 | *.bsl text eol=crlf
16 | *.os text eol=crlf
17 | ParentConfigurations.bin text eol=lf
18 |
19 | *.xml text eol=crlf
20 | *.feature text
21 | *.md text
22 | *.json text
23 |
24 | *.bat text eol=crlf
25 | *.cmd text eol=crlf
26 |
27 | *.sh text eol=lf
28 | *.groovy text eol=lf
29 |
30 | # Archives
31 | *.7z binary
32 | *.gz binary
33 | *.tar binary
34 | *.tgz binary
35 | *.zip binary
36 |
37 | # 1C
38 | *.cf binary
39 | *.cfe binary
40 | *.epf binary
41 | *.erf binary
42 |
43 | # Git LFS
44 | src/Ext/ParentConfigurations/*.cf filter=lfs diff=lfs merge=lfs -text
45 | **/CommonTemplates/**/*.bin filter=lfs diff=lfs merge=lfs -binary
46 | **/Templates/**/*.bin filter=lfs diff=lfs merge=lfs -binary
47 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | DumpFilesIndex.txt
2 | ConfigDumpInfo.xml
3 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Обработка для сравнения модулей в режиме 1С:Предприятие
2 |
3 | 
4 | [](https://github.com/vandalsvq/1c_code_diff/releases)
5 |
6 | Обработка предназначеня для сравнения кода в режиме 1С:Предприятие без использования внешних компонент.
7 |
8 | 
9 |
10 | ## Возможности
11 | * построение структуры модуля (дерево областей и методов)
12 | * фильтр изменений (измененные, добавленные, удаленные и т.д.)
13 | * переключение режима просмотра списка методов (дерево, таблица)
14 | * подсветка наличия изменений, добавленных и удаленных областей / методов
15 | * информация об Асинх, Экспорт и директиве компиляции в списке методов
16 | * информация о типе метода (pr - процедура, fx - функция)
17 | * построчное сравнение текстов модулей
18 |
19 | ## Планируемые доработки
20 | * анализ изменений без привязки к методам (например комментарии в коде)
21 | * возможность открыть каталог выгрузки конфигурации и подбирать файлы для сравнения из него
22 | * трехстороннее сравнение (но это не точно)
23 |
24 | ## Дополнительная информация
25 | * Минимальная версия платформы 8.3.18 (используются методы Асинх)
26 | * Алгоритм построчного сравнения реализован на базе [разработки с Инфостарт](https://infostart.ru/public/581384/). Автор: Игорь Пашутин
27 | * Немного подсматривал в [обработку сравнения модулей](https://infostart.ru/public/453716/) Андрея Овсянкина ([на Github](https://github.com/EvilBeaver), [на Инфостарт](https://infostart.ru/profile/267027/))
28 |
29 | Прикручивать консоль кода не планирую, если кто возьмется и сделает, буду благодарен и выложу измененную версию. Хотя не вижу смысла пока в этом. Цель была сделать именно сравнение без использования доп. средств (некоторый спортивный интерес).
30 |
31 | Ну и да, я в курсе про наличие kdiff и др. программ для сравнения, но они тоже внешние, а штатное сравнение работает только в толстом клиенте или через Меню - Сравнить файлы, что несколько неудобно. Да и структуру модуля не показывает.
32 |
33 | ## Чуток подробностей
34 |
35 | ### Методика сравнения
36 | * Сначала программа обрабатывает тексты модулей и "забивает" все комментарии и строковые значения (символом #), а так же заменяет ";"
37 | * После подготовки текста программа строит таблицы областей и методов (см. режим отладки)
38 | * После подготовки таблиц областей и методов, на основании их данных строится структура модуля (в зависимости от настроек)
39 | * При активизации строки метода, программа выполняет построчное сравнения и заносит данные в таблицы слева и справа
40 |
41 | Важно: Построчное сравнение выполняется один раз, при повторной активизации строки накладывается фильтр
42 |
43 | ### Известные недостатки
44 | * Не учитывает объявление нового метода следом за закрытием предыдущего. Например: "КонецПроцедуры Процедура Имя()"
45 | * Сравнение построчное. Внутри строки различия не анализируются и не подсвечиваются
46 | * В некоторых случаях программа некорректно определяет блоки изменений
47 |
48 | ### Быстродействие
49 | * Тестировалось на модулях 4-6 тысяч строк. При наличии разделения на методы (Процедура, Функция) сравнение выполняется достаточно быстро
50 | * Предполагается, что тексты отдельных методов не будут превышать 1000 строк. Иначе из-за особенностей реализации методики построчного сравнения, расчет различий может выполняться длительное время
51 | * Построчный анализ различий не выполняется до момента активизации строки метода в структуре модуля. При повторной активизации, анализ не выполняется, просто накладывается фильтр на таблицы
52 |
53 | ### Про батарейки
54 | В обработке используются некоторые процедуры из общих модулей БСП. Обратите внимание "batteries not included", поэтому рекомендую открывать в конфигурациях, основанных на БСП. Выпилить возможно, но для меня не актуально.
55 |
56 | Использованные объекты из БСП:
57 | * ОМ.ОбщегоНазначения
58 | * ОМ.ОбщегоНазначенияКлиент
59 | * ОМ.ОбщегоНазначенияКлиентСервер
60 | * ОМ.СтроковыеФункцииКлиентСервер
61 | * ОМ.ФайловаяСистемаКлиент
--------------------------------------------------------------------------------
/files/СравнениеКода1С.epf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vandalsvq/1c_code_diff/a735f493c9e1460b66bccde3b7554c53ad7a9197/files/СравнениеКода1С.epf
--------------------------------------------------------------------------------
/imgs/debug_methods.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vandalsvq/1c_code_diff/a735f493c9e1460b66bccde3b7554c53ad7a9197/imgs/debug_methods.png
--------------------------------------------------------------------------------
/imgs/debug_regions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vandalsvq/1c_code_diff/a735f493c9e1460b66bccde3b7554c53ad7a9197/imgs/debug_regions.png
--------------------------------------------------------------------------------
/imgs/diff-icon-300.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vandalsvq/1c_code_diff/a735f493c9e1460b66bccde3b7554c53ad7a9197/imgs/diff-icon-300.jpg
--------------------------------------------------------------------------------
/imgs/main.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vandalsvq/1c_code_diff/a735f493c9e1460b66bccde3b7554c53ad7a9197/imgs/main.png
--------------------------------------------------------------------------------
/imgs/method_compare.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vandalsvq/1c_code_diff/a735f493c9e1460b66bccde3b7554c53ad7a9197/imgs/method_compare.png
--------------------------------------------------------------------------------
/src/.gitignore:
--------------------------------------------------------------------------------
1 | .tester/
--------------------------------------------------------------------------------
/src/СравнениеКода1С.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | c3831ec8-d8d5-4f93-8a22-f9bfae07327f
7 | 1e578b05-65dc-4fb2-8ff1-35d707745983
8 |
9 |
10 | dbfff0e5-e72e-4008-add6-893f17a3a127
11 | cfa9f7f7-f90c-48c9-93e1-9e0fa4c76d4a
12 |
13 |
14 |
15 | СравнениеКода1С
16 |
17 |
18 | ru
19 | Сравнение кода 1С
20 |
21 |
22 |
23 | ExternalDataProcessor.СравнениеКода1С.Form.Форма
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/src/СравнениеКода1С/Ext/ObjectModule.bsl:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/СравнениеКода1С/Forms/Форма.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
22 |
--------------------------------------------------------------------------------
/src/СравнениеКода1С/Forms/Форма/Ext/Form/Items/ЛоготипGithub/Picture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vandalsvq/1c_code_diff/a735f493c9e1460b66bccde3b7554c53ad7a9197/src/СравнениеКода1С/Forms/Форма/Ext/Form/Items/ЛоготипGithub/Picture.png
--------------------------------------------------------------------------------
/src/СравнениеКода1С/Forms/Форма/Ext/Form/Items/ЛоготипИнфостарт/Picture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vandalsvq/1c_code_diff/a735f493c9e1460b66bccde3b7554c53ad7a9197/src/СравнениеКода1С/Forms/Форма/Ext/Form/Items/ЛоготипИнфостарт/Picture.png
--------------------------------------------------------------------------------
/src/СравнениеКода1С/Forms/Форма/Ext/Form/Items/ОткрытьНаИнфостарт/Picture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vandalsvq/1c_code_diff/a735f493c9e1460b66bccde3b7554c53ad7a9197/src/СравнениеКода1С/Forms/Форма/Ext/Form/Items/ОткрытьНаИнфостарт/Picture.png
--------------------------------------------------------------------------------
/src/СравнениеКода1С/Forms/Форма/Ext/Form/Items/ОткрытьРепозиторий/Picture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vandalsvq/1c_code_diff/a735f493c9e1460b66bccde3b7554c53ad7a9197/src/СравнениеКода1С/Forms/Форма/Ext/Form/Items/ОткрытьРепозиторий/Picture.png
--------------------------------------------------------------------------------
/src/СравнениеКода1С/Forms/Форма/Ext/Form/Module.bsl:
--------------------------------------------------------------------------------
1 |
2 | #Область ПрограммныйИнтерфейс
3 |
4 | &НаКлиентеНаСервереБезКонтекста
5 | Функция НомерВерсии() Экспорт
6 | Возврат "1.4";
7 | КонецФункции
8 |
9 | #КонецОбласти
10 |
11 | #Область УправлениеФормой
12 |
13 | &НаКлиентеНаСервереБезКонтекста
14 | Процедура УстановитьУсловноеОформлениеРеквизита(Форма, Обработано, ИмяРеквизита)
15 |
16 | Если НЕ Обработано.Найти(ИмяРеквизита) = Неопределено Тогда
17 | Возврат;
18 | КонецЕсли;
19 | Обработано.Добавить(ИмяРеквизита);
20 |
21 | Элементы = Форма.Элементы;
22 | Объект = Форма.Объект;
23 |
24 | ЭтоРежимОтладки = Элементы.ФормаРежимОтладки.Пометка;
25 |
26 | #Область Наборы
27 |
28 | Если ИмяРеквизита = "РеквизитыРежимОтладки" ИЛИ ПустаяСтрока(ИмяРеквизита) Тогда
29 | УстановитьУсловноеОформлениеРеквизита(Форма, Обработано, "ОсновнаяПанель");
30 | КонецЕсли;
31 |
32 | #КонецОбласти
33 |
34 | #Область Элементы
35 |
36 | Если ИмяРеквизита = "ОсновнаяПанель" Тогда
37 | Отображение = ?(ЭтоРежимОтладки, ОтображениеСтраницФормы.ЗакладкиСверху, ОтображениеСтраницФормы.Нет);
38 |
39 | ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
40 | "ОсновнаяПанель", "ОтображениеСтраниц", Отображение);
41 |
42 | Если НЕ ЭтоРежимОтладки Тогда
43 | ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
44 | "ОсновнаяПанель", "ТекущаяСтраница", Элементы.ГруппаОсновная);
45 | КонецЕсли;
46 | КонецЕсли;
47 |
48 | #КонецОбласти
49 |
50 | #Область Команды
51 |
52 | //Если ИмяРеквизита = "КомандаЗаполнить" ИЛИ ПустаяСтрока(ИмяРеквизита) Тогда
53 | // ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
54 | // "ТаблицаФормыЗаполнить", "Видимость", НЕ Объект.Проведен);
55 | //КонецЕсли;
56 |
57 | #КонецОбласти
58 |
59 | КонецПроцедуры
60 |
61 | &НаКлиентеНаСервереБезКонтекста
62 | Процедура УстановитьУсловноеОформление(Форма, ИменаРеквизитов = "")
63 | Если ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда
64 | Если ПустаяСтрока(ИменаРеквизитов) Тогда
65 | МассивИмен = Новый Массив;
66 | МассивИмен.Добавить("");
67 | Иначе
68 | МассивИмен = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИменаРеквизитов, ",");
69 | КонецЕсли;
70 | ИначеЕсли ТипЗнч(ИменаРеквизитов) = Тип("Массив") Тогда
71 | МассивИмен = ОбщегоНазначенияКлиентСервер.СкопироватьМассив(ИменаРеквизитов);
72 | Иначе
73 | Возврат;
74 | КонецЕсли;
75 |
76 | Обработано = Новый Массив;
77 | Для Каждого ИмяРеквизита Из МассивИмен Цикл
78 | УстановитьУсловноеОформлениеРеквизита(Форма, Обработано, СокрЛП(ИмяРеквизита));
79 | КонецЦикла;
80 | КонецПроцедуры
81 |
82 | &НаСервереБезКонтекста
83 | Процедура УстановитьОформлениеСтруктурыМодуляНаСервере(знач Форма) Экспорт
84 |
85 | Шрифт_Ж = Новый Шрифт(Форма.Элементы.СтруктураМодуля.Шрифт,,, Истина);
86 |
87 | #Область ЭтоОбласть
88 | ЭлементУО = Форма.УсловноеОформление.Элементы.Добавить();
89 | ЭлементУО.Использование = Истина;
90 | ЭлементУО.Представление = НСтр("ru='Это строка области'");
91 |
92 | // отбор
93 | ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(ЭлементУО.Отбор,
94 | "СтруктураМодуля.ЭтоОбласть", Истина, ВидСравненияКомпоновкиДанных.Равно,, Истина);
95 |
96 | // оформление
97 | ЭлементУО.Оформление.УстановитьЗначениеПараметра("Шрифт", Шрифт_Ж);
98 |
99 | // поля
100 | ДобавитьПоляУсловногоОформления(ЭлементУО.Поля, "СтруктураМодуля");
101 | #КонецОбласти
102 |
103 | КонецПроцедуры
104 |
105 | #КонецОбласти
106 |
107 | #Область ОбработчикиСобытийЭлементовШапкиФормы
108 |
109 | &НаКлиенте
110 | Процедура ПутьКМодулю1ПриИзменении(Элемент)
111 |
112 | ПрочитатьТекстМодуля("1");
113 |
114 | КонецПроцедуры
115 |
116 | &НаКлиенте
117 | Процедура ПутьКМодулю2ПриИзменении(Элемент)
118 |
119 | ПрочитатьТекстМодуля("2");
120 |
121 | КонецПроцедуры
122 |
123 | &НаКлиенте
124 | Асинх Процедура ПутьКМодулю1НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
125 |
126 | ЭтотОбъект.ПутьКМодулю1 = Ждать ВыбратьФайлМодуляАсинх();
127 | ПрочитатьТекстМодуля("1");
128 |
129 | КонецПроцедуры
130 |
131 | &НаКлиенте
132 | Асинх Процедура ПутьКМодулю2НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
133 |
134 | ЭтотОбъект.ПутьКМодулю2 = Ждать ВыбратьФайлМодуляАсинх();
135 | ПрочитатьТекстМодуля("2");
136 |
137 | КонецПроцедуры
138 |
139 | &НаКлиенте
140 | Процедура ТекстМодуля1ПриИзменении(Элемент)
141 |
142 | ОчиститьПодготовленныйТекстМодуля("1");
143 |
144 | КонецПроцедуры
145 |
146 | &НаКлиенте
147 | Процедура ТекстМодуля2ПриИзменении(Элемент)
148 |
149 | ОчиститьПодготовленныйТекстМодуля("1");
150 |
151 | КонецПроцедуры
152 |
153 | &НаКлиенте
154 | Процедура ФильтрДереваПриИзменении(Элемент)
155 |
156 | ОбновитьСтруктуруМодуля();
157 |
158 | КонецПроцедуры
159 |
160 | &НаКлиенте
161 | Процедура ВидСтруктурыМодуляПриИзменении(Элемент)
162 |
163 | ОбновитьСтруктуруМодуля();
164 |
165 | КонецПроцедуры
166 |
167 | #КонецОбласти
168 |
169 | #Область ОбработчикиСобытийЭлементовТаблицыФормы_СтруктураМодуля
170 |
171 | &НаКлиенте
172 | Процедура СтруктураМодуляПриАктивизацииСтроки(Элемент)
173 | ТекущиеДанные = Элементы.СтруктураМодуля.ТекущиеДанные;
174 | Если ТекущиеДанные = Неопределено Тогда
175 | Возврат;
176 | КонецЕсли;
177 |
178 | СравнитьТексты(ЭтотОбъект, ТекущиеДанные);
179 |
180 | УстановитьОтборСтрокСравнения();
181 | КонецПроцедуры
182 |
183 | #КонецОбласти
184 |
185 | #Область ОбработчикиСобытийЭлементовТаблицыФормы_Методы
186 |
187 | &НаКлиенте
188 | Процедура МетодыПриАктивизацииСтроки(Элемент)
189 | КонецПроцедуры
190 |
191 | #КонецОбласти
192 |
193 | #Область ОбработчикиСобытийЭлементовТаблицыФормы_Документы
194 |
195 | &НаКлиенте
196 | Процедура ДокументЛевыйПриАктивизацииСтроки(Элемент)
197 | ТекущиеДанные = Элементы.ДокументЛевый.ТекущиеДанные;
198 | Если ТекущиеДанные = Неопределено Тогда
199 | Возврат;
200 | КонецЕсли;
201 |
202 | СтрокаТаблицы = ДокументПравый.НайтиПоИдентификатору(ТекущиеДанные.ПолучитьИдентификатор());
203 | Если СтрокаТаблицы <> Неопределено Тогда
204 | Элементы.ДокументПравый.ТекущаяСтрока = СтрокаТаблицы.ПолучитьИдентификатор();
205 | КонецЕсли;
206 | КонецПроцедуры
207 |
208 | &НаКлиенте
209 | Процедура ДокументПравыйПриАктивизацииСтроки(Элемент)
210 | ТекущиеДанные = Элементы.ДокументПравый.ТекущиеДанные;
211 | Если ТекущиеДанные = Неопределено Тогда
212 | Возврат;
213 | КонецЕсли;
214 |
215 | СтрокаТаблицы = ДокументЛевый.НайтиПоИдентификатору(ТекущиеДанные.ПолучитьИдентификатор());
216 | Если СтрокаТаблицы <> Неопределено Тогда
217 | Элементы.ДокументЛевый.ТекущаяСтрока = СтрокаТаблицы.ПолучитьИдентификатор();
218 | КонецЕсли;
219 | КонецПроцедуры
220 |
221 | #КонецОбласти
222 |
223 | #Область ОбработчикиСобытийФормы
224 |
225 | &НаСервере
226 | Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
227 |
228 | ЭтотОбъект.Заголовок = СтрШаблон(НСтр("ru='Сравнение модулей (версия %1)'"), НомерВерсии());
229 | ЭтотОбъект.ФильтрДерева = 1;
230 |
231 | УстановитьОформлениеСтруктурыМодуляНаСервере(ЭтотОбъект);
232 |
233 | КонецПроцедуры
234 |
235 | &НаКлиенте
236 | Процедура ПриОткрытии(Отказ)
237 |
238 | УстановитьУсловноеОформление(ЭтотОбъект);
239 |
240 | КонецПроцедуры
241 |
242 | #КонецОбласти
243 |
244 | #Область ОбработчикиКомандФормы
245 |
246 | &НаКлиенте
247 | Процедура РежимОтладки(Команда)
248 |
249 | Элементы.ФормаРежимОтладки.Пометка = НЕ Элементы.ФормаРежимОтладки.Пометка;
250 |
251 | УстановитьУсловноеОформление(ЭтотОбъект, "РеквизитыРежимОтладки");
252 |
253 | КонецПроцедуры
254 |
255 | &НаКлиенте
256 | Процедура ВыполнитьСравнение(Команда)
257 | ПроверитьТекстПодготовленный();
258 | ЗаполнитьТаблицыОбластейМетодов(Истина, Истина);
259 | ОбновитьСтруктуруМодуля();
260 | КонецПроцедуры
261 |
262 | &НаКлиенте
263 | Процедура ОткрытьВнешнююСсылку(Команда)
264 |
265 | ТекстСсылки = "";
266 | Если Команда.Имя = "ОткрытьНаИнфостарт" Тогда
267 | ТекстСсылки = "https://infostart.ru/public/1812778/";
268 | ИначеЕсли Команда.Имя = "ОткрытьРепозиторий" Тогда
269 | ТекстСсылки = "https://github.com/vandalsvq/1c_code_diff/";
270 | КонецЕсли;
271 |
272 | Если ПустаяСтрока(ТекстСсылки) Тогда
273 | Возврат;
274 | КонецЕсли;
275 |
276 | ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(ТекстСсылки);
277 |
278 | КонецПроцедуры
279 |
280 | #КонецОбласти
281 |
282 | #Область ЗавершениеНемодальныхВызовов
283 | #КонецОбласти
284 |
285 | #Область СлужебныеПроцедурыИФункции
286 |
287 | &НаКлиенте
288 | Процедура ПрочитатьТекстМодуля(знач Сторона)
289 | ПутьКФайлу = ЭтотОбъект["ПутьКМодулю" + Сторона];
290 | Если ПустаяСтрока(ПутьКФайлу) Тогда
291 | Возврат;
292 | КонецЕсли;
293 |
294 | ТекстовыйДокумент = Новый ТекстовыйДокумент;
295 | ТекстовыйДокумент.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8);
296 | ЭтотОбъект["ТекстМодуля" + Сторона] = ТекстовыйДокумент.ПолучитьТекст();
297 | ТекстовыйДокумент = Неопределено;
298 |
299 | ОчиститьПодготовленныйТекстМодуля(Сторона);
300 | КонецПроцедуры
301 |
302 | &НаКлиенте
303 | Процедура ОчиститьПодготовленныйТекстМодуля(знач Сторона)
304 | ЭтотОбъект["ТекстПодготовленный" + Сторона] = "";
305 | КонецПроцедуры
306 |
307 | &НаКлиенте
308 | Процедура ПроверитьТекстПодготовленный()
309 | Если ПустаяСтрока(ЭтотОбъект.ТекстПодготовленный1) Тогда
310 | ЭтотОбъект.ТекстПодготовленный1 = ПодготовитьТекстМодуля(ЭтотОбъект.ТекстМодуля1);
311 | КонецЕсли;
312 |
313 | Если ПустаяСтрока(ЭтотОбъект.ТекстПодготовленный2) Тогда
314 | ЭтотОбъект.ТекстПодготовленный2 = ПодготовитьТекстМодуля(ЭтотОбъект.ТекстМодуля2);
315 | КонецЕсли;
316 | КонецПроцедуры
317 |
318 | &НаКлиенте
319 | Процедура УстановитьОтборСтрокСравнения()
320 | СтруктураОтбор = Новый Структура("КлючСтроки", "БезОтбора");
321 |
322 | ТекущиеДанные = Элементы.СтруктураМодуля.ТекущиеДанные;
323 | Если НЕ ТекущиеДанные = Неопределено И НЕ ПустаяСтрока(ТекущиеДанные.КлючСтроки) Тогда
324 | СтруктураОтбор.КлючСтроки = ТекущиеДанные.КлючСтроки;
325 | КонецЕсли;
326 |
327 | Элементы.ДокументЛевый.ОтборСтрок = Новый ФиксированнаяСтруктура(СтруктураОтбор);
328 | Элементы.ДокументПравый.ОтборСтрок = Новый ФиксированнаяСтруктура(СтруктураОтбор);
329 | КонецПроцедуры
330 |
331 | &НаКлиентеНаСервереБезКонтекста
332 | Процедура СравнитьТексты(знач Форма, знач СтрокаСтруктуры)
333 | Если НЕ СтрокаСтруктуры.ЭтоМетод Тогда
334 | Возврат;
335 | КонецЕсли;
336 |
337 | СтрокаМетода = Форма.Методы.НайтиПоИдентификатору(СтрокаСтруктуры.Идентификатор);
338 | Если СтрокаМетода.Обработано Тогда
339 | Возврат;
340 | КонецЕсли;
341 |
342 | ДанныеСравнения = ПодготовитьДанныеСравненияНаКлиенте(Форма, СтрокаМетода);
343 | Последовательность = НайтиНаибольшуюПодпоследовательность(ДанныеСравнения);
344 | РезультатСравнения = ПолучитьРезультатСравнения(ДанныеСравнения, Последовательность);
345 |
346 | ЗаполнитьТаблицыСравнения(Форма, СтрокаМетода, РезультатСравнения);
347 |
348 | СтрокаМетода.Обработано = Истина;
349 | КонецПроцедуры
350 |
351 | &НаКлиентеНаСервереБезКонтекста
352 | Процедура ЗаполнитьТаблицыСравнения(знач Форма, знач СтрокаМетода, знач РезультатСравнения)
353 | //Форма.ДокументЛевый.Очистить();
354 | //Форма.ДокументПравый.Очистить();
355 |
356 | ГраницаРезультата = РезультатСравнения.ВГраница();
357 |
358 | Счетчик1 = 0;
359 | Счетчик2 = 0;
360 |
361 | Обработано1 = Новый Массив;
362 | Обработано2 = Новый Массив;
363 |
364 | Для ИндексБлока = 0 По ГраницаРезультата Цикл
365 | БлокРезультата = РезультатСравнения[ИндексБлока];
366 |
367 | СледИндекс = ИндексБлока + 1;
368 | ПредИндекс = ИндексБлока - 1;
369 |
370 | СледующийБлок = ?(СледИндекс <= ГраницаРезультата, РезультатСравнения[СледИндекс], Неопределено);
371 | ПредыдущийБлок = ?(ПредИндекс >= 0, РезультатСравнения[ПредИндекс], Неопределено);
372 |
373 | ПредКоличество = ?(ПредыдущийБлок = Неопределено, 0, ПредыдущийБлок.Строки1.Количество());
374 | СледКоличество = ?(СледующийБлок = Неопределено, 0, СледующийБлок.Строки2.Количество());
375 |
376 | Если БлокРезультата.Левый Тогда
377 | ПроверитьБлок = (НЕ СледующийБлок = Неопределено
378 | И НЕ СледующийБлок.Левый
379 | И СледующийБлок.Правый
380 | И СледКоличество > 0);
381 |
382 | Для Индекс1 = 0 По БлокРезультата.Строки1.ВГраница() Цикл
383 | Индекс = БлокРезультата.Строки1[Индекс1];
384 | Если Обработано1.Найти(Индекс) <> Неопределено Тогда
385 | Продолжить;
386 | КонецЕсли;
387 |
388 | Счетчик1 = Счетчик1 + 1;
389 |
390 | Строка1 = Форма.ДокументЛевый.Добавить();
391 | Строка1.НомерСтроки = Счетчик1;
392 | Строка1.Значение = БлокРезультата.Значения1[Индекс];
393 | Строка1.Знак = ?(БлокРезультата.Правый, "", "-");
394 | Строка1.Тип = ?(БлокРезультата.Правый, "", "Удалена");
395 | Строка1.КлючСтроки = СтрокаМетода.КлючСтроки;
396 |
397 | ДополнитьДанныеСтрокиДокумента(Строка1);
398 |
399 | Обработано1.Добавить(Индекс);
400 |
401 | ДобавитьПустую = НЕ ПроверитьБлок
402 | ИЛИ Индекс1 >= СледКоличество
403 | ИЛИ НЕ Обработано2.Найти(СледующийБлок.Строки2[Индекс1]) = Неопределено;
404 |
405 | Если НЕ БлокРезультата.Правый И ДобавитьПустую Тогда
406 | Строка2 = Форма.ДокументПравый.Добавить();
407 | Строка2.Тип = "Пустая";
408 | Строка2.КлючСтроки = СтрокаМетода.КлючСтроки;
409 | КонецЕсли;
410 | КонецЦикла;
411 | КонецЕсли;
412 |
413 | Если БлокРезультата.Правый Тогда
414 | ПроверитьБлок = (НЕ ПредыдущийБлок = Неопределено
415 | И ПредыдущийБлок.Левый
416 | И НЕ ПредыдущийБлок.Правый
417 | И ПредКоличество > 0);
418 |
419 | Для Индекс2 = 0 По БлокРезультата.Строки2.ВГраница() Цикл
420 | Индекс = БлокРезультата.Строки2[Индекс2];
421 | Если Обработано2.Найти(Индекс) <> Неопределено Тогда
422 | Строка1 = Форма.ДокументЛевый.Добавить();
423 | Строка1.Тип = "Пустая";
424 | КонецЕсли;
425 |
426 | ДобавитьПустую = НЕ ПроверитьБлок
427 | ИЛИ Индекс2 >= ПредКоличество
428 | ИЛИ Обработано1.Найти(ПредыдущийБлок.Строки1[Индекс2]) = Неопределено;
429 |
430 | Если НЕ БлокРезультата.Левый И ДобавитьПустую Тогда
431 | Строка1 = Форма.ДокументЛевый.Добавить();
432 | Строка1.Тип = "Пустая";
433 | Строка1.КлючСтроки = СтрокаМетода.КлючСтроки;
434 | КонецЕсли;
435 |
436 | Обработано2.Добавить(Индекс);
437 |
438 | Счетчик2 = Счетчик2 + 1;
439 |
440 | Строка2 = Форма.ДокументПравый.Добавить();
441 | Строка2.НомерСтроки = Счетчик2;
442 | Строка2.Значение = БлокРезультата.Значения2[Индекс];
443 | Строка2.Знак = ?(БлокРезультата.Левый, "", "+");
444 | Строка2.Тип = ?(БлокРезультата.Левый, "", "Добавлена");
445 | Строка2.КлючСтроки = СтрокаМетода.КлючСтроки;
446 |
447 | ДополнитьДанныеСтрокиДокумента(Строка2);
448 | КонецЦикла;
449 | КонецЕсли;
450 | КонецЦикла;
451 | КонецПроцедуры
452 |
453 | &НаКлиентеНаСервереБезКонтекста
454 | Процедура ДополнитьДанныеСтрокиДокумента(знач СтрокаТаблицы)
455 |
456 | СтрЗначение = СокрЛП(СтрокаТаблицы.Значение);
457 |
458 | СтрокаТаблицы.ЭтоКомментарий = СтрНачинаетсяС(СтрЗначение, "//");
459 | СтрокаТаблицы.ЭтоДиректива = СтрНачинаетсяС(СтрЗначение, "&") ИЛИ СтрНачинаетсяС(СтрЗначение, "#");
460 |
461 | КонецПроцедуры
462 |
463 | &НаКлиентеНаСервереБезКонтекста
464 | Процедура ПроверитьКлючСтроки(знач СтрокаТаблицы, знач ИмяПоля)
465 | Если ЗначениеЗаполнено(СтрокаТаблицы[ИмяПоля]) Тогда
466 | Возврат;
467 | КонецЕсли;
468 |
469 | СтрокаТаблицы[ИмяПоля] = Строка(Новый УникальныйИдентификатор);
470 | КонецПроцедуры
471 |
472 | &НаКлиентеНаСервереБезКонтекста
473 | Процедура ЗаполнитьСтрокуДиапазона(знач СтрокаТаблицы, знач ПолеПриемник, знач ПолеИсточник1, знач ПолеИсточник2)
474 | СтрокаТаблицы[ПолеПриемник] = СтрШаблон("%1 - %2",
475 | Формат(СтрокаТаблицы[ПолеИсточник1], "ЧН=0; ЧГ="),
476 | Формат(СтрокаТаблицы[ПолеИсточник2], "ЧН=0; ЧГ="));
477 | КонецПроцедуры
478 |
479 | &НаКлиентеНаСервереБезКонтекста
480 | Процедура ДобавитьПоляУсловногоОформления(Поля, знач СписокПолей = "") Экспорт
481 | ТипСписокПолей = ТипЗнч(СписокПолей);
482 | Если ТипСписокПолей = Тип("Строка") Тогда
483 | МассивПолей = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СписокПолей, ",", Истина, Истина);
484 | ИначеЕсли ТипСписокПолей = Тип("Массив") Тогда
485 | МассивПолей = СписокПолей;
486 | КонецЕсли;
487 |
488 | Для Каждого ИмяПоля Из МассивПолей Цикл
489 | Поле = Поля.Элементы.Добавить();
490 | Поле.Использование = Истина;
491 | Поле.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
492 | КонецЦикла;
493 | КонецПроцедуры
494 |
495 | &НаКлиентеНаСервереБезКонтекста
496 | Процедура ВывестиСостояниеОбработки(знач Параметры, знач Пояснение = "", знач Картинка = Неопределено)
497 | Параметры.Счетчик = Параметры.Счетчик + 1;
498 |
499 | ЗначПроцент = ?(Параметры.Количество = 0, 0, Параметры.Счетчик / Параметры.Количество) * 100;
500 | ЗначПроцент = Цел(ЗначПроцент);
501 |
502 | Если Параметры.Процент = ЗначПроцент Тогда
503 | Возврат;
504 | КонецЕсли;
505 |
506 | Параметры.Процент = ЗначПроцент;
507 |
508 | #Если Клиент Тогда
509 | Если ТипЗнч(Картинка) = Тип("Картинка") Тогда
510 | ЗначКартинка = Картинка;
511 | ИначеЕсли ТипЗнч(Параметры.Картинка) = Тип("Картинка") Тогда
512 | ЗначКартинка = Параметры.Картинка;
513 | Иначе
514 | ЗначКартинка = Неопределено;
515 | КонецЕсли;
516 |
517 | Состояние(Параметры.Заголовок, Параметры.Процент, Пояснение, ЗначКартинка);
518 | #КонецЕсли
519 | КонецПроцедуры
520 |
521 | &НаКлиентеНаСервереБезКонтекста
522 | Процедура ДобавитьДанныеМодуляВМассив(знач Массив, знач ДанныеМодуля)
523 | Индекс = Массив.ВГраница();
524 |
525 | Если Индекс = -1 Тогда // если массив пустой добавим в конец
526 | Массив.Добавить(ДанныеМодуля);
527 | ИначеЕсли Массив[0].НачСтрока > ДанныеМодуля.НачСтрока Тогда // если первая строка больше текущей вставим в начало
528 | Массив.Вставить(0, ДанныеМодуля);
529 | ИначеЕсли Массив[Индекс].НачСтрока < ДанныеМодуля.НачСтрока Тогда // если последняя строка меньше текущей добавим в конце
530 | Массив.Добавить(ДанныеМодуля);
531 | Иначе // найдем первую строку с меньшим начальным номером строки, вставим послее нее
532 | Пока Индекс >= 0 Цикл
533 | Если Массив[Индекс].НачСтрока < ДанныеМодуля.НачСтрока Тогда
534 | Массив.Вставить(Индекс + 1, ДанныеМодуля);
535 | Прервать;
536 | КонецЕсли;
537 |
538 | Индекс = Индекс - 1;
539 | КонецЦикла;
540 | КонецЕсли;
541 | КонецПроцедуры
542 |
543 | &НаКлиентеНаСервереБезКонтекста
544 | Функция ВыполнятьАнализСтроки(знач Строка)
545 | Возврат НЕ ПустаяСтрока(Строка)
546 | И НЕ СтрНачинаетсяС(Строка, "//");
547 | КонецФункции
548 |
549 | &НаКлиентеНаСервереБезКонтекста
550 | Функция ПодготовитьТекстМодуля(знач Текст)
551 | ЧислоСтрок = СтрЧислоСтрок(Текст);
552 | НРегТекст = НРег(Текст);
553 | НРегТекст = СтрЗаменить(НРегТекст, "'", """");
554 |
555 | НовыйТекст = Новый Массив;
556 | Для Индекс = 1 По ЧислоСтрок Цикл
557 | СтрокаМодуля = СтрПолучитьСтроку(НРегТекст, Индекс);
558 | ДлинаСтроки = СтрДлина(СтрокаМодуля);
559 | НоваяСтрока = "";
560 |
561 | // заменим ; на #
562 | СтрокаМодуля = СтрЗаменить(СтрокаМодуля, ";", "#");
563 |
564 | // если строка начинается с | значит это строковые символы
565 | Если СтрНачинаетсяС(СокрЛ(СтрокаМодуля), "|") Тогда
566 | НачПозиции = СтрНайти(СтрокаМодуля, "|");
567 | СтрокаМодуля = Лев(СтрокаМодуля, НачПозиции);
568 | Для НомерСимвола = НачПозиции + 1 По ДлинаСтроки Цикл
569 | СтрокаМодуля = СтрокаМодуля + "#";
570 | КонецЦикла;
571 | КонецЕсли;
572 |
573 | // забъем комментарии
574 | НачКомментарий = СтрНайти(СтрокаМодуля, "//");
575 | Если НачКомментарий > 0 Тогда
576 | СтрокаМодуля = Лев(СтрокаМодуля, НачКомментарий + 1);
577 | Для НомерСимвола = НачКомментарий + 2 По ДлинаСтроки Цикл
578 | СтрокаМодуля = СтрокаМодуля + "#";
579 | КонецЦикла;
580 | КонецЕсли;
581 |
582 | // забъем строки
583 | РазмерСтроки = СтрДлина(СтрокаМодуля);
584 | НачСтроки = СтрНайти(СтрокаМодуля, """");
585 | Пока НачСтроки > 0 Цикл
586 | Если НачСтроки >= РазмерСтроки Тогда
587 | Прервать;
588 | КонецЕсли;
589 |
590 | НачалоСтроки = Лев(СтрокаМодуля, НачСтроки - 1);
591 |
592 | КонСтроки = СтрНайти(СтрокаМодуля, """",, НачСтроки + 1);
593 | КонСтроки = ?(КонСтроки = 0, ДлинаСтроки, КонСтроки);
594 |
595 | Для НомерСимвола = НачСтроки По КонСтроки Цикл
596 | НачалоСтроки = НачалоСтроки + "#";
597 | КонецЦикла;
598 | СтрокаМодуля = НачалоСтроки + Сред(СтрокаМодуля, КонСтроки + 1);
599 |
600 | Если КонСтроки = ДлинаСтроки Тогда
601 | Прервать;
602 | КонецЕсли;
603 |
604 | НачСтроки = СтрНайти(СтрокаМодуля, """",, КонСтроки + 1);
605 | КонецЦикла;
606 |
607 | НовыйТекст.Добавить(СтрокаМодуля);
608 | КонецЦикла;
609 |
610 | Возврат СтрСоединить(НовыйТекст, Символы.ПС);
611 | КонецФункции
612 |
613 | &НаКлиентеНаСервереБезКонтекста
614 | Функция ПолучитьТекстМодуля(знач Форма, знач СтрокаТаблицы, знач Сторона, знач Подготовленный = Ложь)
615 | НачСтроки = СтрокаТаблицы["НачСтроки" + Сторона];
616 | КонСтроки = СтрокаТаблицы["КонСтроки" + Сторона];
617 |
618 | ТекстМодуля = Новый Массив;
619 | Для НомерСтроки = НачСтроки По КонСтроки Цикл
620 | Если Подготовленный Тогда
621 | СтрокаМодуля = СтрПолучитьСтроку(Форма["ТекстПодготовленный" + Сторона], НомерСтроки);
622 | Иначе
623 | СтрокаМодуля = СтрПолучитьСтроку(Форма["ТекстМодуля" + Сторона], НомерСтроки);
624 | КонецЕсли;
625 |
626 | ТекстМодуля.Добавить(СтрокаМодуля);
627 | КонецЦикла;
628 |
629 | Возврат СокрЛП(СтрСоединить(ТекстМодуля, Символы.ПС));
630 | КонецФункции
631 |
632 | &НаКлиентеНаСервереБезКонтекста
633 | Функция ПолучитьПараметрыСостояния(знач Заголовок, знач Количество, знач Картинка = Неопределено)
634 | Возврат Новый Структура("Заголовок,Счетчик,Процент,Количество,Картинка",
635 | Заголовок, 0, 0, Количество, Картинка);
636 | КонецФункции
637 |
638 | &НаКлиентеНаСервереБезКонтекста
639 | Функция НовыйПустойБлокМодуля(знач ПредыдущийБлок = Неопределено)
640 | ПутьКБлоку = "";
641 | КлючРодитель = "";
642 |
643 | Если ТипЗнч(ПредыдущийБлок) = Тип("Структура") Тогда
644 | ПутьКБлоку = ПредыдущийБлок.ПутьКБлоку
645 | + ?(ПустаяСтрока(ПредыдущийБлок.ПутьКБлоку), "", "/")
646 | + ПредыдущийБлок.ИмяБлока;
647 |
648 | КлючРодитель = ПредыдущийБлок.КлючБлока;
649 | КонецЕсли;
650 |
651 | ПустойБлок = Новый Структура;
652 | ПустойБлок.Вставить("КлючБлока" , Строка(Новый УникальныйИдентификатор));
653 | ПустойБлок.Вставить("КлючРодитель" , КлючРодитель);
654 |
655 | ПустойБлок.Вставить("Открыт" , Ложь);
656 | ПустойБлок.Вставить("НачИмяБлока" , "");
657 | ПустойБлок.Вставить("КонИмяБлока" , "");
658 | ПустойБлок.Вставить("ИмяБлока" , "");
659 | ПустойБлок.Вставить("ПутьКБлоку" , ПутьКБлоку);
660 | ПустойБлок.Вставить("НачСтроки" , 0);
661 | ПустойБлок.Вставить("НачПозиции" , 0);
662 |
663 | ПустойБлок.Вставить("ЭтоОбласть" , Ложь);
664 | ПустойБлок.Вставить("ЭтоМетод" , Ложь);
665 | ПустойБлок.Вставить("ЭтоОбластьМетода" , Ложь);
666 | ПустойБлок.Вставить("ЭтоАсинх" , Ложь);
667 |
668 | Возврат ПустойБлок;
669 | КонецФункции
670 |
671 | &НаКлиентеНаСервереБезКонтекста
672 | Функция ЭтоОкончаниеБлока(знач СтрокаАнализ, знач КонИмяБлока)
673 | ЭтоОкончание = Ложь;
674 |
675 | Если СтрНачинаетсяС(СтрокаАнализ, КонИмяБлока) Тогда
676 | СледСимвол = Сред(СтрокаАнализ, СтрДлина(КонИмяБлока) + 1, 1);
677 | КодЗначения = КодСимвола(СледСимвол, 1);
678 | Если СтроковыеФункцииКлиентСервер.ЭтоРазделительСлов(КодЗначения) Тогда
679 | ЭтоОкончание = Истина;
680 | КонецЕсли;
681 | ИначеЕсли СтрЗаканчиваетсяНа(СтрокаАнализ, КонИмяБлока) Тогда
682 | ПредСимвол = Сред(СтрокаАнализ, СтрДлина(СтрокаАнализ) - СтрДлина(КонИмяБлока) - 1, 1);
683 | КодЗначения = КодСимвола(ПредСимвол, 1);
684 | Если СтроковыеФункцииКлиентСервер.ЭтоРазделительСлов(КодЗначения) Тогда
685 | ЭтоОкончание = Истина;
686 | КонецЕсли;
687 | КонецЕсли;
688 |
689 | Возврат ЭтоОкончание;
690 | КонецФункции
691 |
692 | #КонецОбласти
693 |
694 | #Область СлужебныеПроцедурыИФункции_СтруктураМодуля
695 |
696 | &НаКлиенте
697 | Процедура ОбновитьСтруктуруМодуля()
698 |
699 | ЭтотОбъект.СтруктураМодуля.ПолучитьЭлементы().Очистить();
700 |
701 | КэшМетодов = Новый Соответствие;
702 | КэшРодителей = Новый Соответствие;
703 | КэшОбластей = Новый Соответствие;
704 |
705 | ВсеРодители = Новый Массив;
706 | ОбластиМетодов = Новый Массив;
707 | Для Каждого СтрокаОбласти Из ЭтотОбъект.Области Цикл
708 | Если НЕ ПустаяСтрока(СтрокаОбласти.КлючРодитель1) Тогда
709 | ВсеРодители.Добавить(СтрокаОбласти.КлючРодитель1);
710 | КонецЕсли;
711 |
712 | Если НЕ ПустаяСтрока(СтрокаОбласти.КлючРодитель2) Тогда
713 | ВсеРодители.Добавить(СтрокаОбласти.КлючРодитель2);
714 | КонецЕсли;
715 | КонецЦикла;
716 |
717 | БезОбластей = Новый Массив;
718 |
719 | ПараметрыСостояния = ПолучитьПараметрыСостояния(НСтр("ru='Анализ структуры методов'"), ЭтотОбъект.Методы.Количество());
720 | Для Каждого СтрокаМетода Из ЭтотОбъект.Методы Цикл
721 | ВывестиСостояниеОбработки(ПараметрыСостояния);
722 |
723 | ЗаполнитьСтрокиОбластей(ЭтотОбъект, СтрокаМетода);
724 |
725 | ЕстьОбласть1 = ЗначениеЗаполнено(СтрокаМетода.КлючОбласти1);
726 | ЕстьОбласть2 = ЗначениеЗаполнено(СтрокаМетода.КлючОбласти2);
727 |
728 | // Нет фильтра(0), Показывать отличия модулей(1), Показывать измененные(2), Показывать присутствующие только в Файл 1(3), Показывать присутствующие только в Файл 2(4), Показывать неизмененные(5)
729 |
730 | ЕстьИзменения = (СтрокаМетода.ЕстьОтличия ИЛИ НЕ ПустаяСтрока(СтрокаМетода.Знак1) ИЛИ НЕ ПустаяСтрока(СтрокаМетода.Знак2));
731 | ТолькоИзменение = (СтрокаМетода.ЕстьОтличия И ПустаяСтрока(СтрокаМетода.Знак1) И ПустаяСтрока(СтрокаМетода.Знак2));
732 |
733 | Если ЭтотОбъект.ФильтрДерева = 1 И НЕ ЕстьИзменения Тогда
734 | Продолжить;
735 | ИначеЕсли ЭтотОбъект.ФильтрДерева = 2 И НЕ ТолькоИзменение Тогда
736 | Продолжить;
737 | ИначеЕсли ЭтотОбъект.ФильтрДерева = 3 И НЕ СтрокаМетода.Знак1 = "-" Тогда
738 | Продолжить;
739 | ИначеЕсли ЭтотОбъект.ФильтрДерева = 4 И НЕ СтрокаМетода.Знак2 = "+" Тогда
740 | Продолжить;
741 | ИначеЕсли ЭтотОбъект.ФильтрДерева = 5 И ЕстьИзменения Тогда
742 | Продолжить;
743 | КонецЕсли;
744 |
745 | Если ЕстьОбласть1 Тогда
746 | МассивМетодов = КэшМетодов.Получить(СтрокаМетода.КлючОбласти1);
747 | Если МассивМетодов = Неопределено Тогда
748 | МассивМетодов = Новый Массив;
749 | КэшМетодов.Вставить(СтрокаМетода.КлючОбласти1, МассивМетодов);
750 | КонецЕсли;
751 |
752 | Если МассивМетодов.Найти(СтрокаМетода) = Неопределено Тогда
753 | МассивМетодов.Добавить(СтрокаМетода);
754 | КонецЕсли;
755 | КонецЕсли;
756 |
757 | Если ЕстьОбласть2 Тогда
758 | МассивМетодов = КэшМетодов.Получить(СтрокаМетода.КлючОбласти2);
759 | Если МассивМетодов = Неопределено Тогда
760 | МассивМетодов = Новый Массив;
761 | КэшМетодов.Вставить(СтрокаМетода.КлючОбласти2, МассивМетодов);
762 | КонецЕсли;
763 |
764 | Если МассивМетодов.Найти(СтрокаМетода) = Неопределено Тогда
765 | МассивМетодов.Добавить(СтрокаМетода);
766 | КонецЕсли;
767 | КонецЕсли;
768 |
769 | Если НЕ ЕстьОбласть1 И НЕ ЕстьОбласть2 Тогда
770 | БезОбластей.Добавить(СтрокаМетода);
771 | КонецЕсли;
772 | КонецЦикла;
773 |
774 | ПараметрыСостояния = ПолучитьПараметрыСостояния(НСтр("ru='Построение дерева методов'"), ЭтотОбъект.Области.Количество());
775 | Для Каждого СтрокаОбласти Из ЭтотОбъект.Области Цикл
776 | ВывестиСостояниеОбработки(ПараметрыСостояния);
777 |
778 | ЭтоРодитель = (ВсеРодители.Найти(СтрокаОбласти.КлючОбласти1) <> Неопределено
779 | ИЛИ ВсеРодители.Найти(СтрокаОбласти.КлючОбласти2) <> Неопределено);
780 |
781 | Если ЭтоРодитель Тогда
782 | КэшРодителей.Вставить(СтрокаОбласти.КлючОбласти1, СтрокаОбласти);
783 | КэшРодителей.Вставить(СтрокаОбласти.КлючОбласти2, СтрокаОбласти);
784 | КонецЕсли;
785 |
786 | МассивМетодов = КэшМетодов.Получить(СтрокаОбласти.КлючСтроки);
787 | Если НЕ ТипЗнч(МассивМетодов) = Тип("Массив") Тогда
788 | МассивМетодов = Новый Массив;
789 | КонецЕсли;
790 |
791 | Если МассивМетодов.Количество() = 0 И НЕ ЭтоРодитель Тогда
792 | Продолжить;
793 | КонецЕсли;
794 |
795 | Если ЭтотОбъект.ВидСтруктурыМодуля = 0 Тогда
796 | Если ЗначениеЗаполнено(СтрокаОбласти.КлючРодитель1) Тогда
797 | СтрокаОбластиРодитель = КэшРодителей.Получить(СтрокаОбласти.КлючРодитель1);
798 | ИначеЕсли ЗначениеЗаполнено(СтрокаОбласти.КлючРодитель2) Тогда
799 | СтрокаОбластиРодитель = КэшРодителей.Получить(СтрокаОбласти.КлючРодитель2);
800 | Иначе
801 | СтрокаОбластиРодитель = Неопределено;
802 | КонецЕсли;
803 |
804 | Если СтрокаОбластиРодитель <> Неопределено Тогда
805 | СтрокаРодитель = КэшОбластей.Получить(СтрокаОбластиРодитель.КлючСтроки);
806 | Иначе
807 | СтрокаРодитель = Неопределено;
808 | КонецЕсли;
809 |
810 | Если СтрокаРодитель = Неопределено Тогда
811 | СтрокаДерева = ЭтотОбъект.СтруктураМодуля.ПолучитьЭлементы().Добавить();
812 | Иначе
813 | СтрокаДерева = СтрокаРодитель.ПолучитьЭлементы().Добавить();
814 | КонецЕсли;
815 |
816 | СтрокаДерева.Идентификатор = СтрокаОбласти.ПолучитьИдентификатор();
817 | СтрокаДерева.Имя1 = СтрокаОбласти.ИмяОбласти1;
818 | СтрокаДерева.Знак1 = СтрокаОбласти.Знак1;
819 | СтрокаДерева.Строки1 = СтрокаОбласти.Строки1;
820 | СтрокаДерева.Имя2 = СтрокаОбласти.ИмяОбласти2;
821 | СтрокаДерева.Знак2 = СтрокаОбласти.Знак2;
822 | СтрокаДерева.Строки2 = СтрокаОбласти.Строки2;
823 | СтрокаДерева.ЭтоОбласть = Истина;
824 | СтрокаДерева.ЭтоМетод = Ложь;
825 |
826 | СтрокаДерева.КлючОбласти1 = СтрокаОбласти.КлючОбласти1;
827 | СтрокаДерева.КлючОбласти2 = СтрокаОбласти.КлючОбласти2;
828 | СтрокаДерева.КлючСтроки = СтрокаОбласти.КлючСтроки;
829 | Иначе
830 | СтрокаДерева = ЭтотОбъект.СтруктураМодуля;
831 | КонецЕсли;
832 |
833 | Для Каждого СтрокаМетода Из МассивМетодов Цикл
834 | СтрокаВложенная = СтрокаДерева.ПолучитьЭлементы().Добавить();
835 | ЗаполнитьСтрокуСтруктурыМодуляИзМетода(СтрокаВложенная, СтрокаМетода);
836 | КонецЦикла;
837 |
838 | КэшОбластей.Вставить(СтрокаОбласти.КлючСтроки, СтрокаДерева);
839 | КонецЦикла;
840 |
841 | Для Каждого СтрокаМетода Из БезОбластей Цикл
842 | СтрокаВложенная = ЭтотОбъект.СтруктураМодуля.ПолучитьЭлементы().Добавить();
843 | ЗаполнитьСтрокуСтруктурыМодуляИзМетода(СтрокаВложенная, СтрокаМетода);
844 | КонецЦикла;
845 |
846 | КонецПроцедуры
847 |
848 | &НаКлиентеНаСервереБезКонтекста
849 | Процедура ЗаполнитьСтрокуСтруктурыМодуляИзМетода(знач СтрокаВложенная, знач СтрокаМетода)
850 | СтрокаВложенная.Идентификатор = СтрокаМетода.ПолучитьИдентификатор();
851 |
852 | // файл 1
853 | СтрокаВложенная.Имя1 = СтрокаМетода.ИмяМетода1;
854 | СтрокаВложенная.Знак1 = СтрокаМетода.Знак1;
855 | СтрокаВложенная.Строки1 = СтрокаМетода.Строки1;
856 | СтрокаВложенная.КлючОбласти1 = СтрокаМетода.КлючОбласти1;
857 | СтрокаВложенная.ЭтоАсинх1 = СтрокаМетода.ЭтоАсинх1;
858 | СтрокаВложенная.ЭтоЭкспорт1 = СтрокаМетода.ЭтоЭкспорт1;
859 | СтрокаВложенная.ДирективаКомпиляции1 = СтрокаМетода.ДирективаКомпиляции1;
860 | Если НЕ ПустаяСтрока(СтрокаВложенная.Имя1) Тогда
861 | СтрокаВложенная.ТипМетода1 = ?(СтрокаМетода.ЭтоФункция1, "fn", "pr");
862 | КонецЕсли;
863 |
864 | // файл 2
865 | СтрокаВложенная.Имя2 = СтрокаМетода.ИмяМетода2;
866 | СтрокаВложенная.Знак2 = СтрокаМетода.Знак2;
867 | СтрокаВложенная.Строки2 = СтрокаМетода.Строки2;
868 | СтрокаВложенная.КлючОбласти2 = СтрокаМетода.КлючОбласти2;
869 | СтрокаВложенная.ЭтоАсинх2 = СтрокаМетода.ЭтоАсинх2;
870 | СтрокаВложенная.ЭтоЭкспорт2 = СтрокаМетода.ЭтоЭкспорт2;
871 | СтрокаВложенная.ДирективаКомпиляции2 = СтрокаМетода.ДирективаКомпиляции2;
872 | Если НЕ ПустаяСтрока(СтрокаВложенная.Имя1) Тогда
873 | СтрокаВложенная.ТипМетода2 = ?(СтрокаМетода.ЭтоФункция2, "fn", "pr");
874 | КонецЕсли;
875 |
876 | // общие реквизиты
877 | СтрокаВложенная.ЭтоОбласть = Ложь;
878 | СтрокаВложенная.ЭтоМетод = Истина;
879 | СтрокаВложенная.КлючСтроки = СтрокаМетода.КлючСтроки;
880 | СтрокаВложенная.ЕстьОтличия = СтрокаМетода.ЕстьОтличия;
881 |
882 | // изменения
883 | СтрокаВложенная.ОбластьИзменена = СтрокаВложенная.КлючОбласти1 <> СтрокаВложенная.КлючОбласти2;
884 | КонецПроцедуры
885 |
886 | &НаКлиентеНаСервереБезКонтекста
887 | Процедура ЗаполнитьСтрокиОбластей(знач Форма, знач СтрокаМетода)
888 | Н1 = СтрокаМетода.НачСтроки1;
889 | К1 = СтрокаМетода.КонСтроки1;
890 |
891 | Н2 = СтрокаМетода.НачСтроки2;
892 | К2 = СтрокаМетода.КонСтроки2;
893 |
894 | Область1 = Неопределено;
895 | Область2 = Неопределено;
896 | Для Каждого СтрокаОбласти Из Форма.Области Цикл
897 | Если Н1 >= СтрокаОбласти.НачСтроки1 И К1 <= СтрокаОбласти.КонСтроки1 Тогда
898 | Область1 = СтрокаОбласти;
899 | КонецЕсли;
900 |
901 | Если Н2 >= СтрокаОбласти.НачСтроки2 И К2 <= СтрокаОбласти.КонСтроки2 Тогда
902 | Область2 = СтрокаОбласти;
903 | КонецЕсли;
904 |
905 | Если Н1 < СтрокаОбласти.НачСтроки1 И Н2 < СтрокаОбласти.НачСтроки2 Тогда
906 | Прервать;
907 | КонецЕсли;
908 | КонецЦикла;
909 |
910 | СтрокаМетода.КлючОбласти1 = ?(Область1 = Неопределено, "", Область1.КлючСтроки);
911 | СтрокаМетода.КлючОбласти2 = ?(Область2 = Неопределено, "", Область2.КлючСтроки);
912 | КонецПроцедуры
913 |
914 | #КонецОбласти
915 |
916 | #Область СлужебныеПроцедурыИФункции_РаботаСФайлами
917 |
918 | &НаКлиенте
919 | Асинх Функция ВыбратьФайлМодуляАсинх()
920 |
921 | РезультатПодключения = Ждать ПодключитьРасширениеДляРаботыСФайлами();
922 | Если НЕ РезультатПодключения Тогда
923 | СообщитьОшибкуПодключенияРасширения(, Истина);
924 | Возврат "";
925 | КонецЕсли;
926 |
927 | ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
928 | ДиалогВыбора.Фильтр = ФильтрФайловМодульКонфигурации();
929 | ДиалогВыбора.Заголовок = НСтр("ru='Выберите файл с текстом модуля'");
930 | ДиалогВыбора.МножественныйВыбор = Ложь;
931 | ДиалогВыбора.ПроверятьСуществованиеФайла = Истина;
932 | Результат = Ждать ДиалогВыбора.ВыбратьАсинх();
933 | Если НЕ ТипЗнч(Результат) = Тип("Массив") Тогда
934 | Возврат "";
935 | КонецЕсли;
936 |
937 | Возврат Результат[0];
938 | КонецФункции
939 |
940 | &НаКлиенте
941 | Асинх Функция ПодключитьРасширениеДляРаботыСФайлами()
942 |
943 | #Если НЕ ВебКлиент Тогда
944 | Возврат Истина;
945 | #КонецЕсли
946 |
947 | РасширениеПодключено = Ждать ПодключитьРасширениеРаботыСФайламиАсинх();
948 | Если РасширениеПодключено Тогда
949 | Возврат Истина;
950 | КонецЕсли;
951 |
952 | Если ОбщегоНазначенияКлиент.ЭтоMacOSКлиент() Тогда
953 | ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Расширение для работы с файлами недоступно на MacOS.'"));
954 | Возврат Ложь;
955 | КонецЕсли;
956 |
957 | СписокКнопок = Новый СписокЗначений;
958 | СписокКнопок.Добавить(КодВозвратаДиалога.Да, НСтр("ru='Установить и продолжить'"));
959 | СписокКнопок.Добавить(КодВозвратаДиалога.Нет, НСтр("ru='Продолжить без установки'"));
960 | СписокКнопок.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru='Больше не напоминать'"));
961 |
962 | ТекстВопроса = НСтр("ru='Для удобной работы с программой предлагается установить расширение для работы с 1С:Предприятием.
963 | |Установить?'");
964 |
965 | ОтветПользователя = Ждать ВопросАсинх(ТекстВопроса,
966 | СписокКнопок,
967 | 30,
968 | КодВозвратаДиалога.Да,
969 | НСтр("ru='Установка расширения работы с файлами'"),
970 | КодВозвратаДиалога.Нет);
971 |
972 | Если ОтветПользователя = КодВозвратаДиалога.Да Тогда
973 |
974 | Ждать УстановитьРасширениеРаботыСФайламиАсинх();
975 |
976 | КонецЕсли;
977 |
978 | РасширениеПодключено = Ждать ПодключитьРасширениеРаботыСФайламиАсинх();
979 |
980 | Если РасширениеПодключено Тогда
981 | Возврат Истина;
982 | КонецЕсли;
983 |
984 | Возврат Ложь;
985 |
986 | КонецФункции
987 |
988 | &НаКлиенте
989 | Процедура СообщитьОшибкуПодключенияРасширения(знач КакСообщение = Ложь, знач КакИсключение = Ложь) Экспорт
990 | Текст = НСтр("ru='Для работы с файлами требуется подключить расширение (недоступно на MacOS).'");
991 | Если КакСообщение = Истина Тогда
992 | ОбщегоНазначенияКлиент.СообщитьПользователю(Текст);
993 | ИначеЕсли КакИсключение = Истина Тогда
994 | ВызватьИсключение Текст;
995 | Иначе
996 | ПоказатьПредупреждение(, Текст, 30);
997 | КонецЕсли;
998 | КонецПроцедуры
999 |
1000 | &НаКлиентеНаСервереБезКонтекста
1001 | Функция ФильтрФайловМодульКонфигурации()
1002 | Возврат НСтр("ru='1С файлы '") + "(*.bsl;*.os;*.txt)|*.bsl;*.os;*.txt";
1003 | КонецФункции
1004 |
1005 | #КонецОбласти
1006 |
1007 | #Область СлужебныеПроцедурыИФункции_ОбластиМетоды
1008 |
1009 | &НаКлиенте
1010 | Процедура ЗаполнитьТаблицыОбластейМетодов(знач ЗаполнитьОбласти = Истина, знач ЗаполнитьМетоды = Истина)
1011 | Массив1 = Новый Массив;
1012 | Массив2 = Новый Массив;
1013 |
1014 | ЗаполнитьМассивОбластейМетодов(ЭтотОбъект, Массив1, "1");
1015 | ЗаполнитьМассивОбластейМетодов(ЭтотОбъект, Массив2, "2");
1016 |
1017 | Если ЗаполнитьОбласти Тогда
1018 | ЗаполнитьТаблицуОбластей(Массив1, Массив2);
1019 | КонецЕсли;
1020 |
1021 | Если ЗаполнитьМетоды Тогда
1022 | ЗаполнитьТаблицуМетодов(Массив1, Массив2);
1023 | КонецЕсли;
1024 | КонецПроцедуры
1025 |
1026 | &НаКлиенте
1027 | Процедура ЗаполнитьТаблицуОбластей(знач Массив1, знач Массив2)
1028 | ЭтотОбъект.Области.Очистить();
1029 |
1030 | КэшСтроки = Новый Соответствие;
1031 |
1032 | ПараметрыСостояния = ПолучитьПараметрыСостояния(НСтр("ru='Заполнение областей'"), Массив1.Количество());
1033 | Для Каждого Значение Из Массив1 Цикл
1034 | ВывестиСостояниеОбработки(ПараметрыСостояния);
1035 |
1036 | Если НЕ Значение.ЭтоОбласть Тогда
1037 | Продолжить;
1038 | ИначеЕсли Значение.ЭтоОбластьМетода Тогда
1039 | Продолжить;
1040 | КонецЕсли;
1041 |
1042 | СтрокаТаблицы = ЭтотОбъект.Области.Добавить();
1043 | СтрокаТаблицы.КлючОбласти1 = Значение.КлючОбласти;
1044 | СтрокаТаблицы.КлючРодитель1 = Значение.КлючРодитель;
1045 | СтрокаТаблицы.ПолноеИмя1 = Значение.ПолноеИмя;
1046 | СтрокаТаблицы.ИмяОбласти1 = Значение.Имя;
1047 | СтрокаТаблицы.ИмяРодитель1 = Значение.ИмяРодитель;
1048 | СтрокаТаблицы.НачСтроки1 = Значение.НачСтрока;
1049 | СтрокаТаблицы.НачПозиции1 = Значение.НачПозиции;
1050 | СтрокаТаблицы.КонСтроки1 = Значение.КонСтрока;
1051 | СтрокаТаблицы.КонПозиции1 = Значение.КонПозиции;
1052 | СтрокаТаблицы.Знак1 = "-";
1053 |
1054 | ПроверитьКлючСтроки(СтрокаТаблицы, "КлючСтроки");
1055 | ЗаполнитьСтрокуДиапазона(СтрокаТаблицы, "Строки1", "НачСтроки1", "КонСтроки1");
1056 |
1057 | КлючИмени = СокрЛП(НРег(Значение.ПолноеИмя));
1058 | КэшСтроки.Вставить(КлючИмени, СтрокаТаблицы);
1059 | КонецЦикла;
1060 |
1061 | ПредИндекс = Неопределено;
1062 | ПараметрыСостояния = ПолучитьПараметрыСостояния(НСтр("ru='Сопоставление областей'"), Массив2.Количество());
1063 | Для Каждого Значение Из Массив2 Цикл
1064 | ВывестиСостояниеОбработки(ПараметрыСостояния);
1065 |
1066 | Если НЕ Значение.ЭтоОбласть Тогда
1067 | Продолжить;
1068 | ИначеЕсли Значение.ЭтоОбластьМетода Тогда
1069 | Продолжить;
1070 | КонецЕсли;
1071 |
1072 | КлючИмени = СокрЛП(НРег(Значение.ПолноеИмя));
1073 |
1074 | СтрокаТаблицы = КэшСтроки.Получить(КлючИмени);
1075 | Если СтрокаТаблицы = Неопределено Тогда
1076 | Если ПредИндекс = Неопределено Тогда
1077 | СтрокаТаблицы = ЭтотОбъект.Области.Добавить();
1078 | Иначе
1079 | СтрокаТаблицы = ЭтотОбъект.Области.Вставить(ПредИндекс + 1);
1080 | КонецЕсли;
1081 |
1082 | СтрокаТаблицы.Знак2 = "+";
1083 | Иначе
1084 | ПредИндекс = ЭтотОбъект.Области.Индекс(СтрокаТаблицы);
1085 |
1086 | СтрокаТаблицы.Знак1 = "";
1087 | КонецЕсли;
1088 |
1089 | СтрокаТаблицы.КлючОбласти2 = Значение.КлючОбласти;
1090 | СтрокаТаблицы.КлючРодитель2 = Значение.КлючРодитель;
1091 | СтрокаТаблицы.ПолноеИмя2 = Значение.ПолноеИмя;
1092 | СтрокаТаблицы.ИмяОбласти2 = Значение.Имя;
1093 | СтрокаТаблицы.ИмяРодитель2 = Значение.ИмяРодитель;
1094 | СтрокаТаблицы.НачСтроки2 = Значение.НачСтрока;
1095 | СтрокаТаблицы.НачПозиции2 = Значение.НачПозиции;
1096 | СтрокаТаблицы.КонСтроки2 = Значение.КонСтрока;
1097 | СтрокаТаблицы.КонПозиции2 = Значение.КонПозиции;
1098 |
1099 | ПроверитьКлючСтроки(СтрокаТаблицы, "КлючСтроки");
1100 | ЗаполнитьСтрокуДиапазона(СтрокаТаблицы, "Строки2", "НачСтроки2", "КонСтроки2");
1101 | КонецЦикла;
1102 | КонецПроцедуры
1103 |
1104 | &НаКлиенте
1105 | Процедура ЗаполнитьТаблицуМетодов(знач Массив1, знач Массив2)
1106 | ЭтотОбъект.Методы.Очистить();
1107 | ЭтотОбъект.ДокументЛевый.Очистить();
1108 | ЭтотОбъект.ДокументПравый.Очистить();
1109 |
1110 | КэшСтроки = Новый Соответствие;
1111 |
1112 | ПараметрыСостояния = ПолучитьПараметрыСостояния(НСтр("ru='Заполнение методов'"), Массив1.Количество());
1113 | Для Каждого Значение Из Массив1 Цикл
1114 | ВывестиСостояниеОбработки(ПараметрыСостояния);
1115 |
1116 | Если НЕ Значение.ЭтоМетод Тогда
1117 | Продолжить;
1118 | КонецЕсли;
1119 |
1120 | СтрокаТаблицы = ЭтотОбъект.Методы.Добавить();
1121 | СтрокаТаблицы.ИмяМетода1 = Значение.Имя;
1122 | СтрокаТаблицы.НачСтроки1 = Значение.НачСтрока;
1123 | СтрокаТаблицы.НачПозиции1 = Значение.НачПозиции;
1124 | СтрокаТаблицы.КонСтроки1 = Значение.КонСтрока;
1125 | СтрокаТаблицы.КонПозиции1 = Значение.КонПозиции;
1126 | СтрокаТаблицы.Знак1 = "-";
1127 | СтрокаТаблицы.ТекстМодуля1 = ПолучитьТекстМодуля(ЭтотОбъект, СтрокаТаблицы, "1");
1128 | СтрокаТаблицы.ЭтоФункция1 = Значение.ЭтоФункция;
1129 |
1130 | СтрокаТаблицы.ЭтоАсинх1 = Значение.ЭтоАсинх;
1131 | СтрокаТаблицы.ЭтоЭкспорт1 = Значение.ЭтоЭкспорт;
1132 | СтрокаТаблицы.ДирективаКомпиляции1 = Значение.ДирективаКомпиляции;
1133 |
1134 | СтрокаТаблицы.ЕстьОтличия = Истина;
1135 |
1136 | ПроверитьКлючСтроки(СтрокаТаблицы, "КлючСтроки");
1137 | ЗаполнитьСтрокуДиапазона(СтрокаТаблицы, "Строки1", "НачСтроки1", "КонСтроки1");
1138 |
1139 | КлючИмени = СокрЛП(НРег(Значение.Имя));
1140 | КэшСтроки.Вставить(КлючИмени, СтрокаТаблицы);
1141 | КонецЦикла;
1142 |
1143 | ПредИндекс = Неопределено;
1144 | ПараметрыСостояния = ПолучитьПараметрыСостояния(НСтр("ru='Сопоставление методов'"), Массив2.Количество());
1145 | Для Каждого Значение Из Массив2 Цикл
1146 | ВывестиСостояниеОбработки(ПараметрыСостояния);
1147 |
1148 | Если НЕ Значение.ЭтоМетод Тогда
1149 | Продолжить;
1150 | КонецЕсли;
1151 |
1152 | КлючИмени = СокрЛП(НРег(Значение.Имя));
1153 |
1154 | СтрокаТаблицы = КэшСтроки.Получить(КлючИмени);
1155 | Если СтрокаТаблицы = Неопределено Тогда
1156 | Если ПредИндекс = Неопределено Тогда
1157 | СтрокаТаблицы = ЭтотОбъект.Методы.Добавить();
1158 | Иначе
1159 | СтрокаТаблицы = ЭтотОбъект.Методы.Вставить(ПредИндекс + 1);
1160 | КонецЕсли;
1161 |
1162 | СтрокаТаблицы.Знак2 = "+";
1163 | Иначе
1164 | СтрокаТаблицы.Знак1 = "";
1165 | КонецЕсли;
1166 |
1167 | ПредИндекс = ЭтотОбъект.Методы.Индекс(СтрокаТаблицы);
1168 |
1169 | СтрокаТаблицы.ИмяМетода2 = Значение.Имя;
1170 | СтрокаТаблицы.НачСтроки2 = Значение.НачСтрока;
1171 | СтрокаТаблицы.НачПозиции2 = Значение.НачПозиции;
1172 | СтрокаТаблицы.КонСтроки2 = Значение.КонСтрока;
1173 | СтрокаТаблицы.КонПозиции2 = Значение.КонПозиции;
1174 | СтрокаТаблицы.ТекстМодуля2 = ПолучитьТекстМодуля(ЭтотОбъект, СтрокаТаблицы, "2");
1175 | СтрокаТаблицы.ЭтоФункция2 = Значение.ЭтоФункция;
1176 |
1177 | СтрокаТаблицы.ЭтоАсинх2 = Значение.ЭтоАсинх;
1178 | СтрокаТаблицы.ЭтоЭкспорт2 = Значение.ЭтоЭкспорт;
1179 | СтрокаТаблицы.ДирективаКомпиляции2 = Значение.ДирективаКомпиляции;
1180 |
1181 | ПроверитьКлючСтроки(СтрокаТаблицы, "КлючСтроки");
1182 | ЗаполнитьСтрокуДиапазона(СтрокаТаблицы, "Строки2", "НачСтроки2", "КонСтроки2");
1183 |
1184 | СтрокаТаблицы.ЕстьОтличия = (СтрокаТаблицы.ТекстМодуля1 <> СтрокаТаблицы.ТекстМодуля2);
1185 | СтрокаТаблицы.ТекстМодуля1 = "";
1186 | СтрокаТаблицы.ТекстМодуля2 = "";
1187 | КонецЦикла;
1188 | КонецПроцедуры
1189 |
1190 | &НаКлиентеНаСервереБезКонтекста
1191 | Процедура ЗаполнитьМассивОбластейМетодов(знач Форма, знач Массив, знач Сторона)
1192 | ТекстАнализ = Форма["ТекстПодготовленный" + Сторона];
1193 | ТекстМодуля = Форма["ТекстМодуля" + Сторона];
1194 |
1195 | ИменаБлоков = Новый Соответствие;
1196 | ИменаБлоков.Вставить("#область " , "#конецобласти");
1197 | ИменаБлоков.Вставить("#region " , "#endregion");
1198 | ИменаБлоков.Вставить("процедура " , "конецпроцедуры");
1199 | ИменаБлоков.Вставить("procedure " , "endprocedure");
1200 | ИменаБлоков.Вставить("функция " , "конецфункции");
1201 | ИменаБлоков.Вставить("function " , "endfunction");
1202 |
1203 | СтрКонецФункции = СтрРазделить("конецфункции,endfunction", ",");
1204 |
1205 | НачСтроки = 1;
1206 | КонСтроки = СтрЧислоСтрок(ТекстАнализ);
1207 | НачПозиции = 0;
1208 | КонПозиции = НачПозиции;
1209 |
1210 | ЗаголовокСостояния = СтрШаблон(НСтр("ru='Поиск областей и методов (файл %1)'"), Сторона);
1211 | ПараметрыСостояния = ПолучитьПараметрыСостояния(ЗаголовокСостояния, КонСтроки);
1212 |
1213 | ДанныеБлока = НовыйПустойБлокМодуля();
1214 | ОткрытыеБлоки = Новый Массив;
1215 |
1216 | Для НомерСтроки = НачСтроки По КонСтроки Цикл
1217 | #Если Клиент Тогда
1218 | ОбработкаПрерыванияПользователя();
1219 | #КонецЕсли
1220 |
1221 | ВывестиСостояниеОбработки(ПараметрыСостояния);
1222 |
1223 | СтрокаАнализ = СтрПолучитьСтроку(ТекстАнализ, НомерСтроки);
1224 | СтрокаМодуля = СтрПолучитьСтроку(ТекстМодуля, НомерСтроки);
1225 |
1226 | НачПозиции = КонПозиции;
1227 | КонПозиции = КонПозиции + СтрДлина(СтрокаАнализ);
1228 |
1229 | СтрокаАнализ = СокрЛП(СтрокаАнализ);
1230 | Если НЕ ВыполнятьАнализСтроки(СтрокаАнализ) Тогда
1231 | Продолжить;
1232 | КонецЕсли;
1233 |
1234 | ЭтоАсинх = Ложь;
1235 | Если СтрНачинаетсяС(СтрокаАнализ, "асинх ") Тогда
1236 | СтрокаАнализ = Сред(СтрокаАнализ, 7);
1237 | ЭтоАсинх = Истина;
1238 | КонецЕсли;
1239 |
1240 | Для Каждого КлючИЗначение Из ИменаБлоков Цикл
1241 | ИмяНачало = КлючИЗначение.Ключ;
1242 | ИмяКонец = КлючИЗначение.Значение;
1243 |
1244 | Если СтрНачинаетсяС(СтрокаАнализ, ИмяНачало) Тогда
1245 | ЭтоОбластьМетода = Ложь;
1246 |
1247 | Если ДанныеБлока.Открыт Тогда
1248 | ЭтоОбластьМетода = (ЭтоОбласть(ИмяНачало) И ДанныеБлока.ЭтоМетод);
1249 |
1250 | ДанныеБлока = НовыйПустойБлокМодуля(ДанныеБлока);
1251 | КонецЕсли;
1252 |
1253 | ДанныеБлока.Открыт = Истина;
1254 | ДанныеБлока.НачИмяБлока = ИмяНачало;
1255 | ДанныеБлока.КонИмяБлока = ИмяКонец;
1256 | ДанныеБлока.НачСтроки = НомерСтроки;
1257 | ДанныеБлока.НачПозиции = НачПозиции;
1258 |
1259 | ДанныеБлока.ЭтоАсинх = ЭтоАсинх;
1260 | ДанныеБлока.ЭтоОбласть = ЭтоОбласть(ИмяНачало);
1261 | ДанныеБлока.ЭтоМетод = ЭтоМетод(ИмяНачало);
1262 | ДанныеБлока.ЭтоОбластьМетода = ЭтоОбластьМетода;
1263 |
1264 | Если ДанныеБлока.ЭтоОбласть Тогда
1265 | ДанныеБлока.ИмяБлока = ВыделитьИмяОбласти(СтрокаМодуля, ИмяНачало);
1266 | ИначеЕсли ДанныеБлока.ЭтоМетод Тогда
1267 | ДанныеБлока.ИмяБлока = ВыделитьИмяМетода(СтрокаМодуля, ИмяНачало, ЭтоАсинх);
1268 | КонецЕсли;
1269 |
1270 | ОткрытыеБлоки.Добавить(ДанныеБлока);
1271 |
1272 | Прервать;
1273 | КонецЕсли;
1274 | КонецЦикла;
1275 |
1276 | Если ДанныеБлока.Открыт Тогда
1277 | Если ЭтоОкончаниеБлока(СтрокаАнализ, ДанныеБлока.КонИмяБлока) Тогда
1278 | ПолноеИмя = ДанныеБлока.ПутьКБлоку
1279 | + ?(ПустаяСтрока(ДанныеБлока.ПутьКБлоку), "", "/")
1280 | + ДанныеБлока.ИмяБлока;
1281 |
1282 | ДанныеМодуля = Новый Структура;
1283 | ДанныеМодуля.Вставить("Имя" , ДанныеБлока.ИмяБлока);
1284 | ДанныеМодуля.Вставить("КлючОбласти" , ДанныеБлока.КлючБлока);
1285 | ДанныеМодуля.Вставить("ИмяРодитель" , ДанныеБлока.ПутьКБлоку);
1286 | ДанныеМодуля.Вставить("КлючРодитель", ДанныеБлока.КлючРодитель);
1287 |
1288 | ДанныеМодуля.Вставить("ЭтоОбласть" , ДанныеБлока.ЭтоОбласть);
1289 | ДанныеМодуля.Вставить("ЭтоМетод" , ДанныеБлока.ЭтоМетод);
1290 | ДанныеМодуля.Вставить("ЭтоОбластьМетода" , ДанныеБлока.ЭтоОбластьМетода);
1291 |
1292 | ДанныеМодуля.Вставить("НачСтрока" , ДанныеБлока.НачСтроки);
1293 | ДанныеМодуля.Вставить("НачПозиции" , ДанныеБлока.НачПозиции);
1294 | ДанныеМодуля.Вставить("КонСтрока" , НомерСтроки);
1295 | ДанныеМодуля.Вставить("КонПозиции" , КонПозиции);
1296 | ДанныеМодуля.Вставить("ПолноеИмя" , ПолноеИмя);
1297 |
1298 | Если ДанныеБлока.ЭтоМетод Тогда
1299 | ЭтоФункция = (СтрКонецФункции.Найти(ДанныеБлока.КонИмяБлока) <> Неопределено);
1300 |
1301 | ДанныеМодуля.Вставить("ЭтоАсинх" , ЭтоАсинх);
1302 | ДанныеМодуля.Вставить("ЭтоФункция" , ЭтоФункция);
1303 |
1304 | ДополнитьДанныеМетода(ТекстМодуля, ТекстАнализ, ДанныеМодуля);
1305 | КонецЕсли;
1306 |
1307 | ДобавитьДанныеМодуляВМассив(Массив, ДанныеМодуля);
1308 |
1309 | ОткрытыеБлоки.Удалить(ОткрытыеБлоки.ВГраница());
1310 | Если ОткрытыеБлоки.Количество() > 0 Тогда
1311 | ДанныеБлока = ОткрытыеБлоки[ОткрытыеБлоки.ВГраница()];
1312 | Иначе
1313 | ДанныеБлока = НовыйПустойБлокМодуля();
1314 | КонецЕсли;
1315 | КонецЕсли;
1316 | КонецЕсли;
1317 | КонецЦикла;
1318 | КонецПроцедуры
1319 |
1320 | &НаКлиентеНаСервереБезКонтекста
1321 | Процедура ДополнитьДанныеМетода(знач ТекстМодуля, знач ТекстАнализ, знач ДанныеМетода)
1322 | ДанныеМетода.Вставить("ЭтоЭкспорт" , Ложь);
1323 | ДанныеМетода.Вставить("ДирективаКомпиляции", "");
1324 |
1325 | ПерваяСтрока = СтрПолучитьСтроку(ТекстАнализ, ДанныеМетода.НачСтрока);
1326 | ПерваяСтрока = СокрЛП(ПерваяСтрока);
1327 |
1328 | Если СтрЗаканчиваетсяНа(ПерваяСтрока, "экспорт") Тогда
1329 | ДанныеМетода.ЭтоЭкспорт = Истина;
1330 | КонецЕсли;
1331 |
1332 | Если ДанныеМетода.НачСтрока = 1 Тогда
1333 | Возврат;
1334 | КонецЕсли;
1335 |
1336 | // чтение директивы и комментария к процедуре
1337 | МассивКомментарий = Новый Массив;
1338 |
1339 | КонСтрока = ДанныеМетода.НачСтрока;
1340 | Для Индекс = 1 По КонСтрока Цикл
1341 | НомерСтроки = КонСтрока - Индекс;
1342 |
1343 | ПредыдущаяСтрока = СтрПолучитьСтроку(ТекстАнализ, НомерСтроки);
1344 | ПредыдущаяСтрока = СокрЛП(ПредыдущаяСтрока);
1345 |
1346 | ЭтоДиректива = СтрНачинаетсяС(ПредыдущаяСтрока, "&");
1347 | ЭтоКомментарий = СтрНачинаетсяС(ПредыдущаяСтрока, "//");
1348 |
1349 | Если НЕ ЭтоДиректива И НЕ ЭтоКомментарий Тогда
1350 | Прервать;
1351 | КонецЕсли;
1352 |
1353 | СтрокаМодуля = СтрПолучитьСтроку(ТекстМодуля, НомерСтроки);
1354 | Если ЭтоДиректива Тогда
1355 | ДанныеМетода.ДирективаКомпиляции = СтрокаМодуля;
1356 | КонецЕсли;
1357 |
1358 | ДанныеМетода.НачСтрока = НомерСтроки;
1359 | ДанныеМетода.НачПозиции = ДанныеМетода.НачПозиции - СтрДлина(СтрокаМодуля);
1360 | КонецЦикла;
1361 | КонецПроцедуры
1362 |
1363 | &НаКлиентеНаСервереБезКонтекста
1364 | Функция ЭтоОбласть(знач ИмяНачало)
1365 | Возврат СтрНайти("#область,#region", СокрЛП(ИмяНачало)) > 0;
1366 | КонецФункции
1367 |
1368 | &НаКлиентеНаСервереБезКонтекста
1369 | Функция ЭтоМетод(знач ИмяНачало)
1370 | Возврат СтрНайти("процедура,procedure,функция,function", СокрЛП(ИмяНачало)) > 0;
1371 | КонецФункции
1372 |
1373 | &НаКлиентеНаСервереБезКонтекста
1374 | Функция ВыделитьИмяОбласти(знач ТекстОбласти, знач ИмяБлока)
1375 | Текст = Сред(ТекстОбласти, СтрДлина(ИмяБлока) + 1);
1376 | Текст = СокрЛП(Текст);
1377 |
1378 | Для КонИмени = 1 По СтрДлина(Текст) Цикл
1379 | ЗначСимвол = КодСимвола(Текст, КонИмени);
1380 | Если СтроковыеФункцииКлиентСервер.ЭтоРазделительСлов(ЗначСимвол) Тогда
1381 | Прервать;
1382 | КонецЕсли;
1383 | КонецЦикла;
1384 |
1385 | Возврат СокрЛП(Лев(Текст, КонИмени));
1386 | КонецФункции
1387 |
1388 | &НаКлиентеНаСервереБезКонтекста
1389 | Функция ВыделитьИмяМетода(знач ТекстМетода, знач ИмяБлока, знач ЭтоАсинх)
1390 | Если ЭтоАсинх Тогда
1391 | ТекстМетода = Сред(ТекстМетода, 7);
1392 | КонецЕсли;
1393 |
1394 | Текст = Сред(ТекстМетода, СтрДлина(ИмяБлока) + 1);
1395 | Текст = СокрЛП(Текст);
1396 |
1397 | Для КонИмени = 1 По СтрДлина(Текст) Цикл
1398 | ЗначСимвол = КодСимвола(Текст, КонИмени);
1399 | Если СтроковыеФункцииКлиентСервер.ЭтоРазделительСлов(ЗначСимвол) Тогда
1400 | Прервать;
1401 | КонецЕсли;
1402 | КонецЦикла;
1403 |
1404 | Возврат СокрЛП(Лев(Текст, КонИмени - 1));
1405 | КонецФункции
1406 |
1407 | #КонецОбласти
1408 |
1409 | #Область СлужебныеПроцедурыИФункции_СравнениеТекстов
1410 |
1411 | // алгоритм основан на обработке Инфостарт
1412 | // https://infostart.ru/public/581384/
1413 | // Автор: Игорь Пашутин
1414 |
1415 | &НаКлиентеНаСервереБезКонтекста
1416 | Процедура ДополнитьРезультатСравненияСтроками(ДанныеСравнения, Результат)
1417 | Для Каждого Блок Из Результат Цикл
1418 | Блок.Вставить("Значения1", Новый Соответствие);
1419 | Блок.Вставить("Значения2", Новый Соответствие);
1420 |
1421 | Для Каждого Индекс Из Блок.Строки1 Цикл
1422 | Блок.Значения1.Вставить(Индекс, ДанныеСравнения.Файл1[Индекс].Текст);
1423 | КонецЦикла;
1424 |
1425 | Для Каждого Индекс Из Блок.Строки2 Цикл
1426 | Блок.Значения2.Вставить(Индекс, ДанныеСравнения.Файл2[Индекс].Текст);
1427 | КонецЦикла;
1428 | КонецЦикла;
1429 | КонецПроцедуры
1430 |
1431 | &НаКлиентеНаСервереБезКонтекста
1432 | Процедура ДобавитьРезультатСравнения(БлокРезультата, Позиция, Сч1, Сч2)
1433 |
1434 | Если БлокРезультата.Левый Тогда
1435 | БлокРезультата.Строки1.Добавить(Сч1);
1436 | Сч1 = Сч1 + 1;
1437 | КонецЕсли;
1438 |
1439 | Если БлокРезультата.Правый Тогда
1440 | БлокРезультата.Строки2.Добавить(Сч2);
1441 | Сч2 = Сч2 + 1;
1442 | КонецЕсли;
1443 |
1444 | Позиция = Позиция + 1;
1445 |
1446 | КонецПроцедуры
1447 |
1448 | &НаКлиентеНаСервереБезКонтекста
1449 | Функция ДобавитьБлокРезультатаСравнения(Результат, Тип, Позиция, Сч1, Сч2)
1450 | Структура = Новый Структура;
1451 | Структура.Вставить("Левый" , СтрНайти(Тип, "Левый") > 0);
1452 | Структура.Вставить("Правый" , СтрНайти(Тип, "Правый") > 0);
1453 | Структура.Вставить("Позиция" , Позиция);
1454 | Структура.Вставить("Строки1" , Новый Массив);
1455 | Структура.Вставить("Строки2" , Новый Массив);
1456 |
1457 | Если Структура.Левый Тогда
1458 | Структура.Строки1.Добавить(Сч1);
1459 | Сч1 = Сч1 + 1;
1460 | КонецЕсли;
1461 |
1462 | Если Структура.Правый Тогда
1463 | Структура.Строки2.Добавить(Сч2);
1464 | Сч2 = Сч2 + 1;
1465 | КонецЕсли;
1466 |
1467 | Позиция = Позиция + 1;
1468 |
1469 | Результат.Добавить(Структура);
1470 |
1471 | Возврат Структура;
1472 | КонецФункции
1473 |
1474 | &НаКлиентеНаСервереБезКонтекста
1475 | Функция ПолучитьРезультатСравнения(ДанныеСравнения, Последовательность)
1476 | Результат = Новый Массив;
1477 |
1478 | Сч1 = 0;
1479 | Сч2 = 0;
1480 | ПозицияСортировки = 0;
1481 |
1482 | КолПоследовательность = Последовательность.Количество();
1483 | КоличествоХеш1 = ДанныеСравнения.Хеш1.Количество();
1484 | КоличествоХеш2 = ДанныеСравнения.Хеш2.Количество();
1485 |
1486 | ПозицияСоответствия = 0;
1487 | Пока ПозицияСоответствия < КолПоследовательность Цикл
1488 | #Если Клиент Тогда
1489 | ОбработкаПрерыванияПользователя();
1490 | #КонецЕсли
1491 |
1492 | // левый блок
1493 | Если Последовательность[ПозицияСоответствия].Сч1 > Сч1 Тогда
1494 | БлокРезультата = ДобавитьБлокРезультатаСравнения(Результат,
1495 | "Левый", ПозицияСортировки, Сч1, Сч2);
1496 |
1497 | Пока Последовательность[ПозицияСоответствия].Сч1 > Сч1 Цикл
1498 | ДобавитьРезультатСравнения(БлокРезультата, ПозицияСортировки, Сч1, Сч2);
1499 | КонецЦикла;
1500 | КонецЕсли;
1501 |
1502 | // правый блок
1503 | Если Последовательность[ПозицияСоответствия].Сч2 > Сч2 Тогда
1504 | БлокРезультата = ДобавитьБлокРезультатаСравнения(Результат,
1505 | "Правый", ПозицияСортировки, Сч1, Сч2);
1506 |
1507 | Пока Последовательность[ПозицияСоответствия].Сч2 > Сч2 Цикл
1508 | ДобавитьРезультатСравнения(БлокРезультата, ПозицияСортировки, Сч1, Сч2);
1509 | КонецЦикла;
1510 | КонецЕсли;
1511 |
1512 | // с обеих сторон
1513 | БлокРезультата = ДобавитьБлокРезультатаСравнения(Результат,
1514 | "ЛевыйПравый", ПозицияСортировки, Сч1, Сч2);
1515 |
1516 | Пока ПозицияСоответствия < КолПоследовательность-1
1517 | И Последовательность[ПозицияСоответствия + 1].Сч1 = Сч1
1518 | И Последовательность[ПозицияСоответствия + 1].Сч2 = Сч2 Цикл
1519 |
1520 | ДобавитьРезультатСравнения(БлокРезультата, ПозицияСортировки, Сч1, Сч2);
1521 | ПозицияСоответствия = ПозицияСоответствия + 1;
1522 |
1523 | КонецЦикла;
1524 |
1525 | ПозицияСоответствия = ПозицияСоответствия + 1;
1526 | КонецЦикла;
1527 |
1528 | Если Сч1 < КоличествоХеш1 Тогда
1529 | БлокРезультата = ДобавитьБлокРезультатаСравнения(Результат,
1530 | "Левый", ПозицияСортировки, Сч1, Сч2);
1531 |
1532 | Пока Сч1 < КоличествоХеш1 Цикл
1533 | ДобавитьРезультатСравнения(БлокРезультата, ПозицияСортировки, Сч1, Сч2);
1534 | КонецЦикла;
1535 | КонецЕсли;
1536 |
1537 | Если Сч2 < КоличествоХеш2 Тогда
1538 | БлокРезультата = ДобавитьБлокРезультатаСравнения(Результат,
1539 | "Правый", ПозицияСортировки, Сч1, Сч2);
1540 |
1541 | Пока Сч2 < КоличествоХеш2 Цикл
1542 | ДобавитьРезультатСравнения(БлокРезультата, ПозицияСортировки, Сч1, Сч2);
1543 | КонецЦикла;
1544 | КонецЕсли;
1545 |
1546 | ДополнитьРезультатСравненияСтроками(ДанныеСравнения, Результат);
1547 |
1548 | Возврат Результат;
1549 | КонецФункции
1550 |
1551 | &НаКлиентеНаСервереБезКонтекста
1552 | Функция ПодготовитьДанныеСравненияНаКлиенте(знач Форма, знач СтрокаМетода)
1553 | ТекстАнализ1 = ПолучитьТекстМодуля(Форма, СтрокаМетода, "1", Истина);
1554 | ТекстАнализ2 = ПолучитьТекстМодуля(Форма, СтрокаМетода, "2", Истина);
1555 |
1556 | ТекстМодуля1 = ПолучитьТекстМодуля(Форма, СтрокаМетода, "1", Ложь);
1557 | ТекстМодуля2 = ПолучитьТекстМодуля(Форма, СтрокаМетода, "2", Ложь);
1558 |
1559 | Результат = Новый Структура("Файл1,Файл2,Хеш1,Хеш2",
1560 | Новый Массив,
1561 | Новый Массив,
1562 | Новый Массив,
1563 | Новый Массив);
1564 |
1565 | КэшСтрок = Новый Соответствие;
1566 |
1567 | Для Индекс = 1 По СтрЧислоСтрок(ТекстАнализ1) Цикл
1568 | Структура = Новый Структура("Хеш,Значение,Текст");
1569 | Структура.Текст = СтрПолучитьСтроку(ТекстМодуля1, Индекс);
1570 | Структура.Значение = ПодготовитьСтрокуДляСравнения(Структура.Текст);
1571 | Структура.Хеш = НомерСтрокиВКэше(КэшСтрок, Структура.Значение);
1572 |
1573 | Результат.Файл1.Добавить(Структура);
1574 | Результат.Хеш1.Добавить(Структура.Хеш);
1575 | КонецЦикла;
1576 |
1577 | Для Индекс = 1 По СтрЧислоСтрок(ТекстАнализ2) Цикл
1578 | Структура = Новый Структура("Хеш,Значение,Текст");
1579 | Структура.Текст = СтрПолучитьСтроку(ТекстМодуля2, Индекс);
1580 | Структура.Значение = ПодготовитьСтрокуДляСравнения(Структура.Текст);
1581 | Структура.Хеш = НомерСтрокиВКэше(КэшСтрок, Структура.Значение);
1582 |
1583 | Результат.Файл2.Добавить(Структура);
1584 | Результат.Хеш2.Добавить(Структура.Хеш);
1585 | КонецЦикла;
1586 |
1587 | Возврат Результат;
1588 | КонецФункции
1589 |
1590 | &НаКлиентеНаСервереБезКонтекста
1591 | Функция ПодготовитьСтрокуДляСравнения(знач Строка)
1592 | Строка = СокрЛП(Строка);
1593 | Строка = НРег(Строка);
1594 | Если СтрНачинаетсяС(Строка, "|") И НЕ СтрЗаканчиваетсяНа(Строка, ",") Тогда
1595 | Строка = Строка + ",";
1596 | КонецЕсли;
1597 |
1598 | Возврат Строка;
1599 | КонецФункции
1600 |
1601 | &НаКлиентеНаСервереБезКонтекста
1602 | Функция Сравнить(М1, И1, М2, И2) Возврат М1[И1] = М2[И2] КонецФункции
1603 |
1604 | &НаКлиентеНаСервереБезКонтекста
1605 | Функция СравнитьПоКлючу(М1, И1, М2, И2, Ключ) Возврат М1[И1][Ключ] = М2[И2][Ключ] КонецФункции
1606 |
1607 | &НаКлиентеНаСервереБезКонтекста
1608 | Функция ПодготовитьДанныеИзмененияПоследовательности(ДанныеСравнения)
1609 | М1 = ДанныеСравнения.Хеш1;
1610 | М2 = ДанныеСравнения.Хеш2;
1611 |
1612 | Ф1 = ДанныеСравнения.Файл1;
1613 | Ф2 = ДанныеСравнения.Файл2;
1614 |
1615 | Количество1 = М1.Количество();
1616 | Количество2 = М2.Количество();
1617 |
1618 | // инициализация
1619 | Результат = Новый Массив(Количество2 + 1, Количество1 + 1);
1620 | Результат[0][0] = 0;
1621 |
1622 | // границы
1623 | БылоСовпадение = 0;
1624 | Для Сч = 1 По Количество1 Цикл Если Сравнить(М1, Сч-1, М2, 0) Тогда БылоСовпадение = 1; КонецЕсли; Результат[0][Сч] = 0; Результат[1][Сч] = БылоСовпадение; КонецЦикла;
1625 |
1626 | БылоСовпадение = 0;
1627 | Для Сч = 1 По Количество2 Цикл Если Сравнить(М1, 0, М2, Сч-1) Тогда БылоСовпадение = 1; КонецЕсли; Результат[Сч][0] = 0; Результат[Сч][1] = БылоСовпадение; КонецЦикла;
1628 |
1629 | // остальная таблица
1630 | Для Сч1 = 2 По Количество1 Цикл Для Сч2 = 2 По Количество2 Цикл Если Сравнить(М1, Сч1-1, М2, Сч2-1) И СравнитьПоКлючу(Ф1, Сч1-1, Ф2, Сч2-1, "Хеш") Тогда Результат[Сч2][Сч1] = Результат[Сч2-1][Сч1-1] + 1; Иначе Результат[Сч2][Сч1] = Макс(Результат[Сч2-1][Сч1], Результат[Сч2][Сч1-1]); КонецЕсли; КонецЦикла; КонецЦикла;
1631 |
1632 | Возврат Результат;
1633 | КонецФункции
1634 |
1635 | &НаКлиентеНаСервереБезКонтекста
1636 | Функция ВосстановитьПодпоследовательность(ДанныеСравнения, ДанныеИзменения)
1637 | Результат = Новый Массив;
1638 |
1639 | М1 = ДанныеСравнения.Хеш1;
1640 | М2 = ДанныеСравнения.Хеш2;
1641 |
1642 | Сч1 = М1.Количество();
1643 | Сч2 = М2.Количество();
1644 |
1645 | Пока Сч1 > 0 И Сч2 > 0 Цикл
1646 | Если Сравнить(М1, Сч1-1, М2, Сч2-1) Тогда
1647 | Структура = Новый Структура("Сч1,Сч2", Сч1-1, Сч2-1);
1648 | Результат.Добавить(Структура);
1649 |
1650 | Сч1 = Структура.Сч1;
1651 | Сч2 = Структура.Сч2;
1652 | Иначе
1653 | Если ДанныеИзменения[Сч2-1][Сч1] = ДанныеИзменения[Сч2][Сч1] Тогда
1654 | Сч2 = Сч2 - 1;
1655 | Иначе
1656 | Сч1 = Сч1 - 1;
1657 | КонецЕсли;
1658 | КонецЕсли;
1659 | КонецЦикла;
1660 |
1661 | Возврат УпорядочитьПоследовательностьНаСервере(Результат);
1662 | КонецФункции
1663 |
1664 | &НаКлиентеНаСервереБезКонтекста
1665 | Функция НайтиНаибольшуюПодпоследовательность(ДанныеСравнения)
1666 | ДанныеИзменения = ПодготовитьДанныеИзмененияПоследовательности(ДанныеСравнения);
1667 | Возврат ВосстановитьПодпоследовательность(ДанныеСравнения, ДанныеИзменения);
1668 | КонецФункции
1669 |
1670 | &НаСервереБезКонтекста
1671 | Функция УпорядочитьПоследовательностьНаСервере(знач Массив)
1672 | Таблица = Новый ТаблицаЗначений;
1673 | Таблица.Колонки.Добавить("Сч1", ОбщегоНазначения.ОписаниеТипаЧисло(10));
1674 | Таблица.Колонки.Добавить("Сч2", ОбщегоНазначения.ОписаниеТипаЧисло(10));
1675 |
1676 | Для Каждого Значение Из Массив Цикл
1677 | ЗаполнитьЗначенияСвойств(Таблица.Добавить(), Значение);
1678 | КонецЦикла;
1679 |
1680 | Таблица.Сортировать("Сч1,Сч2");
1681 |
1682 | Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив(Таблица);
1683 | КонецФункции
1684 |
1685 | &НаКлиентеНаСервереБезКонтекста
1686 | Функция НомерСтрокиВКэше(знач Кэш, знач Значение)
1687 | НомерСтроки = Кэш.Получить(Значение);
1688 | Если НомерСтроки = Неопределено Тогда
1689 | НомерСтроки = Кэш.Количество();
1690 | Кэш.Вставить(Значение, НомерСтроки);
1691 | КонецЕсли;
1692 |
1693 | Возврат НомерСтроки;
1694 | КонецФункции
1695 |
1696 | #КонецОбласти
1697 |
1698 |
--------------------------------------------------------------------------------