├── .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 | ![Платформа 1С](https://img.shields.io/badge/1с_platform-8.3.20.1838-yellow.svg) 4 | [![GitHub release](https://img.shields.io/github/release/vandalsvq/1c_code_diff.svg)](https://github.com/vandalsvq/1c_code_diff/releases) 5 | 6 | Обработка предназначеня для сравнения кода в режиме 1С:Предприятие без использования внешних компонент. 7 | 8 | ![Главное окно](imgs/main.png) 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 |
4 | 5 | Форма 6 | 7 | 8 | ru 9 | Форма 10 | 11 | 12 | 13 | Managed 14 | false 15 | 16 | PlatformApplication 17 | MobilePlatformApplication 18 | 19 | 20 | 21 |
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 | --------------------------------------------------------------------------------