1
0
mirror of https://github.com/bia-technologies/precommit4onec.git synced 2024-11-28 08:48:45 +02:00

Merge branch 'feature/canonical' into develop

This commit is contained in:
Maxmov Valery 2019-09-30 13:40:38 +03:00
commit d4822fc731
6 changed files with 573 additions and 4 deletions

View File

@ -46,7 +46,7 @@
- `ПроверкаКорректностиОбластей` - выполняет проверку на корректность скобок областей: `на парность` и `перед окончание области должно быть ее определение`
- `ПроверкаДублейПроцедурИФункций` - выполняет поиск одинаковых названий процедур и функций в модуле.
- `ОтключениеПолнотекстовогоПоиска` - По умолчанию отключает полнотекстовый поиск в файлах описания метаданных. Имеет настройку для исключения файлов из обработки. Для исключения необходимо указать относительный путь в репозитории до файла описания метаданного. Можно выключать из обработки отдельные реквизиты метаданного, для этого надо задать массив реквизитов в конфигурационном файле.
- `ИсправлениеНеКаноническогоНаписания` - Проверяет модули на каноничность написания ключевых слов и исправляет найденное
## Изменение настроек
precommit4onec может читать настройки своей работы из специального конфигурационного файла.

View File

@ -146,4 +146,70 @@
"""
И я фиксирую изменения в репозитории "РабочийКаталог" с комментарием "demo коммит"
Тогда Файл "\src\Документ.mdo" в рабочем каталоге содержит "fullTextSearch>Use<"
И Файл "\src\Документ.xml" в рабочем каталоге не содержит "FullTextSearch>Use<"
И Файл "\src\Документ.xml" в рабочем каталоге не содержит "FullTextSearch>Use<"
Сценарий: Прекоммит, анализируя исходники исправляет неканоничкое написание ключевых слов на каноническое
Когда Я копирую файл "tests\fixtures\ИсправлениеНеКаноническогоНаписания.bsl" в каталог репозитория "РабочийКаталог"
И я выполняю команду "git" с параметрами "add --all"
И я выполняю команду "git" с параметрами "commit -m addFile"
Тогда Вывод команды "git" содержит """
ИНФОРМАЦИЯ - В строке 5 найдено ключевое слово '#область' заменено на '#Область'
ИНФОРМАЦИЯ - В строке 7 найдено ключевое слово 'ПЕРЕМ' заменено на 'Перем'
ИНФОРМАЦИЯ - В строке 8 найдено ключевое слово 'перем' заменено на 'Перем'
ИНФОРМАЦИЯ - В строке 14 найдено ключевое слово '#КонецОБласти' заменено на '#КонецОбласти'
ИНФОРМАЦИЯ - В строке 16 найдено ключевое слово '&НаКлиентенаСервере' заменено на '&НаКлиентеНаСервере'
ИНФОРМАЦИЯ - В строке 17 найдено ключевое слово 'ПРоцедура' заменено на 'Процедура'
ИНФОРМАЦИЯ - В строке 18 найдено ключевое слово 'конецпроцедуры' заменено на 'КонецПроцедуры'
ИНФОРМАЦИЯ - В строке 20 найдено ключевое слово '&Насервере' заменено на '&НаСервере'
ИНФОРМАЦИЯ - В строке 21 найдено ключевое слово 'процедура' заменено на 'Процедура'
ИНФОРМАЦИЯ - В строке 24 найдено ключевое слово '&Наклиенте' заменено на '&НаКлиенте'
ИНФОРМАЦИЯ - В строке 25 найдено ключевое слово 'функция' заменено на 'Функция'
ИНФОРМАЦИЯ - В строке 26 найдено ключевое слово '#если' заменено на '#Если'
ИНФОРМАЦИЯ - В строке 26 найдено ключевое слово '#тогда' заменено на '#Тогда'
ИНФОРМАЦИЯ - В строке 26 найдено ключевое слово 'КлиенТ' заменено на 'Клиент'
ИНФОРМАЦИЯ - В строке 26 найдено ключевое слово 'сервер' заменено на 'Сервер'
ИНФОРМАЦИЯ - В строке 27 найдено ключевое слово 'перейти' заменено на 'Перейти'
ИНФОРМАЦИЯ - В строке 28 найдено ключевое слово '#Конецесли' заменено на '#КонецЕсли'
ИНФОРМАЦИЯ - В строке 30 найдено ключевое слово 'если' заменено на 'Если'
ИНФОРМАЦИЯ - В строке 30 найдено ключевое слово 'тогда' заменено на 'Тогда'
ИНФОРМАЦИЯ - В строке 30 найдено ключевое слово 'иначе' заменено на 'Иначе'
ИНФОРМАЦИЯ - В строке 30 найдено ключевое слово 'конецесли' заменено на 'КонецЕсли'
ИНФОРМАЦИЯ - В строке 30 найдено ключевое слово 'возврат' заменено на 'Возврат'
ИНФОРМАЦИЯ - В строке 30 найдено ключевое слово 'и' заменено на 'И'
ИНФОРМАЦИЯ - В строке 30 найдено ключевое слово 'не' заменено на 'НЕ'
ИНФОРМАЦИЯ - В строке 30 найдено ключевое слово 'истина' заменено на 'Истина'
ИНФОРМАЦИЯ - В строке 30 найдено ключевое слово 'ложь' заменено на 'Ложь'
ИНФОРМАЦИЯ - В строке 30 найдено ключевое слово 'НеОпределено' заменено на 'Неопределено'
ИНФОРМАЦИЯ - В строке 30 найдено ключевое слово 'null' заменено на 'NULL'
ИНФОРМАЦИЯ - В строке 32 найдено ключевое слово 'цикл' заменено на 'Цикл'
ИНФОРМАЦИЯ - В строке 32 найдено ключевое слово 'пока' заменено на 'Пока'
ИНФОРМАЦИЯ - В строке 33 найдено ключевое слово 'прервать' заменено на 'Прервать'
ИНФОРМАЦИЯ - В строке 34 найдено ключевое слово 'конеццикла' заменено на 'КонецЦикла'
ИНФОРМАЦИЯ - В строке 38 найдено ключевое слово 'иначеЕсли' заменено на 'ИначеЕсли'
ИНФОРМАЦИЯ - В строке 39 найдено ключевое слово 'попытка' заменено на 'Попытка'
ИНФОРМАЦИЯ - В строке 40 найдено ключевое слово 'новый' заменено на 'Новый'
ИНФОРМАЦИЯ - В строке 41 найдено ключевое слово 'исключение' заменено на 'Исключение'
ИНФОРМАЦИЯ - В строке 42 найдено ключевое слово 'вызватьИсключение' заменено на 'ВызватьИсключение'
ИНФОРМАЦИЯ - В строке 43 найдено ключевое слово 'конецпопытки' заменено на 'КонецПопытки'
ИНФОРМАЦИЯ - В строке 47 найдено ключевое слово 'ТолстыйКлиентОбычноеприложение' заменено на 'ТолстыйКлиентОбычноеПриложение'
ИНФОРМАЦИЯ - В строке 47 найдено ключевое слово 'толстыйКлиентУправляемоеПриложение' заменено на 'ТолстыйКлиентУправляемоеПриложение'
ИНФОРМАЦИЯ - В строке 47 найдено ключевое слово 'Тонкийклиент' заменено на 'ТонкийКлиент'
ИНФОРМАЦИЯ - В строке 47 найдено ключевое слово 'вебклиент' заменено на 'ВебКлиент'
ИНФОРМАЦИЯ - В строке 47 найдено ключевое слово 'и' заменено на 'И'
ИНФОРМАЦИЯ - В строке 47 найдено ключевое слово 'не' заменено на 'НЕ'
ИНФОРМАЦИЯ - В строке 51 найдено ключевое слово 'для' заменено на 'Для'
ИНФОРМАЦИЯ - В строке 51 найдено ключевое слово 'каждого' заменено на 'Каждого'
ИНФОРМАЦИЯ - В строке 51 найдено ключевое слово 'из' заменено на 'Из'
ИНФОРМАЦИЯ - В строке 52 найдено ключевое слово 'выполнить' заменено на 'Выполнить'
ИНФОРМАЦИЯ - В строке 55 найдено ключевое слово 'по' заменено на 'По'
ИНФОРМАЦИЯ - В строке 58 найдено ключевое слово 'добавитьОбработчик' заменено на 'ДобавитьОбработчик'
ИНФОРМАЦИЯ - В строке 58 найдено ключевое слово 'Удалитьобработчик' заменено на 'УдалитьОбработчик'
ИНФОРМАЦИЯ - В строке 59 найдено ключевое слово 'истина' заменено на 'Истина'
ИНФОРМАЦИЯ - В строке 59 найдено ключевое слово 'истина' заменено на 'Истина'
ИНФОРМАЦИЯ - В строке 59 найдено ключевое слово 'истина' заменено на 'Истина'
ИНФОРМАЦИЯ - В строке 59 найдено ключевое слово 'ложь' заменено на 'Ложь'
ИНФОРМАЦИЯ - В строке 60 найдено ключевое слово 'конецфункции' заменено на 'КонецФункции'
ИНФОРМАЦИЯ - В строке 62 найдено ключевое слово '&НасерверебезКонтекста' заменено на '&НаСервереБезКонтекста'
ИНФОРМАЦИЯ - В строке 68 найдено ключевое слово '&наКлиентеНаСервереБезКонтекста' заменено на '&НаКлиентеНаСервереБезКонтекста'
ИНФОРМАЦИЯ - В строке 72 найдено ключевое слово '&наКлиентенаСервере' заменено на '&НаКлиентеНаСервере'
"""

View File

@ -0,0 +1,388 @@
///////////////////////////////////////////////////////////////////////////////
//
// Служебный модуль с реализацией сценариев обработки файлов
// <ИсправлениеНеКаноническогоНаписания>
//
///////////////////////////////////////////////////////////////////////////////
Перем Лог;
// ИмяСценария
// Возвращает имя сценария обработки файлов
//
// Возвращаемое значение:
// Строка - Имя текущего сценария обработки файлов
//
Функция ИмяСценария() Экспорт
Возврат "ИсправлениеНеКаноническогоНаписания";
КонецФункции // ИмяСценария()
// ОбработатьФайл
// Выполняет обработку файла
//
// Параметры:
// АнализируемыйФайл - Файл - Файл из журнала git для анализа
// КаталогИсходныхФайлов - Строка - Каталог расположения исходных файлов относительно каталог репозитория
// ДополнительныеПараметры - Структура - Набор дополнительных параметров, которые можно использовать
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
// Булево - Признак выполненной обработки файла
//
Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт
Лог = ДополнительныеПараметры.Лог;
Если АнализируемыйФайл.Существует() И ТипыФайлов.ЭтоФайлИсходников(АнализируемыйФайл) Тогда
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
Если ИсправитьНаКаноническоеНаписание(АнализируемыйФайл.ПолноеИмя) Тогда
ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя);
КонецЕсли;
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции // ОбработатьФайл()
Функция ИсправитьНаКаноническоеНаписание(Знач ИмяФайла)
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
Если Не ЗначениеЗаполнено(СодержимоеФайла) Тогда
Возврат Ложь;
КонецЕсли;
Эталоны = Эталоны();
КлючевыеСлова = КлючевыеСлова(Эталоны);
РазбираемоеСодержимоеФайла = СтрЗаменить(СодержимоеФайла, """""", "***ЗАМЕНА_ДВОЙНЫХ_КАВЫЧЕК***");
РазбираемоеСодержимоеФайла = СтрЗаменить(РазбираемоеСодержимоеФайла, "://", "***ЗАМЕНА_ЧАСТИ_URL***"); // например, URLСтрока = "http://my.domain.com"
НовоеСодержимоеФайла = Новый ТекстовыйДокумент;
ТекстРазбора = Новый ТекстовыйДокумент;
ТекстРазбора.УстановитьТекст(РазбираемоеСодержимоеФайла);
ВсегоСтрок = ТекстРазбора.КоличествоСтрок();
СтрокаОткрыта = Ложь;
// символы, которые будут использоваться для нормализации строки
ЗаменяемыеСимволы = "; = ( ) , " + Символы.Таб;
ЗаменяемыеСимволы = СтрРазделить(ЗаменяемыеСимволы, " ", Истина);
// Построчная проверка
Для Ит = 1 По ВсегоСтрок Цикл
СтрокаМодуля = ТекстРазбора.ПолучитьСтроку(Ит);
// оставим строки, которые обрабатывать не нужно
Если ПустаяСтрока(СтрокаМодуля)
ИЛИ СтрНачинаетсяС(СокрЛ(СтрокаМодуля), "//") Тогда
ДобавитьСтрокуСодержимого(НовоеСодержимоеФайла, СтрокаМодуля);
Продолжить;
КонецЕсли;
НоваяСтрокаМодуля = СтрокаМодуля;
Если НЕ СтрокаОткрыта Тогда
НоваяСтрокаМодуля = УдалитьКомИКавИзСтроки(НоваяСтрокаМодуля);
КонецЕсли;
// Вырезаем часть строки в кавычках
ПоследняяПозиция = 0;
ПозицияКавычек = СтрНайти(НоваяСтрокаМодуля, """");
НоваяСтрокаМодуля = ВырезатьТекстВКавычках(НоваяСтрокаМодуля, ПозицияКавычек, ПоследняяПозиция, СтрокаОткрыта);
// ничего интересного не осталось
Если СтрокаОткрыта И ПозицияКавычек = 0
ИЛИ ПустаяСтрока(НоваяСтрокаМодуля) Тогда
ДобавитьСтрокуСодержимого(НовоеСодержимоеФайла, СтрокаМодуля);
Продолжить;
КонецЕсли;
// Проверяем правильное использование каждого ключевого слова
ВРегНоваяСтрокаМодуля = НормализоватьСтроку(НоваяСтрокаМодуля, ЗаменяемыеСимволы);
ДлинаСтроки = СтрДлина(ВРегНоваяСтрокаМодуля);
Для Каждого ЭлементТаблицы Из КлючевыеСлова Цикл
Эталон = ЭлементТаблицы.Наименование;
ПозицияЭталона = СтрНайти(ВРегНоваяСтрокаМодуля, " " + Эталон + " ");
Если НЕ ПозицияЭталона Тогда
Продолжить;
КонецЕсли;
ДлинаЭталона = СтрДлина(Эталон);
// Нашли ключевое слово, проверяем каноническое написание
Пока ПозицияЭталона > 0 Цикл
СтартоваяПозиция = ПозицияЭталона - 1;
Написание = СокрЛП(Сред(СтрокаМодуля, ПозицияЭталона, ДлинаЭталона));
Если Эталоны.Найти(Написание) = Неопределено Тогда // Ключевое слово написано не канонически
СтрокаМодуля = Лев(СтрокаМодуля, СтартоваяПозиция)
+ ЭлементТаблицы.Значение
+ Сред(СтрокаМодуля, СтартоваяПозиция + ДлинаЭталона + 1);
СтрокаСообщения = СтрШаблон("В строке %1 найдено ключевое слово '%2' заменено на '%3'",
Ит, Написание, ЭлементТаблицы.Значение);
Лог.Информация(СтрокаСообщения);
КонецЕсли;
ПозицияЭталона = СтрНайти(ВРегНоваяСтрокаМодуля, " " + Эталон + " ", , ПозицияЭталона + ДлинаЭталона);
КонецЦикла;
КонецЦикла;
ДобавитьСтрокуСодержимого(НовоеСодержимоеФайла, СтрокаМодуля);
КонецЦикла;
Если НовоеСодержимоеФайла.ПолучитьТекст() <> СодержимоеФайла Тогда
ФайловыеОперации.ЗаписатьТекстФайла(ИмяФайла, НовоеСодержимоеФайла.ПолучитьТекст());
Возврат Истина; // переиндексируем
КонецЕсли;
Возврат Ложь;
КонецФункции
Функция НормализоватьСтроку(Знач Строка, ЗаменяемыеСимволы)
Строка = " " + ВРег(Строка) + " ";
Для Каждого Символ Из ЗаменяемыеСимволы Цикл
Строка = СтрЗаменить(Строка, Символ, " ");
КонецЦикла;
Возврат Строка;
КонецФункции
Процедура ДобавитьСтрокуСодержимого(НовоеСодержимоеФайла, Знач СтрокаМодуля)
СтрокаМодуля = СтрЗаменить(СтрокаМодуля, "***ЗАМЕНА_ДВОЙНЫХ_КАВЫЧЕК***", """""");
СтрокаМодуля = СтрЗаменить(СтрокаМодуля, "***ЗАМЕНА_ЧАСТИ_URL***", "://");
НовоеСодержимоеФайла.ДобавитьСтроку(СтрокаМодуля);
КонецПроцедуры
Функция ВырезатьТекстВКавычках(Знач СтрокаМодуля, ПозицияКавычек, ПоследняяПозиция, СтрокаОткрыта)
Пока ПозицияКавычек > 0 Цикл
Если СтрокаОткрыта Тогда
// кавычки закрывают строку, вырезаем часть в кавычках
СтрокаМодуляВКавычках = Сред(СтрокаМодуля, ПозицияКавычек + 1);
СтрокаМодуля = Лев(СтрокаМодуля, ПоследняяПозиция - 1)
+ ДополнитьСтроку("", ПозицияКавычек - ПоследняяПозиция + 1, " ")
+ СтрокаМодуляВКавычках;
СтрокаОткрыта = Ложь;
ПоследняяПозиция = 0;
Иначе
// позиция кавычек начинают строку
ПоследняяПозиция = ПозицияКавычек;
СтрокаОткрыта = Истина;
СтрокаМодуля = Лев(СтрокаМодуля, ПозицияКавычек - 1) + " " + Сред(СтрокаМодуля, ПозицияКавычек + 1);
КонецЕсли;
ПозицияКавычек = Найти(СтрокаМодуля, """");
КонецЦикла;
Возврат СтрокаМодуля;
КонецФункции
Функция УдалитьКомИКавИзСтроки(Знач СтрокаМодуля)
ПозицияКомментария = СтрНайти(СтрокаМодуля, "//");
Если ПозицияКомментария > 0 Тогда // есть комментарий
ДлинаСтроки = СтрДлина(СтрокаМодуля);
ПозицияКавычек = СтрНайти(СтрокаМодуля, """");
Если ПозицияКавычек = 0 // нет кавычек, удаляем комментарий
ИЛИ ПозицияКавычек > ПозицияКомментария Тогда // кавычки после комментария, удаляем комментарий
СтрокаМодуля = ДополнитьСтроку(Лев(СтрокаМодуля, ПозицияКомментария - 1), ДлинаСтроки, " ", "Справа");
Иначе
КоличествоКавычекДоКомментария = СтрЧислоВхождений(Лев(СтрокаМодуля, ПозицияКомментария), """");
Если КоличествоКавычекДоКомментария % 2 = 0 Тогда // строка открывается и закрывается до комментария, удаляем комментарий
СтрокаМодуля = ДополнитьСтроку(Лев(СтрокаМодуля, ПозицияКомментария - 1), ДлинаСтроки, " ", "Справа");
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат СтрокаМодуля;
КонецФункции
Функция КлючевыеСлова(Эталоны)
КлючевыеСлова = Новый ТаблицаЗначений;
КлючевыеСлова.Колонки.Добавить("Наименование");
КлючевыеСлова.Колонки.Добавить("Значение");
Для Каждого Эталон Из Эталоны Цикл
Если КлючевыеСлова.НайтиСтроки(Новый Структура("Наименование", ВРег(Эталон))).Количество() = 0 Тогда
СтрокаТаблицы = КлючевыеСлова.Добавить();
СтрокаТаблицы.Наименование = ВРег(Эталон);
СтрокаТаблицы.Значение = Эталон;
КонецЕсли;
КонецЦикла;
Возврат КлючевыеСлова;
КонецФункции
Функция Эталоны()
Эталоны = Новый Массив;
Эталоны.Добавить("Если");
Эталоны.Добавить("#Если");
Эталоны.Добавить("Тогда");
Эталоны.Добавить("#Тогда");
Эталоны.Добавить("Иначе");
Эталоны.Добавить("#Иначе");
Эталоны.Добавить("ИначеЕсли");
Эталоны.Добавить("#ИначеЕсли");
Эталоны.Добавить("КонецЕсли");
Эталоны.Добавить("#КонецЕсли");
Эталоны.Добавить("#Область");
Эталоны.Добавить("#КонецОбласти");
Эталоны.Добавить("Клиент");
Эталоны.Добавить("НаКлиенте");
Эталоны.Добавить("НаСервере");
Эталоны.Добавить("ТолстыйКлиентОбычноеПриложение");
Эталоны.Добавить("ТолстыйКлиентУправляемоеПриложение");
Эталоны.Добавить("Сервер");
Эталоны.Добавить("ВнешнееСоединение");
Эталоны.Добавить("ТонкийКлиент");
Эталоны.Добавить("ВебКлиент");
Эталоны.Добавить("&НаКлиенте");
Эталоны.Добавить("&НаСервере");
Эталоны.Добавить("&НаСервереБезКонтекста");
Эталоны.Добавить("&НаКлиентеНаСервереБезКонтекста");
Эталоны.Добавить("&НаКлиентеНаСервере");
Эталоны.Добавить("Для");
Эталоны.Добавить("Каждого");
Эталоны.Добавить("Цикл");
Эталоны.Добавить("КонецЦикла");
Эталоны.Добавить("Выполнить");
Эталоны.Добавить("По");
Эталоны.Добавить("Прервать");
Эталоны.Добавить("Продолжить");
Эталоны.Добавить("Из");
Эталоны.Добавить("Новый");
Эталоны.Добавить("Перейти");
Эталоны.Добавить("Перем");
Эталоны.Добавить("Пока");
Эталоны.Добавить("Попытка");
Эталоны.Добавить("Исключение");
Эталоны.Добавить("КонецПопытки");
Эталоны.Добавить("ВызватьИсключение");
Эталоны.Добавить("Процедура");
Эталоны.Добавить("КонецПроцедуры");
Эталоны.Добавить("Функция");
Эталоны.Добавить("КонецФункции");
Эталоны.Добавить("Возврат");
Эталоны.Добавить("ДобавитьОбработчик");
Эталоны.Добавить("УдалитьОбработчик");
Эталоны.Добавить("И");
Эталоны.Добавить("ИЛИ");
Эталоны.Добавить("НЕ");
Эталоны.Добавить("Или");
Эталоны.Добавить("Не");
Эталоны.Добавить("Истина");
Эталоны.Добавить("ИСТИНА");
Эталоны.Добавить("Ложь");
Эталоны.Добавить("ЛОЖЬ");
Эталоны.Добавить("Знач");
Эталоны.Добавить("ЗНАЧ");
Эталоны.Добавить("Неопределено");
Эталоны.Добавить("НЕОПРЕДЕЛЕНО");
Эталоны.Добавить("NULL");
Эталоны.Добавить("Null");
Возврат Эталоны;
КонецФункции
// перенесено из строковых ф-ий ибо там ошибка
Функция СформироватьСтрокуСимволов(Знач Символ, Знач ДлинаСтроки)
Результат = "";
Для Счетчик = 1 По ДлинаСтроки Цикл
Результат = Результат + Символ;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ДополнитьСтроку(Знач Строка, Знач ДлинаСтроки, Знач Символ = "0", Знач Режим = "Слева")
// Длина символа не должна превышать единицы.
Символ = Лев(Символ, 1);
КоличествоСимволовНадоДобавить = ДлинаСтроки - СтрДлина(Строка);
Если КоличествоСимволовНадоДобавить > 0 Тогда
СтрокаДляДобавления = СформироватьСтрокуСимволов(Символ, КоличествоСимволовНадоДобавить);
Если ВРег(Режим) = "СЛЕВА" Тогда
Строка = СтрокаДляДобавления + Строка;
ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда
Строка = Строка + СтрокаДляДобавления;
КонецЕсли;
КонецЕсли;
Возврат Строка;
КонецФункции

View File

@ -0,0 +1,74 @@
#Область ХорошихПеременных
Перем пер1
#КонецОбласти
#область ПлохихПеременных
ПЕРЕМ пер1;
перем пер3;
//ПEрем пер4
// ПEрем пер5
Перем пер6; //если тут будет текст его не заменит
#КонецОБласти
&НаКлиентенаСервере
ПРоцедура тест()
конецпроцедуры
&Насервере
процедура СКомментарием() // Комментарий
КонецПроцедуры
&Наклиенте
функция ТестовыйУжас(ЗНАЧ пар)
#если КлиенТ ИЛИ сервер #тогда
перейти МеткаВыход :
#Конецесли
если истина тогда Сообщить(не(ложь и null=НеОпределено)); возврат Неопределено; иначе конецесли;
пока п1 = п2 цикл // если тогда иначе конецесли;
прервать;
конеццикла;
Если ИСТИНА Тогда
Сообщить();
иначеЕсли ЛОЖЬ Тогда
попытка
Переменная1 = новый Массив;
исключение
вызватьИсключение "сложно набирать такой код"
конецпопытки;
КонецЕсли;
#Если НЕ вебклиент и не Тонкийклиент ИЛИ ТолстыйКлиентОбычноеприложение ИЛИ толстыйКлиентУправляемоеПриложение ИЛИ ВнешнееСоединение
#КонецЕсли
для каждого Элемент из Переменная1 Цикл
выполнить("Сообщить(""Привет"")");
КонецЦикла;
Для i = 1 по 10 Цикл
КонецЦикла;
Соообщить("тут пример однострочника");добавитьОбработчик Накладная.ПриЗаписи Обработка.ПриЗаписиДокумента;Удалитьобработчик Накладная.ПриЗаписи, Обработка.ПриЗаписиДокумента;
Возврат ?(истина=истина,ложь,истина);
конецфункции
&НасерверебезКонтекста
Процедура тест(Пар1,
Пар2,
ЗНАЧ пар3)// Комментарий
КонецПроцедуры
&наКлиентеНаСервереБезКонтекста
Процедура тест() // Комментарий
КонецПроцедуры
&наКлиентенаСервере
Процедура тест() // Комментарий
КонецПроцедуры

View File

@ -21,7 +21,8 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийРазбораОтчетовОбработокРасширенийИмеетМетодПолученияНастроек");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийОтключенияПолнотекстовогоПоискаВозвращаетНастройки");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийРазбораОтчетовОбработокРасширенийВозвращаетНастройки");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияИсправляетФайл");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияНеИндексируетНеизмененные");
Возврат ВсеТесты;
КонецФункции
@ -44,6 +45,33 @@
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияИсправляетФайл() Экспорт
ОбъектСценария = ПолучитьСценарий("ИсправлениеНеКаноническогоНаписания.os");
ИмяФайла = "ИсправлениеНеКаноническогоНаписания.bsl";
Файл = ПодготовитьИзменяемыйТестовыйФайл(ИмяФайла);
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
Ожидаем.Что(Результат, Истина).ЭтоИстина();
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияНеИндексируетНеизмененные() Экспорт
ОбъектСценария = ПолучитьСценарий("ИсправлениеНеКаноническогоНаписания.os");
ИмяФайла = "ИсправлениеНеКаноническогоНаписания.bsl";
Файл = ПодготовитьИзменяемыйТестовыйФайл(ИмяФайла);
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
ДопНастройки = ПолучитьДополнительныеНастройки();
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ДопНастройки);
Ожидаем.Что(ДопНастройки.ИзмененныеКаталоги.Количество(), Истина).Равно(0);
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСценарийОтключенияПолнотекстовогоПоискаИмеетМетодПолученияНастроек() Экспорт
ОбъектСценария = ПолучитьСценарий("ОтключениеПолнотекстовогоПоиска.os");
@ -184,8 +212,20 @@
Функция ПолучитьДополнительныеНастройки()
УправлениеНастройками = Новый НастройкиРепозитория(ТекущийКаталог());
ДополнительныеНастройки = Новый Структура("Лог, УправлениеНастройками", Лог, УправлениеНастройками);
ДополнительныеНастройки = Новый Структура("Лог, УправлениеНастройками, ИзмененныеКаталоги",
Лог, УправлениеНастройками, Новый Массив);
Возврат ДополнительныеНастройки;
КонецФункции
Функция ПодготовитьИзменяемыйТестовыйФайл(Знач ИмяТестовогоФайла)
ПутьКТесту = ОбъединитьПути(КаталогТестовыхФикстур(), ИмяТестовогоФайла);
ПутьКФайлу = МенеджерВременныхФайлов.СоздатьФайл(ИмяТестовогоФайла);
КопироватьФайл(ПутьКТесту, ПутьКФайлу);
Файл = Новый Файл(ПутьКФайлу);
Возврат Файл;
КонецФункции

View File

@ -5,6 +5,7 @@
"ГлобальныеСценарии": [
"ДобавлениеПробеловПередКлючевымиСловами.os",
"ЗапретИспользованияПерейти.os",
"ИсправлениеНеКаноническогоНаписания.os",
"КорректировкаXMLФорм.os",
"ОтключениеПолнотекстовогоПоиска.os",
"ПроверкаДублейПроцедурИФункций.os",