Для поиска данных в программе наберите слово или словосочетание, нажмите Найти.
+
Поисковая фраза сохраняется и при последующих поисках программа выводит список ранее введенных поисковых фраз.
+
Поиск может осуществляться по одному и нескольким словам. В строке ввода допускается использование поисковых операторов типа И, ИЛИ, НЕ и т.д. Можно использовать и другие поисковые операторы, а также проводить поиск по части слова.
+
В окне результатов поиска выводятся объекты, в которых содержится поисковая фраза или слово и краткое описание объекта. Поисковая фраза или слово подсвечивается. Из окна результатов поиска, выбрав объект, можно открыть его.
+
С помощью кнопок и можно перелистывать страницы результатов поиска.
Ограничение области поиска
+
Если найдено большое количество информации, для увеличения точности результатов можно ограничить Область поиска.
+
Например, можно искать данные, которые относятся только к ключевым операциям замера производительности.
+
Область поиска настраивается по ссылке, расположенной под строкой поиска. По умолчанию ссылка принимает значение Везде.
+
Нажмите на ссылку, для того чтобы изменить настройки.
Ошибки поиска и методы исправления
+
+
Если данные не найдены, программа выдает сообщение об ошибке. Пути исправления ошибки:
+
+
Проверьте поисковое выражение. Доработайте его при необходимости, исправьте ошибки по рекомендациям программы.
+
+
Возможно, выбрана не та Область поиска. Попробуйте ее убрать или изменить с помощью соответствующей ссылки.
+
+
Возможно, индекс полнотекстового поиска давно не обновлялся. Проконтролируйте его состояние, при необходимости нажмите Обновить индекс.
+ | Воспользуйтесь поиском по началу слова.
+ | Используйте звездочку (*) в качестве окончания.
+ | Например, поиск стро* найдет все документы, которые содержат слова, начинающиеся на стро -
+ | Журнал ""Строительство и ремонт"", ""ООО СтройКомплект"" и.т.д.
+ |
+ |
+ | Воспользуйтесь нечетким поиском.
+ | Используйте решетку (#).
+ | Например, Ромашка#2 найдет все документы, содержащие такие слова, которые отличаются от слова
+ | Ромашка на одну или две буквы.
+ |
Упростите запрос, исключив из него какое-либо слово.
'");
+
+ ИначеЕсли КодОшибки = "СлишкомМногоРезультатов" Тогда
+
+ Если Не ИскатьВРазделах Или Не УказаныОбластиПоиска Тогда
+
+ РекомендацияОбластиПоискаHTML =
+ НСтр("ru = '
Уточните область поиска.
+ |Попробуйте выбрать область поиска, задав точный раздел или список.
'");
+ КонецЕсли;
+
+ КонецЕсли;
+
+ РекомендацииHTML = СтрЗаменить(РекомендацииHTML, "%РекомендацияОбластиПоиска%", РекомендацияОбластиПоискаHTML);
+ РекомендацииHTML = СтрЗаменить(РекомендацииHTML, "%РекомендацияТекстЗапроса%", РекомендацияТекстЗапросаHTML);
+
+ Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСтраницы, ОписаниеОшибки, РекомендацииHTML);
+
+КонецФункции
+
+&НаКлиентеНаСервереБезКонтекста
+Функция ПредставлениеСостоянияПоиска(КонтейнерСостояний)
+
+ СостояниеПоиска = КонтейнерСостояний.СостояниеПоиска;
+
+ Если СостояниеПоиска = "ПоискРазрешен" Тогда
+ Представление = "";
+ ИначеЕсли СостояниеПоиска = "ВыполняетсяОбновлениеИндекса"
+ Или СостояниеПоиска = "ВыполняетсяСлияниеИндекса"
+ Или СостояниеПоиска = "ТребуетсяОбновлениеИндекса" Тогда
+
+ Представление = НСтр("ru = 'Результаты поиска могут быть неточными, повторите поиск позднее.'");
+ ИначеЕсли СостояниеПоиска = "ОшибкаНастройкиПоиска" Тогда
+
+ // Для не администратора
+ Представление = НСтр("ru = 'Полнотекстовый поиск не настроен, обратитесь к администратору.'");
+
+ ИначеЕсли СостояниеПоиска = "ПоискЗапрещен" Тогда
+ Представление = НСтр("ru = 'Полнотекстовый поиск отключен.'");
+ КонецЕсли;
+
+ Возврат Представление;
+
+КонецФункции
+
+&НаСервере
+Процедура ОбновитьВидимостьСостояниеПоиска(КонтейнерСостояний)
+
+ СостояниеПоиска = КонтейнерСостояний.СостояниеПоиска;
+ Элементы.СостояниеПоиска.Видимость = (СостояниеПоиска <> "ПоискРазрешен");
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область БизнесЛогика
+
+&НаСервереБезКонтекста
+Процедура ЗагрузитьНастройкиИИсториюПоиска(НастройкиПоиска)
+
+ ИсторияПоиска = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПолнотекстовыйПоискСтрокиПолнотекстовогоПоиска", "");
+ СохраненныеНастройкиПоиска = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПолнотекстовогоПоиска", "");
+
+ ИскатьВРазделах = Неопределено;
+ ОбластиПоиска = Неопределено;
+
+ Если ТипЗнч(СохраненныеНастройкиПоиска) = Тип("Структура") Тогда
+ СохраненныеНастройкиПоиска.Свойство("ИскатьВРазделах", ИскатьВРазделах);
+ СохраненныеНастройкиПоиска.Свойство("ОбластиПоиска", ОбластиПоиска);
+ КонецЕсли;
+
+ НастройкиПоиска.ИскатьВРазделах = ?(ИскатьВРазделах = Неопределено, Ложь, ИскатьВРазделах);
+ НастройкиПоиска.ОбластиПоиска = ?(ОбластиПоиска = Неопределено, Новый СписокЗначений, ОбластиПоиска);
+ НастройкиПоиска.ИсторияПоиска = ?(ИсторияПоиска = Неопределено, Новый Массив, ИсторияПоиска);
+
+КонецПроцедуры
+
+&НаСервереБезКонтекста
+Процедура СохранитьСтрокуПоискаВИстории(СтрокаПоиска, ИсторияПоиска)
+
+ СохраненнаяСтрока = ИсторияПоиска.Найти(СтрокаПоиска);
+
+ Если СохраненнаяСтрока <> Неопределено Тогда
+ ИсторияПоиска.Удалить(СохраненнаяСтрока);
+ КонецЕсли;
+
+ ИсторияПоиска.Вставить(0, СтрокаПоиска);
+
+ КоличествоСтрок = ИсторияПоиска.Количество();
+
+ Если КоличествоСтрок > 20 Тогда
+ ИсторияПоиска.Удалить(КоличествоСтрок - 1);
+ КонецЕсли;
+
+ ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
+ "ПолнотекстовыйПоискСтрокиПолнотекстовогоПоиска",
+ "",
+ ИсторияПоиска);
+
+КонецПроцедуры
+
+&НаСервереБезКонтекста
+Процедура СохранитьНастройкиПоиска(ИскатьВРазделах, ОбластиПоиска)
+
+ Настройки = Новый Структура;
+ Настройки.Вставить("ИскатьВРазделах", ИскатьВРазделах);
+ Настройки.Вставить("ОбластиПоиска", ОбластиПоиска);
+
+ ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("НастройкиПолнотекстовогоПоиска", "", Настройки);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
diff --git "a/TestingTool_3-0/src/CommonForms/\320\244\320\276\321\200\320\274\320\260\320\237\320\276\320\270\321\201\320\272\320\260/\320\244\320\276\321\200\320\274\320\260\320\237\320\276\320\270\321\201\320\272\320\260.mdo" "b/TestingTool_3-0/src/CommonForms/\320\244\320\276\321\200\320\274\320\260\320\237\320\276\320\270\321\201\320\272\320\260/\320\244\320\276\321\200\320\274\320\260\320\237\320\276\320\270\321\201\320\272\320\260.mdo"
new file mode 100644
index 0000000..4e8aa1a
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonForms/\320\244\320\276\321\200\320\274\320\260\320\237\320\276\320\270\321\201\320\272\320\260/\320\244\320\276\321\200\320\274\320\260\320\237\320\276\320\270\321\201\320\272\320\260.mdo"
@@ -0,0 +1,16 @@
+
+
+ ФормаПоиска
+
+ ru
+ Форма поиска
+
+
+
+ ru
+
+
+ PersonalComputer
+ MobileDevice
+ true
+
diff --git "a/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217/Module.bsl"
index ddd6a4c..b1b36c1 100644
--- "a/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217/Module.bsl"
+++ "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217/Module.bsl"
@@ -1,4 +1,3 @@
-
// Возвращает ссылку, соответствующую объекту метаданных, для
// использования в базе данных.
// Например:
@@ -44,110 +43,278 @@
КонецФункции
-// Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы
-// по ссылке на объект.
-//
-// Если доступа к одному из реквизитов нет, возникнет исключение прав доступа.
+// Значения реквизитов, прочитанные из информационной базы для нескольких объектов.
+//
// Если необходимо зачитать реквизит независимо от прав текущего пользователя,
// то следует использовать предварительный переход в привилегированный режим.
+//
+// Параметры:
+// Ссылки - Массив - массив ссылок на объекты одного типа.
+// Значения массива должны быть ссылками на объекты одного типа.
+// если массив пуст, то результатом будет пустое соответствие.
+// Реквизиты - Строка - имена реквизитов перечисленные через запятую, в формате требований к свойствам
+// структуры. Например, "Код, Наименование, Родитель".
+// ВыбратьРазрешенные - Булево - если Истина, то запрос к объектам выполняется с учетом прав пользователя, и в случае,
+// - если какой-либо объект будет исключен из выборки по правам, то этот объект
+// будет исключен и из результата;
+// - если Ложь, то возникнет исключение при отсутствии прав на таблицу
+// или любой из реквизитов.
+//
+// Возвращаемое значение:
+// Соответствие - список объектов и значений их реквизитов:
+// * Ключ - ЛюбаяСсылка - ссылка на объект;
+// * Значение - Структура - значения реквизитов:
+// ** Ключ - Строка - имя реквизита;
+// ** Значение - Произвольный - значение реквизита.
//
-// Функция не предназначена для получения значений реквизитов пустых ссылок.
+Функция ЗначенияРеквизитовОбъектов(Ссылки, Знач Реквизиты, ВыбратьРазрешенные = Ложь) Экспорт
+
+ Если ПустаяСтрока(Реквизиты) Тогда
+ ВызватьИсключение НСтр("ru = 'Неверный второй параметр Реквизиты:
+ |- Поле объекта должно быть указано'");
+ КонецЕсли;
+
+ Если СтрНайти(Реквизиты, ".") <> 0 Тогда
+ ВызватьИсключение НСтр("ru = 'Неверный второй параметр Реквизиты:
+ |- Обращение через точку не поддерживается'");
+ КонецЕсли;
+
+ ЗначенияРеквизитов = Новый Соответствие;
+ Если Ссылки.Количество() = 0 Тогда
+ Возврат ЗначенияРеквизитов;
+ КонецЕсли;
+
+ ПерваяСсылка = Ссылки[0];
+
+ Попытка
+ ПолноеИмяОбъектаМетаданных = ПерваяСсылка.Метаданные().ПолноеИмя();
+ Исключение
+ ВызватьИсключение НСтр("ru = 'Неверный первый параметр Ссылки:
+ |- Значения массива должны быть ссылками'");
+ КонецПопытки;
+
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ " + ?(ВыбратьРазрешенные, "РАЗРЕШЕННЫЕ", "") + "
+ | Ссылка КАК Ссылка, " + Реквизиты + "
+ |ИЗ
+ | " + ПолноеИмяОбъектаМетаданных + " КАК Таблица
+ |ГДЕ
+ | Таблица.Ссылка В (&Ссылки)";
+ Запрос.УстановитьПараметр("Ссылки", Ссылки);
+
+ Попытка
+ Выборка = Запрос.Выполнить().Выбрать();
+ Исключение
+
+ // Удаление пробелов.
+ Реквизиты = СтрЗаменить(Реквизиты, " ", "");
+ // Преобразование параметра в массив полей.
+ Реквизиты = СтрРазделить(Реквизиты, ",");
+
+ // Не удалось распознать ошибку, проброс первичной ошибки.
+ ВызватьИсключение;
+
+ КонецПопытки;
+
+ Пока Выборка.Следующий() Цикл
+ Результат = Новый Структура(Реквизиты);
+ ЗаполнитьЗначенияСвойств(Результат, Выборка);
+ ЗначенияРеквизитов[Выборка.Ссылка] = Результат;
+ КонецЦикла;
+
+ Возврат ЗначенияРеквизитов;
+
+КонецФункции
+
+// Структура, содержащая значения реквизитов, прочитанные из информационной базы по ссылке на объект.
+//
+// Если необходимо зачитать реквизит независимо от прав текущего пользователя,
+// то следует использовать предварительный переход в привилегированный режим.
//
// Параметры:
// Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить.
-//
+// - Строка - полное имя предопределенного элемента, значения реквизитов которого необходимо получить.
// Реквизиты - Строка - имена реквизитов, перечисленные через запятую, в формате
-// требований к свойствам структуры.
-// Например, "Код, Наименование, Родитель".
+// требований к свойствам структуры.
+// Например, "Код, Наименование, Родитель".
// - Структура, ФиксированнаяСтруктура - в качестве ключа передается
-// псевдоним поля для возвращаемой структуры с результатом, а в качестве
-// значения (опционально) фактическое имя поля в таблице.
-// Если значение не определено, то имя поля берется из ключа.
+// псевдоним поля для возвращаемой структуры с результатом, а в качестве
+// значения (опционально) фактическое имя поля в таблице.
+// Если ключ задан, а значение не определено, то имя поля берется из ключа.
// - Массив, ФиксированныйМассив - имена реквизитов в формате требований
-// к свойствам структуры.
+// к свойствам структуры.
+// ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя, и в случае,
+// - если есть ограничение на уровне записей, то все реквизиты вернутся
+// со значением Неопределено;
+// - если нет прав для работы с таблицей, то возникнет исключение.
+// - если Ложь, то возникнет исключение при отсутствии прав на таблицу
+// или любой из реквизитов.
//
// Возвращаемое значение:
// Структура - содержит имена (ключи) и значения затребованных реквизитов.
-// Если строка затребованных реквизитов пуста, то возвращается пустая структура.
-// Если в качестве объекта передана пустая ссылка, то все реквизиты вернутся со значением Неопределено.
+// - если в параметр Реквизиты передана пустая строка, то возвращается пустая структура.
+// - если в параметр Ссылка передана пустая ссылка, то возвращается структура,
+// соответствующая именам реквизитов со значениями Неопределено.
+// - если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка),
+// то все реквизиты вернутся со значением Неопределено.
//
-Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты) Экспорт
+Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь) Экспорт
+
+ Попытка
+ ПолноеИмяОбъектаМетаданных = Ссылка.Метаданные().ПолноеИмя();
+ Исключение
+ ВызватьИсключение НСтр("ru = 'Неверный первый параметр Ссылка:
+ |- Значение должно быть ссылкой или именем предопределенного элемента'");
+ КонецПопытки;
+ // Разбор реквизитов, если второй параметр Строка.
Если ТипЗнч(Реквизиты) = Тип("Строка") Тогда
Если ПустаяСтрока(Реквизиты) Тогда
Возврат Новый Структура;
КонецЕсли;
- Реквизиты = СтрРазделить(Реквизиты, ",", Ложь);
+
+ // Удаление пробелов.
+ Реквизиты = СтрЗаменить(Реквизиты, " ", "");
+ // Преобразование параметра в массив полей.
+ Реквизиты = СтрРазделить(Реквизиты, ",");
КонецЕсли;
- СтруктураРеквизитов = Новый Структура;
- Если ТипЗнч(Реквизиты) = Тип("Структура") Или ТипЗнч(Реквизиты) = Тип("ФиксированнаяСтруктура") Тогда
- СтруктураРеквизитов = Реквизиты;
- ИначеЕсли ТипЗнч(Реквизиты) = Тип("Массив") Или ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда
+ // Приведение реквизитов к единому формату.
+ СтруктураПолей = Новый Структура;
+ Если ТипЗнч(Реквизиты) = Тип("Структура")
+ Или ТипЗнч(Реквизиты) = Тип("ФиксированнаяСтруктура") Тогда
+
+ СтруктураПолей = Реквизиты;
+
+ ИначеЕсли ТипЗнч(Реквизиты) = Тип("Массив")
+ Или ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда
+
Для Каждого Реквизит Из Реквизиты Цикл
- СтруктураРеквизитов.Вставить(СтрЗаменить(Реквизит, ".", ""), Реквизит);
+
+ Попытка
+ ПсевдонимПоля = СтрЗаменить(Реквизит, ".", "");
+ СтруктураПолей.Вставить(ПсевдонимПоля, Реквизит);
+ Исключение
+ // Если псевдоним не является ключом.
+ // Не удалось распознать ошибку, проброс первичной ошибки.
+ ВызватьИсключение;
+
+ КонецПопытки;
КонецЦикла;
Иначе
- ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неверный тип второго параметра Реквизиты: %1'"), Строка(ТипЗнч(Реквизиты)));
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Неверный тип второго параметра Реквизиты: %1'"), Строка(ТипЗнч(Реквизиты)));
КонецЕсли;
- ТекстПолей = "";
- Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл
- ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение),
- СокрЛП(КлючИЗначение.Значение),
- СокрЛП(КлючИЗначение.Ключ));
+ // Подготовка результата (после выполнения запроса переопределится).
+ Результат = Новый Структура;
+
+ // Формирование текста запроса к выбираемым полям.
+ ТекстЗапросаПолей = "";
+ Для каждого КлючИЗначение Из СтруктураПолей Цикл
+
+ ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение),
+ КлючИЗначение.Значение,
+ КлючИЗначение.Ключ);
+ ПсевдонимПоля = КлючИЗначение.Ключ;
- Псевдоним = СокрЛП(КлючИЗначение.Ключ);
+ ТекстЗапросаПолей =
+ ТекстЗапросаПолей + ?(ПустаяСтрока(ТекстЗапросаПолей), "", ",") + "
+ | " + ИмяПоля + " КАК " + ПсевдонимПоля;
+
+
+ // Предварительное добавление поля по псевдониму в возвращаемый результат.
+ Результат.Вставить(ПсевдонимПоля);
- ТекстПолей = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + "
- | " + ИмяПоля + " КАК " + Псевдоним;
КонецЦикла;
+ // Если предопределенного нет в ИБ.
+ // - приведение результата к отсутствию объекта в ИБ или передаче пустой ссылки.
+ Если Ссылка = Неопределено Тогда
+ Возврат Результат;
+ КонецЕсли;
+
+ ТекстЗапроса =
+ "ВЫБРАТЬ " + ?(ВыбратьРазрешенные, "РАЗРЕШЕННЫЕ", "") + "
+ |" + ТекстЗапросаПолей + "
+ |ИЗ
+ | " + ПолноеИмяОбъектаМетаданных + " КАК Таблица
+ |ГДЕ
+ | Таблица.Ссылка = &Ссылка
+ |";
+
+ // Выполнение запроса.
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
- Запрос.Текст =
- "ВЫБРАТЬ
- |" + ТекстПолей + "
- |ИЗ
- | " + Ссылка.Метаданные().ПолноеИмя() + " КАК ПсевдонимЗаданнойТаблицы
- |ГДЕ
- | ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка
- |";
- Выборка = Запрос.Выполнить().Выбрать();
- Выборка.Следующий();
+ Запрос.Текст = ТекстЗапроса;
- Результат = Новый Структура;
- Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл
- Результат.Вставить(КлючИЗначение.Ключ);
- КонецЦикла;
- ЗаполнитьЗначенияСвойств(Результат, Выборка);
+ Попытка
+ Выборка = Запрос.Выполнить().Выбрать();
+ Исключение
+
+ // Если реквизиты были переданы строкой, то они уже конвертированы в массив.
+ // Если реквизиты - массив, оставляем без изменений.
+ // Если реквизиты - структура - конвертируем в массив.
+ // В остальных случаях уже было бы выброшено исключение.
+ Если Тип("Структура") = ТипЗнч(Реквизиты) Тогда
+ Реквизиты = Новый Массив;
+ Для каждого КлючИЗначение Из СтруктураПолей Цикл
+ ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение),
+ КлючИЗначение.Значение,
+ КлючИЗначение.Ключ);
+ Реквизиты.Добавить(ИмяПоля);
+ КонецЦикла;
+ КонецЕсли;
+
+ // Не удалось распознать ошибку, проброс первичной ошибки.
+ ВызватьИсключение;
+
+ КонецПопытки;
+
+ // Заполнение реквизитов.
+ Если Выборка.Следующий() Тогда
+ ЗаполнитьЗначенияСвойств(Результат, Выборка);
+ КонецЕсли;
Возврат Результат;
КонецФункции
-// Возвращает значение реквизита, прочитанного из информационной базы по ссылке на объект.
-//
-// Если доступа к реквизиту нет, возникнет исключение прав доступа.
-// Если необходимо зачитать реквизит независимо от прав текущего пользователя,
-// то следует использовать предварительный переход в привилегированный режим.
+// Значение реквизита, прочитанного из информационной базы по ссылке на объект.
+//
+// Если необходимо зачитать реквизит независимо от прав текущего пользователя,
+// то следует использовать предварительный переход в привилегированный режим.
//
-// Функция не предназначена для получения значений реквизитов пустых ссылок.
-//
// Параметры:
-// Ссылка - ссылка на объект, - элемент справочника, документ, ...
-// ИмяРеквизита - Строка, например, "Код".
-//
+// Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить.
+// - Строка - полное имя предопределенного элемента, значения реквизитов которого необходимо получить.
+// ИмяРеквизита - Строка - имя получаемого реквизита.
+// ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя, и в случае,
+// - если есть ограничение на уровне записей, то возвращается Неопределено;
+// - если нет прав для работы с таблицей, то возникнет исключение.
+// - если Ложь, то возникнет исключение при отсутствии прав на таблицу
+// или любой из реквизитов.
+//
// Возвращаемое значение:
-// Произвольный - зависит от типа значения прочитанного реквизита.
-//
-Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита) Экспорт
+// Произвольный - зависит от типа значения прочитанного реквизита.
+// - если в параметр Ссылка передана пустая ссылка, то возвращается Неопределено.
+// - если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка),
+// то возвращается Неопределено.
+//
+Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь) Экспорт
+
+ Если ПустаяСтрока(ИмяРеквизита) Тогда
+ ВызватьИсключение НСтр("ru = 'Неверный второй параметр ИмяРеквизита:
+ |- Имя реквизита должно быть заполнено'");
+ КонецЕсли;
- Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита);
+ Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные);
Возврат Результат[СтрЗаменить(ИмяРеквизита, ".", "")];
КонецФункции
+
// Возвращает признак того, что реквизит входит в подмножество стандартных реквизитов.
//
// Параметры:
@@ -300,3 +467,293 @@
Возврат Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных);
КонецФункции
+
+////////////////////////////////////////////////////////////////////////////////
+// Сохранение, чтение и удаление настроек из хранилищ.
+
+// Сохраняет настройку в хранилище общих настроек, как метод платформы Сохранить,
+// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>,
+// но с поддержкой длины ключа настроек более 128 символов путем хеширования части,
+// которая превышает 96 символов.
+// Если нет права СохранениеДанныхПользователя, сохранение пропускается без ошибки.
+//
+// Параметры:
+// КлючОбъекта - Строка - см. синтакс-помощник платформы.
+// КлючНастроек - Строка - см. синтакс-помощник платформы.
+// Настройки - Произвольный - см. синтакс-помощник платформы.
+// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы.
+// ИмяПользователя - Строка - см. синтакс-помощник платформы.
+// ОбновитьПовторноИспользуемыеЗначения - Булево - выполнить одноименный метод платформы.
+//
+Процедура ХранилищеОбщихНастроекСохранить(КлючОбъекта, КлючНастроек, Настройки,
+ ОписаниеНастроек = Неопределено,
+ ИмяПользователя = Неопределено,
+ ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт
+
+ ХранилищеСохранить(ХранилищеОбщихНастроек,
+ КлючОбъекта,
+ КлючНастроек,
+ Настройки,
+ ОписаниеНастроек,
+ ИмяПользователя,
+ ОбновитьПовторноИспользуемыеЗначения);
+
+КонецПроцедуры
+
+// Сохраняет несколько настроек в хранилище общих настроек, как метод платформы Сохранить,
+// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>,
+// но с поддержкой длины ключа настроек более 128 символов путем хеширования части,
+// которая превышает 96 символов.
+// Если нет права СохранениеДанныхПользователя, сохранение пропускается без ошибки.
+//
+// Параметры:
+// НесколькоНастроек - Массив - со значениями:
+// * Значение - Структура - со свойствами:
+// * Объект - Строка - см. параметр КлючОбъекта в синтакс-помощнике платформы.
+// * Настройка - Строка - см. параметр КлючНастроек в синтакс-помощнике платформы.
+// * Значение - Произвольный - см. параметр Настройки в синтакс-помощнике платформы.
+//
+// ОбновитьПовторноИспользуемыеЗначения - Булево - выполнить одноименный метод платформы.
+//
+Процедура ХранилищеОбщихНастроекСохранитьМассив(НесколькоНастроек,
+ ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт
+
+ Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда
+ Возврат;
+ КонецЕсли;
+
+ Для Каждого Элемент Из НесколькоНастроек Цикл
+ ХранилищеОбщихНастроек.Сохранить(Элемент.Объект, КлючНастроек(Элемент.Настройка), Элемент.Значение);
+ КонецЦикла;
+
+ Если ОбновитьПовторноИспользуемыеЗначения Тогда
+ ОбновитьПовторноИспользуемыеЗначения();
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Загружает настройку из хранилища общих настроек, как метод платформы Загрузить,
+// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>,
+// но с поддержкой длины ключа настроек более 128 символов путем хеширования части,
+// которая превышает 96 символов.
+// Кроме того, возвращает указанное значение по умолчанию, если настройки не найдены.
+// Если нет права СохранениеДанныхПользователя, возвращается значение по умолчанию без ошибки.
+//
+// В возвращаемом значении очищаются ссылки на несуществующий объект в базе данных, а именно
+// - возвращаемая ссылка заменяется на указанное значение по умолчанию;
+// - из данных типа Массив ссылки удаляются;
+// - у данных типа Структура и Соответствие ключ не меняется, а значение устанавливается Неопределено;
+// - анализ значений в данных типа Массив, Структура, Соответствие выполняется рекурсивно.
+//
+// Параметры:
+// КлючОбъекта - Строка - см. синтакс-помощник платформы.
+// КлючНастроек - Строка - см. синтакс-помощник платформы.
+// ЗначениеПоУмолчанию - Произвольный - значение, которое возвращается, если настройки не найдены.
+// Если не указано, возвращается значение Неопределено.
+// ОписаниеНастроек - ОписаниеНастроек - см. синтакс-помощник платформы.
+// ИмяПользователя - Строка - см. синтакс-помощник платформы.
+//
+// Возвращаемое значение:
+// Произвольный - см. синтакс-помощник платформы.
+//
+Функция ХранилищеОбщихНастроекЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено,
+ ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт
+
+ Возврат ХранилищеЗагрузить(ХранилищеОбщихНастроек,
+ КлючОбъекта,
+ КлючНастроек,
+ ЗначениеПоУмолчанию,
+ ОписаниеНастроек,
+ ИмяПользователя);
+
+КонецФункции
+
+// Удаляет настройку из хранилища общих настроек, как метод платформы Удалить,
+// объектов СтандартноеХранилищеНастроекМенеджер или ХранилищеНастроекМенеджер.<Имя хранилища>,
+// но с поддержкой длины ключа настроек более 128 символов путем хеширования части,
+// которая превышает 96 символов.
+// Если нет права СохранениеДанныхПользователя, удаление пропускается без ошибки.
+//
+// Параметры:
+// КлючОбъекта - Строка, Неопределено - см. синтакс-помощник платформы.
+// КлючНастроек - Строка, Неопределено - см. синтакс-помощник платформы.
+// ИмяПользователя - Строка, Неопределено - см. синтакс-помощник платформы.
+//
+Процедура ХранилищеОбщихНастроекУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт
+
+ ХранилищеУдалить(ХранилищеОбщихНастроек,
+ КлючОбъекта,
+ КлючНастроек,
+ ИмяПользователя);
+
+КонецПроцедуры
+
+////////////////////////////////////////////////////////////////////////////////
+// Хранилища настроек.
+
+Процедура ХранилищеСохранить(МенеджерХранилища, КлючОбъекта, КлючНастроек, Настройки,
+ ОписаниеНастроек, ИмяПользователя, ОбновитьПовторноИспользуемыеЗначения)
+
+ Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда
+ Возврат;
+ КонецЕсли;
+
+ МенеджерХранилища.Сохранить(КлючОбъекта, КлючНастроек(КлючНастроек), Настройки,
+ ОписаниеНастроек, ИмяПользователя);
+
+ Если ОбновитьПовторноИспользуемыеЗначения Тогда
+ ОбновитьПовторноИспользуемыеЗначения();
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция ХранилищеЗагрузить(МенеджерХранилища, КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию,
+ ОписаниеНастроек, ИмяПользователя)
+
+ Результат = Неопределено;
+
+ Если ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда
+ Результат = МенеджерХранилища.Загрузить(КлючОбъекта, КлючНастроек(КлючНастроек),
+ ОписаниеНастроек, ИмяПользователя);
+ КонецЕсли;
+
+ Если Результат = Неопределено Тогда
+ Результат = ЗначениеПоУмолчанию;
+ Иначе
+ УстановитьПривилегированныйРежим(Истина);
+ Если УдалитьБитыеСсылки(Результат) Тогда
+ Результат = ЗначениеПоУмолчанию;
+ КонецЕсли;
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции
+
+// Удаляет битые ссылки из переменной.
+//
+// Параметры:
+// СсылкаИлиКоллекция - ЛюбаяСсылка, Произвольный - Проверяемый объект или очищаемая коллекция.
+//
+// Возвращаемое значение:
+// Булево -
+// * Истина - СсылкаИлиКоллекция ссылочного типа и объект не найден в базе данных.
+// * Ложь - Когда СсылкаИлиКоллекция не ссылочного типа или объект найден в базе данных.
+//
+Функция УдалитьБитыеСсылки(СсылкаИлиКоллекция)
+
+ Тип = ТипЗнч(СсылкаИлиКоллекция);
+
+ Если Тип = Тип("Неопределено")
+ Или Тип = Тип("Булево")
+ Или Тип = Тип("Строка")
+ Или Тип = Тип("Число")
+ Или Тип = Тип("Дата") Тогда // Оптимизация - часто используемые примитивные типы.
+
+ Возврат Ложь; // Не ссылка.
+
+ ИначеЕсли Тип = Тип("Массив") Тогда
+
+ Количество = СсылкаИлиКоллекция.Количество();
+ Для Номер = 1 По Количество Цикл
+ ОбратныйИндекс = Количество - Номер;
+ Значение = СсылкаИлиКоллекция[ОбратныйИндекс];
+ Если УдалитьБитыеСсылки(Значение) Тогда
+ СсылкаИлиКоллекция.Удалить(ОбратныйИндекс);
+ КонецЕсли;
+ КонецЦикла;
+
+ Возврат Ложь; // Не ссылка.
+
+ ИначеЕсли Тип = Тип("Структура")
+ Или Тип = Тип("Соответствие") Тогда
+
+ Для Каждого КлючИЗначение Из СсылкаИлиКоллекция Цикл
+ Значение = КлючИЗначение.Значение;
+ Если УдалитьБитыеСсылки(Значение) Тогда
+ СсылкаИлиКоллекция.Вставить(КлючИЗначение.Ключ, Неопределено);
+ КонецЕсли;
+ КонецЦикла;
+
+ Возврат Ложь; // Не ссылка.
+
+ ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип)
+ Или Справочники.ТипВсеСсылки().СодержитТип(Тип)
+ Или Перечисления.ТипВсеСсылки().СодержитТип(Тип)
+ Или ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип)
+ Или ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип)
+ Или ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип)
+ Или ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип)
+ Или БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип)
+ Или Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда
+ // Ссылочный тип, исключая ТочкаМаршрутаБизнесПроцессаСсылка.
+
+ Если СсылкаИлиКоллекция.Пустая() Тогда
+ Возврат Ложь; // Ссылка пустая.
+ ИначеЕсли ЗначениеРеквизитаОбъекта(СсылкаИлиКоллекция, "Ссылка") = Неопределено Тогда
+ СсылкаИлиКоллекция = Неопределено;
+ Возврат Истина; // "Битая" ссылка.
+ Иначе
+ Возврат Ложь; // Объект найден.
+ КонецЕсли;
+
+ Иначе
+
+ Возврат Ложь; // Не ссылка.
+
+ КонецЕсли;
+
+КонецФункции
+
+Процедура ХранилищеУдалить(МенеджерХранилища, КлючОбъекта, КлючНастроек, ИмяПользователя)
+
+ Если ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда
+ МенеджерХранилища.Удалить(КлючОбъекта, КлючНастроек(КлючНастроек), ИмяПользователя);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Возвращает строку ключа настроек, не превышающую допустимую длину 128 символов.
+// Если указанная строка превышает 128, тогда вместо символов сверх 96 символов
+// добавляется их хеш-сумма по алгоритму MD5 размером 32 символа.
+//
+// Параметры:
+// Строка - Строка - строка произвольной длины.
+//
+// Возвращаемое значение:
+// Строка - не более 128 символов.
+//
+Функция КлючНастроек(Знач Строка)
+ Возврат СократитьСтрокуКонтрольнойСуммой(Строка, 128);
+КонецФункции
+
+// Сокращает строку до нужной длины, при этом обрезанная часть хешируется,
+// обеспечивая уникальность строки. Проверяет длину строки на входе и, в случае
+// превышения максимальной длины, преобразует ее конец по алгоритму MD5 в
+// уникальную строку из 32 символов.
+//
+// Параметры:
+// Строка - Строка - исходная строка произвольной длины.
+// МаксимальнаяДлина - Число - требуемое максимальное количество символов в строке,
+// минимальное значение: 32.
+//
+// Возвращаемое значение:
+// Строка - строка, не превышающая максимальную длину.
+//
+Функция СократитьСтрокуКонтрольнойСуммой(Строка, МаксимальнаяДлина) Экспорт
+ ОбщегоНазначенияКлиентСервер.Проверить(МаксимальнаяДлина >= 32, НСтр("ru = 'Параметр МаксимальнаяДлина не может быть меньше 32'"),
+ "ОбщегоНазначения.СократитьСтрокуКонтрольнойСуммой");
+
+ Результат = Строка;
+ Если СтрДлина(Строка) > МаксимальнаяДлина Тогда
+ Результат = Лев(Строка, МаксимальнаяДлина - 32);
+ ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);
+ ХешированиеДанных.Добавить(Сред(Строка, МаксимальнаяДлина - 32 + 1));
+ Результат = Результат + СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");
+ КонецЕсли;
+ Возврат Результат;
+КонецФункции
+
+Процедура ПриНачалеВыполненияРегламентногоЗадания(РегламентноеЗадание = Неопределено) Экспорт
+ //пустая (для совместимости)
+КонецПроцедуры
\ No newline at end of file
diff --git "a/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
new file mode 100644
index 0000000..91f1e4e
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
@@ -0,0 +1,9 @@
+
+// пробросили из клиента
+Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь) Экспорт
+ Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, Реквизиты, ВыбратьРазрешенные );
+КонецФункции
+
+Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь) Экспорт
+ Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные );
+КонецФункции
\ No newline at end of file
diff --git "a/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260.mdo" "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260.mdo"
new file mode 100644
index 0000000..ec619fa
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260.mdo"
@@ -0,0 +1,12 @@
+
+
+ ОбщегоНазначенияВызовСервера
+
+ ru
+ Общего назначения вызов сервера
+
+ true
+ true
+ true
+ true
+
diff --git "a/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl"
index eafbdf7..9a2d1e4 100644
--- "a/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl"
+++ "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl"
@@ -1,3 +1,85 @@
+////////////////////////////////////////////////////////////////////////////////
+// Подсистема "Базовая функциональность".
+// Клиентские процедуры и функции общего назначения:
+// - для работы со списками в формах;
+// - для работы с журналом регистрации;
+// - для обработки действий пользователя в процессе редактирования
+// многострочного текста, например комментария в документах;
+// - прочее.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область ПрограммныйИнтерфейс
+
+////////////////////////////////////////////////////////////////////////////////
+// Функции работы со списками в формах.
+
+// Проверяет, что в параметре команды Параметр передан объект ожидаемого типа ОжидаемыйТип.
+// В противном случае, выдает стандартное сообщение и возвращает Ложь.
+// Такая ситуация возможна, например, если в списке выделена строка группировки.
+//
+// Для использования в командах, работающих с элементами динамических списков в формах.
+// Пример использования:
+//
+// Если НЕ ПроверитьТипПараметраКоманды(Элементы.Список.ВыделенныеСтроки,
+// Тип("ЗадачаСсылка.ЗадачаИсполнителя")) Тогда
+// Возврат;
+// КонецЕсли;
+// ...
+//
+// Параметры:
+// Параметр - Массив или ссылочный тип - параметр команды.
+// ОжидаемыйТип - Тип - ожидаемый тип параметра.
+//
+// Возвращаемое значение:
+// Булево - Истина, если параметр ожидаемого типа.
+//
+Функция ПроверитьТипПараметраКоманды(Знач Параметр, Знач ОжидаемыйТип) Экспорт
+
+ Если Параметр = Неопределено Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ Результат = Истина;
+
+ Если ТипЗнч(Параметр) = Тип("Массив") Тогда
+ // Если в массиве один элемент и он неправильного типа...
+ Результат = НЕ (Параметр.Количество() = 1 И ТипЗнч(Параметр[0]) <> ОжидаемыйТип);
+ Иначе
+ Результат = ТипЗнч(Параметр) = ОжидаемыйТип;
+ КонецЕсли;
+
+ Если НЕ Результат Тогда
+ ПоказатьПредупреждение(,НСтр("ru = 'Действие не может быть выполнено для выбранного элемента.'"));
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции
+
+////////////////////////////////////////////////////////////////////////////////
+// Клиентские процедуры общего назначения.
+
+// Возвращает текущую дату, приведенную к часовому поясу сеанса.
+//
+// Функция возвращает время, близкое к результату функции ТекущаяДатаСеанса() в серверном контексте.
+// Погрешность обусловлена временем выполнения серверного вызова.
+// Предназначена для использования вместо функции ТекущаяДата().
+//
+Функция ДатаСеанса() Экспорт
+ Возврат ТекущаяДата();
+КонецФункции
+
+// Возвращает универсальную дату сеанса, получаемую из текущей даты сеанса.
+//
+// Функция возвращает время, близкое к результату функции УниверсальноеВремя() в серверном контексте.
+// Погрешность обусловлена временем выполнения серверного вызова.
+// Предназначена для использования вместо функции УниверсальноеВремя().
+//
+Функция ДатаУниверсальная() Экспорт
+ ДатаСеанса = ТекущаяДата();
+ Возврат ДатаСеанса;
+КонецФункции
// Предлагает пользователю установить расширение работы с файлами в веб-клиенте.
//
@@ -30,46 +112,489 @@
Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещенияОЗакрытии, ТекстПредложения = "",
ВозможноПродолжениеБезУстановки = Истина) Экспорт
- ОписаниеОповещенияЗавершение = Новый ОписаниеОповещения("ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиЗавершение",
- ЭтотОбъект, ОписаниеОповещенияОЗакрытии);
-
+ Оповещение = Новый ОписаниеОповещения("ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиЗавершение", ЭтотОбъект, ОписаниеОповещенияОЗакрытии);
#Если Не ВебКлиент Тогда
// В тонком и толстом клиентах расширение подключено всегда.
- ВыполнитьОбработкуОповещения(ОписаниеОповещенияЗавершение, "ПодключениеНеТребуется");
+ ВыполнитьОбработкуОповещения(Оповещение);
Возврат;
#КонецЕсли
- ДополнительныеПараметры = Новый Структура;
- ДополнительныеПараметры.Вставить("ОписаниеОповещенияЗавершение", ОписаниеОповещенияЗавершение);
- ДополнительныеПараметры.Вставить("ТекстПредложения", ТекстПредложения);
- ДополнительныеПараметры.Вставить("ВозможноПродолжениеБезУстановки", ВозможноПродолжениеБезУстановки);
+ // Если расширение и так уже подключено, незачем про него спрашивать.
+ РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
+ Если РасширениеПодключено Тогда
+ ВыполнитьОбработкуОповещения(Оповещение);
+ Возврат;
+ КонецЕсли;
+
+ // В веб клиенте под MacOS расширение не доступно.
+ СистемнаяИнформация = Новый СистемнаяИнформация;
+ ЭтоMacКлиент = (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86
+ Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86_64);
+ Если ЭтоMacКлиент Тогда
+ ВыполнитьОбработкуОповещения(Оповещение);
+ Возврат;
+ КонецЕсли;
- Оповещение = Новый ОписаниеОповещения("ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиПриУстановкеРасширения",
- ЭтотОбъект, ДополнительныеПараметры);
- НачатьПодключениеРасширенияРаботыСФайлами(Оповещение);
+ ВыполнитьОбработкуОповещения(Оповещение);
КонецПроцедуры
-Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиЗавершение(Действие, ОповещениеОЗакрытии) Экспорт
+// Предлагает пользователю подключить расширение работы с файлами в веб-клиенте,
+// и в случае отказа выдает предупреждение о невозможности продолжения операции.
+//
+// Предназначена для использования в начале участков кода, в которых ведется работа с файлами
+// только при подключенном расширении.
+// Например:
+//
+// Оповещение = Новый ОписаниеОповещения("ПечатьДокументаЗавершение", ЭтотОбъект);
+// ТекстСообщения = НСтр("ru = 'Для печати документа необходимо установить расширение работы с файлами.'");
+// ОбщегоНазначенияКлиент.ПроверитьРасширениеРаботыСФайламиПодключено(Оповещение, ТекстСообщения);
+//
+// Процедура ПечатьДокументаЗавершение(Результат, ДополнительныеПараметры) Экспорт
+// // код печати документа, рассчитывающий на то, что расширение подключено.
+// // ...
+//
+// Параметры:
+// ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - описание процедуры, которая будет вызвана, если расширение
+// подключено со следующими параметрами:
+// Результат - Булево - всегда Истина.
+// ДополнительныеПараметры - Неопределено
+// ТекстПредложения - Строка - текст с предложением подключить расширение работы с файлами.
+// Если не указан, то выводится текст по умолчанию.
+// ТекстПредупреждения - Строка - текст предупреждения о невозможности продолжения операции.
+// Если не указан, то выводится текст по умолчанию.
+//
+// Возвращаемое значение:
+// Булево - Истина, если расширение подключено.
+//
+Процедура ПроверитьРасширениеРаботыСФайламиПодключено(ОписаниеОповещенияОЗакрытии, Знач ТекстПредложения = "",
+ Знач ТекстПредупреждения = "") Экспорт
+
+ Параметры = Новый Структура("ОписаниеОповещенияОЗакрытии,ТекстПредупреждения",
+ ОписаниеОповещенияОЗакрытии, ТекстПредупреждения, );
+ Оповещение = Новый ОписаниеОповещения("РасширениеРаботыСФайламиПодключеноЗавершение", ЭтотОбъект, Параметры);
+ ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстПредложения);
+
+КонецПроцедуры
+
+
+// Задает вопрос о продолжении действия, влекущего к потере изменений.
+// Для использования в обработчиках события ПередЗакрытием модулей форм.
+//
+// Параметры:
+// ОповещениеСохранитьИЗакрыть - ОписаниеОповещения - содержит имя процедуры, вызываемой при нажатии на кнопку OK.
+// Отказ - Булево - возвращаемый параметр, признак отказа от выполняемого действия.
+// ТекстПредупреждения - Строка - переопределяемый текст предупреждения, выводимый пользователю.
+//
+// Пример:
+// Оповещение = Новый ОписаниеОповещения("ВыбратьИЗакрыть", ЭтотОбъект);
+// ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ);
+//
+// &НаКлиенте
+// Процедура ВыбратьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
+// // записываем данные формы.
+// // ...
+// Модифицированность = Ложь; // не выводить подтверждение о закрытии формы еще раз.
+// Закрыть(<РезультатВыбораВФорме>);
+// КонецПроцедуры
+//
+Процедура ПоказатьПодтверждениеЗакрытияФормы(ОповещениеСохранитьИЗакрыть, Отказ, ТекстПредупреждения = "") Экспорт
+
+ Форма = ОповещениеСохранитьИЗакрыть.Модуль;
+ Если Не Форма.Модифицированность Тогда
+ Возврат;
+ КонецЕсли;
+
+ Отказ = Истина;
+
+ Параметры = Новый Структура();
+ Параметры.Вставить("ОповещениеСохранитьИЗакрыть", ОповещениеСохранитьИЗакрыть);
+ Параметры.Вставить("ТекстПредупреждения", ТекстПредупреждения);
+
+ ПодключитьОбработчикОжидания("ПодтвердитьЗакрытиеФормыСейчас", 0.1, Истина);
+
+КонецПроцедуры
+
+// Задает вопрос о продолжении действия, ведущего к закрытию формы.
+// Для использования в обработчиках события ПередЗакрытием модулей форм.
+//
+// Параметры:
+// Форма - УправляемаяФорма - форма, которая вызывает диалог предупреждения.
+// Отказ - Булево - возвращаемый параметр, признак отказа от выполняемого действия.
+// ТекстПредупреждения - Строка - текст предупреждения, выводимый пользователю.
+// ИмяРеквизитаЗакрытьФормуБезПодтверждения - Строка - имя реквизита, содержащего в себе признак того, нужно
+// выводить предупреждение или нет.
+// ОписаниеОповещенияЗакрыть - ОписаниеОповещения - содержит имя процедуры, вызываемой при нажатии на кнопку да.
+//
+// Пример:
+// ТекстПредупреждения = НСтр("ru = 'Закрыть помощник?'");
+// ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(
+// ЭтотОбъект, Отказ, ТекстПредупреждения, "ЗакрытьФормуБезПодтверждения");
+//
+Процедура ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(Форма, Отказ, ТекстПредупреждения,
+ ИмяРеквизитаЗакрытьФормуБезПодтверждения, ОписаниеОповещенияЗакрыть = Неопределено) Экспорт
+
+ Если Форма[ИмяРеквизитаЗакрытьФормуБезПодтверждения] Тогда
+ Возврат;
+ КонецЕсли;
+
+ Отказ = Истина;
+
+ Параметры = Новый Структура();
+ Параметры.Вставить("Форма", Форма);
+ Параметры.Вставить("ТекстПредупреждения", ТекстПредупреждения);
+ Параметры.Вставить("ИмяРеквизитаЗакрытьФормуБезПодтверждения", ИмяРеквизитаЗакрытьФормуБезПодтверждения);
+ Параметры.Вставить("ОписаниеОповещенияЗакрыть", ОписаниеОповещенияЗакрыть);
+
+ ПодключитьОбработчикОжидания("ПодтвердитьЗакрытиеПроизвольнойФормыСейчас", 0.1, Истина);
+
+КонецПроцедуры
+
+////////////////////////////////////////////////////////////////////////////////
+// Процедуры и функции для обработки событий и вызова необязательных подсистем.
+
+// Возвращает ссылку на общий модуль по имени.
+//
+// Параметры:
+// Имя - Строка - имя общего модуля, например:
+// "ОбщегоНазначения",
+// "ОбщегоНазначенияКлиент".
+//
+// Возвращаемое значение:
+// ОбщийМодуль.
+//
+Функция ОбщийМодуль(Имя) Экспорт
+
+ Модуль = Вычислить(Имя);
+
+#Если НЕ ВебКлиент Тогда
+ Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Общий модуль ""%1"" не найден.'"), Имя);
+ КонецЕсли;
+#КонецЕсли
+
+ Возврат Модуль;
+
+КонецФункции
+
+////////////////////////////////////////////////////////////////////////////////
+// Функции для обработки действий пользователя в процессе редактирования
+// многострочного текста, например комментария в документах.
+
+// Открывает форму редактирования произвольного многострочного текста.
+//
+// Параметры:
+// ОповещениеОЗакрытии - ОписаниеОповещения - содержит описание процедуры, которая будет вызвана
+// после закрытия формы ввода текста с теми же параметрами, что и для метода
+// ПоказатьВводСтроки.
+// МногострочныйТекст - Строка - произвольный текст, который необходимо отредактировать;
+// Заголовок - Строка - текст, который необходимо отобразить в заголовке формы.
+//
+// Пример:
+//
+// Оповещение = Новый ОписаниеОповещения("КомментарийЗавершениеВвода", ЭтотОбъект);
+// ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(Оповещение, Элемент.ТекстРедактирования);
+//
+// &НаКлиенте
+// Процедура КомментарийЗавершениеВвода(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
+// Если ВведенныйТекст = Неопределено Тогда
+// Возврат;
+// КонецЕсли;
+//
+// Объект.МногострочныйКомментарий = ВведенныйТекст;
+// Модифицированность = Истина;
+// КонецПроцедуры
+//
+Процедура ПоказатьФормуРедактированияМногострочногоТекста(Знач ОповещениеОЗакрытии,
+ Знач МногострочныйТекст, Знач Заголовок = Неопределено) Экспорт
+
+ Если Заголовок = Неопределено Тогда
+ ПоказатьВводСтроки(ОповещениеОЗакрытии, МногострочныйТекст,,, Истина);
+ Иначе
+ ПоказатьВводСтроки(ОповещениеОЗакрытии, МногострочныйТекст, Заголовок,, Истина);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Открывает форму редактирования многострочного комментария.
+//
+// Параметры:
+// МногострочныйТекст - Строка - произвольный текст, который необходимо отредактировать.
+// ФормаВладелец - УправляемаяФорма - форма, в поле которой выполняется ввод комментария.
+// ИмяРеквизита - Строка - имя реквизита формы, в который будет помещен введенный пользователем
+// комментарий.
+// Заголовок - Строка - текст, который необходимо отобразить в заголовке формы.
+// По умолчанию: "Комментарий".
+//
+// Пример использования:
+//
+// ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(Элемент.ТекстРедактирования, ЭтотОбъект, "Объект.Комментарий");
+//
+Процедура ПоказатьФормуРедактированияКомментария(Знач МногострочныйТекст, Знач ФормаВладелец, Знач ИмяРеквизита,
+ Знач Заголовок = Неопределено) Экспорт
+
+ ДополнительныеПараметры = Новый Структура("ФормаВладелец,ИмяРеквизита", ФормаВладелец, ИмяРеквизита);
+ Оповещение = Новый ОписаниеОповещения("КомментарийЗавершениеВвода", ЭтотОбъект, ДополнительныеПараметры);
+ ЗаголовокФормы = ?(Заголовок <> Неопределено, Заголовок, НСтр("ru='Комментарий'"));
+ ПоказатьФормуРедактированияМногострочногоТекста(Оповещение, МногострочныйТекст, ЗаголовокФормы);
+
+КонецПроцедуры
+
+////////////////////////////////////////////////////////////////////////////////
+// Процедуры и функции для выполнения резервного копирования в пользовательском режиме.
+
+
+// ИспользованиеМодальности
+
+////////////////////////////////////////////////////////////////////////////////
+// Устаревшие процедуры и функции, использующие модальные окна.
+
+// Устарела. Следует использовать ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами.
+// Предлагает пользователю установить расширение работы с файлами в веб-клиенте.
+// При этом инициализирует параметр сеанса ПредлагатьУстановкуРасширенияРаботыСФайлами.
+//
+// Предназначена для использования в начале участков кода, в которых ведется работа с файлами.
+// Например:
+//
+// ПредложитьУстановкуРасширенияРаботыСФайлами("Для печати документа необходимо установить расширение работы с файлами.");
+// // далее располагается код печати документа
+// //...
+//
+// Параметры
+// Сообщение - Строка - текст сообщения. Если не указан, то выводится текст по умолчанию.
+//
+// Возвращаемое значение:
+// Строка - возможные значения:
+// Подключено - расширение подключено
+// НеПодключено - пользователь отказался от подключения
+// НеподдерживаемыйВебКлиент - расширение не может быть подключено, так как не поддерживается в Веб-клиенте
+//
+Функция ПредложитьУстановкуРасширенияРаботыСФайлами(ТекстПредложения = Неопределено) Экспорт
- РасширениеПодключено = (Действие = "РасширениеПодключено" Или Действие = "ПодключениеНеТребуется");
#Если ВебКлиент Тогда
- Если Действие = "БольшеНеПредлагать"
- Или Действие = "РасширениеПодключено" Тогда
- СистемнаяИнформация = Новый СистемнаяИнформация();
- ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента;
- ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"] = Ложь;
+ РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
+ Если РасширениеПодключено Тогда
+ Возврат "Подключено"; // если расширение и так уже есть, незачем про него спрашивать
+ КонецЕсли;
+
+ СистемнаяИнформация = Новый СистемнаяИнформация();
+ ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента;
+
+ ПервоеОбращениеЗаСеанс = ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"] = Неопределено;
+
+ ИмяПараметра = "СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами";
+ Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
+ ПараметрыПриложения.Вставить(ИмяПараметра, ПредлагатьУстановкуРасширенияРаботыСФайлами());
+ КонецЕсли;
+
+ Если Не ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"] Тогда
+ Возврат ?(РасширениеПодключено, "Подключено", "НеПодключено");
+ КонецЕсли;
+
+ Если ПервоеОбращениеЗаСеанс Тогда
+ ПараметрыФормы = Новый Структура("Сообщение,ВозможноПродолжениеБезУстановки", ТекстПредложения, Истина);
+ КодВозврата = ОткрытьФормуМодально("ОбщаяФорма.ВопросОбУстановкеРасширенияРаботыСФайлами", ПараметрыФормы);
+ Если КодВозврата = Неопределено Тогда
+ КодВозврата = Истина;
+ КонецЕсли;
+
+ ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"] = КодВозврата;
ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить(
- "НастройкиПрограммы/ПредлагатьУстановкуРасширенияРаботыСФайлами", ИдентификаторКлиента, Ложь);
+ "НастройкиПрограммы/ПредлагатьУстановкуРасширенияРаботыСФайлами", ИдентификаторКлиента,
+ ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"]);
КонецЕсли;
+ Возврат ?(ПодключитьРасширениеРаботыСФайлами(), "Подключено", "НеПодключено");
+
+#Иначе
+ Возврат "Подключено";
#КонецЕсли
- ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, РасширениеПодключено);
+КонецФункции
+
+// Устарела. Следует использовать ПроверитьРасширениеРаботыСФайламиПодключено.
+// Предлагает пользователю подключить расширение работы с файлами в веб-клиенте,
+// и в случае отказа выдает предупреждение о невозможности продолжения операции.
+//
+// Предназначена для использования в начале участков кода, в которых ведется работа с файлами
+// только при подключенном расширении.
+// Например:
+//
+// Если Не РасширениеРаботыСФайламиПодключено("Для печати документа необходимо установить расширение работы с файлами.") Тогда
+// Возврат;
+// КонецЕсли;
+// // далее располагается код печати документа
+// //...
+//
+// Параметры
+// ТекстПредложения - Строка - текст с предложением подключить расширение работы с файлами.
+// Если не указан, то выводится текст по умолчанию.
+// ТекстПредупреждения - Строка - текст предупреждения о невозможности продолжения операции.
+// Если не указан, то выводится текст по умолчанию.
+//
+// Возвращаемое значение:
+// Булево - Истина, если расширение подключено.
+//
+Функция РасширениеРаботыСФайламиПодключено(ТекстПредложения = Неопределено, ТекстПредупреждения = Неопределено) Экспорт
+
+ Результат = ПредложитьУстановкуРасширенияРаботыСФайлами(ТекстПредложения);
+ ТекстСообщения = "";
+ Если Результат = "НеПодключено" Тогда
+ Если ТекстПредупреждения <> Неопределено Тогда
+ ТекстСообщения = ТекстПредупреждения;
+ Иначе
+ ТекстСообщения = НСтр("ru = 'Действие недоступно, так как не подключено расширение работы с файлами в Веб-клиенте.'")
+ КонецЕсли;
+ КонецЕсли;
+ Если Не ПустаяСтрока(ТекстСообщения) Тогда
+ ПоказатьПредупреждение(,ТекстСообщения);
+ КонецЕсли;
+ Возврат Результат = "Подключено";
+
+КонецФункции
+
+// Устарела. Следует использовать ПоказатьПодтверждениеЗакрытияФормы или ПоказатьПодтверждениеЗакрытияПроизвольнойФормы.
+// Задает вопрос о продолжении действия, влекущего к потере изменений.
+//
+// Параметры:
+// Отказ - Булево - возвращаемый параметр, признак отказа от выполняемого действия;
+// Модифицированность - Булево - признак модифицированности формы, из которой вызывается данная процедура;
+// ДействиеВыбрано - Булево - признак выбора пользователем действия, приводящего к закрытию формы;
+// ТекстПредупреждения - Строка - текст диалога с пользователем.
+//
+Процедура ЗапроситьПодтверждениеЗакрытияФормы(Отказ, Модифицированность = Истина, ДействиеВыбрано = Ложь, ТекстПредупреждения = "") Экспорт
+
+ Если ДействиеВыбрано = Истина Или Не Модифицированность Тогда
+ Возврат;
+ КонецЕсли;
+
+ ТекстВопроса = ?(ПустаяСтрока(ТекстПредупреждения),
+ НСтр("ru = 'Данные были изменены, внесенные изменения будут отменены.
+ |Отменить и закрыть?'"),
+ ТекстПредупреждения);
+ Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет,
+ НСтр("ru = 'Отмена изменений'"));
+
+ Если Результат = КодВозвратаДиалога.Нет Тогда
+ Отказ = Истина;
+ КонецЕсли;
КонецПроцедуры
-// Обновляет интерфейс программы сохраняя текущее активное окно.
+// Устарела.
+// Позволяет выбрать время из выпадающего списка.
+//
+// Параметры:
+// Форма - управляемая форма / форма - форма, на которой располагается элемент,
+// для которого будет выбираться время
+// ПолеВводаФормы - ПолеФормы - элемент-владелец списка, у которого будет
+// показан выпадающий список значений времен
+// ТекущееЗначение - Дата - значение, на которое будет спозиционирован выпадающий список
+// Интервал - число - интервал времени (в секундах), с которым необходимо заполнить список, по умолчанию час
+//
+// Возвращаемое значение:
+// Число - значение времени в секундах. Либо Неопределено, если пользователь отказался от выбора.
//
+Функция ВыбратьВремя(Форма, ПолеВводаФормы, Знач ТекущееЗначение, Интервал = 3600) Экспорт
+
+ НачалоРабочегоДня = '00010101000000';
+ ОкончаниеРабочегоДня = '00010101235959';
+
+ СписокВремен = Новый СписокЗначений;
+ НачалоРабочегоДня = НачалоЧаса(НачалоДня(ТекущееЗначение) +
+ Час(НачалоРабочегоДня) * 3600 +
+ Минута(НачалоРабочегоДня)*60);
+ ОкончаниеРабочегоДня = КонецЧаса(НачалоДня(ТекущееЗначение) +
+ Час(ОкончаниеРабочегоДня) * 3600 +
+ Минута(ОкончаниеРабочегоДня)*60);
+
+ ВремяСписка = НачалоРабочегоДня;
+
+ Пока НачалоЧаса(ВремяСписка) <= НачалоЧаса(ОкончаниеРабочегоДня) Цикл
+
+ Если НЕ ЗначениеЗаполнено(ВремяСписка) Тогда
+ ПредставлениеВремени = "00:00";
+ Иначе
+ ПредставлениеВремени = Формат(ВремяСписка,"ДФ=ЧЧ:мм");
+ КонецЕсли;
+
+ СписокВремен.Добавить(ВремяСписка, ПредставлениеВремени);
+
+ ВремяСписка = ВремяСписка + Интервал;
+
+ КонецЦикла;
+
+ НачальноеЗначение = СписокВремен.НайтиПоЗначению(ТекущееЗначение);
+
+ Если НачальноеЗначение = Неопределено Тогда
+ ВыбранноеВремя = Форма.ВыбратьИзСписка(СписокВремен, ПолеВводаФормы);
+ Иначе
+ ВыбранноеВремя = Форма.ВыбратьИзСписка(СписокВремен, ПолеВводаФормы, НачальноеЗначение);
+ КонецЕсли;
+
+ Если ВыбранноеВремя = Неопределено Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ Возврат ВыбранноеВремя.Значение;
+
+КонецФункции
+
+// Устарела. Следует использовать ПоказатьФормуРедактированияМногострочногоТекста.
+// Открывает форму редактирования произвольного многострочного текста модально.
+//
+// Параметры:
+// МногострочныйТекст - Строка - произвольный текст, который необходимо отредактировать;
+// РезультатРедактирования - Строка - в этот параметр будет помещен результат редактирования;
+// Модифицированность - Строка - флаг модифицированности формы;
+// Заголовок - Строка - текст, который необходимо отобразить в заголовке формы.
+//
+Процедура ОткрытьФормуРедактированияМногострочногоТекста(Знач МногострочныйТекст, РезультатРедактирования, Модифицированность = Ложь,
+ Знач Заголовок = Неопределено) Экспорт
+
+ Если Заголовок = Неопределено Тогда
+ ТекстВведен = ВвестиСтроку(МногострочныйТекст,,, Истина);
+ Иначе
+ ТекстВведен = ВвестиСтроку(МногострочныйТекст, Заголовок,, Истина);
+ КонецЕсли;
+
+ Если Не ТекстВведен Тогда
+ Возврат;
+ КонецЕсли;
+
+ РезультатРедактирования = МногострочныйТекст;
+ Если Не Модифицированность Тогда
+ Модифицированность = Истина;
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Устарела. Следует использовать ПоказатьФормуРедактированияКомментария.
+// Открывает форму редактирования многострочного комментария модально.
+//
+// Параметры:
+// МногострочныйТекст - Строка - произвольный текст, который необходимо отредактировать
+// РезультатРедактирования - Строка - переменная, в которую будет помещен результат редактирования
+// Модифицированность - Строка - флаг модифицированности формы
+//
+// Пример использования:
+// ОткрытьФормуРедактированияКомментария(Элемент.ТекстРедактирования, Объект.Комментарий, Модифицированность);
+//
+Процедура ОткрытьФормуРедактированияКомментария(Знач МногострочныйТекст, РезультатРедактирования,
+ Модифицированность = Ложь) Экспорт
+
+ ОткрытьФормуРедактированияМногострочногоТекста(МногострочныйТекст, РезультатРедактирования, Модифицированность,
+ НСтр("ru='Комментарий'"));
+
+КонецПроцедуры
+
+// Конец ИспользованиеМодальности
+
+#КонецОбласти
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+
+// Обновляет интерфейс программы сохраняя текущее активное окно.
Процедура ОбновитьИнтерфейсПрограммы() Экспорт
ТекущееАктивноеОкно = АктивноеОкно();
@@ -78,4 +603,178 @@
ТекущееАктивноеОкно.Активизировать();
КонецЕсли;
-КонецПроцедуры
\ No newline at end of file
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиЗавершение(Действие, ОповещениеОЗакрытии) Экспорт
+
+#Если ВебКлиент Тогда
+ Если Действие = "БольшеНеПредлагать" Тогда
+ СистемнаяИнформация = Новый СистемнаяИнформация();
+ ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента;
+ ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"] = Ложь;
+ ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить(
+ "НастройкиПрограммы/ПредлагатьУстановкуРасширенияРаботыСФайлами", ИдентификаторКлиента,
+ ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"]);
+ КонецЕсли;
+#КонецЕсли
+
+ ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, ПодключитьРасширениеРаботыСФайлами());
+
+КонецПроцедуры
+
+Процедура РасширениеРаботыСФайламиПодключеноЗавершение(Действие, Параметры) Экспорт
+
+ ТекстСообщения = "";
+ Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ ВыполнитьОбработкуОповещения(Параметры.ОписаниеОповещенияОЗакрытии);
+ Возврат;
+ КонецЕсли;
+
+ Если ПустаяСтрока(Параметры.ТекстПредупреждения) Тогда
+ ТекстСообщения = НСтр("ru = 'Действие недоступно, так как не установлено расширение для веб-клиента 1С:Предприятие.'")
+ Иначе
+ ТекстСообщения = Параметры.ТекстПредупреждения;
+ КонецЕсли;
+ ПоказатьПредупреждение(, ТекстСообщения);
+
+КонецПроцедуры
+
+Процедура КомментарийЗавершениеВвода(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт
+
+ Если ВведенныйТекст = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ РеквизитФормы = ДополнительныеПараметры.ФормаВладелец;
+
+ ПутьКРеквизитуФормы = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ДополнительныеПараметры.ИмяРеквизита, ".");
+ // Если реквизит вида "Объект.Комментарий" и т.п.
+ Если ПутьКРеквизитуФормы.Количество() > 1 Тогда
+ Для Индекс = 0 По ПутьКРеквизитуФормы.Количество() - 2 Цикл
+ РеквизитФормы = РеквизитФормы[ПутьКРеквизитуФормы[Индекс]];
+ КонецЦикла;
+ КонецЕсли;
+
+ РеквизитФормы[ПутьКРеквизитуФормы[ПутьКРеквизитуФормы.Количество() - 1]] = ВведенныйТекст;
+ ДополнительныеПараметры.ФормаВладелец.Модифицированность = Истина;
+
+КонецПроцедуры
+
+
+Процедура ПодтвердитьЗакрытиеФормыЗавершение(Ответ, Параметры) Экспорт
+
+ Если Ответ = КодВозвратаДиалога.Да Тогда
+ ВыполнитьОбработкуОповещения(Параметры.ОповещениеСохранитьИЗакрыть);
+ ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда
+ Форма = Параметры.ОповещениеСохранитьИЗакрыть.Модуль;
+ Форма.Модифицированность = Ложь;
+ Форма.Закрыть();
+ Иначе
+ Форма = Параметры.ОповещениеСохранитьИЗакрыть.Модуль;
+ Форма.Модифицированность = Истина;
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ПодтвердитьЗакрытиеПроизвольнойФормыЗавершение(Ответ, Параметры) Экспорт
+
+ Форма = Параметры.Форма;
+ Если Ответ = КодВозвратаДиалога.Да
+ Или Ответ = КодВозвратаДиалога.ОК Тогда
+ Форма[Параметры.ИмяРеквизитаЗакрытьФормуБезПодтверждения] = Истина;
+ Если Параметры.ОписаниеОповещенияЗакрыть <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Параметры.ОписаниеОповещенияЗакрыть);
+ КонецЕсли;
+ Форма.Закрыть();
+ Иначе
+ Форма[Параметры.ИмяРеквизитаЗакрытьФормуБезПодтверждения] = Ложь;
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+// Открывает навигационную ссылку в программе, которая ассоциирована с протоколом навигационной ссылки.
+//
+// Допустимые протоколы: http, https, e1c, v8help, mailto, tel, skype.
+//
+// Для открытия проводника или файла в программе просмотра не следует формировать ссылку по протоколу file://
+// - для открытия проводника см. ОткрытьПроводник.
+// - для открытия файла по расширению см. ОткрытьФайлВПрограммеПросмотра.
+//
+// Параметры:
+// НавигационнаяСсылка - Строка - ссылка, которую требуется открыть.
+// Оповещение - ОписаниеОповещения, Неопределено - оповещение о результате открытия.
+// - если оповещение не задано - в случае ошибки будет показано предупреждение.
+// * ПриложениеЗапущено - Булево - Истина, если внешнее приложение не вызвало ошибок при открытии.
+// * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения.
+//
+// Пример:
+// ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку("e1cib/navigationpoint/startpage"); // начальная страница.
+// ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку("v8help://1cv8/QueryLanguageFullTextSearchInData");
+// ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку("https://1c.ru");
+// ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку("mailto:help@1c.ru");
+// ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку("skype:echo123?call");
+//
+Процедура ОткрытьНавигационнуюСсылку(НавигационнаяСсылка, Знач Оповещение = Неопределено) Экспорт
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("НавигационнаяСсылка", НавигационнаяСсылка);
+ Контекст.Вставить("Оповещение", Оповещение);
+
+ ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Не удалось перейти по ссылке ""%1"" по причине:
+ |Неверно задана навигационная ссылка.'"),
+ НавигационнаяСсылка);
+
+ Если Не ОбщегоНазначенияСлужебныйКлиент.ЭтоДопустимаяСсылка(НавигационнаяСсылка) Тогда
+ ОбщегоНазначенияСлужебныйКлиент.ОткрытьНавигационнуюСсылкуОповеститьОбОшибке(ОписаниеОшибки, Контекст);
+ Возврат;
+ КонецЕсли;
+
+ Если ОбщегоНазначенияСлужебныйКлиент.ЭтоВебСсылка(НавигационнаяСсылка)
+ Или ОбщегоНазначенияСлужебныйКлиент.ЭтоНавигационнаяСсылка(НавигационнаяСсылка) Тогда
+
+ Попытка
+
+#Если ТолстыйКлиентОбычноеПриложение Тогда
+ // Особенность платформы: ПерейтиПоНавигационнойСсылке не доступен в толстом клиенте обычного приложения.
+ Оповещение = Новый ОписаниеОповещения(,, Контекст,
+ "ОткрытьНавигационнуюСсылкуПриОбработкеОшибки", ОбщегоНазначенияСлужебныйКлиент);
+ НачатьЗапускПриложения(Оповещение, НавигационнаяСсылка);
+#Иначе
+ ПерейтиПоНавигационнойСсылке(НавигационнаяСсылка);
+#КонецЕсли
+
+ Исключение
+ ОбщегоНазначенияСлужебныйКлиент.ОткрытьНавигационнуюСсылкуОповеститьОбОшибке(ОписаниеОшибки, Контекст);
+ Возврат;
+ КонецПопытки;
+
+ Если Оповещение <> Неопределено Тогда
+ ПриложениеЗапущено = Истина;
+ ВыполнитьОбработкуОповещения(Оповещение, ПриложениеЗапущено);
+ КонецЕсли;
+
+ Возврат;
+ КонецЕсли;
+
+ Если ОбщегоНазначенияСлужебныйКлиент.ЭтоСсылкаНаСправку(НавигационнаяСсылка) Тогда
+ ОткрытьСправку(НавигационнаяСсылка);
+ Возврат;
+ КонецЕсли;
+
+ //Оповещение = Новый ОписаниеОповещения(
+ // "ОткрытьНавигационнуюСсылкуПослеПроверкиРасширенияРаботыСФайлами", ОбщегоНазначенияСлужебныйКлиент, Контекст);
+ //
+ //ТекстПредложения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ // НСтр("ru = 'Для открытия ссылки ""%1"" необходимо установить расширение работы с файлами.'"),
+ // НавигационнаяСсылка);
+ //ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстПредложения, Ложь);
+
+КонецПроцедуры
+
diff --git "a/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Module.bsl"
new file mode 100644
index 0000000..e161c41
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Module.bsl"
@@ -0,0 +1,53 @@
+#Область СлужебныеПроцедурыИФункции
+
+// Функция получает цвет стиля по имени элемента стиля.
+//
+// Параметры:
+// ИмяЦветаСтиля - Строка - Имя элемента стиля.
+//
+// Возвращаемое значение:
+// Цвет.
+//
+Функция ЦветСтиля(ИмяЦветаСтиля) Экспорт
+
+ Возврат ОбщегоНазначенияВызовСервера.ЦветСтиля(ИмяЦветаСтиля);
+
+КонецФункции
+
+// Функция получает шрифт стиля по имени элемента стиля.
+//
+// Параметры:
+// ИмяШрифтаСтиля - Строка - Имя шрифта стиля.
+//
+// Возвращаемое значение:
+// Шрифт.
+//
+Функция ШрифтСтиля(ИмяШрифтаСтиля) Экспорт
+
+ Возврат ОбщегоНазначенияВызовСервера.ШрифтСтиля(ИмяШрифтаСтиля);
+
+КонецФункции
+
+// См. ОбщегоНазначенияКлиентСервер.ЭтоВебКлиентПодMacOS.
+Функция ЭтоВебКлиентПодMacOS() Экспорт
+
+#Если Не ВебКлиент Тогда
+ Возврат Ложь; // Только в веб клиенте этот код работает.
+#КонецЕсли
+
+ СистемнаяИнфо = Новый СистемнаяИнформация;
+ Если СтрНайти(СистемнаяИнфо.ИнформацияПрограммыПросмотра, "Macintosh") <> 0 Тогда
+ Возврат Истина;
+ КонецЕсли;
+
+ Возврат Ложь;
+
+КонецФункции
+
+// См. ОбщегоНазначенияКлиент.ТипПлатформыКлиента.
+Функция ТипПлатформыКлиента() Экспорт
+ СистемнаяИнфо = Новый СистемнаяИнформация;
+ Возврат СистемнаяИнфо.ТипПлатформы;
+КонецФункции
+
+#КонецОбласти
diff --git "a/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\276\320\262\321\202\320\230\321\201\320\277/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\276\320\262\321\202\320\230\321\201\320\277.mdo" "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\276\320\262\321\202\320\230\321\201\320\277/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\276\320\262\321\202\320\230\321\201\320\277.mdo"
new file mode 100644
index 0000000..3c4048b
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\276\320\262\321\202\320\230\321\201\320\277/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\276\320\262\321\202\320\230\321\201\320\277.mdo"
@@ -0,0 +1,11 @@
+
+
+ ОбщегоНазначенияКлиентПовтИсп
+
+ ru
+ Общего назначения клиент повт исп
+
+ true
+ true
+ DuringSession
+
diff --git "a/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
index 20c9d58..b71daa0 100644
--- "a/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
+++ "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
@@ -131,3 +131,115 @@
Файл = новый Файл(ПутьКФайлу);
Возврат Файл.Путь;
КонецФункции
+
+// Возвращает Истина, если включен режим отладки.
+Функция РежимОтладки() Экспорт
+
+//#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
+// ПараметрЗапускаПриложения = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ПараметрЗапуска");
+//#Иначе
+// ПараметрЗапускаПриложения = ПараметрЗапуска;
+//#КонецЕсли
+//
+// Возврат Найти(ПараметрЗапускаПриложения, "РежимОтладки") > 0;
+ Возврат Ложь;
+
+КонецФункции
+
+// Вызывает исключение с текстом Сообщение, если Условие не равно Истина.
+// Применяется для самодиагностики кода.
+//
+// Параметры:
+// Условие - Булево - если не равно Истина, то вызывается исключение.
+// КонтекстПроверки - Строка - например, имя процедуры или функции, в которой выполняется проверка.
+// Сообщение - Строка - текст сообщения. Если не задан, то исключение вызывается с сообщением по
+// умолчанию.
+//
+Процедура Проверить(Знач Условие, Знач Сообщение = "", Знач КонтекстПроверки = "") Экспорт
+
+ Если Не РежимОтладки() Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если Условие <> Истина Тогда
+ Если ПустаяСтрока(Сообщение) Тогда
+ ТекстИсключения = НСтр("ru = 'Недопустимая операция'"); // Assertion failed
+ Иначе
+ ТекстИсключения = Сообщение;
+ КонецЕсли;
+ Если Не ПустаяСтрока(КонтекстПроверки) Тогда
+ ТекстИсключения = ТекстИсключения + " " +
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'в %1'"), КонтекстПроверки);
+ КонецЕсли;
+ ВызватьИсключение ТекстИсключения;
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Вызывает исключение, если тип значения параметра ИмяПараметра процедуры или функции ИмяПроцедурыИлиФункции
+// отличается от ожидаемого.
+// Для диагностики типов параметров, передаваемых в процедуры и функции программного интерфейса.
+//
+// Параметры:
+// ИмяПроцедурыИлиФункции - Строка - имя процедуры или функции, параметр которой проверяется.
+// ИмяПараметра - Строка - имя проверяемого параметра процедуры или функции.
+// ЗначениеПараметра - Произвольный - фактическое значение параметра.
+// ОжидаемыеТипы - ОписаниеТипов, Тип - тип(ы) параметра процедуры или функции.
+// ОжидаемыеТипыСвойств - Структура - если ожидаемый тип - структура, то
+// в этом параметре можно указать типы ее свойств.
+//
+Процедура ПроверитьПараметр(Знач ИмяПроцедурыИлиФункции, Знач ИмяПараметра, Знач ЗначениеПараметра,
+ Знач ОжидаемыеТипы, Знач ОжидаемыеТипыСвойств = Неопределено) Экспорт
+
+ Если Не РежимОтладки() Тогда
+ Возврат;
+ КонецЕсли;
+
+ Контекст = "ОбщегоНазначенияКлиентСервер.ПроверитьПараметр";
+ Проверить(ТипЗнч(ИмяПроцедурыИлиФункции) = Тип("Строка"),
+ НСтр("ru = 'Недопустимо значение параметра ИмяПроцедурыИлиФункции'"), Контекст);
+ Проверить(ТипЗнч(ИмяПараметра) = Тип("Строка"),
+ НСтр("ru = 'Недопустимо значение параметра ИмяПараметра'"), Контекст);
+
+ ЭтоОписаниеТипов = ТипЗнч(ОжидаемыеТипы) = Тип("ОписаниеТипов");
+ Проверить(ЭтоОписаниеТипов Или ТипЗнч(ОжидаемыеТипы) = Тип("Тип"),
+ НСтр("ru = 'Недопустимо значение параметра ОжидаемыеТипы'"), Контекст);
+
+ НедопустимыйПараметр = НСтр("ru = 'Недопустимое значение параметра %1 в %2.
+ |Ожидалось: %3; передано значение: %4 (тип %5).'");
+ Проверить((ЭтоОписаниеТипов И ОжидаемыеТипы.СодержитТип(ТипЗнч(ЗначениеПараметра)))
+ Или (Не ЭтоОписаниеТипов И ОжидаемыеТипы = ТипЗнч(ЗначениеПараметра)),
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НедопустимыйПараметр,
+ ИмяПараметра, ИмяПроцедурыИлиФункции, ОжидаемыеТипы,
+ ?(ЗначениеПараметра <> Неопределено, ЗначениеПараметра, НСтр("ru = 'Неопределено'")), ТипЗнч(ЗначениеПараметра)));
+
+ Если ТипЗнч(ЗначениеПараметра) = Тип("Структура") И ОжидаемыеТипыСвойств <> Неопределено Тогда
+
+ Проверить(ТипЗнч(ОжидаемыеТипыСвойств) = Тип("Структура"),
+ НСтр("ru = 'Недопустимо значение параметра ИмяПроцедурыИлиФункции'"), Контекст);
+
+ НетСвойства = НСтр("ru = 'Недопустимое значение параметра %1 (Структура) в %2.
+ |В структуре ожидалось свойство %3 (тип %4).'");
+ НедопустимоеСвойство = НСтр("ru = 'Недопустимое значение свойства %1 в параметре %2 (Структура) в %3.
+ |Ожидалось: %4; передано значение: %5 (тип %6).'");
+ Для каждого Свойство Из ОжидаемыеТипыСвойств Цикл
+
+ ОжидаемоеИмяСвойства = Свойство.Ключ;
+ ОжидаемыйТипСвойства = Свойство.Значение;
+ ЗначениеСвойства = Неопределено;
+
+ Проверить(ЗначениеПараметра.Свойство(ОжидаемоеИмяСвойства, ЗначениеСвойства),
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НетСвойства,
+ ИмяПараметра, ИмяПроцедурыИлиФункции, ОжидаемоеИмяСвойства, ОжидаемыйТипСвойства));
+
+ ЭтоОписаниеТипов = ТипЗнч(ОжидаемыйТипСвойства) = Тип("ОписаниеТипов");
+ Проверить((ЭтоОписаниеТипов И ОжидаемыйТипСвойства.СодержитТип(ТипЗнч(ЗначениеСвойства)))
+ Или (Не ЭтоОписаниеТипов И ОжидаемыйТипСвойства = ТипЗнч(ЗначениеСвойства)),
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НедопустимоеСвойство,
+ ОжидаемоеИмяСвойства, ИмяПараметра, ИмяПроцедурыИлиФункции, ОжидаемыйТипСвойства,
+ ?(ЗначениеСвойства <> Неопределено, ЗначениеСвойства, НСтр("ru = 'Неопределено'")), ТипЗнч(ЗначениеСвойства)));
+
+ КонецЦикла;
+ КонецЕсли;
+
+КонецПроцедуры
diff --git "a/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl"
new file mode 100644
index 0000000..11017bc
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl"
@@ -0,0 +1,115 @@
+#Область ОткрытьНавигационнуюСсылку
+
+// Продолжение процедуры ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку.
+Процедура ОткрытьНавигационнуюСсылкуПослеПроверкиРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт
+
+ НавигационнаяСсылка = Контекст.НавигационнаяСсылка;
+
+ Если РасширениеПодключено Тогда
+
+ Оповещение = Контекст.Оповещение;
+ ДождатьсяЗавершения = (Оповещение <> Неопределено);
+
+ Оповещение = Новый ОписаниеОповещения("ОткрытьНавигационнуюСсылкуПослеЗапускаПриложения", ЭтотОбъект, Контекст,
+ "ОткрытьНавигационнуюСсылкуПриОбработкеОшибки", ЭтотОбъект);
+ НачатьЗапускПриложения(Оповещение, НавигационнаяСсылка,, ДождатьсяЗавершения);
+
+ Иначе
+ ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Расширение для работы с файлами не установлено, переход по ссылке ""%1"" невозможен.'"),
+ НавигационнаяСсылка);
+ ОткрытьНавигационнуюСсылкуОповеститьОбОшибке(ОписаниеОшибки, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку.
+Процедура ОткрытьНавигационнуюСсылкуПослеЗапускаПриложения(КодВозврата, Контекст) Экспорт
+
+ Оповещение = Контекст.Оповещение;
+
+ Если Оповещение <> Неопределено Тогда
+ ПриложениеЗапущено = (КодВозврата = 0 Или КодВозврата = Неопределено);
+ ВыполнитьОбработкуОповещения(Оповещение, ПриложениеЗапущено);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку.
+Процедура ОткрытьНавигационнуюСсылкуПриОбработкеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ СтандартнаяОбработка = Ложь;
+ ОткрытьНавигационнуюСсылкуОповеститьОбОшибке("", Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку.
+Процедура ОткрытьНавигационнуюСсылкуОповеститьОбОшибке(ОписаниеОшибки, Контекст) Экспорт
+
+ Оповещение = Контекст.Оповещение;
+
+ Если Оповещение = Неопределено Тогда
+ Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
+ ПоказатьПредупреждение(, ОписаниеОшибки);
+ КонецЕсли;
+ Иначе
+ ПриложениеЗапущено = Ложь;
+ ВыполнитьОбработкуОповещения(Оповещение, ПриложениеЗапущено);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Проверяет, является ли переданная строка веб ссылкой.
+//
+// Параметры:
+// Строка - Строка - переданная ссылка.
+//
+Функция ЭтоВебСсылка(Строка) Экспорт
+
+ Возврат СтрНачинаетсяС(Строка, "http://") // обычное соединение.
+ Или СтрНачинаетсяС(Строка, "https://");// защищенное соединение.
+
+КонецФункции
+
+// Проверяет, является ли переданная строка ссылкой на встроенную справку.
+//
+// Параметры:
+// Строка - Строка - переданная ссылка.
+//
+Функция ЭтоСсылкаНаСправку(Строка) Экспорт
+
+ Возврат СтрНачинаетсяС(Строка, "v8help://");
+
+КонецФункции
+
+// Проверяет, является ли переданная строка допустимой ссылкой по белому списку протоколов.
+//
+// Параметры:
+// Строка - Строка - переданная ссылка.
+//
+Функция ЭтоДопустимаяСсылка(Строка) Экспорт
+
+ Возврат СтрНачинаетсяС(Строка, "e1cib/")
+ Или СтрНачинаетсяС(Строка, "http:")
+ Или СтрНачинаетсяС(Строка, "https:")
+ Или СтрНачинаетсяС(Строка, "e1c:")
+ Или СтрНачинаетсяС(Строка, "v8help:")
+ Или СтрНачинаетсяС(Строка, "mailto:")
+ Или СтрНачинаетсяС(Строка, "tel:")
+ Или СтрНачинаетсяС(Строка, "skype:");
+
+КонецФункции
+
+#КонецОбласти
+
+// Проверяет, является ли переданная строка внутренней навигационной ссылкой.
+//
+// Параметры:
+// Строка - Строка - навигационная ссылка.
+//
+Функция ЭтоНавигационнаяСсылка(Строка) Экспорт
+
+ Возврат СтрНачинаетсяС(Строка, "e1c:")
+ Или СтрНачинаетсяС(Строка, "e1cib/");
+
+КонецФункции
diff --git "a/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202.mdo" "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202.mdo"
new file mode 100644
index 0000000..5e66cad
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202.mdo"
@@ -0,0 +1,9 @@
+
+
+ ОбщегоНазначенияСлужебныйКлиент
+
+ ru
+ Общего назначения служебный клиент
+
+ true
+
diff --git "a/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl"
new file mode 100644
index 0000000..21bcae1
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl"
@@ -0,0 +1,11 @@
+#Область ПрограммныйИнтерфейс
+
+// Открывает форму управления полнотекстовым поиском и извлечения текстов.
+//
+Процедура ПоказатьУправлениеПолнотекстовымПоискомИИзвлечениемТекстов() Экспорт
+
+ ОткрытьФорму("Обработка.ПолнотекстовыйПоискВДанных.Форма.УправлениеПолнотекстовымПоискомИИзвлечениемТекстов");
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git "a/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\232\320\273\320\270\320\265\320\275\321\202/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\232\320\273\320\270\320\265\320\275\321\202.mdo" "b/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\232\320\273\320\270\320\265\320\275\321\202/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\232\320\273\320\270\320\265\320\275\321\202.mdo"
new file mode 100644
index 0000000..5379f7b
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\232\320\273\320\270\320\265\320\275\321\202/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\232\320\273\320\270\320\265\320\275\321\202.mdo"
@@ -0,0 +1,10 @@
+
+
+ ПолнотекстовыйПоискКлиент
+
+ ru
+ Полнотекстовый поиск клиент
+
+ true
+ true
+
diff --git "a/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
new file mode 100644
index 0000000..177d003
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
@@ -0,0 +1,468 @@
+#Область ПрограммныйИнтерфейс
+
+// Обновляет индекс полнотекстового поиска.
+Процедура ОбновлениеИндексаППД() Экспорт
+
+ ОбновитьИндекс(НСтр("ru = 'Обновление индекса ППД'"), Ложь, Истина);
+
+КонецПроцедуры
+
+// Выполняет слияние индексов полнотекстового поиска.
+Процедура СлияниеИндексаППД() Экспорт
+
+ ОбновитьИндекс(НСтр("ru = 'Слияние индекса ППД'"), Истина);
+
+КонецПроцедуры
+
+// Возвращает, актуален ли индекс полнотекстового поиска.
+// Проверка функциональной опции "ИспользоватьПолнотекстовыйПоиск" выполняется в вызывающем коде.
+//
+// Возвращаемое значение:
+// Булево - Истина - полнотекстовый поиск содержит актуальные данные.
+//
+Функция ИндексПоискаАктуален() Экспорт
+
+ Возврат (
+ // Операции не разрешены,
+ // или индекс полностью соответствует текущему состоянию информационной базы,
+ // или индекс обновлялся менее 5 минут назад.
+ Не ОперацииРазрешены()
+ Или ПолнотекстовыйПоиск.ИндексАктуален()
+ Или ТекущаяДата() < (ПолнотекстовыйПоиск.ДатаАктуальности() + 300)); // Исключение из правила ТекущаяДатаСеанса().
+
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+// Возвращает разрешены ли операции полнотекстового поиска: обновление индексов, очистка индексов, поиск.
+Функция ОперацииРазрешены() Экспорт
+
+ Возврат (ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Разрешить);
+
+КонецФункции
+
+Функция ИспользоватьПолнотекстовыйПоиск() Экспорт
+
+ Возврат Метаданные.ФункциональныеОпции.ИспользоватьПолнотекстовыйПоиск;
+
+КонецФункции
+
+#Область ОбработчикиСобытийПодсистемКонфигурации
+
+// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел.
+Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт
+//отключено
+КонецПроцедуры
+
+// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления.
+Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
+
+ Обработчик = Обработчики.Добавить();
+ Обработчик.НачальноеЗаполнение = Истина;
+ Обработчик.Процедура = "ПолнотекстовыйПоискСервер.ИнициализироватьФункциональнуюОпциюПолнотекстовыйПоиск";
+ Обработчик.Версия = "1.0.0.1";
+ Обработчик.ОбщиеДанные = Истина;
+
+КонецПроцедуры
+
+// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий.
+Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт
+
+ Зависимость = Зависимости.Добавить();
+ Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОбновлениеИндексаППД;
+ Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьПолнотекстовыйПоиск;
+
+ Зависимость = Зависимости.Добавить();
+ Зависимость.РегламентноеЗадание = Метаданные.РегламентныеЗадания.СлияниеИндексаППД;
+ Зависимость.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьПолнотекстовыйПоиск;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+// Устанавливает значение константы ИспользоватьПолнотекстовыйПоиск.
+// Используется для синхронизации значения
+// функциональной опции "ИспользоватьПолнотекстовыйПоиск"
+// с "ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска()".
+//
+Процедура ИнициализироватьФункциональнуюОпциюПолнотекстовыйПоиск() Экспорт
+
+ ЗначениеКонстанты = ОперацииРазрешены();
+ Константы.ИспользоватьПолнотекстовыйПоиск.Установить(ЗначениеКонстанты);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#Область ОбработчикиРегламентныхЗаданий
+
+// Обработчик регламентного задания ОбновлениеИндексаППД.
+Процедура ОбновлениеИндексаППДПоРасписанию() Экспорт
+
+ ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОбновлениеИндексаППД);
+
+ Если ВыполняетсяФоновоеЗаданиеСлияниеИндекса() Тогда
+ Возврат;
+ КонецЕсли;
+
+ ОбновлениеИндексаППД();
+
+КонецПроцедуры
+
+// Обработчик регламентного задания СлияниеИндексаППД.
+Процедура СлияниеИндексаППДПоРасписанию() Экспорт
+
+ ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.СлияниеИндексаППД);
+
+ Если ВыполняетсяФоновоеЗаданиеОбновлениеИндекса() Тогда
+ Возврат;
+ КонецЕсли;
+
+ СлияниеИндексаППД();
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область БизнесЛогикаПоиска
+
+#Область СостояниеПоиска
+
+Функция СостояниеПолнотекстовогоПоиска() Экспорт
+
+ Если ПолучитьФункциональнуюОпцию("ИспользоватьПолнотекстовыйПоиск") Тогда
+
+ Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Разрешить Тогда
+
+ // Исключение из правила ТекущаяДатаСеанса().
+ Если ТекущаяДата() < (ПолнотекстовыйПоиск.ДатаАктуальности() + 300) Тогда
+ Возврат "ПоискРазрешен";
+ Иначе
+ Если ПолнотекстовыйПоиск.ИндексАктуален() Тогда
+ Возврат "ПоискРазрешен";
+ ИначеЕсли ВыполняетсяФоновоеЗаданиеОбновлениеИндекса() Тогда
+ Возврат "ВыполняетсяОбновлениеИндекса";
+ ИначеЕсли ВыполняетсяФоновоеЗаданиеСлияниеИндекса() Тогда
+ Возврат "ВыполняетсяСлияниеИндекса";
+ Иначе
+ Возврат "ТребуетсяОбновлениеИндекса";
+ КонецЕсли;
+ КонецЕсли;
+
+ Иначе
+ // Рассинхронизация значения константы ИспользоватьПолнотекстовыйПоиск
+ // и установленного режима полнотекстового поиска в информационной базе.
+ Возврат "ОшибкаНастройкиПоиска";
+ КонецЕсли;
+
+ Иначе
+ Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Разрешить Тогда
+ // Рассинхронизация значения константы ИспользоватьПолнотекстовыйПоиск
+ // и установленного режима полнотекстового поиска в информационной базе.
+ Возврат "ОшибкаНастройкиПоиска";
+ Иначе
+ Возврат "ПоискЗапрещен";
+ КонецЕсли;
+ КонецЕсли;
+
+КонецФункции
+
+Функция ВыполняетсяФоновоеЗаданиеОбновлениеИндекса()
+
+ РегламентноеЗадание = Метаданные.РегламентныеЗадания.ОбновлениеИндексаППД;
+
+ Отбор = Новый Структура;
+ Отбор.Вставить("ИмяМетода", РегламентноеЗадание.ИмяМетода);
+ Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);
+ ТекущиеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
+
+ Возврат ТекущиеФоновыеЗадания.Количество() > 0;
+
+КонецФункции
+
+Функция ВыполняетсяФоновоеЗаданиеСлияниеИндекса()
+
+ РегламентноеЗадание = Метаданные.РегламентныеЗадания.СлияниеИндексаППД;
+
+ Отбор = Новый Структура;
+ Отбор.Вставить("ИмяМетода", РегламентноеЗадание.ИмяМетода);
+ Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);
+ ТекущиеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
+
+ Возврат ТекущиеФоновыеЗадания.Количество() > 0;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ВыполнениеПоиска
+
+Функция ПараметрыПоиска() Экспорт
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("СтрокаПоиска", "");
+ Параметры.Вставить("НаправлениеПоиска", "ПерваяЧасть");
+ Параметры.Вставить("ТекущаяПозиция", 0);
+ Параметры.Вставить("ИскатьВРазделах", Ложь);
+ Параметры.Вставить("ОбластиПоиска", Новый Массив);
+
+ Возврат Параметры;
+
+КонецФункции
+
+Функция ВыполнитьПолнотекстовыйПоиск(ПараметрыПоиска) Экспорт
+
+ СтрокаПоиска = ПараметрыПоиска.СтрокаПоиска;
+ Направление = ПараметрыПоиска.НаправлениеПоиска;
+ ТекущаяПозиция = ПараметрыПоиска.ТекущаяПозиция;
+ ИскатьВРазделах = ПараметрыПоиска.ИскатьВРазделах;
+ ОбластиПоиска = ПараметрыПоиска.ОбластиПоиска;
+
+ РазмерПорции = 10;
+ ОписаниеОшибки = "";
+ КодОшибки = "";
+
+ СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(СтрокаПоиска, РазмерПорции);
+
+ Если ИскатьВРазделах И ОбластиПоиска.Количество() > 0 Тогда
+ СписокПоиска.ИспользованиеМетаданных = ИспользованиеМетаданныхПолнотекстовогоПоиска.НеИспользовать;
+
+ Для каждого Область Из ОбластиПоиска Цикл
+ ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Область.Значение);
+ СписокПоиска.ОбластьПоиска.Добавить(ОбъектМетаданных);
+ КонецЦикла;
+ КонецЕсли;
+
+ Попытка
+ Если Направление = "ПерваяЧасть" Тогда
+ СписокПоиска.ПерваяЧасть();
+ ИначеЕсли Направление = "ПредыдущаяЧасть" Тогда
+ СписокПоиска.ПредыдущаяЧасть(ТекущаяПозиция);
+ ИначеЕсли Направление = "СледующаяЧасть" Тогда
+ СписокПоиска.СледующаяЧасть(ТекущаяПозиция);
+ Иначе
+ ВызватьИсключение НСтр("ru = 'Параметр НаправлениеПоиска задан неверно.'");
+ КонецЕсли;
+ Исключение
+ ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
+ КодОшибки = "ОшибкаПоиска";
+ КонецПопытки;
+
+ Если СписокПоиска.СлишкомМногоРезультатов() Тогда
+ ОписаниеОшибки = НСтр("ru = 'Слишком много результатов, уточните запрос'");
+ КодОшибки = "СлишкомМногоРезультатов";
+ КонецЕсли;
+
+ ПолноеКоличество = СписокПоиска.ПолноеКоличество();
+
+ Если ПолноеКоличество = 0 Тогда
+ ОписаниеОшибки = НСтр("ru = 'По запросу ничего не найдено'");
+ КодОшибки = "НичегоНеНайдено";
+ КонецЕсли;
+
+ Если ПустаяСтрока(КодОшибки) Тогда
+ РезультатыПоиска = РезультатыПолнотекстовогоПоиска(СписокПоиска);
+ Иначе
+ РезультатыПоиска = Новый Массив;
+ КонецЕсли;
+
+ Результат = Новый Структура;
+ Результат.Вставить("ТекущаяПозиция", СписокПоиска.НачальнаяПозиция());
+ Результат.Вставить("Количество", СписокПоиска.Количество());
+ Результат.Вставить("ПолноеКоличество", ПолноеКоличество);
+ Результат.Вставить("КодОшибки", КодОшибки);
+ Результат.Вставить("ОписаниеОшибки", ОписаниеОшибки);
+ Результат.Вставить("РезультатыПоиска", РезультатыПоиска);
+
+ Возврат Результат;
+
+КонецФункции
+
+Функция РезультатыПолнотекстовогоПоиска(СписокПоиска)
+
+ // Разбор списка посредством выделения блока описания HTML.
+ СтрокиПоискаHTML = СтрокиРезультатаПоискаHTML(СписокПоиска);
+
+ Результат = Новый Массив;
+
+ // Обход строк списка поиска.
+ Для Индекс = 0 По СписокПоиска.Количество() - 1 Цикл
+
+ ОписаниеHTML = СтрокиПоискаHTML.ОписанияHTML.Получить(Индекс);
+ Представление = СтрокиПоискаHTML.Представления.Получить(Индекс);
+ СтрокаСпискаПоиска = СписокПоиска.Получить(Индекс);
+
+ МетаданныеОбъекта = СтрокаСпискаПоиска.Метаданные;
+ Значение = СтрокаСпискаПоиска.Значение;
+
+ Переопределяемый_ПриПолученииПолнотекстовымПоиском(МетаданныеОбъекта, Значение, Представление);
+
+ Ссылка = "";
+ Попытка
+ Ссылка = ПолучитьНавигационнуюСсылку(Значение);
+ Исключение
+ Ссылка = "#"; // Непредусмотренное для открытия.
+ КонецПопытки;
+
+ СтрокаРезультата = Новый Структура;
+ СтрокаРезультата.Вставить("Ссылка", Ссылка);
+ СтрокаРезультата.Вставить("ОписаниеHTML", ОписаниеHTML);
+ СтрокаРезультата.Вставить("Представление", Представление);
+
+ Результат.Добавить(СтрокаРезультата);
+
+ КонецЦикла;
+
+ Возврат Результат;
+
+КонецФункции
+
+Функция СтрокиРезультатаПоискаHTML(СписокПоиска)
+
+ ОтображениеСпискаHTML = СписокПоиска.ПолучитьОтображение(ВидОтображенияПолнотекстовогоПоиска.HTMLТекст);
+
+ // Получение DOM для отображения списка.
+ // Нельзя выносить в отдельную функцию получения DOM из-за ошибки платформы в стеке вызовов потока чтения DOM.
+ ЧтениеHTML = Новый ЧтениеHTML;
+ ЧтениеHTML.УстановитьСтроку(ОтображениеСпискаHTML);
+ ПостроительDOM = Новый ПостроительDOM;
+ ОтображениеСпискаDOM = ПостроительDOM.Прочитать(ЧтениеHTML);
+ ЧтениеHTML.Закрыть();
+
+ СписокЭлементовDivDOM = ОтображениеСпискаDOM.ПолучитьЭлементыПоИмени("div");
+ СтрокиОписанияHTML = СтрокиОписанияHTML(СписокЭлементовDivDOM);
+
+ СписокЭлементовAnchorDOM = ОтображениеСпискаDOM.ПолучитьЭлементыПоИмени("a");
+ СтрокиПредставления = СтрокиПредставления(СписокЭлементовAnchorDOM);
+
+ Результат = Новый Структура;
+ Результат.Вставить("ОписанияHTML", СтрокиОписанияHTML);
+ Результат.Вставить("Представления", СтрокиПредставления);
+
+ Возврат Результат;
+
+КонецФункции
+
+Функция СтрокиОписанияHTML(СписокЭлементовDivDOM)
+
+ СтрокиОписанияHTML = Новый Массив;
+ Для каждого ЭлементDOM Из СписокЭлементовDivDOM Цикл
+
+ Если ЭлементDOM.ИмяКласса = "textPortion" Тогда
+
+ ЗаписьDOM = Новый ЗаписьDOM;
+ ЗаписьHTML = Новый ЗаписьHTML;
+ ЗаписьHTML.УстановитьСтроку();
+ ЗаписьDOM.Записать(ЭлементDOM, ЗаписьHTML);
+
+ ОписаниеHTMLСтрокиРезультата = ЗаписьHTML.Закрыть();
+
+ СтрокиОписанияHTML.Добавить(ОписаниеHTMLСтрокиРезультата);
+
+ КонецЕсли;
+ КонецЦикла;
+
+ Возврат СтрокиОписанияHTML;
+
+КонецФункции
+
+Функция СтрокиПредставления(СписокЭлементовAnchorDOM)
+
+ СтрокиПредставления = Новый Массив;
+ Для каждого ЭлементDOM Из СписокЭлементовAnchorDOM Цикл
+
+ Представление = ЭлементDOM.ТекстовоеСодержимое;
+ СтрокиПредставления.Добавить(Представление);
+
+ КонецЦикла;
+
+ Возврат СтрокиПредставления;
+
+КонецФункции
+
+// Позволяет переопределить:
+// - Значение
+// - Представление
+//
+// См. тип данных ЭлементСпискаПолнотекстовогоПоиска
+//
+Процедура Переопределяемый_ПриПолученииПолнотекстовымПоиском(МетаданныеОбъекта, Значение, Представление)
+
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ОбновлениеИндексаПоиска
+
+// Общая процедура для обновления и слияния индекса ППД.
+Процедура ОбновитьИндекс(ПредставлениеПроцедуры, РазрешитьСлияние = Ложь, Порциями = Ложь)
+
+ Если НЕ ОперацииРазрешены() Тогда
+ Возврат;
+ КонецЕсли;
+
+ ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания();
+
+ ЗаписьЖурнала(Неопределено, НСтр("ru = 'Запуск процедуры ""%1"".'"), , ПредставлениеПроцедуры);
+
+ Попытка
+ ПолнотекстовыйПоиск.ОбновитьИндекс(РазрешитьСлияние, Порциями);
+ ЗаписьЖурнала(Неопределено, НСтр("ru = 'Успешное завершение процедуры ""%1"".'"), , ПредставлениеПроцедуры);
+ Исключение
+ ЗаписьЖурнала(Неопределено, НСтр("ru = 'Ошибка выполнения процедуры ""%1"":'"), ИнформацияОбОшибке(), ПредставлениеПроцедуры);
+ КонецПопытки;
+
+КонецПроцедуры
+
+// Создает запись в журнале регистрации и сообщениях пользователю;
+//
+// Параметры:
+// УровеньЖурнала - УровеньЖурналаРегистрации - Важность сообщения для администратора.
+// КомментарийСПараметрами - Строка - Комментарий, который может содержать параметры %1.
+// ИнформацияОбОшибке - ИнформацияОбОшибке, Строка - Информация об ошибке, которая будет размещена после комментария.
+// Параметр - Строка - Для подстановки в КомментарийСПараметрами вместо %1.
+//
+Процедура ЗаписьЖурнала(УровеньЖурнала, КомментарийСПараметрами, ИнформацияОбОшибке = Неопределено,
+ Параметр = Неопределено)
+
+ // Определение уровня журнала регистрации на основе типа переданного сообщения об ошибке.
+ Если ТипЗнч(УровеньЖурнала) <> Тип("УровеньЖурналаРегистрации") Тогда
+ Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда
+ УровеньЖурнала = УровеньЖурналаРегистрации.Ошибка;
+ ИначеЕсли ТипЗнч(ИнформацияОбОшибке) = Тип("Строка") Тогда
+ УровеньЖурнала = УровеньЖурналаРегистрации.Предупреждение;
+ Иначе
+ УровеньЖурнала = УровеньЖурналаРегистрации.Информация;
+ КонецЕсли;
+ КонецЕсли;
+
+ // Комментарий для журнала регистрации.
+ ТекстДляЖурнала = КомментарийСПараметрами;
+ Если Параметр <> Неопределено Тогда
+ ТекстДляЖурнала = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстДляЖурнала, Параметр);
+ КонецЕсли;
+ Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда
+ ТекстДляЖурнала = ТекстДляЖурнала + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
+ ИначеЕсли ТипЗнч(ИнформацияОбОшибке) = Тип("Строка") Тогда
+ ТекстДляЖурнала = ТекстДляЖурнала + Символы.ПС + ИнформацияОбОшибке;
+ КонецЕсли;
+ ТекстДляЖурнала = СокрЛП(ТекстДляЖурнала);
+
+ // Запись в журнал регистрации.
+ ЗаписьЖурналаРегистрации(
+ НСтр("ru = 'Полнотекстовое индексирование'", ),
+ УровеньЖурнала, , ,
+ ТекстДляЖурнала);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#КонецОбласти
diff --git "a/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200.mdo" "b/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200.mdo"
new file mode 100644
index 0000000..97c1dad
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200.mdo"
@@ -0,0 +1,11 @@
+
+
+ ПолнотекстовыйПоискСервер
+
+ ru
+ Полнотекстовый поиск сервер
+
+ true
+ true
+ true
+
diff --git "a/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\265\321\200\320\265\320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\320\265\320\274\321\213\320\271/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\265\321\200\320\265\320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\320\265\320\274\321\213\320\271/Module.bsl"
new file mode 100644
index 0000000..df0a3df
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\265\321\200\320\265\320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\320\265\320\274\321\213\320\271/Module.bsl"
@@ -0,0 +1,37 @@
+#Область ПрограммныйИнтерфейс
+
+// Позволяет внести изменения в дерево с разделами полнотекстового поиска, отображаемого при выборе области поиска.
+// По умолчанию дерево разделов формируется на основании состава подсистем конфигурации.
+// Структура дерева описана в форме Обработка.ПолнотекстовыйПоискВДанных.Форма.ВыборОбластиПоиска.
+// Все колонки, неуказанные в параметрах, будут автоматически рассчитаны.
+// При необходимости построить дерево разделов самостоятельно требуется сохранить состав колонок.
+//
+// Параметры:
+// РазделыПоиска - ДеревоЗначений - области поиска. Содержит колонки:
+// ** Раздел - Строка - Представление раздела: подсистемы или объекта метаданных.
+// ** Картинка - Картинка - Картинка раздела, рекомендуется только для корневых разделов.
+// ** ОбъектМД - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Задается только для объектов метаданных,
+// для разделов остается пустым.
+// Пример:
+//
+// НовыйРаздел = РазделыПоиска.Строки.Добавить();
+// НовыйРаздел.Раздел = "Главное";
+// НовыйРаздел.Картинка = БиблиотекаКартинок._ДемоРазделГлавное;
+//
+// ОбъектМетаданных = Метаданные.Документы._ДемоСчетНаОплатуПокупателю;
+//
+// Если ПравоДоступа("Просмотр", ОбъектМетаданных)
+// И ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ОбъектМетаданных) Тогда
+//
+// НовыйОбъектРаздела = НовыйРаздел.Строки.Добавить();
+// НовыйОбъектРаздела.Раздел = ОбъектМетаданных.ПредставлениеСписка;
+// НовыйОбъектРаздела.ОбъектМД = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных);
+// КонецЕсли;
+//
+Процедура ПриПолученииРазделовПолнотекстовогоПоиска(РазделыПоиска) Экспорт
+
+
+
+КонецПроцедуры
+
+#КонецОбласти
\ No newline at end of file
diff --git "a/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\265\321\200\320\265\320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\320\265\320\274\321\213\320\271/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\265\321\200\320\265\320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\320\265\320\274\321\213\320\271.mdo" "b/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\265\321\200\320\265\320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\320\265\320\274\321\213\320\271/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\265\321\200\320\265\320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\320\265\320\274\321\213\320\271.mdo"
new file mode 100644
index 0000000..8e7dcdd
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\265\321\200\320\265\320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\320\265\320\274\321\213\320\271/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\265\321\200\320\265\320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\320\265\320\274\321\213\320\271.mdo"
@@ -0,0 +1,11 @@
+
+
+ ПолнотекстовыйПоискСерверПереопределяемый
+
+ ru
+ Полнотекстовый поиск сервер переопределяемый
+
+ true
+ true
+ true
+
diff --git "a/TestingTool_3-0/src/CommonModules/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\265\320\230\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\265\320\230\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
new file mode 100644
index 0000000..47f64c9
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\265\320\230\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
@@ -0,0 +1,113 @@
+// Программно размещает элемент на форме
+// СтруктураЭлемента может содержать параметры:
+// ИмяРодителя - Имя элемента-родителя добавляемого элемента. Если не указан - добавляется на верхний уровень
+// ИмяСледующегоЭлемента - Имя элемента, перед которым мы вставляем новый элемент. Если не указан - добавляется в конец
+// Прочие параметры совпадают с именами свойств добавляемого элемента(Видимость, ширина, и т.п.)
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма, на которой размещается элемент
+// Имя - Строка - Уникальное имя элемента формы
+// Тип - Тип - Тип добавляемого элемента (Поле формы, группа формы, таблица формы и т.п.)
+// СтруктураЭлемента - Структура - Структура, содержащая параметры создаваемого элемента
+//
+// Возвращаемое значение:
+// ЭлементФормы - Добавленный элемент
+//
+Функция ВставитьЭлемент(Форма, Имя, Тип, СтруктураЭлемента) Экспорт
+
+ Родитель=Форма;
+ ИмяРодителя="";
+ Если СтруктураЭлемента.Свойство("ИмяРодителя", ИмяРодителя) И ЗначениеЗаполнено(ИмяРодителя) Тогда
+ Родитель = Форма.Элементы[ИмяРодителя];
+ КонецЕсли;
+
+ СледующийЭлемент=Неопределено;
+ ИмяСледующегоЭлемента="";
+ Если СтруктураЭлемента.Свойство("ИмяСледующегоЭлемента", ИмяСледующегоЭлемента)
+ И ЗначениеЗаполнено(ИмяСледующегоЭлемента) Тогда
+ СледующийЭлемент=Форма.Элементы[ИмяСледующегоЭлемента];
+ КонецЕсли;
+
+ Элемент=Форма.Элементы.Вставить(Имя, Тип, Родитель, СледующийЭлемент);
+
+ ЗаполнитьЗначенияСвойств(Элемент,СтруктураЭлемента);
+
+ Возврат Элемент;
+
+КонецФункции
+
+// Программно удаляет элемент с формы, не может удалять элементы добавленные конструктором через конфигуратор
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма, на которой размещается элемент
+// Имя - Строка - Уникальное имя элемента формы
+//
+Процедура УдалитьЭлемент(Форма, Имя) Экспорт
+
+ Элемент = Форма.Элементы.Найти(Имя);
+ Если НЕ Элемент=Неопределено Тогда
+ Форма.Элементы.Удалить(Элемент);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Программно размещает элемент на форме
+// СтруктураЭлемента может содержать параметры:
+// ИмяРодителя - Имя элемента-родителя добавляемого элемента. Если не указан - добавляется на верхний уровень
+// ИмяСледующегоЭлемента - Имя элемента, перед которым мы вставляем новый элемент. Если не указан - добавляется в конец
+// Прочие параметры совпадают с именами свойств добавляемого элемента(Видимость, ширина, и т.п.)
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма, на которой размещается элемент
+// Имя - Строка - Уникальное имя элемента формы
+// Тип - Тип - Тип добавляемого элемента (Поле формы, группа формы, таблица формы и т.п.)
+// СтруктураЭлемента - Структура - Структура, содержащая параметры создаваемого элемента
+//
+// Возвращаемое значение:
+// ЭлементФормы - Добавленный элемент
+//
+Функция ВставитьЭлементДинамическогоСписка(Форма, Имя, Тип, Знач СтруктураЭлемента) Экспорт
+
+ ПолныйПутьКДаннымПоля = Неопределено;
+ Если СтруктураЭлемента.Свойство("ПутьКДанным", ПолныйПутьКДаннымПоля) И ЗначениеЗаполнено(ПолныйПутьКДаннымПоля) Тогда
+ МассивИменЭлементов = СтрРазделить(ПолныйПутьКДаннымПоля, ".", Ложь);
+ Если МассивИменЭлементов.Количество()>1 Тогда
+ ДинамическийСписок = Форма[МассивИменЭлементов[0]];
+ Если ТипЗнч(ДинамическийСписок)=Тип("ДинамическийСписок") Тогда //на всякий случай чтобы при опиське не было ошибки
+ ПутьКДаннымПоля = Сред(ПолныйПутьКДаннымПоля, СтрДлина(МассивИменЭлементов[0])+2);
+ Если ДинамическийСписок.КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора.НайтиПоле(Новый ПолеКомпоновкиДанных(ПутьКДаннымПоля))=Неопределено Тогда
+ //если поле в списке недоступно, то не будем заполнять реквизит "ПутьКДанным"
+ СтруктураЭлемента.Удалить("ПутьКДанным");
+ КонецЕсли;
+ КонецЕсли;
+ КонецЕсли;
+ КонецЕсли;
+
+ Возврат ВставитьЭлемент(Форма, Имя, Тип, СтруктураЭлемента);
+
+КонецФункции
+
+// Программно првоеряет наличие реквизиты
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма, на которой размещается элемент
+// Имя - Строка - Уникальное имя элемента формы
+//
+// Возвращаемое значение:
+// РеквизитНайден - Найден или нет реквизит (Истина, Ложь)
+//
+Функция ЕстьРеквизит(Форма, Имя) Экспорт
+
+ РеквизитНайден=Ложь;
+
+ МассивРеквизитов=Форма.ПолучитьРеквизиты();
+ Для Каждого Реквизит Из МассивРеквизитов Цикл
+ Если Реквизит.Имя=Имя Тогда
+ РеквизитНайден=Истина;
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+
+ Возврат РеквизитНайден;
+
+КонецФункции
diff --git "a/TestingTool_3-0/src/CommonModules/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\265\320\230\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274\320\241\320\265\321\200\320\262\320\265\321\200/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\265\320\230\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274\320\241\320\265\321\200\320\262\320\265\321\200.mdo" "b/TestingTool_3-0/src/CommonModules/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\265\320\230\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274\320\241\320\265\321\200\320\262\320\265\321\200/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\265\320\230\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274\320\241\320\265\321\200\320\262\320\265\321\200.mdo"
new file mode 100644
index 0000000..2032742
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\265\320\230\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274\320\241\320\265\321\200\320\262\320\265\321\200/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\275\320\276\320\265\320\230\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274\320\241\320\265\321\200\320\262\320\265\321\200.mdo"
@@ -0,0 +1,11 @@
+
+
+ ПрограммноеИзменениеФормСервер
+
+ ru
+ Программное изменение форм сервер
+
+ true
+ true
+ true
+
diff --git "a/TestingTool_3-0/src/CommonModules/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
new file mode 100644
index 0000000..f8c8822
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
@@ -0,0 +1,162 @@
+////////////////////////////////////////////////////////////////////////////////
+// Подсистема "Регламентные задания".
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область ПрограммныйИнтерфейс
+
+// Возвращает использование регламентного задания.
+// Перед вызовом требуется иметь право Администрирования или УстановитьПривилегированныйРежим.
+//
+// Параметры:
+// Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска
+// предопределенного регламентного задания.
+// - УникальныйИдентификатор - идентификатор регламентного задания.
+// - Строка - строка уникального идентификатора регламентного задания.
+// - РегламентноеЗадание - регламентное задание.
+//
+// Возвращаемое значение:
+// Булево - если Истина, регламентное задание используется.
+//
+Функция ПолучитьИспользованиеРегламентногоЗадания(Знач Идентификатор) Экспорт
+
+ РегламентныеЗаданияСлужебный.ВызватьИсключениеЕслиНетПраваАдминистрирования();
+ УстановитьПривилегированныйРежим(Истина);
+
+ Задание = ПолучитьРегламентноеЗадание(Идентификатор);
+
+ Возврат Задание.Использование;
+
+КонецФункции
+
+// Устанавливает использование регламентного задания.
+// Перед вызовом требуется иметь право Администрирования или УстановитьПривилегированныйРежим.
+//
+// Параметры:
+// Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска
+// предопределенного регламентного задания.
+// - УникальныйИдентификатор - идентификатор регламентного задания.
+// - Строка - строка уникального идентификатора регламентного задания.
+// - РегламентноеЗадание - регламентное задание.
+//
+// Использование - Булево - значение использования которое нужно установить.
+//
+Процедура УстановитьИспользованиеРегламентногоЗадания(Знач Идентификатор, Знач Использование) Экспорт
+
+ РегламентныеЗаданияСлужебный.ВызватьИсключениеЕслиНетПраваАдминистрирования();
+ УстановитьПривилегированныйРежим(Истина);
+
+ Задание = ПолучитьРегламентноеЗадание(Идентификатор);
+
+ Если Задание.Использование <> Использование Тогда
+ Задание.Использование = Использование;
+ КонецЕсли;
+
+ Задание.Записать();
+
+КонецПроцедуры
+
+// Возвращает расписание регламентного задания.
+// Перед вызовом требуется иметь право Администрирования или УстановитьПривилегированныйРежим.
+//
+// Параметры:
+// Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска
+// предопределенного регламентного задания.
+// - УникальныйИдентификатор - идентификатор регламентного задания.
+// - Строка - строка уникального идентификатора регламентного задания.
+// - РегламентноеЗадание - регламентное задание.
+//
+// ВСтруктуре - Булево - если Истина, тогда расписание будет преобразовано
+// в структуру, которую можно передать на клиент.
+//
+// Возвращаемое значение:
+// РасписаниеРегламентногоЗадания, Структура - структура содержит те же свойства, что и расписание.
+//
+Функция ПолучитьРасписаниеРегламентногоЗадания(Знач Идентификатор, Знач ВСтруктуре = Ложь) Экспорт
+
+ РегламентныеЗаданияСлужебный.ВызватьИсключениеЕслиНетПраваАдминистрирования();
+ УстановитьПривилегированныйРежим(Истина);
+
+ Задание = ПолучитьРегламентноеЗадание(Идентификатор);
+
+ Если ВСтруктуре Тогда
+ Возврат ОбщегоНазначенияКлиентСервер.РасписаниеВСтруктуру(Задание.Расписание);
+ КонецЕсли;
+
+ Возврат Задание.Расписание;
+
+КонецФункции
+
+// Устанавливает расписание регламентного задания.
+// Перед вызовом требуется иметь право Администрирования или УстановитьПривилегированныйРежим.
+//
+// Параметры:
+// Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска
+// предопределенного регламентного задания.
+// - УникальныйИдентификатор - идентификатор регламентного задания.
+// - Строка - строка уникального идентификатора регламентного задания.
+// - РегламентноеЗадание - регламентное задание.
+//
+// Расписание - РасписаниеРегламентногоЗадания - расписание.
+// - Структура - значение возвращаемое функцией РасписаниеВСтруктуру
+// общего модуля ОбщегоНазначенияКлиентСервер.
+//
+Процедура УстановитьРасписаниеРегламентногоЗадания(Знач Идентификатор, Знач Расписание) Экспорт
+
+ РегламентныеЗаданияСлужебный.ВызватьИсключениеЕслиНетПраваАдминистрирования();
+ УстановитьПривилегированныйРежим(Истина);
+
+ Задание = ПолучитьРегламентноеЗадание(Идентификатор);
+
+ Если ТипЗнч(Расписание) = Тип("РасписаниеРегламентногоЗадания") Тогда
+ Задание.Расписание = Расписание;
+ Иначе
+ Задание.Расписание = ОбщегоНазначенияКлиентСервер.СтруктураВРасписание(Расписание);
+ КонецЕсли;
+
+ Задание.Записать();
+
+КонецПроцедуры
+
+// Возвращает РегламентноеЗадание из информационной базы.
+//
+// Параметры:
+// Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска
+// предопределенного регламентного задания.
+// - УникальныйИдентификатор - идентификатор регламентного задания.
+// - Строка - строка уникального идентификатора регламентного задания.
+// - РегламентноеЗадание - регламентное задание из которого нужно получить
+// уникальный идентификатор для получения свежей копии регламентного задания.
+//
+// Возвращаемое значение:
+// РегламентноеЗадание - прочитано из базы данных.
+//
+Функция ПолучитьРегламентноеЗадание(Знач Идентификатор) Экспорт
+
+ РегламентныеЗаданияСлужебный.ВызватьИсключениеЕслиНетПраваАдминистрирования();
+ УстановитьПривилегированныйРежим(Истина);
+
+ Если ТипЗнч(Идентификатор) = Тип("РегламентноеЗадание") Тогда
+ Идентификатор = Идентификатор.УникальныйИдентификатор;
+ КонецЕсли;
+
+ Если ТипЗнч(Идентификатор) = Тип("Строка") Тогда
+ Идентификатор = Новый УникальныйИдентификатор(Идентификатор);
+ КонецЕсли;
+
+ Если ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных") Тогда
+ РегламентноеЗадание = РегламентныеЗадания.НайтиПредопределенное(Идентификатор);
+ Иначе
+ РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор);
+ КонецЕсли;
+
+ Если РегламентноеЗадание = Неопределено Тогда
+ ВызватьИсключение( НСтр("ru = 'Регламентное задание не найдено.
+ |Возможно, оно удалено другим пользователем.'") );
+ КонецЕсли;
+
+ Возврат РегламентноеЗадание;
+
+КонецФункции
+
+#КонецОбласти
diff --git "a/TestingTool_3-0/src/CommonModules/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\265\321\200\320\262\320\265\321\200/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\265\321\200\320\262\320\265\321\200.mdo" "b/TestingTool_3-0/src/CommonModules/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\265\321\200\320\262\320\265\321\200/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\265\321\200\320\262\320\265\321\200.mdo"
new file mode 100644
index 0000000..1aad82a
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\265\321\200\320\262\320\265\321\200/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\265\321\200\320\262\320\265\321\200.mdo"
@@ -0,0 +1,11 @@
+
+
+ РегламентныеЗаданияСервер
+
+ ru
+ Регламентные задания сервер
+
+ true
+ true
+ true
+
diff --git "a/TestingTool_3-0/src/CommonModules/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl"
new file mode 100644
index 0000000..143ce50
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl"
@@ -0,0 +1,559 @@
+////////////////////////////////////////////////////////////////////////////////
+// Подсистема "Регламентные задания".
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер.
+Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт
+
+ // СЕРВЕРНЫЕ ОБРАБОТЧИКИ.
+
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+// Вызывает исключение, если у пользователя нет права администрирования.
+Процедура ВызватьИсключениеЕслиНетПраваАдминистрирования() Экспорт
+
+ Если НЕ ПривилегированныйРежим() Тогда
+ ВыполнитьПроверкуПравДоступа("Администрирование", Метаданные);
+ КонецЕсли;
+
+КонецПроцедуры
+
+////////////////////////////////////////////////////////////////////////////////
+// Обработчики событий подсистем БСП.
+
+// Формирует список параметров ИБ.
+//
+// Параметры:
+// ТаблицаПараметров - ТаблицаЗначений - таблица описания параметров.
+// Описание состав колонок - см. РаботаВМоделиСервиса.ПолучитьТаблицуПараметровИБ().
+//
+Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт
+
+
+КонецПроцедуры
+
+////////////////////////////////////////////////////////////////////////////////
+// Процедуры и функции для работы с регламентными заданиями.
+
+// Предназначена для "ручного" немедленного выполнения процедуры регламентного задания
+// либо в сеансе клиента (в файловой ИБ), либо в фоновом задании на сервере (в серверной ИБ).
+// Применяется в любом режиме соединения.
+// СРучной" режим запуска не влияет на выполнение регламентного задания по аварийному
+// и основному расписаниям, т.к. не указывается ссылка на регламентное задание у фонового задания.
+// Тип ФоновоеЗадание не допускает установки такой ссылки, поэтому для файлового режима применяется
+// тоже правило.
+//
+// Параметры:
+// Задание - РегламентноеЗадание, Строка - уникального идентификатора РегламентногоЗадания.
+//
+// Возвращаемое значение:
+// Структура - со свойствами
+// * МоментЗапуска - Неопределено, Дата - для файловой ИБ устанавливает переданный момент, как момент запуска
+// метода регламентного задания.
+// Для серверной ИБ - возвращает момент запуска фонового задания по факту.
+// * ИдентификаторФоновогоЗадания - Строка - для серверной ИБ возвращает идентификатор запущенного фонового задания.
+//
+Функция ВыполнитьРегламентноеЗаданиеВручную(Знач Задание) Экспорт
+
+ ВызватьИсключениеЕслиНетПраваАдминистрирования();
+ УстановитьПривилегированныйРежим(Истина);
+
+ ПараметрыВыполнения = ПараметрыВыполненияРегламентногоЗадания();
+ ПараметрыВыполнения.ПроцедураУжеВыполняется = Ложь;
+ Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Задание);
+
+ ПараметрыВыполнения.ЗапускВыполнен = Ложь;
+ СвойстваПоследнегоФоновогоЗадания = ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(Задание);
+
+ Если СвойстваПоследнегоФоновогоЗадания <> Неопределено
+ И СвойстваПоследнегоФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.Активно Тогда
+
+ ПараметрыВыполнения.МоментЗапуска = СвойстваПоследнегоФоновогоЗадания.Начало;
+ Если ЗначениеЗаполнено(СвойстваПоследнегоФоновогоЗадания.Наименование) Тогда
+ ПараметрыВыполнения.ПредставлениеФоновогоЗадания = СвойстваПоследнегоФоновогоЗадания.Наименование;
+ Иначе
+ ПараметрыВыполнения.ПредставлениеФоновогоЗадания = ПредставлениеРегламентногоЗадания(Задание);
+ КонецЕсли;
+ Иначе
+ НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запуск вручную: %1'"), ПредставлениеРегламентногоЗадания(Задание));
+ ФоновоеЗадание = ФоновыеЗадания.Выполнить(Задание.Метаданные.ИмяМетода, Задание.Параметры, Строка(Задание.УникальныйИдентификатор), НаименованиеФоновогоЗадания);
+ ПараметрыВыполнения.ИдентификаторФоновогоЗадания = Строка(ФоновоеЗадание.УникальныйИдентификатор);
+ ПараметрыВыполнения.МоментЗапуска = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ФоновоеЗадание.УникальныйИдентификатор).Начало;
+ ПараметрыВыполнения.ЗапускВыполнен = Истина;
+ КонецЕсли;
+
+ ПараметрыВыполнения.ПроцедураУжеВыполняется = НЕ ПараметрыВыполнения.ЗапускВыполнен;
+ Возврат ПараметрыВыполнения;
+
+КонецФункции
+
+Функция ПараметрыВыполненияРегламентногоЗадания()
+
+ Результат = Новый Структура;
+ Результат.Вставить("МоментЗапуска");
+ Результат.Вставить("ИдентификаторФоновогоЗадания");
+ Результат.Вставить("ПредставлениеФоновогоЗадания");
+ Результат.Вставить("ПроцедураУжеВыполняется");
+ Результат.Вставить("ЗапускВыполнен");
+ Возврат Результат;
+
+КонецФункции
+
+// Возвращает представление регламентного задания,
+// это по порядку исключения незаполненных реквизитов:
+// Наименование, Метаданные.Синоним, Метаданные.Имя.
+//
+// Параметры:
+// Задание - РегламентноеЗадание, Строка - если строка, тогда УникальныйИдентификатор строкой.
+//
+// Возвращаемое значение:
+// Строка.
+//
+Функция ПредставлениеРегламентногоЗадания(Знач Задание) Экспорт
+
+ ВызватьИсключениеЕслиНетПраваАдминистрирования();
+ УстановитьПривилегированныйРежим(Истина);
+
+ Если ТипЗнч(Задание) = Тип("РегламентноеЗадание") Тогда
+ РегламентноеЗадание = Задание;
+ Иначе
+ РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(Задание));
+ КонецЕсли;
+
+ Если РегламентноеЗадание <> Неопределено Тогда
+ Представление = РегламентноеЗадание.Наименование;
+
+ Если ПустаяСтрока(РегламентноеЗадание.Наименование) Тогда
+ Представление = РегламентноеЗадание.Метаданные.Синоним;
+
+ Если ПустаяСтрока(Представление) Тогда
+ Представление = РегламентноеЗадание.Метаданные.Имя;
+ КонецЕсли
+ КонецЕсли;
+ Иначе
+ Представление = ТекстНеОпределено();
+ КонецЕсли;
+
+ Возврат Представление;
+
+КонецФункции
+
+// Возвращает текст "<не определено>".
+Функция ТекстНеОпределено() Экспорт
+
+ Возврат НСтр("ru = '<не определено>'");
+
+КонецФункции
+
+// Возвращает многострочную Строку содержащую Сообщения и ОписаниеИнформацииОбОшибке,
+// последнее фоновое задание найдено по идентификатору регламентного задания
+// и сообщения/ошибки есть.
+//
+// Параметры:
+// Задание - РегламентноеЗадание, Строка - УникальныйИдентификатор
+// РегламентногоЗадания строкой.
+//
+// Возвращаемое значение:
+// Строка.
+//
+Функция СообщенияИОписанияОшибокРегламентногоЗадания(Знач Задание) Экспорт
+
+ ВызватьИсключениеЕслиНетПраваАдминистрирования();
+ УстановитьПривилегированныйРежим(Истина);
+
+ ИдентификаторРегламентногоЗадания = ?(ТипЗнч(Задание) = Тип("РегламентноеЗадание"), Строка(Задание.УникальныйИдентификатор), Задание);
+ СвойстваПоследнегоФоновогоЗадания = ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(ИдентификаторРегламентногоЗадания);
+ Возврат ?(СвойстваПоследнегоФоновогоЗадания = Неопределено,
+ "",
+ СообщенияИОписанияОшибокФоновогоЗадания(СвойстваПоследнегоФоновогоЗадания.Идентификатор) );
+
+КонецФункции
+
+////////////////////////////////////////////////////////////////////////////////
+// Процедуры и функции для работы с фоновыми заданиями.
+
+// Отменяет фоновое задание, если это возможно, а именно, если оно выполняется на сервере, и активно.
+//
+// Параметры:
+// Идентификатор - Строка уникального идентификатора ФоновогоЗадания.
+//
+Процедура ОтменитьФоновоеЗадание(Идентификатор) Экспорт
+
+ ВызватьИсключениеЕслиНетПраваАдминистрирования();
+ УстановитьПривилегированныйРежим(Истина);
+
+ Отбор = Новый Структура("УникальныйИдентификатор", Новый УникальныйИдентификатор(Идентификатор));
+ МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
+ Если МассивФоновыхЗаданий.Количество() = 1 Тогда
+ ФоновоеЗадание = МассивФоновыхЗаданий[0];
+ Иначе
+ ВызватьИсключение НСтр("ru = 'Фоновое задание не найдено на сервере.'");
+ КонецЕсли;
+
+ Если ФоновоеЗадание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда
+ ВызватьИсключение НСтр("ru = 'Задание не выполняется, его нельзя отменить.'");
+ КонецЕсли;
+
+ ФоновоеЗадание.Отменить();
+
+КонецПроцедуры
+
+// Возвращает таблицу свойств фоновых заданий.
+// Структуру таблицы смотри в функции ПустаяТаблицаСвойствФоновыхЗаданий().
+//
+// Параметры:
+// Отбор - Структура - допустимые поля:
+// Идентификатор, Ключ, Состояние, Начало, Конец,
+// Наименование, ИмяМетода, РегламентноеЗадание.
+//
+// Возвращаемое значение:
+// ТаблицаЗначений - возвращается таблица после отбора.
+//
+Функция ПолучитьТаблицуСвойствФоновыхЗаданий(Отбор = Неопределено) Экспорт
+
+ ВызватьИсключениеЕслиНетПраваАдминистрирования();
+ УстановитьПривилегированныйРежим(Истина);
+
+ Таблица = ПустаяТаблицаСвойствФоновыхЗаданий();
+
+ Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания") Тогда
+ Отбор.Удалить("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания");
+ ПолучитьПоследнее = Истина;
+ Иначе
+ ПолучитьПоследнее = Ложь;
+ КонецЕсли;
+
+ РегламентноеЗадание = Неопределено;
+
+ // Добавление истории фоновых заданий, полученных с сервера.
+ Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда
+ Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда
+ РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(
+ Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания));
+ ТекущийОтбор = Новый Структура("Ключ", Отбор.ИдентификаторРегламентногоЗадания);
+ ФоновыеЗаданияЗапущенныеВручную = ФоновыеЗадания.ПолучитьФоновыеЗадания(ТекущийОтбор);
+ Если РегламентноеЗадание <> Неопределено Тогда
+ ПоследнееФоновоеЗадание = РегламентноеЗадание.ПоследнееЗадание;
+ КонецЕсли;
+ Если НЕ ПолучитьПоследнее ИЛИ ПоследнееФоновоеЗадание = Неопределено Тогда
+ ТекущийОтбор = Новый Структура("РегламентноеЗадание", РегламентноеЗадание);
+ АвтоматическиеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(ТекущийОтбор);
+ КонецЕсли;
+ Если ПолучитьПоследнее Тогда
+ Если ПоследнееФоновоеЗадание = Неопределено Тогда
+ ПоследнееФоновоеЗадание = ПоследнееФоновоеЗаданиеВМассиве(АвтоматическиеФоновыеЗадания);
+ КонецЕсли;
+
+ ПоследнееФоновоеЗадание = ПоследнееФоновоеЗаданиеВМассиве(
+ ФоновыеЗаданияЗапущенныеВручную, ПоследнееФоновоеЗадание);
+
+ Если ПоследнееФоновоеЗадание <> Неопределено Тогда
+ МассивФоновыхЗаданий = Новый Массив;
+ МассивФоновыхЗаданий.Добавить(ПоследнееФоновоеЗадание);
+ ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица);
+ КонецЕсли;
+ Возврат Таблица;
+ КонецЕсли;
+ ДобавитьСвойстваФоновыхЗаданий(ФоновыеЗаданияЗапущенныеВручную, Таблица);
+ ДобавитьСвойстваФоновыхЗаданий(АвтоматическиеФоновыеЗадания, Таблица);
+ Иначе
+ МассивФоновыхЗаданий = Новый Массив;
+ ВсеИдентификаторыРегламентныхЗаданий = Новый Соответствие;
+ Для каждого ТекущееЗадание Из РегламентныеЗадания.ПолучитьРегламентныеЗадания() Цикл
+ ВсеИдентификаторыРегламентныхЗаданий.Вставить(
+ Строка(ТекущееЗадание.УникальныйИдентификатор), Истина);
+ КонецЦикла;
+ ВсеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания();
+ Для каждого ТекущееЗадание Из ВсеФоновыеЗадания Цикл
+ Если ТекущееЗадание.РегламентноеЗадание = Неопределено
+ И ВсеИдентификаторыРегламентныхЗаданий[ТекущееЗадание.Ключ] = Неопределено Тогда
+
+ МассивФоновыхЗаданий.Добавить(ТекущееЗадание);
+ КонецЕсли;
+ КонецЦикла;
+ ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица);
+ КонецЕсли;
+ Иначе
+ Если НЕ ЗначениеЗаполнено(Отбор) Тогда
+ МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания();
+ Иначе
+ Если Отбор.Свойство("Идентификатор") Тогда
+ Отбор.Вставить("УникальныйИдентификатор", Новый УникальныйИдентификатор(Отбор.Идентификатор));
+ Отбор.Удалить("Идентификатор");
+ КонецЕсли;
+ МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
+ Если Отбор.Свойство("УникальныйИдентификатор") Тогда
+ Отбор.Вставить("Идентификатор", Строка(Отбор.УникальныйИдентификатор));
+ Отбор.Удалить("УникальныйИдентификатор");
+ КонецЕсли;
+ КонецЕсли;
+ ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда
+ РегламентныеЗаданияДляОбработки = Новый Массив;
+ Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда
+ Если РегламентноеЗадание = Неопределено Тогда
+ РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(
+ Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания));
+ КонецЕсли;
+ Если РегламентноеЗадание <> Неопределено Тогда
+ РегламентныеЗаданияДляОбработки.Добавить(РегламентноеЗадание);
+ КонецЕсли;
+ КонецЕсли;
+ Иначе
+ РегламентныеЗаданияДляОбработки = РегламентныеЗадания.ПолучитьРегламентныеЗадания();
+ КонецЕсли;
+
+ Таблица.Сортировать("Начало Убыв, Конец Убыв");
+
+ // Отбор фоновых заданий.
+ Если ЗначениеЗаполнено(Отбор) Тогда
+ Начало = Неопределено;
+ Конец = Неопределено;
+ Состояние = Неопределено;
+ Если Отбор.Свойство("Начало") Тогда
+ Начало = ?(ЗначениеЗаполнено(Отбор.Начало), Отбор.Начало, Неопределено);
+ Отбор.Удалить("Начало");
+ КонецЕсли;
+ Если Отбор.Свойство("Конец") Тогда
+ Конец = ?(ЗначениеЗаполнено(Отбор.Конец), Отбор.Конец, Неопределено);
+ Отбор.Удалить("Конец");
+ КонецЕсли;
+ Если Отбор.Свойство("Состояние") Тогда
+ Если ТипЗнч(Отбор.Состояние) = Тип("Массив") Тогда
+ Состояние = Отбор.Состояние;
+ Отбор.Удалить("Состояние");
+ КонецЕсли;
+ КонецЕсли;
+
+ Если Отбор.Количество() <> 0 Тогда
+ Строки = Таблица.НайтиСтроки(Отбор);
+ Иначе
+ Строки = Таблица;
+ КонецЕсли;
+ // Выполнение дополнительного отбора по периоду и состоянию (если отбор определен).
+ НомерЭлемента = Строки.Количество() - 1;
+ Пока НомерЭлемента >= 0 Цикл
+ Если Начало <> Неопределено И Начало > Строки[НомерЭлемента].Начало ИЛИ
+ Конец <> Неопределено И Конец < ?(ЗначениеЗаполнено(Строки[НомерЭлемента].Конец), Строки[НомерЭлемента].Конец, ТекущаяДатаСеанса()) ИЛИ
+ Состояние <> Неопределено И Состояние.Найти(Строки[НомерЭлемента].Состояние) = Неопределено Тогда
+ Строки.Удалить(НомерЭлемента);
+ КонецЕсли;
+ НомерЭлемента = НомерЭлемента - 1;
+ КонецЦикла;
+ // Удаление лишних строк из таблицы.
+ Если ТипЗнч(Строки) = Тип("Массив") Тогда
+ НомерСтроки = Таблица.Количество() - 1;
+ Пока НомерСтроки >= 0 Цикл
+ Если Строки.Найти(Таблица[НомерСтроки]) = Неопределено Тогда
+ Таблица.Удалить(Таблица[НомерСтроки]);
+ КонецЕсли;
+ НомерСтроки = НомерСтроки - 1;
+ КонецЦикла;
+ КонецЕсли;
+ КонецЕсли;
+
+ Возврат Таблица;
+
+КонецФункции
+
+// Возвращает свойства ФоновогоЗадания по строке уникального идентификатора.
+//
+// Параметры:
+// Идентификатор - Строка - уникального идентификатора ФоновогоЗадания.
+// ИменаСвойств - Строка, если заполнено, возвращается структура с указанными свойствами.
+//
+// Возвращаемое значение:
+// СтрокаТаблицыЗначений, Структура - свойства ФоновогоЗадания.
+//
+Функция ПолучитьСвойстваФоновогоЗадания(Идентификатор, ИменаСвойств = "") Экспорт
+
+ ВызватьИсключениеЕслиНетПраваАдминистрирования();
+ УстановитьПривилегированныйРежим(Истина);
+
+ Отбор = Новый Структура("Идентификатор", Идентификатор);
+ ТаблицаСвойствФоновыхЗаданий = ПолучитьТаблицуСвойствФоновыхЗаданий(Отбор);
+
+ Если ТаблицаСвойствФоновыхЗаданий.Количество() > 0 Тогда
+ Если ЗначениеЗаполнено(ИменаСвойств) Тогда
+ Результат = Новый Структура(ИменаСвойств);
+ ЗаполнитьЗначенияСвойств(Результат, ТаблицаСвойствФоновыхЗаданий[0]);
+ Иначе
+ Результат = ТаблицаСвойствФоновыхЗаданий[0];
+ КонецЕсли;
+ Иначе
+ Результат = Неопределено;
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции
+
+// Возвращает свойства последнего фонового задания выполненного при выполнении регламентного задания, если оно есть.
+// Процедура работает, как в файл-серверном, так и в клиент-серверном режимах.
+//
+// Параметры:
+// РегламентноеЗадание - РегламентноеЗадание, Строка - строка уникального идентификатора РегламентногоЗадания.
+//
+// Возвращаемое значение:
+// СтрокаТаблицыЗначений, Неопределено.
+//
+Функция ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(РегламентноеЗадание) Экспорт
+
+ ВызватьИсключениеЕслиНетПраваАдминистрирования();
+ УстановитьПривилегированныйРежим(Истина);
+
+ ИдентификаторРегламентногоЗадания = ?(ТипЗнч(РегламентноеЗадание) = Тип("РегламентноеЗадание"), Строка(РегламентноеЗадание.УникальныйИдентификатор), РегламентноеЗадание);
+ Отбор = Новый Структура;
+ Отбор.Вставить("ИдентификаторРегламентногоЗадания", ИдентификаторРегламентногоЗадания);
+ Отбор.Вставить("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания");
+ ТаблицаСвойствФоновыхЗаданий = ПолучитьТаблицуСвойствФоновыхЗаданий(Отбор);
+ ТаблицаСвойствФоновыхЗаданий.Сортировать("Конец Возр");
+
+ Если ТаблицаСвойствФоновыхЗаданий.Количество() = 0 Тогда
+ СвойстваФоновогоЗадания = Неопределено;
+ ИначеЕсли НЕ ЗначениеЗаполнено(ТаблицаСвойствФоновыхЗаданий[0].Конец) Тогда
+ СвойстваФоновогоЗадания = ТаблицаСвойствФоновыхЗаданий[0];
+ Иначе
+ СвойстваФоновогоЗадания = ТаблицаСвойствФоновыхЗаданий[ТаблицаСвойствФоновыхЗаданий.Количество()-1];
+ КонецЕсли;
+
+ Возврат СвойстваФоновогоЗадания;
+
+КонецФункции
+
+// Возвращает многострочную Строку содержащую Сообщения и ОписаниеИнформацииОбОшибке,
+// если фоновое задание найдено по идентификатору и сообщения/ошибки есть.
+//
+// Параметры:
+// Задание - Строка - УникальныйИдентификатор ФоновогоЗадания строкой.
+//
+// Возвращаемое значение:
+// Строка.
+//
+Функция СообщенияИОписанияОшибокФоновогоЗадания(Идентификатор, СвойстваФоновогоЗадания = Неопределено) Экспорт
+
+ ВызватьИсключениеЕслиНетПраваАдминистрирования();
+ УстановитьПривилегированныйРежим(Истина);
+
+ Если СвойстваФоновогоЗадания = Неопределено Тогда
+ СвойстваФоновогоЗадания = ПолучитьСвойстваФоновогоЗадания(Идентификатор);
+ КонецЕсли;
+
+ Строка = "";
+ Если СвойстваФоновогоЗадания <> Неопределено Тогда
+ Для каждого Сообщение Из СвойстваФоновогоЗадания.СообщенияПользователю Цикл
+ Строка = Строка + ?(Строка = "",
+ "",
+ "
+ |
+ |") + Сообщение.Текст;
+ КонецЦикла;
+ Если ЗначениеЗаполнено(СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке) Тогда
+ Строка = Строка + ?(Строка = "",
+ СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке,
+ "
+ |
+ |" + СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке);
+ КонецЕсли;
+ КонецЕсли;
+
+ Возврат Строка;
+
+КонецФункции
+
+////////////////////////////////////////////////////////////////////////////////
+// Вспомогательные процедуры и функции.
+
+// Возвращает новую таблицу свойств фоновых заданий.
+//
+// Возвращаемое значение:
+// ТаблицаЗначений.
+//
+Функция ПустаяТаблицаСвойствФоновыхЗаданий()
+
+ НоваяТаблица = Новый ТаблицаЗначений;
+ НоваяТаблица.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
+ НоваяТаблица.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
+ НоваяТаблица.Колонки.Добавить("Ключ", Новый ОписаниеТипов("Строка"));
+ НоваяТаблица.Колонки.Добавить("Начало", Новый ОписаниеТипов("Дата"));
+ НоваяТаблица.Колонки.Добавить("Конец", Новый ОписаниеТипов("Дата"));
+ НоваяТаблица.Колонки.Добавить("ИдентификаторРегламентногоЗадания", Новый ОписаниеТипов("Строка"));
+ НоваяТаблица.Колонки.Добавить("Состояние", Новый ОписаниеТипов("СостояниеФоновогоЗадания"));
+ НоваяТаблица.Колонки.Добавить("ИмяМетода", Новый ОписаниеТипов("Строка"));
+ НоваяТаблица.Колонки.Добавить("Расположение", Новый ОписаниеТипов("Строка"));
+ НоваяТаблица.Колонки.Добавить("ОписаниеИнформацииОбОшибке", Новый ОписаниеТипов("Строка"));
+ НоваяТаблица.Колонки.Добавить("ПопыткаЗапуска", Новый ОписаниеТипов("Число"));
+ НоваяТаблица.Колонки.Добавить("СообщенияПользователю", Новый ОписаниеТипов("Массив"));
+ НоваяТаблица.Колонки.Добавить("НомерСеанса", Новый ОписаниеТипов("Число"));
+ НоваяТаблица.Колонки.Добавить("НачалоСеанса", Новый ОписаниеТипов("Дата"));
+ НоваяТаблица.Индексы.Добавить("Идентификатор, Начало");
+
+ Возврат НоваяТаблица;
+
+КонецФункции
+
+Процедура ДобавитьСвойстваФоновыхЗаданий(Знач МассивФоновыхЗаданий, Знач ТаблицаСвойствФоновыхЗаданий)
+
+ Индекс = МассивФоновыхЗаданий.Количество() - 1;
+ Пока Индекс >= 0 Цикл
+ ФоновоеЗадание = МассивФоновыхЗаданий[Индекс];
+ Строка = ТаблицаСвойствФоновыхЗаданий.Добавить();
+ ЗаполнитьЗначенияСвойств(Строка, ФоновоеЗадание);
+ Строка.Идентификатор = ФоновоеЗадание.УникальныйИдентификатор;
+ РегламентноеЗадание = ФоновоеЗадание.РегламентноеЗадание;
+
+ Если РегламентноеЗадание = Неопределено
+ И СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор(ФоновоеЗадание.Ключ) Тогда
+
+ РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(ФоновоеЗадание.Ключ));
+ КонецЕсли;
+ Строка.ИдентификаторРегламентногоЗадания = ?(
+ РегламентноеЗадание = Неопределено,
+ "",
+ РегламентноеЗадание.УникальныйИдентификатор);
+
+ Строка.ОписаниеИнформацииОбОшибке = ?(
+ ФоновоеЗадание.ИнформацияОбОшибке = Неопределено,
+ "",
+ ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке));
+
+ Индекс = Индекс - 1;
+ КонецЦикла;
+
+КонецПроцедуры
+
+Функция ПоследнееФоновоеЗаданиеВМассиве(МассивФоновыхЗаданий, ПоследнееФоновоеЗадание = Неопределено)
+
+ Для каждого ТекущееФоновоеЗадание Из МассивФоновыхЗаданий Цикл
+ Если ПоследнееФоновоеЗадание = Неопределено Тогда
+ ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание;
+ Продолжить;
+ КонецЕсли;
+ Если ЗначениеЗаполнено(ПоследнееФоновоеЗадание.Конец) Тогда
+ Если НЕ ЗначениеЗаполнено(ТекущееФоновоеЗадание.Конец)
+ ИЛИ ПоследнееФоновоеЗадание.Конец < ТекущееФоновоеЗадание.Конец Тогда
+ ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание;
+ КонецЕсли;
+ Иначе
+ Если НЕ ЗначениеЗаполнено(ТекущееФоновоеЗадание.Конец)
+ И ПоследнееФоновоеЗадание.Начало < ТекущееФоновоеЗадание.Начало Тогда
+ ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание;
+ КонецЕсли;
+ КонецЕсли;
+ КонецЦикла;
+
+ Возврат ПоследнееФоновоеЗадание;
+
+КонецФункции
+
+#КонецОбласти
diff --git "a/TestingTool_3-0/src/CommonModules/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo" "b/TestingTool_3-0/src/CommonModules/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo"
new file mode 100644
index 0000000..1c2c580
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo"
@@ -0,0 +1,11 @@
+
+
+ РегламентныеЗаданияСлужебный
+
+ ru
+ Регламентные задания служебный
+
+ true
+ true
+ true
+
diff --git "a/TestingTool_3-0/src/CommonModules/\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
new file mode 100644
index 0000000..ba62e59
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
@@ -0,0 +1,32 @@
+// Устанавливает размер шрифта заголовков групп формы для их корректного отображения в интерфейсе 8.2.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма для изменения шрифта заголовков групп;
+// ИменаГрупп - Строка - Список имен групп формы, разделенных запятыми.
+//
+Процедура УстановитьОтображениеЗаголовковГрупп(Форма, ИменаГрупп = "") Экспорт
+
+ Если ВариантИнтерфейсаКлиентскогоПриложения= ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда
+ ЖирныйШрифт = Новый Шрифт(,, Истина);
+ Если НЕ ЗначениеЗаполнено(ИменаГрупп) Тогда
+ Для Каждого Элемент Из Форма.Элементы Цикл
+ Если Тип(Элемент) = Тип("ГруппаФормы")
+ И Элемент.Вид = ВидГруппыФормы.ОбычнаяГруппа
+ И Элемент.ОтображатьЗаголовок = Истина
+ И (Элемент.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение
+ Или Элемент.Отображение = ОтображениеОбычнойГруппы.Нет) Тогда
+ Элемент.ШрифтЗаголовка = ЖирныйШрифт;
+ КонецЕсли;
+ КонецЦикла;
+ Иначе
+ МассивЗаголовков = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИменаГрупп,,, Истина);
+ Для Каждого ИмяЗаголовка Из МассивЗаголовков Цикл
+ Элемент = Форма.Элементы[ИмяЗаголовка];
+ Если Элемент.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение ИЛИ Элемент.Отображение = ОтображениеОбычнойГруппы.Нет Тогда
+ Элемент.ШрифтЗаголовка = ЖирныйШрифт;
+ КонецЕсли;
+ КонецЦикла;
+ КонецЕсли;
+ КонецЕсли;
+
+КонецПроцедуры
diff --git "a/TestingTool_3-0/src/CommonModules/\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\241\320\265\321\200\320\262\320\265\321\200/\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\241\320\265\321\200\320\262\320\265\321\200.mdo" "b/TestingTool_3-0/src/CommonModules/\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\241\320\265\321\200\320\262\320\265\321\200/\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\241\320\265\321\200\320\262\320\265\321\200.mdo"
new file mode 100644
index 0000000..dc8cff2
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\241\320\265\321\200\320\262\320\265\321\200/\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\241\320\265\321\200\320\262\320\265\321\200.mdo"
@@ -0,0 +1,11 @@
+
+
+ СтандартныеПодсистемыСервер
+
+ ru
+ Стандартные подсистемы сервер
+
+ true
+ true
+ true
+
diff --git "a/TestingTool_3-0/src/CommonModules/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\244\321\203\320\275\320\272\321\206\320\270\320\270\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\244\321\203\320\275\320\272\321\206\320\270\320\270\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
index dacfd9d..985737f 100644
--- "a/TestingTool_3-0/src/CommonModules/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\244\321\203\320\275\320\272\321\206\320\270\320\270\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
+++ "b/TestingTool_3-0/src/CommonModules/\320\241\321\202\321\200\320\276\320\272\320\276\320\262\321\213\320\265\320\244\321\203\320\275\320\272\321\206\320\270\320\270\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
@@ -228,3 +228,33 @@
Возврат СтроковыеФункции.СравнитьВерсии(СтрокаВерсии1,СтрокаВерсии2);
КонецФункции
+
+// Проверяет, является ли строка уникальным идентификатором.
+// В качестве уникального идентификатора предполагается строка вида
+// "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где X = [0..9,a..f].
+//
+// Параметры:
+// ИдентификаторСтрока - Строка - проверяемая строка.
+//
+// Возвращаемое значение:
+// Булево - Истина, если переданная строка является уникальным идентификатором.
+Функция ЭтоУникальныйИдентификатор(Знач Строка) Экспорт
+
+ Шаблон = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
+
+ Если СтрДлина(Шаблон) <> СтрДлина(Строка) Тогда
+ Возврат Ложь;
+ КонецЕсли;
+ Для Позиция = 1 По СтрДлина(Строка) Цикл
+ Если КодСимвола(Шаблон, Позиция) = 88 // X
+ И ((КодСимвола(Строка, Позиция) < 48 Или КодСимвола(Строка, Позиция) > 57) // 0..9
+ И (КодСимвола(Строка, Позиция) < 97 Или КодСимвола(Строка, Позиция) > 102) // a..f
+ И (КодСимвола(Строка, Позиция) < 65 Или КодСимвола(Строка, Позиция) > 70)) // A..F
+ Или КодСимвола(Шаблон, Позиция) = 45 И КодСимвола(Строка, Позиция) <> 45 Тогда // -
+ Возврат Ложь;
+ КонецЕсли;
+ КонецЦикла;
+
+ Возврат Истина;
+
+КонецФункции
diff --git "a/TestingTool_3-0/src/CommonModules/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
new file mode 100644
index 0000000..40598b9
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
@@ -0,0 +1,177 @@
+#Область СохранениеЗагрузкаНастроек
+
+Процедура СохранитьНастройкиПользователя(Знач КлючОбъекта, Знач КлючНастроек,Знач Настройки, Знач Пользователь="") Экспорт
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ Если ТипЗнч(Настройки)=Тип("ХранилищеЗначения") ИЛИ Настройки=Неопределено Тогда
+ Иначе
+ Настройки = Новый ХранилищеЗначения(Настройки);
+ КонецЕсли;
+
+ МенеджерЗаписи = РегистрыСведений.ОбщееХранениеНастроек.СоздатьМенеджерЗаписи();
+
+ МенеджерЗаписи.КлючНастроек = КлючНастроек;
+ МенеджерЗаписи.КлючОбъекта = КлючОбъекта;
+ МенеджерЗаписи.Пользователь = Пользователь;
+ МенеджерЗаписи.Настройки = Настройки;
+ МенеджерЗаписи.ДатаАктуальности = ТекущаяДата();
+
+ МенеджерЗаписи.Записать();
+
+КонецПроцедуры
+
+Функция ЗагрузитьНастройкиПользователя(Знач КлючОбъекта, Знач КлючНастроек, Знач Пользователь="", СрокЖизниКэша = 86400, КэшУстарел=Ложь) Экспорт
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ ЗначениеНастройки = Неопределено;
+
+ КлючОбъекта = Строка(КлючОбъекта);
+ КлючНастроек = Строка(КлючНастроек);
+ Пользователь = Строка(Пользователь);
+
+ Запрос = новый Запрос;
+ Запрос.Текст ="ВЫБРАТЬ
+ | ОбщееХранениеНастроек.КлючОбъекта КАК КлючОбъекта,
+ | ОбщееХранениеНастроек.КлючНастроек КАК КлючНастроек,
+ | ОбщееХранениеНастроек.Пользователь КАК Пользователь,
+ | ОбщееХранениеНастроек.Настройки КАК Настройки,
+ | ОбщееХранениеНастроек.ДатаАктуальности КАК ДатаАктуальности
+ |ИЗ
+ | РегистрСведений.ОбщееХранениеНастроек КАК ОбщееХранениеНастроек
+ |ГДЕ
+ | ОбщееХранениеНастроек.КлючОбъекта = &КлючОбъекта
+ | И ОбщееХранениеНастроек.КлючНастроек = &КлючНастроек
+ | И ОбщееХранениеНастроек.Пользователь = &Пользователь";
+ Запрос.УстановитьПараметр("КлючОбъекта",КлючОбъекта);
+ Запрос.УстановитьПараметр("КлючНастроек",КлючНастроек);
+ Запрос.УстановитьПараметр("Пользователь",Пользователь);
+
+ РезультатЗапроса = Запрос.Выполнить();
+
+ Если НЕ РезультатЗапроса.Пустой() Тогда
+ Выборка = РезультатЗапроса.Выбрать();
+ Если Выборка.Следующий() Тогда
+ ЗначениеНастройки = Выборка.Настройки;
+ ДатаАктуальности = Выборка.ДатаАктуальности;
+
+ // пока смотрим сутки
+ Если ТекущаяДата() > ДатаАктуальности + СрокЖизниКэша Тогда
+ КэшУстарел = Истина;
+ КонецЕсли;
+
+ Если ТипЗнч(ЗначениеНастройки)<>Тип("ХранилищеЗначения") ИЛИ ЗначениеНастройки=Неопределено Тогда
+ Иначе
+ ЗначениеНастройки = ЗначениеНастройки.Получить();
+ КонецЕсли;
+ КонецЕсли;
+ КонецЕсли;
+
+ Возврат ЗначениеНастройки;
+КонецФункции
+
+Процедура УдалитьНастройкиПользователя(Знач КлючОбъекта, Знач КлючНастроек, Знач Пользователь="") Экспорт
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ МенеджерЗаписи = РегистрыСведений.ОбщееХранениеНастроек.СоздатьМенеджерЗаписи();
+ МенеджерЗаписи.КлючОбъекта = КлючОбъекта;
+ МенеджерЗаписи.КлючНастроек = КлючНастроек;
+ МенеджерЗаписи.Пользователь = Пользователь;
+
+ МенеджерЗаписи.Удалить();
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область РаботаСБЕзопаснымХранилищем
+
+// Помещает настройки в безопасное хранилище
+Процедура ЗаписатьДанныеВБезопасноеХранилище(Знач Владелец,Знач Данные, Знач Ключ = "") Экспорт
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ Если ТипЗнч(Данные)=Тип("ХранилищеЗначения") ИЛИ Данные=Неопределено Тогда
+ Иначе
+ Данные = Новый ХранилищеЗначения(Данные);
+ КонецЕсли;
+
+ МенеджерЗаписи = РегистрыСведений.БезопасноеХранилищеДанных.СоздатьМенеджерЗаписи();
+
+ МенеджерЗаписи.Владелец = Владелец;
+ МенеджерЗаписи.Ключ = Ключ;
+ МенеджерЗаписи.Данные = Данные;
+
+ МенеджерЗаписи.Записать();
+
+КонецПроцедуры
+
+// Помещает настройки в безопасное хранилище
+Процедура ЗаписатьДанныеВБезопасноеХранилищеРасширенный(Знач Владелец, Знач Данные, Знач Комментарий="", Знач Ключ = "") Экспорт
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ Если ТипЗнч(Данные)=Тип("ХранилищеЗначения") ИЛИ Данные=Неопределено Тогда
+ Иначе
+ Данные = Новый ХранилищеЗначения(Данные);
+ КонецЕсли;
+
+ МенеджерЗаписи = РегистрыСведений.БезопасноеХранилищеДанных.СоздатьМенеджерЗаписи();
+
+ МенеджерЗаписи.Владелец = Владелец;
+ МенеджерЗаписи.Ключ = Ключ;
+ МенеджерЗаписи.Данные = Данные;
+ МенеджерЗаписи.Комментарий = Комментарий;
+
+ МенеджерЗаписи.Записать();
+
+КонецПроцедуры
+
+// Получает данные из безопасного хранилища
+Функция ДанныеИзБезопасногоХранилища(Знач Владелец,Знач Ключ = "") Экспорт
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ Результат = Неопределено;
+
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | БезопасноеХранилищеДанных.Данные КАК Данные
+ |ИЗ
+ | РегистрСведений.БезопасноеХранилищеДанных КАК БезопасноеХранилищеДанных
+ |ГДЕ
+ | БезопасноеХранилищеДанных.Владелец = &Владелец
+ | И БезопасноеХранилищеДанных.Ключ = &Ключ";
+
+ Запрос.УстановитьПараметр("Владелец", Владелец);
+ Запрос.УстановитьПараметр("Ключ", Ключ);
+ РезультатЗапроса = Запрос.Выполнить().Выбрать();
+
+ Если РезультатЗапроса.Следующий() Тогда
+ Если ЗначениеЗаполнено(РезультатЗапроса.Данные) Тогда
+ Результат = РезультатЗапроса.Данные.Получить();
+ КонецЕсли;
+ КонецЕсли;
+
+ Возврат Результат;
+КонецФункции
+
+// Удаляет конфиденциальные данные в безопасное хранилище.
+Процедура УдалитьДанныеИзБезопасногоХранилища(Знач Владелец,Знач Ключ = "") Экспорт
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ БезопасноеХранилищеДанных = РегистрыСведений.БезопасноеХранилищеДанных.СоздатьМенеджерЗаписи();
+
+ БезопасноеХранилищеДанных.Владелец = Владелец;
+ БезопасноеХранилищеДанных.Ключ = Ключ;
+
+ БезопасноеХранилищеДанных.Удалить();
+
+КонецПроцедуры
+
+
+#КонецОбласти
\ No newline at end of file
diff --git "a/TestingTool_3-0/src/CommonModules/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260.mdo" "b/TestingTool_3-0/src/CommonModules/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260.mdo"
new file mode 100644
index 0000000..99fc869
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260.mdo"
@@ -0,0 +1,10 @@
+
+
+ УправлениеХранилищемНастроекВызовСервера
+
+ ru
+ Управление хранилищем настроек вызов сервера
+
+ true
+ true
+
diff --git "a/TestingTool_3-0/src/CommonModules/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Module.bsl" "b/TestingTool_3-0/src/CommonModules/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Module.bsl"
new file mode 100644
index 0000000..3093f21
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Module.bsl"
@@ -0,0 +1,8 @@
+
+#Область ЗагрузкаНастроек
+
+Функция ЗагрузитьНастройкиПользователя(Знач КлючОбъекта, Знач КлючНастроек, Знач Пользователь="") Экспорт
+ Возврат УправлениеХранилищемНастроекВызовСервера.ЗагрузитьНастройкиПользователя(КлючОбъекта, КлючНастроек, Пользователь);
+КонецФункции
+
+#КонецОбласти
diff --git "a/TestingTool_3-0/src/CommonModules/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260\320\237\320\276\320\262\321\202\320\230\321\201\320\277/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260\320\237\320\276\320\262\321\202\320\230\321\201\320\277.mdo" "b/TestingTool_3-0/src/CommonModules/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260\320\237\320\276\320\262\321\202\320\230\321\201\320\277/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260\320\237\320\276\320\262\321\202\320\230\321\201\320\277.mdo"
new file mode 100644
index 0000000..1766ca2
--- /dev/null
+++ "b/TestingTool_3-0/src/CommonModules/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260\320\237\320\276\320\262\321\202\320\230\321\201\320\277/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260\320\237\320\276\320\262\321\202\320\230\321\201\320\277.mdo"
@@ -0,0 +1,11 @@
+
+
+ УправлениеХранилищемНастроекВызовСервераПовтИсп
+
+ ru
+ Управление хранилищем настроек вызов сервера повт исп
+
+ true
+ true
+ DuringSession
+
diff --git a/TestingTool_3-0/src/Configuration/Configuration.mdo b/TestingTool_3-0/src/Configuration/Configuration.mdo
index c18dd03..ebad1d9 100644
--- a/TestingTool_3-0/src/Configuration/Configuration.mdo
+++ b/TestingTool_3-0/src/Configuration/Configuration.mdo
@@ -18,8 +18,9 @@
PersonalComputerRussianivanov660
- 3.20.03.11
+ 3.20.06.27https://github.com/ivanov660/TestingTool-3
+ CommonForm.ФормаПоискаLanguage.Русский
@@ -51,6 +52,7 @@
ru
+ Subsystem.СтандартныеПодсистемыSubsystem.АдминистрированиеSubsystem.ИгровоеМоделированиеSubsystem.Информация
@@ -61,6 +63,9 @@
Subsystem.НагрузочноеТестированиеSubsystem.УправлениеРелизамиSubsystem.ОценкаЭффективности
+ StyleItem.НедоступныеДанныеЦвет
+ StyleItem.ПоясняющийТекст
+ StyleItem.ЦветФонаПредупрежденияCommonPicture.BrokenQuad_32x32CommonPicture.clockCommonPicture.FailedQuad_32x33
@@ -149,7 +154,9 @@
CommonModule.ОбновлениеИнформационнойБазыКлиентПереопределяемыйCommonModule.ОбновлениеИнформационнойБазыПереопределяемыйCommonModule.ОбщегоНазначения
+ CommonModule.ОбщегоНазначенияВызовСервераCommonModule.ОбщегоНазначенияКлиент
+ CommonModule.ОбщегоНазначенияКлиентПовтИспCommonModule.ОбщегоНазначенияКлиентСерверCommonModule.ОбщегоНазначенияСерверCommonModule.ОсновноеРабочееМестоВызовСервера
@@ -158,28 +165,41 @@
CommonModule.ПланировщикЗаданийВызовСервераCommonModule.ПланировщикЗаданийКлиентСерверCommonModule.ПланировщикЗаданийСервер
+ CommonModule.ОбщегоНазначенияСлужебныйКлиент
+ CommonModule.ПолнотекстовыйПоискКлиент
+ CommonModule.ПолнотекстовыйПоискСервер
+ CommonModule.ПолнотекстовыйПоискСерверПереопределяемыйCommonModule.ПользователиCommonModule.ПользователиВызовСервераCommonModule.ПользователиКлиентСерверCommonModule.ПользователиСерверCommonModule.РабочееМестоСервер
+ CommonModule.РегламентныеЗаданияСервер
+ CommonModule.РегламентныеЗаданияСлужебныйCommonModule.СлужебныйВызовСервереПовтИспCommonModule.СлужебныйКлиентCommonModule.СлужебныйСерверCommonModule.СлужебныйСерверВызовСервераCommonModule.СтандартныеПодсистемыКлиентCommonModule.СтандартныеПодсистемыПовтИсп
+ CommonModule.СтандартныеПодсистемыСерверCommonModule.СтроковыеФункцииCommonModule.СтроковыеФункцииКлиентСерверCommonModule.СценарноеТестированиеВызовСервераCommonModule.СценарноеТестированиеКлиентСерверCommonModule.СценарноеТестированиеСервер
+ CommonModule.УправлениеХранилищемНастроекВызовСервера
+ CommonModule.УправлениеХранилищемНастроекВызовСервераПовтИсп
+ CommonModule.ПрограммноеИзменениеФормСерверWebService.RemoteControlHTTPService.RemoteControlHTTPService.Reports
+ ScheduledJob.ОбновлениеИндексаППД
+ ScheduledJob.СлияниеИндексаППДScheduledJob.ОбработкаЗаданийScheduledJob.ОбработкаДействийЗаданийScheduledJob.УдалениеУстаревшихСобытий
+ FunctionalOption.ИспользоватьПолнотекстовыйПоискFunctionalOption.ИспользоватьИгровоеМоделированиеFunctionalOption.ИспользоватьНагрузочноеТестированиеFunctionalOption.ИспользоватьОценкуЭффективности
@@ -203,6 +223,7 @@
CommonCommand.ПросмотрРезультатовВыполненияПроверокCommonCommand.ПросмотрУправлениеЗаданиямиCommonCommand.УправлениеОбновлениемПлагинов
+ Constant.ИспользоватьПолнотекстовыйПоискConstant.ЗаголовокСистемыConstant.ИспользоватьИгровоеМоделированиеConstant.ИспользоватьНагрузочноеТестирование
@@ -215,6 +236,7 @@
CommonForm.ДополнительныеОтчетыИОбработкиCommonForm.ОбщиеНастройиСистемыCommonForm.ОписаниеИзмененийСистемы
+ CommonForm.ФормаПоискаCatalog.АгентыТестированияCatalog.АлгоритмыCatalog.Базы1С
@@ -278,6 +300,8 @@
Report.ВыполнениеТестовПоПроверкамReport.НакопительныйГрафикВыполненияТестовПоПроверкамReport.ОтчетПоИерархииРезультатовТестированияПоПроверкам
+ DataProcessor.ПолнотекстовыйПоискВДанных
+ DataProcessor.РегламентныеИФоновыеЗаданияDataProcessor.КонсольЗаданийDataProcessor.ОсновноеРабочееМестоПользователяDataProcessor.УправлениеСпискомПроцессовОСWindows
diff --git a/TestingTool_3-0/src/Configuration/MainSectionCommandInterface.cmi b/TestingTool_3-0/src/Configuration/MainSectionCommandInterface.cmi
index e375026..7259526 100644
--- a/TestingTool_3-0/src/Configuration/MainSectionCommandInterface.cmi
+++ b/TestingTool_3-0/src/Configuration/MainSectionCommandInterface.cmi
@@ -1,23 +1,29 @@
-
-
-
-
- DataProcessor.ОсновноеРабочееМестоПользователя.Command.ОсновноеРабочееМесто
-
- true
-
-
-
-
-
- NavigationPanelImportant
- DataProcessor.ОсновноеРабочееМестоПользователя.Command.ОсновноеРабочееМесто
-
-
-
-
- NavigationPanelImportant
- DataProcessor.ОсновноеРабочееМестоПользователя.Command.ОсновноеРабочееМесто
-
-
-
+
+
+
+
+ DataProcessor.ОсновноеРабочееМестоПользователя.Command.ОсновноеРабочееМесто
+
+ true
+
+
+
+
+
+ NavigationPanelImportant
+ DataProcessor.ОсновноеРабочееМестоПользователя.Command.ОсновноеРабочееМесто
+ CommonCommand.ПросмотрУправлениеЗаданиями
+ CommonCommand.ПросмотрРезультатовВыполненияПроверок
+ CommonCommand.МенеджерВыполненияЧекЛистТестов
+
+
+
+
+ NavigationPanelImportant
+ DataProcessor.ОсновноеРабочееМестоПользователя.Command.ОсновноеРабочееМесто
+ CommonCommand.ПросмотрУправлениеЗаданиями
+ CommonCommand.ПросмотрРезультатовВыполненияПроверок
+ CommonCommand.МенеджерВыполненияЧекЛистТестов
+
+
+
diff --git "a/TestingTool_3-0/src/Constants/\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\321\214\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272/ValueManagerModule.bsl" "b/TestingTool_3-0/src/Constants/\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\321\214\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272/ValueManagerModule.bsl"
new file mode 100644
index 0000000..e69de29
diff --git "a/TestingTool_3-0/src/Constants/\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\321\214\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272/\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\321\214\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272.mdo" "b/TestingTool_3-0/src/Constants/\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\321\214\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272/\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\321\214\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272.mdo"
new file mode 100644
index 0000000..a744520
--- /dev/null
+++ "b/TestingTool_3-0/src/Constants/\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\321\214\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272/\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\321\214\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272.mdo"
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+ ИспользоватьПолнотекстовыйПоиск
+
+ ru
+ Использовать полнотекстовый поиск
+
+
+ Boolean
+
+
+
+ Managed
+
diff --git "a/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Commands/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272/CommandModule.bsl" "b/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Commands/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272/CommandModule.bsl"
new file mode 100644
index 0000000..64a2523
--- /dev/null
+++ "b/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Commands/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272/CommandModule.bsl"
@@ -0,0 +1,12 @@
+
+#Область ОбработчикиСобытий
+
+&НаКлиенте
+Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
+
+ ОткрытьФорму("ОбщаяФорма.ФормаПоиска",,
+ ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно);
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git "a/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\274\320\237\320\276\320\270\321\201\320\272\320\276\320\274\320\230\320\230\320\267\320\262\320\273\320\265\321\207\320\265\320\275\320\270\320\265\320\274\320\242\320\265\320\272\321\201\321\202\320\276\320\262/Form.form" "b/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\274\320\237\320\276\320\270\321\201\320\272\320\276\320\274\320\230\320\230\320\267\320\262\320\273\320\265\321\207\320\265\320\275\320\270\320\265\320\274\320\242\320\265\320\272\321\201\321\202\320\276\320\262/Form.form"
new file mode 100644
index 0000000..c127774
--- /dev/null
+++ "b/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\274\320\237\320\276\320\270\321\201\320\272\320\276\320\274\320\230\320\230\320\267\320\262\320\273\320\265\321\207\320\265\320\275\320\270\320\265\320\274\320\242\320\265\320\272\321\201\321\202\320\276\320\262/Form.form"
@@ -0,0 +1,1542 @@
+
+
+
+ ГруппаЗаголовок
+ 134
+
+ ОписаниеРаздела
+ 136
+
+ ru
+ Обновление, очистка и проверка индекса полнотекстового поиска, а также настройка извлечения текстов из файлов для использования при поиске.
+
+ true
+ true
+
+ true
+
+
+ ОписаниеРазделаРасширеннаяПодсказка
+ 138
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ОписаниеРазделаКонтекстноеМеню
+ 137
+ true
+ true
+
+ true
+
+ true
+
+ Label
+ true
+
+ Left
+
+
+
+ ГруппаСправка
+ 142
+
+ Справка
+ 144
+ true
+ true
+
+ true
+
+
+ СправкаExtendedTooltip
+ 145
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ Form.StandardCommand.Help
+ Auto
+ true
+ true
+ UserCmds
+
+ true
+ true
+
+ true
+
+
+ ru
+ Справка
+
+
+ ГруппаСправкаExtendedTooltip
+ 143
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ CommandBar
+
+ Right
+
+
+ true
+ true
+
+ true
+
+
+ ru
+ Заголовок
+
+
+ ГруппаЗаголовокExtendedTooltip
+ 135
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualGroup
+
+ HorizontalIfPossible
+ true
+ true
+ Auto
+ DontUse
+
+
+
+ Группа1
+ 151
+
+ ГруппаИспользоватьПолнотекстовыйПоиск
+ 101
+
+ ОбработкаАктивныеПользователи
+ 102
+ true
+
+ true
+
+
+ ОбработкаАктивныеПользователиExtendedTooltip
+ 116
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ Hyperlink
+ 0
+ Auto
+ true
+ true
+ UserCmds
+
+ true
+ true
+
+ true
+
+
+ ru
+ Использовать полнотекстовый поиск
+
+
+ ГруппаИспользоватьПолнотекстовыйПоискРасширеннаяПодсказка
+ 114
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualGroup
+
+ HorizontalIfPossible
+ true
+ true
+ Auto
+ DontUse
+
+
+
+ ГруппаУправлениеПолнотекстовымПоиском
+ 30
+
+ ДатаАктуальностиИндекса
+ 5
+ true
+ true
+
+ true
+
+
+
+ ДатаАктуальностиИндекса
+
+
+ true
+
+ ДатаАктуальностиИндексаExtendedTooltip
+ 118
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ДатаАктуальностиИндексаКонтекстноеМеню
+ 6
+ true
+ true
+
+ true
+
+ true
+
+ LabelField
+ Enter
+ true
+ Left
+ true
+
+ true
+ true
+
+
+
+ СтатусИндекса
+ 3
+ true
+ true
+
+ true
+
+
+
+ СтатусИндекса
+
+
+ true
+
+ СтатусИндексаExtendedTooltip
+ 119
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+
+ СтатусИндексаКонтекстноеМеню
+ 4
+ true
+ true
+
+ true
+
+ true
+
+ LabelField
+ Enter
+ true
+ Left
+ true
+
+ true
+ true
+
+
+
+ ГруппаКнопки1
+ 93
+
+ ОбновитьИндекс
+ 11
+ true
+ true
+
+ true
+
+
+ ОбновитьИндексExtendedTooltip
+ 121
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualButton
+ Form.Command.ОбновитьИндекс
+ Auto
+ true
+ true
+ UserCmds
+
+
+ ОчиститьИндекс
+ 12
+ true
+ true
+
+ true
+
+
+ ОчиститьИндексExtendedTooltip
+ 122
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualButton
+ Form.Command.ОчиститьИндекс
+ Auto
+ true
+ true
+ UserCmds
+
+
+ ПроверитьИндекс
+ 155
+ true
+ true
+
+ true
+
+
+ ПроверитьИндексРасширеннаяПодсказка
+ 156
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualButton
+ Form.Command.ПроверитьИндекс
+ Auto
+ true
+ true
+ UserCmds
+
+ true
+ true
+
+ true
+
+
+ ru
+ Кнопки 1
+
+
+ ГруппаКнопки1ExtendedTooltip
+ 120
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualGroup
+
+ HorizontalIfPossible
+ true
+ true
+ Auto
+ DontUse
+
+
+ true
+ true
+
+ true
+
+
+ ru
+ Полнотекстовый поиск
+
+
+ System.DefaultGUIFont
+ true
+ false
+ false
+ false
+
+
+ ru
+ Группа управление автоматическим извлечением текстов
+
+
+ ГруппаУправлениеПолнотекстовымПоискомExtendedTooltip
+ 117
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualGroup
+
+ Vertical
+ true
+ true
+ Auto
+ DontUse
+
+
+
+ ГруппаМаксимальныйРазмерИндексируемыхДанных
+ 193
+
+ ГруппаМаксимальныйРазмерИндексируемыхДанныхЗначение
+ 195
+
+ ОграничитьМаксимальныйРазмерИндексируемыхДанных
+ 209
+ true
+ true
+
+ true
+
+
+
+ ОграничитьМаксимальныйРазмерИндексируемыхДанных
+
+
+ None
+
+ OnChange
+ ОграничитьМаксимальныйРазмерИндексируемыхДанныхПриИзменении
+
+
+ ОграничитьМаксимальныйРазмерИндексируемыхДанныхРасширеннаяПодсказка
+ 211
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ОграничитьМаксимальныйРазмерИндексируемыхДанныхКонтекстноеМеню
+ 210
+ true
+ true
+
+ true
+
+ true
+
+ CheckBoxField
+ Enter
+ true
+ Left
+ true
+
+
+
+ МаксимальныйРазмерИндексируемыхДанных
+ 197
+ true
+ true
+
+ true
+
+
+
+ МаксимальныйРазмерИндексируемыхДанных
+
+
+
+ OnChange
+ МаксимальныйРазмерИндексируемыхДанныхПриИзменении
+
+
+ МаксимальныйРазмерИндексируемыхДанныхРасширеннаяПодсказка
+ 199
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+
+ МаксимальныйРазмерИндексируемыхДанныхКонтекстноеМеню
+ 198
+ true
+ true
+
+ true
+
+ true
+
+ InputField
+ Enter
+ true
+ Left
+ true
+
+ true
+ true
+ true
+ true
+ true
+ true
+
+
+
+ ДекорацияМб
+ 200
+
+ ru
+ Мб
+
+ true
+ true
+
+ true
+
+
+ ДекорацияМбРасширеннаяПодсказка
+ 202
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ДекорацияМбКонтекстноеМеню
+ 201
+ true
+ true
+
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ true
+ true
+
+ true
+
+
+ ru
+ Максимальный размер индексируемых данных значение
+
+
+ ГруппаМаксимальныйРазмерИндексируемыхДанныхЗначениеРасширеннаяПодсказка
+ 196
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualGroup
+
+ HorizontalIfPossible
+ true
+ true
+ Auto
+ DontUse
+
+
+
+ МаксимальныйРазмерИндексируемыхДанныхПодсказка
+ 203
+
+ ru
+ Ограничение размера позволяет повысить скорость индексации и полнотекстового поиска.
+
+ true
+ true
+
+ true
+
+
+ МаксимальныйРазмерИндексируемыхДанныхПодсказкаРасширеннаяПодсказка
+ 205
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+
+ МаксимальныйРазмерИндексируемыхДанныхПодсказкаКонтекстноеМеню
+ 204
+ true
+ true
+
+ true
+
+ true
+
+ Label
+ true
+
+ Style.ПоясняющийТекст
+
+
+ Left
+
+
+ true
+ true
+
+ true
+
+
+ ru
+ Максимальный размер индексируемых данных
+
+
+ ГруппаМаксимальныйРазмерИндексируемыхДанныхРасширеннаяПодсказка
+ 194
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualGroup
+
+ Vertical
+ true
+ true
+ Auto
+ DontUse
+
+
+ true
+ true
+
+ true
+
+
+ Группа1РасширеннаяПодсказка
+ 152
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualGroup
+
+ Vertical
+ true
+ true
+ Auto
+ DontUse
+
+
+
+ ГруппаАвтоматическоеИзвлечениеТекстов
+ 56
+
+ ПояснениеИзвлекатьТекстыФайловНаСервере4
+ 103
+
+ ru
+ Извлечение текстов из файлов необходимо для полнотекстового поиска в программе.
+
+ true
+ true
+
+ true
+
+
+ ПояснениеИзвлекатьТекстыФайловНаСервере4ExtendedTooltip
+ 124
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ПояснениеИзвлекатьТекстыФайловНаСервере4КонтекстноеМеню
+ 104
+ true
+ true
+
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Style.ПоясняющийТекст
+
+
+ Left
+
+
+
+ Группа2
+ 189
+
+ ГруппаКолонки
+ 157
+
+ ИзвлекатьТекстыФайловНаСервереWindows
+ 159
+ true
+ true
+
+ true
+
+
+
+ ИзвлекатьТекстыФайловНаСервере
+
+
+ None
+
+ OnChange
+ ИзвлекатьТекстыФайловНаСервереПриИзменении
+
+
+ ИзвлекатьТекстыФайловНаСервереWindowsРасширеннаяПодсказка
+ 161
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ИзвлекатьТекстыФайловНаСервереWindowsКонтекстноеМеню
+ 160
+ true
+ true
+
+ true
+
+ true
+
+ RadioButtonField
+ Enter
+ true
+ Left
+ true
+
+ 2
+
+
+ ru
+ В кластере серверов настроено выполнение на сервере под управлением ОС Windows
+
+
+ 1
+
+
+
+
+
+ РедактироватьРегламентноеЗадание
+ 187
+
+ ru
+ Настроить расписание
+
+ true
+ true
+
+ true
+
+
+ РедактироватьРегламентноеЗаданиеРасширеннаяПодсказка
+ 188
+
+ ru
+ <Настроенное расписание>
+
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ Hyperlink
+ Form.Command.РедактироватьРегламентноеЗадание
+ Auto
+ true
+ true
+ true
+ UserCmds
+ ShowBottom
+
+ true
+ true
+
+ true
+
+
+ ru
+ Колонки
+
+
+ ГруппаКолонкиРасширеннаяПодсказка
+ 158
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualGroup
+
+ HorizontalIfPossible
+ true
+ Auto
+ DontUse
+
+
+
+ Группа5
+ 171
+
+ ИзвлекатьТекстыФайловНаСервереLinux
+ 175
+ true
+ true
+
+ true
+
+
+
+ ИзвлекатьТекстыФайловНаСервере
+
+
+ None
+
+ OnChange
+ ИзвлекатьТекстыФайловНаСервереПриИзменении
+
+
+ ИзвлекатьТекстыФайловНаСервереLinuxРасширеннаяПодсказка
+ 177
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ИзвлекатьТекстыФайловНаСервереLinuxКонтекстноеМеню
+ 176
+ true
+ true
+
+ true
+
+ true
+
+ RadioButtonField
+ Enter
+ true
+ Left
+ true
+
+ 2
+
+
+ ru
+ В кластере нет серверов под управлением ОС Windows (все сервера в кластере только под управлением ОС Linux)
+
+
+ 0
+
+
+
+
+
+ ЗапуститьИзвлечениеТекстов
+ 191
+
+ ru
+ Запустить извлечение текстов
+
+ true
+ true
+
+ true
+
+
+ ЗапуститьИзвлечениеТекстовРасширеннаяПодсказка
+ 192
+
+ ru
+ Извлечение текстов в тонком клиенте на рабочей станции под управлением ОС Windows.
+
+ true
+ true
+
+ true
+
+ Label
+ true
+
+ Left
+
+
+ Hyperlink
+ 0
+ Auto
+ true
+ true
+ UserCmds
+ ShowBottom
+
+ true
+ true
+
+ true
+
+
+ Группа5РасширеннаяПодсказка
+ 172
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualGroup
+
+ HorizontalIfPossible
+ true
+ Auto
+ DontUse
+
+
+ true
+ true
+
+ true
+
+
+ Группа2РасширеннаяПодсказка
+ 190
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualGroup
+
+ Vertical
+ true
+ true
+ Auto
+ DontUse
+
+
+ true
+
+ true
+
+
+ ru
+ Автоматическое извлечение текстов
+
+ false
+
+ ГруппаАвтоматическоеИзвлечениеТекстовExtendedTooltip
+ 123
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualGroup
+
+ Vertical
+ NormalSeparation
+ true
+ true
+ true
+ Auto
+ DontUse
+
+
+ Top
+
+ ФормаКоманднаяПанель
+ -1
+ true
+ true
+
+ true
+
+ Left
+
+
+ OnCreateAtServer
+ ПриСозданииНаСервере
+
+
+ OnClose
+ ПриЗакрытии
+
+ Abort
+ Cancel
+ Ignore
+ No
+ OK
+ RestoreValues
+ Retry
+ SaveValues
+ Write
+ WriteAndClose
+ Yes
+ true
+ true
+ Vertical
+ true
+ true
+ true
+ true
+
+ СтатусИндекса
+
+ ru
+ Статус индекса
+
+ 3
+
+ String
+
+
+
+ true
+
+
+ true
+
+
+
+ ДатаАктуальностиИндекса
+
+ ru
+ Дата актуальности индекса
+
+ 4
+
+ Date
+
+
+
+ true
+
+
+ true
+
+
+
+ ИзвлекатьТекстыФайловНаСервере
+
+ ru
+ Извлекать тексты файлов
+
+ 9
+
+ Number
+
+ 1
+
+
+
+ true
+
+
+ true
+
+
+
+ НаборКонстант
+
+ ru
+ Набор констант
+
+ 7
+
+ ConstantsSet
+
+
+ true
+
+
+ true
+
+
+ НаборКонстант.ИспользоватьПолнотекстовыйПоиск
+
+ true
+
+
+ ИндексАктуален
+
+ ru
+ Индекс актуален
+
+ 1
+
+ Boolean
+
+
+ true
+
+
+ true
+
+
+
+ ИспользоватьПолнотекстовыйПоиск
+
+ ru
+ Использовать полнотекстовый поиск
+
+ 5
+
+ Number
+
+ 1
+
+
+
+ true
+
+
+ true
+
+
+
+ СведенияОРегламентныхЗаданиях
+
+ ru
+ Сведения о регламентных заданиях
+
+ 11
+
+
+ true
+
+
+ true
+
+
+
+ Задания
+
+ ru
+ Задания
+
+ 6
+
+ ValueTable
+
+
+ true
+
+
+ true
+
+
+ ИмяПредопределенного
+
+ ru
+ Имя предопределенного
+
+ 1
+
+ String
+
+
+
+ true
+
+
+ true
+
+
+
+ Идентификатор
+
+ ru
+ Идентификатор
+
+ 2
+
+ UUID
+
+
+ true
+
+
+ true
+
+
+
+ Расписание
+
+ ru
+ Расписание
+
+ 3
+
+ String
+
+
+
+ true
+
+
+ true
+
+
+
+
+ ИндексСодержитКорректныеДанные
+
+ ru
+ Индекс содержит корректные данные
+
+ 12
+
+ Boolean
+
+
+ true
+
+
+ true
+
+
+
+ МаксимальныйРазмерИндексируемыхДанных
+
+ ru
+ Ограничить максимальный размер индексируемых данных
+
+ 13
+
+ Number
+
+ 6
+ true
+
+
+
+ true
+
+
+ true
+
+
+
+ ОграничитьМаксимальныйРазмерИндексируемыхДанных
+
+ ru
+ Ограничить максимальный размер индексируемых данных
+
+ 14
+
+ Boolean
+
+
+ true
+
+
+ true
+
+
+
+ ОбновитьИндекс
+
+ ru
+ Обновить индекс
+
+ 1
+
+ ru
+ Обновить индекс
+
+
+
+
+ ОбновитьИндекс
+
+
+ DontUse
+
+
+ ОчиститьИндекс
+
+ ru
+ Очистить индекс
+
+ 2
+
+ ru
+ Очистить индекс
+
+
+
+
+ ОчиститьИндекс
+
+
+ DontUse
+
+
+ РедактироватьРегламентноеЗадание
+
+ ru
+ Расписание
+
+ 4
+
+ ru
+ Расписание и другие параметры регламентного задания по извлечению текстов из файлов.
+
+
+
+
+ РедактироватьРегламентноеЗадание
+
+
+ DontUse
+
+
+ ПроверитьИндекс
+
+ ru
+ Проверить индекс
+
+ 5
+
+ ru
+ Проверить индекс
+
+
+
+
+ ПроверитьИндекс
+
+
+ DontUse
+
+
+
+
+
+
+
diff --git "a/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\274\320\237\320\276\320\270\321\201\320\272\320\276\320\274\320\230\320\230\320\267\320\262\320\273\320\265\321\207\320\265\320\275\320\270\320\265\320\274\320\242\320\265\320\272\321\201\321\202\320\276\320\262/Help/ru.html" "b/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\274\320\237\320\276\320\270\321\201\320\272\320\276\320\274\320\230\320\230\320\267\320\262\320\273\320\265\321\207\320\265\320\275\320\270\320\265\320\274\320\242\320\265\320\272\321\201\321\202\320\276\320\262/Help/ru.html"
new file mode 100644
index 0000000..ae2665c
--- /dev/null
+++ "b/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\274\320\237\320\276\320\270\321\201\320\272\320\276\320\274\320\230\320\230\320\267\320\262\320\273\320\265\321\207\320\265\320\275\320\270\320\265\320\274\320\242\320\265\320\272\321\201\321\202\320\276\320\262/Help/ru.html"
@@ -0,0 +1,30 @@
+
+
Предназначена для включения и отключения полнотекстового поиска, обновления индекса полнотекстового поиска, а также настройки извлечения текстов из файлов для использования при поиске.
+
Открывается по команде Управление полнотекстовым поиском раздела Администрирование - Общие настройки - Полнотекстовый поиск данных.
Программа позволяет производить полнотекстовый поиск в любых справочниках, документах и других объектах, отыскивая заданную строку во всех полях объектов. При наличии присоединенных файлов, содержащих текстовую информацию, поиск осуществляется также и по ним. Полнотекстовый поиск используется при поиске данных в программе по содержимому справочников, документов и других объектов программы.
+
Также полнотекстовый поиск предоставляет такие возможности как: поддержка транслитерации (написание русских слов символами латиницы в соответствии с ГОСТ); поддержка замещения (написание части символов в русских словах одноклавишными латинскими символами); нечеткий поиск (буквы в найденных словах могут отличаться).
+
Для начала работы с полнотекстовым поиском необходимо включить флажок Полнотекстовый поиск данных. В этом случае становятся доступными команды, которые позволяют настроить полнотекстовый поиск данных в программе, управлять индексом полнотекстового поиска, обновлять и очищать его. По умолчанию флажок включен.
+
В файловом режиме работы программы доступны только команды управления полнотекстовым индексом, тексты извлекаются автоматически при загрузке файла в программу.
+
Обновление индекса полнотекстового поиска
+
Для того чтобы можно было осуществлять поиск по всем введенным в программу данным, необходимо регулярно актуализировать индекс полнотекстового поиска. Для регулярного автоматического обновления индекса предназначены регламентные задания Обновление индекса ППД и Слияние индекса ППД (выполняется раз в сутки).
+
Если индекс уже был обновлен, то отображается Дата актуальности индекса - дата последнего обновления индекса.
+
Если в программе есть данные, которые не прошли индексирование, то становится доступна кнопка Обновить индекс и выводится Статус индекса "Требуется обновление".
Очистка индекса полнотекстового поиска
+
Если работа поиска по каким-то причинам нарушена, то с помощью кнопки Очистить индекс можно удалить все файлы полнотекстового индекса. После удаления индекса необходимо заново его построить, используя кнопку Обновить индекс.
Проверка индекса полнотекстового поиска
+
+
В любой момент можно проверить состояние индекса полнотекстового поиска с помощью кнопки Проверить индекс.
В клиент-серверном режиме доступны команды по настройке автоматического извлечения текстов.
+
Автоматическое извлечение текстов
+
Извлечение текстов из файлов необходимо для полнотекстового поиска в программе.
+
Для настройки необходимо с помощью переключателя выбрать:
Данный вариант подходит, когда в Администрировании серверов 1С Предприятия задано следующее правило для сервера под управлением ОС Microsoft Windows:
+
Объект требования: Клиентское соединение с ИБ.
+
Тип требования: Назначать.
+
Имя ИБ: не указывается.
+
Значение дополнительного параметра: BackgroundJob.CommonModule.ПолнотекстовыйПоискСервер.ОбновлениеИндексаППДПоРасписанию.
В кластере нет серверов под управлением ОС Windows (все сервера в кластере только под управлением ОС Linux) - в этом случае с помощью команды Запустить извлечение текстов можно начать извлечение текстов в тонком клиенте на рабочей станции под управлением ОС Windows.
Если в клиент-серверном варианте один или несколько рабочих процессов сервера работают под Linux, а часть или все клиенты подключаются с помощью веб-клиента, то в информационной базе могут быть добавлены файлы, текст из которых не извлечен, и соответственно эти файлы не могут быть найдены полнотекстовым поиском по содержимому. В этом случае на одном из клиентских компьютеров, работающих под управлением ОС Microsoft Windows, нужно запустить тонкий или толстый клиент, и на нем выполнить команду Извлечение текстов, для того чтобы в автоматическом режиме извлекать текст из файлов. По умолчанию интервал времени выполнения равен 60 секундам.
\ No newline at end of file
diff --git "a/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\274\320\237\320\276\320\270\321\201\320\272\320\276\320\274\320\230\320\230\320\267\320\262\320\273\320\265\321\207\320\265\320\275\320\270\320\265\320\274\320\242\320\265\320\272\321\201\321\202\320\276\320\262/Module.bsl" "b/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\274\320\237\320\276\320\270\321\201\320\272\320\276\320\274\320\230\320\230\320\267\320\262\320\273\320\265\321\207\320\265\320\275\320\270\320\265\320\274\320\242\320\265\320\272\321\201\321\202\320\276\320\262/Module.bsl"
new file mode 100644
index 0000000..43d93c8
--- /dev/null
+++ "b/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\274\320\237\320\276\320\270\321\201\320\272\320\276\320\274\320\230\320\230\320\267\320\262\320\273\320\265\321\207\320\265\320\275\320\270\320\265\320\274\320\242\320\265\320\272\321\201\321\202\320\276\320\262/Module.bsl"
@@ -0,0 +1,395 @@
+#Область ОписаниеПеременных
+
+&НаКлиенте
+Перем ОбновитьИнтерфейс;
+
+#КонецОбласти
+
+#Область ОбработчикиСобытийФормы
+
+&НаСервере
+Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
+ Если Параметры.Свойство("АвтоТест") Тогда
+ Возврат;
+ КонецЕсли;
+
+ АвтоЗаголовок = Ложь;
+ Заголовок = НСтр("ru = 'Управление полнотекстовым поиском'");
+ Элементы.ОписаниеРаздела.Заголовок =
+ НСтр("ru = 'Включение и отключение полнотекстового поиска, обновление индекса полнотекстового поиска.'");
+
+ // Обновление состояния элементов.
+ УстановитьДоступность();
+
+ //СтандартныеПодсистемыСервер.УстановитьОтображениеЗаголовковГрупп(
+ // ЭтотОбъект, "ГруппаАвтоматическоеИзвлечениеТекстов");
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПриЗакрытии(ЗавершениеРаботы)
+ Если ЗавершениеРаботы Тогда
+ Возврат;
+ КонецЕсли;
+ ОбновитьИнтерфейсПрограммы();
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ОбработчикиСобытийЭлементовШапкиФормы
+
+&НаКлиенте
+Процедура ИзвлекатьТекстыФайловНаСервереПриИзменении(Элемент)
+ Подключаемый_ПриИзмененииРеквизита(Элемент, Ложь);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура МаксимальныйРазмерИндексируемыхДанныхПриИзменении(Элемент)
+
+ Подключаемый_ПриИзмененииРеквизита(Элемент);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОграничитьМаксимальныйРазмерИндексируемыхДанныхПриИзменении(Элемент)
+
+ Подключаемый_ПриИзмененииРеквизита(Элемент);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ОбработчикиКомандФормы
+
+&НаКлиенте
+Процедура ОбновитьИндекс(Команда)
+ ОбновитьИндексСервер();
+ ПоказатьОповещениеПользователя(НСтр("ru = 'Полнотекстовый поиск'"),, НСтр("ru = 'Индекс успешно обновлен'"));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОчиститьИндекс(Команда)
+ ОчиститьИндексСервер();
+ ПоказатьОповещениеПользователя(НСтр("ru = 'Полнотекстовый поиск'"),, НСтр("ru = 'Индекс успешно очищен'"));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПроверитьИндекс(Команда)
+ Попытка
+ ПроверитьИндексСервер();
+ Исключение
+ ТекстСообщенияОбОшибке =
+ НСтр("ru = 'В настоящее время проверка индекса невозможна, так как выполняется его очистка или обновление.'");
+ ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщенияОбОшибке);
+ КонецПопытки;
+
+ ПоказатьОповещениеПользователя(НСтр("ru = 'Полнотекстовый поиск'"),, НСтр("ru = 'Индекс содержит корректные данные'"));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура РедактироватьРегламентноеЗадание(Команда)
+ РегламентныеЗаданияГиперссылкаНажатие("ИзвлечениеТекста");
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+////////////////////////////////////////////////////////////////////////////////
+// Клиент
+
+&НаКлиенте
+Процедура Подключаемый_ПриИзмененииРеквизита(Элемент, ОбновлятьИнтерфейс = Истина)
+
+ Результат = ПриИзмененииРеквизитаСервер(Элемент.Имя);
+
+ ОбновитьПовторноИспользуемыеЗначения();
+
+ Если Результат.Свойство("НеУдалосьУстановитьРежимПолнотекстовогоПоиска") Тогда
+ // Выдача предупреждающего сообщения.
+ ТекстВопроса = НСтр("ru = 'Для изменения режима полнотекстового поиска требуется завершение сеансов всех пользователей, кроме текущего.'");
+
+ Кнопки = Новый СписокЗначений;
+ Кнопки.Добавить("АктивныеПользователи", НСтр("ru = 'Активные пользователи'"));
+ Кнопки.Добавить(КодВозвратаДиалога.Отмена);
+
+ Обработчик = Новый ОписаниеОповещения("ПриИзмененииРеквизитаПослеОтветаНаВопрос", ЭтотОбъект);
+ ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, , "АктивныеПользователи");
+ Возврат;
+ КонецЕсли;
+
+ Если ОбновлятьИнтерфейс Тогда
+ ОбновитьИнтерфейс = Истина;
+ ПодключитьОбработчикОжидания("ОбновитьИнтерфейсПрограммы", 2, Истина);
+ КонецЕсли;
+
+ Если Результат.КонстантаИмя <> "" Тогда
+ Оповестить("Запись_НаборКонстант", Новый Структура, Результат.КонстантаИмя);
+ КонецЕсли;
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура РегламентныеЗаданияГиперссылкаНажатие(ИмяПредопределенного)
+ Сведения = СведенияОРегламентныхЗаданиях[ИмяПредопределенного];
+ Если Сведения.Идентификатор = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+ Контекст = Новый Структура;
+ Контекст.Вставить("ИмяПредопределенного", ИмяПредопределенного);
+ Контекст.Вставить("ФлажокИзменен", Ложь);
+ Обработчик = Новый ОписаниеОповещения("РегламентныеЗаданияПослеИзмененияРасписания", ЭтотОбъект, Контекст);
+ Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Сведения.Расписание);
+ Диалог.Показать(Обработчик);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура РегламентныеЗаданияПослеИзмененияРасписания(Расписание, Контекст) Экспорт
+ Если Расписание = Неопределено Тогда
+ Если Контекст.ФлажокИзменен Тогда
+ ЭтотОбъект[Контекст.ИмяФлажка] = Ложь;
+ КонецЕсли;
+ Возврат;
+ КонецЕсли;
+
+ Изменения = Новый Структура("Расписание", Расписание);
+ Если Контекст.ФлажокИзменен Тогда
+ ЭтотОбъект[Контекст.ИмяФлажка] = Истина;
+ Изменения.Вставить("Использование", Истина);
+ КонецЕсли;
+ РегламентныеЗаданияСохранить(Контекст.ИмяПредопределенного, Изменения, Истина);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПриИзмененииРеквизитаПослеОтветаНаВопрос(Ответ, ПараметрыВыполнения) Экспорт
+ Если Ответ = "АктивныеПользователи" Тогда
+ //СтандартныеПодсистемыКлиент.ОткрытьСписокАктивныхПользователей();
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбновитьИнтерфейсПрограммы()
+
+ Если ОбновитьИнтерфейс = Истина Тогда
+ ОбновитьИнтерфейс = Ложь;
+ ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы();
+ КонецЕсли;
+
+КонецПроцедуры
+
+////////////////////////////////////////////////////////////////////////////////
+// Вызов сервера
+
+&НаСервере
+Процедура ОбновитьИндексСервер()
+ ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь, Ложь);
+ УстановитьДоступность("Команда.ОбновитьИндекс");
+КонецПроцедуры
+
+&НаСервере
+Процедура ОчиститьИндексСервер()
+ ПолнотекстовыйПоиск.ОчиститьИндекс();
+ УстановитьДоступность("Команда.ОчиститьИндекс");
+КонецПроцедуры
+
+&НаСервере
+Процедура ПроверитьИндексСервер()
+ ИндексСодержитКорректныеДанные = ПолнотекстовыйПоиск.ПроверитьИндекс();
+ УстановитьДоступность("Команда.ПроверитьИндекс", Истина);
+КонецПроцедуры
+
+&НаСервере
+Функция ПриИзмененииРеквизитаСервер(ИмяЭлемента)
+
+ РеквизитПутьКДанным = Элементы[ИмяЭлемента].ПутьКДанным;
+
+ Результат = СохранитьЗначениеРеквизита(РеквизитПутьКДанным);
+
+ УстановитьДоступность(РеквизитПутьКДанным);
+
+ Если Результат.Свойство("НеУдалосьУстановитьРежимПолнотекстовогоПоиска") Тогда
+ Возврат Результат;
+ КонецЕсли;
+
+ ОбновитьПовторноИспользуемыеЗначения();
+
+ Возврат Результат;
+
+КонецФункции
+
+&НаСервере
+Процедура РегламентныеЗаданияСохранить(ИмяПредопределенного, Изменения, УстановитьВидимостьДоступность)
+ Сведения = СведенияОРегламентныхЗаданиях[ИмяПредопределенного];
+ Если Сведения.Идентификатор = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+ РегламентныеЗаданияСервер.ИзменитьЗадание(Сведения.Идентификатор, Изменения);
+ ЗаполнитьЗначенияСвойств(Сведения, Изменения);
+ СведенияОРегламентныхЗаданиях.Вставить(ИмяПредопределенного, Сведения);
+ Если УстановитьВидимостьДоступность Тогда
+ УстановитьДоступность("РегламентноеЗадание." + ИмяПредопределенного);
+ КонецЕсли;
+КонецПроцедуры
+
+////////////////////////////////////////////////////////////////////////////////
+// Сервер
+
+&НаСервере
+Функция СохранитьЗначениеРеквизита(РеквизитПутьКДанным)
+ Результат = Новый Структура("КонстантаИмя", "");
+
+ // Сохранение значений реквизитов, не связанных с константами напрямую (в отношении один-к-одному).
+ Если РеквизитПутьКДанным = "" Тогда
+ Возврат Результат;
+ КонецЕсли;
+
+ // Определение имени константы.
+ КонстантаИмя = "";
+ Если НРег(Лев(РеквизитПутьКДанным, 14)) = НРег("НаборКонстант.") Тогда
+ // Если путь к данным реквизита указан через "НаборКонстант".
+ КонстантаИмя = Сред(РеквизитПутьКДанным, 15);
+ Иначе
+ // Определение имени и запись значения реквизита в соответствующей константе из "НаборКонстант".
+ // Используется для тех реквизитов формы, которые связаны с константами напрямую (в отношении один-к-одному).
+ Если РеквизитПутьКДанным = "ИзвлекатьТекстыФайловНаСервере" Тогда
+ КонстантаИмя = "ИзвлекатьТекстыФайловНаСервере";
+ НаборКонстант.ИзвлекатьТекстыФайловНаСервере = ИзвлекатьТекстыФайловНаСервере;
+ Изменения = Новый Структура("Использование", НаборКонстант.ИзвлекатьТекстыФайловНаСервере);
+ РегламентныеЗаданияСохранить("ИзвлечениеТекста", Изменения, Ложь);
+ ИначеЕсли РеквизитПутьКДанным = "МаксимальныйРазмерИндексируемыхДанных"
+ Или РеквизитПутьКДанным = "ОграничитьМаксимальныйРазмерИндексируемыхДанных" Тогда
+ Попытка
+ Если ОграничитьМаксимальныйРазмерИндексируемыхДанных Тогда
+ // При первом включении ограничения устанавливается значение по умолчанию платформы - 1 Мб.
+ Если МаксимальныйРазмерИндексируемыхДанных = 0 Тогда
+ МаксимальныйРазмерИндексируемыхДанных = 1;
+ КонецЕсли;
+ Если ПолнотекстовыйПоиск.ПолучитьМаксимальныйРазмерИндексируемыхДанных() <> МаксимальныйРазмерИндексируемыхДанных * 1048576 Тогда
+ ПолнотекстовыйПоиск.УстановитьМаксимальныйРазмерИндексируемыхДанных(МаксимальныйРазмерИндексируемыхДанных * 1048576);
+ КонецЕсли;
+ Иначе
+ ПолнотекстовыйПоиск.УстановитьМаксимальныйРазмерИндексируемыхДанных(0);
+ КонецЕсли;
+ Исключение
+ ЗаписьЖурналаРегистрации(
+ НСтр("ru = 'Полнотекстовый поиск'", ),
+ УровеньЖурналаРегистрации.Ошибка,
+ ,
+ ,
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+ Результат.Вставить("НеУдалосьУстановитьРежимПолнотекстовогоПоиска", Истина);
+ Возврат Результат;
+ КонецПопытки;
+ КонецЕсли;
+ КонецЕсли;
+
+ // Сохранения значения константы.
+ Если КонстантаИмя <> "" Тогда
+ КонстантаМенеджер = Константы[КонстантаИмя];
+ КонстантаЗначение = НаборКонстант[КонстантаИмя];
+
+ Если КонстантаМенеджер.Получить() <> КонстантаЗначение Тогда
+ КонстантаМенеджер.Установить(КонстантаЗначение);
+ КонецЕсли;
+
+ Результат.КонстантаИмя = КонстантаИмя;
+ КонецЕсли;
+
+ Возврат Результат;
+КонецФункции
+
+&НаСервере
+Процедура УстановитьДоступность(РеквизитПутьКДанным = "", ИндексПроверен = Ложь)
+
+ Если РеквизитПутьКДанным = "" Или РеквизитПутьКДанным = "ИспользоватьПолнотекстовыйПоиск" Тогда
+ Если НаборКонстант.ИспользоватьПолнотекстовыйПоиск <> ПолнотекстовыйПоискСервер.ОперацииРазрешены() Тогда
+ ИспользоватьПолнотекстовыйПоиск = 2;
+ Иначе
+ ИспользоватьПолнотекстовыйПоиск = НаборКонстант.ИспользоватьПолнотекстовыйПоиск;
+ КонецЕсли;
+ Элементы.ГруппаУправлениеПолнотекстовымПоиском.Доступность = (ИспользоватьПолнотекстовыйПоиск = 1);
+ Элементы.ГруппаАвтоматическоеИзвлечениеТекстов.Доступность = (ИспользоватьПолнотекстовыйПоиск = 1);
+
+ КонецЕсли;
+
+ Если РеквизитПутьКДанным = ""
+ Или РеквизитПутьКДанным = "ОграничитьМаксимальныйРазмерИндексируемыхДанных"
+ Или РеквизитПутьКДанным = "МаксимальныйРазмерИндексируемыхДанных"
+ Или РеквизитПутьКДанным = "ИспользоватьПолнотекстовыйПоиск"
+ Или РеквизитПутьКДанным = "Команда.ОбновитьИндекс"
+ Или РеквизитПутьКДанным = "Команда.ОчиститьИндекс"
+ Или РеквизитПутьКДанным = "Команда.ПроверитьИндекс" Тогда
+
+ Если ИспользоватьПолнотекстовыйПоиск = 1 Тогда
+ ДатаАктуальностиИндекса = ПолнотекстовыйПоиск.ДатаАктуальности();
+ ИндексАктуален = ПолнотекстовыйПоискСервер.ИндексПоискаАктуален();
+ ФлагДоступность = НЕ ИндексАктуален;
+ Если ИндексПроверен И Не ИндексСодержитКорректныеДанные Тогда
+ СтатусИндекса = НСтр("ru = 'Требуется очистка и обновление'");
+ ИначеЕсли ИндексАктуален Тогда
+ СтатусИндекса = НСтр("ru = 'Обновление не требуется'");
+ Иначе
+ СтатусИндекса = НСтр("ru = 'Требуется обновление'");
+ КонецЕсли;
+ Иначе
+ ДатаАктуальностиИндекса = '00010101';
+ ИндексАктуален = Ложь;
+ ФлагДоступность = Ложь;
+ СтатусИндекса = НСтр("ru = 'Полнотекстовый поиск отключен'");
+ КонецЕсли;
+ МаксимальныйРазмерИндексируемыхДанных = ПолнотекстовыйПоиск.ПолучитьМаксимальныйРазмерИндексируемыхДанных() / 1048576;
+ ОграничитьМаксимальныйРазмерИндексируемыхДанных = МаксимальныйРазмерИндексируемыхДанных <> 0;
+
+ Элементы.МаксимальныйРазмерИндексируемыхДанных.Доступность = ОграничитьМаксимальныйРазмерИндексируемыхДанных;
+ Элементы.ДекорацияМб.Доступность = ОграничитьМаксимальныйРазмерИндексируемыхДанных;
+
+ Если (ИндексПроверен И Не ИндексСодержитКорректныеДанные)
+ Или Не ИндексАктуален Тогда
+ Элементы.СтатусИндекса.Шрифт = Новый Шрифт(, , Истина);
+ Иначе
+ Элементы.СтатусИндекса.Шрифт = Новый Шрифт;
+ КонецЕсли;
+
+ Элементы.ОбновитьИндекс.Доступность = ФлагДоступность;
+
+ КонецЕсли;
+
+ Если Элементы.ГруппаАвтоматическоеИзвлечениеТекстов.Видимость
+ И (РеквизитПутьКДанным = ""
+ Или РеквизитПутьКДанным = "ИзвлекатьТекстыФайловНаСервере"
+ Или РеквизитПутьКДанным = "РегламентноеЗадание.ИзвлечениеТекста") Тогда
+ Элементы.РедактироватьРегламентноеЗадание.Доступность = НаборКонстант.ИзвлекатьТекстыФайловНаСервере;
+ Элементы.ЗапуститьИзвлечениеТекстов.Доступность = Не НаборКонстант.ИзвлекатьТекстыФайловНаСервере;
+ Если НаборКонстант.ИзвлекатьТекстыФайловНаСервере Тогда
+ Сведения = СведенияОРегламентныхЗаданиях["ИзвлечениеТекста"];
+ РасписаниеПредставление = Строка(Сведения.Расписание);
+ РасписаниеПредставление = ВРег(Лев(РасписаниеПредставление, 1)) + Сред(РасписаниеПредставление, 2);
+ Иначе
+ РасписаниеПредставление = НСтр("ru = 'Автоматическое извлечение текстов не выполняется.'");
+ КонецЕсли;
+ Элементы.РедактироватьРегламентноеЗадание.РасширеннаяПодсказка.Заголовок = РасписаниеПредставление;
+ КонецЕсли;
+
+КонецПроцедуры
+
+&НаСервере
+Процедура ЗаполнитьСведенияОРегламентномЗадании(ИмяПредопределенного)
+ Сведения = Новый Структура("Идентификатор, Использование, Расписание");
+ СведенияОРегламентныхЗаданиях.Вставить(ИмяПредопределенного, Сведения);
+ Задание = РегламентныеЗаданияНайтиПредопределенное(ИмяПредопределенного);
+ Если Задание = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+ Сведения.Идентификатор = Задание.УникальныйИдентификатор;
+ Сведения.Использование = Задание.Использование;
+ Сведения.Расписание = Задание.Расписание;
+КонецПроцедуры
+
+&НаСервере
+Функция РегламентныеЗаданияНайтиПредопределенное(ИмяПредопределенного)
+ Фильтр = Новый Структура("Метаданные", ИмяПредопределенного);
+ Найденные = РегламентныеЗаданияСервер.НайтиЗадания(Фильтр);
+ Возврат ?(Найденные.Количество() = 0, Неопределено, Найденные[0]);
+КонецФункции
+
+#КонецОбласти
diff --git "a/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\276\321\211\320\265\320\275\320\275\320\260\321\217\320\244\320\276\321\200\320\274\320\260/Form.form" "b/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\276\321\211\320\265\320\275\320\275\320\260\321\217\320\244\320\276\321\200\320\274\320\260/Form.form"
new file mode 100644
index 0000000..bd022df
--- /dev/null
+++ "b/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\276\321\211\320\265\320\275\320\275\320\260\321\217\320\244\320\276\321\200\320\274\320\260/Form.form"
@@ -0,0 +1,199 @@
+
+
+
+ СтрокаПоиска
+ 3
+ true
+ true
+
+ true
+
+
+
+ СтрокаПоиска
+
+
+ None
+
+ СтрокаПоискаExtendedTooltip
+ 7
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+
+ СтрокаПоискаКонтекстноеМеню
+ 6
+ true
+ true
+
+ true
+
+ true
+
+ InputField
+ Enter
+ true
+ Left
+ true
+ Left
+
+ 25
+ 40
+ true
+ true
+ true
+ true
+
+ String
+
+
+
+ Style.BorderColor
+
+
+ ru
+ Найти документ или файл
+
+
+
+
+ Найти
+ 4
+ true
+ true
+
+ true
+
+ false
+
+ НайтиExtendedTooltip
+ 8
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualButton
+ Form.Command.ВыполнитьПоиск
+ Auto
+ true
+ true
+ 1
+ true
+ UserCmds
+
+ Style.ButtonTextColor
+
+
+ Style.ButtonBackColor
+
+
+ Style.BorderColor
+
+
+ None
+
+ ФормаКоманднаяПанель
+ -1
+ true
+ true
+
+ true
+
+ Left
+ true
+
+
+ OnCreateAtServer
+ ПриСозданииНаСервере
+
+ true
+ true
+ HorizontalIfPossible
+ true
+ true
+ true
+ true
+
+ Объект
+
+ ru
+ Объект
+
+ 1
+
+ DataProcessorObject.ПолнотекстовыйПоискВДанных
+
+
+ true
+
+
+ true
+
+ true
+
+
+ СтрокаПоиска
+
+ ru
+ Строка поиска
+
+ 2
+
+ String
+
+
+
+ true
+
+
+ true
+
+
+
+ ВыполнитьПоиск
+
+ ru
+ Найти
+
+ 2
+
+ ru
+ Найти документ по наименованию или части фразы
+
+
+
+ StdPicture.Find
+
+
+
+ ВыполнитьПоиск
+
+
+ Picture
+ DontUse
+
+
+
+
+
+
+
diff --git "a/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\276\321\211\320\265\320\275\320\275\320\260\321\217\320\244\320\276\321\200\320\274\320\260/Module.bsl" "b/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\276\321\211\320\265\320\275\320\275\320\260\321\217\320\244\320\276\321\200\320\274\320\260/Module.bsl"
new file mode 100644
index 0000000..821441f
--- /dev/null
+++ "b/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\243\320\277\321\200\320\276\321\211\320\265\320\275\320\275\320\260\321\217\320\244\320\276\321\200\320\274\320\260/Module.bsl"
@@ -0,0 +1,57 @@
+
+#Область ОбработчикиСобытийФормы
+
+&НаСервере
+Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
+
+ Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
+ Возврат;
+ КонецЕсли;
+
+ ОбновитьИсториюПоиска(Элементы.СтрокаПоиска);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ОбработчикиКомандФормы
+
+&НаКлиенте
+Процедура ВыполнитьПоиск(Команда)
+
+ Если ПустаяСтрока(СтрокаПоиска) Тогда
+ ПоказатьПредупреждение(, НСтр("ru = 'Введите, что нужно найти.'"));
+ Возврат;
+ КонецЕсли;
+
+ ПараметрыФормы = Новый Структура;
+ ПараметрыФормы.Вставить("ПереданнаяСтрокаПоиска", СтрокаПоиска);
+
+ ОткрытьФорму("ОбщаяФорма.ФормаПоиска", ПараметрыФормы,, Истина);
+
+ ОбновитьИсториюПоиска(Элементы.СтрокаПоиска);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+&НаКлиентеНаСервереБезКонтекста
+Процедура ОбновитьИсториюПоиска(Элемент)
+
+ ИсторияПоиска = СохраненнаяИсторияПоиска();
+ Если ТипЗнч(ИсторияПоиска) = Тип("Массив") Тогда
+ Элемент.СписокВыбора.ЗагрузитьЗначения(ИсторияПоиска);
+ КонецЕсли;
+
+КонецПроцедуры
+
+&НаСервереБезКонтекста
+Функция СохраненнаяИсторияПоиска()
+
+ Возврат ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПолнотекстовыйПоискСтрокиПолнотекстовогоПоиска", "");
+
+КонецФункции
+
+#КонецОбласти
diff --git "a/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Help/ru.html" "b/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Help/ru.html"
new file mode 100644
index 0000000..e48eb59
--- /dev/null
+++ "b/TestingTool_3-0/src/DataProcessors/\320\237\320\276\320\273\320\275\320\276\321\202\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271\320\237\320\276\320\270\321\201\320\272\320\222\320\224\320\260\320\275\320\275\321\213\321\205/Help/ru.html"
@@ -0,0 +1,33 @@
+
+
Полнотекстовый поиск данных позволяет находить любые сведения не только по полям карточек, но и по содержимому присоединенных файлов.
+
Полнотекстовый поиск можно выполнять прямо с Начальной страницы программы.
+
Полнотекстовый поиск предоставляет такие возможности как:
+
Поддержка транслитерации (написание русских слов символами латиницы в соответствии с ГОСТ);
+
Поддержка замещения (написание русских слов в английской раскладке);
+
Нечеткий поиск (буквы в найденных словах могут отличаться).
Для поиска данных в программе наберите слово или его начало. Нажмите Найти. Поиск может осуществляться по одному или нескольким словам. В строке ввода допускается использование поисковых операторов типа И, ИЛИ, НЕ.
+
В поле ввода строки поиска можно вставить навигационную ссылку на данные. В этом случае поиск произведен не будет, а будет сразу открыта нужная карточка. Навигационную ссылку на любой объект информационной базы можно получить при помощи команды в заголовке каждого окна 1С:Предприятия 8.
+
Обновление индекса
+
В файловом варианте информационной базы индекс полнотекстового поиска не обновляется автоматически и поэтому должен периодически обновляться вручную. Если индекс полнотекстового поиска не актуален (т.е. есть такие данные, которые еще не прошли индексирование), то в файловом варианте информационной базы становится доступна кнопка Обновить индекс.
+
Примеры
+
+
Пример поиска
+
Результат
«Реализация 00016422»
+
Найдет документ «реализация товаров и услуг» с номером «00016422»
«Платежное 120000»
+
Найдет платежные поручения на суммы 120000 и 120000,50
«Иванов Акация»
+
Найдет все документы, выписанные Ивановым для контрагента ООО «Акация»
«Реализация Акация»
+
Найдет все документы «реализация товаров и услуг» по контрагенту ООО «Акация»
«Акация 05.07»
+
Найдет все документы по контрагенту ООО «Акация», оформленные 5-го июля
«Кроссовки»
+
Найдет все упоминания товаров типа «кроссовки» по порядку: • Кроссовки белые (Товар) • Кроссовки черные (Товар) • Поступление товаров и услуг № 00086822 • Реализация товаров и услуг № 00016422
+
Советы
+
+
Если нашлось много данных, то уточните поисковый запрос, добавив к нему какое-либо уточнение (дату, сумму, название контрагента).
+
Если нашлось мало данных, то упростите запрос, исключив из него какое-либо слово.
+
Для точного поиска используйте:
+
Кавычки - для поиска точной фразы, например: «"мини пылесос"».
+
ИЛИ - для поиска одного из двух слов, например «Акация ИЛИ Стройпромвсе» - найдет все упоминания контрагентов ООО "Акация" и ЗАО "Стройпромвсе".
+
Скобки - для группировки выражений, например поиск «Иванов (Акация ИЛИ Стройпромвсе)» найдет все документы, выписанные Ивановым по контрагентам ООО "Акация" и ЗАО "Стройпромвсе".
+
Для поиска с учетом синонимов используйте "!", например, поиск "!номер" найдет все документы в которых встречается слово "номер" или "число".
+
Для "нечеткого" поиска используйте "#", например поиск "Стройпромвсе#2" найдет все документы, содержащие такие слова, которые отличаются от слова "Стройпромвсе" на одну или две буквы.
+
Для поиска по началу слова используйте "*", например, поиск "Строй*" найдет все документы, которые содержат слова, начинающиеся на "Строй" - "Стройка", "Стройпромвсе" и т.д.
Как правило, необходимость в изменении свойств регламентных заданий возникает редко. Чаще всего, используется флажок Включено, с помощью которого можно отключить выполнение регламентного задания.
+
В некоторых случаях бывает необходимо задать два разных расписания для одного регламентного задания. Тогда в список можно добавить новое регламентное задание по одному из предопределенных шаблонов, предусмотренных в программе.
+
Основное
+
Это наиболее нужные свойства при настройке регламентного задания. Но, как и все остальные свойства, они уже установлены в поставке, и необходимость их изменения возникает в исключительных случаях.
+
Наименование - наименование регламентного задания. Обычно пустое, и в качестве него применяется синоним, указанный в шаблоне регламентного задания, заданного в конфигураторе. Если синоним шаблона не задан, используется его имя.
+
Включено - флажок позволяет включить или отключить выполнение регламентного задания. Полезно, когда нужно ненадолго отключить регламентное задание, не меняя расписание.
+
Повторять, раз - число попыток выполнения регламентного задания, при возникновении ошибки.
+
Повторять через, сек - пауза (в секундах) между попытками выполнения регламентного задания, при возникновении ошибки.
+
Дополнительно
+
Предопределенное - принимает значения Да и Нет. Непредопределенные (введенные вручную) регламентные задания используются в редких случаях.
+
Идентификатор - нужен только для продвинутого администратора, знающего встроенный язык. Требуется для исследования нестандартных проблем в работе регламентных заданий, если таковые есть.
+
Ключ - нужен только для продвинутого администратора. Требуется для тонкой настройки выполнения регламентных заданий и для исследования нестандартных проблем в работе регламентных заданий, если таковые есть. Если ключ указан, то перед запуском фонового задания проверяется, что нет других активных фоновых заданий по тому же шаблону регламентного задания, который применен в экземпляре регламентного задания.
+
Имя пользователя - имя пользователя информационной базы, который будет использован для выполнения регламентного задания. Выбирается из списка Пользователи.
Метаданные
+
Имя - имя шаблона регламентного задания, определенного в конфигураторе.
+
Синоним - синоним шаблона регламентного задания, определенного в конфигураторе.
+
Имя метода - имя процедуры в конфигурации, которая будет выполняться в фоновом задании, созданным по расписанию регламентного задания.
Сообщения пользователю и описание информации об ошибке
+
Поле содержит текст сообщений и текст сведений об ошибке, если сообщения и/или ошибки произошли при выполнении последнего фонового задания созданного по этому регламентному заданию. То же содержание доступно, если открыть последнее фоновое задание этого регламентного задания.
Наименование - копия поля Наименованиерегламентного задания. При применении кнопки Выполнить сейчас на командной панели регламентного задания, наименованию фонового задания присваивается значение "Запуск вручную: <Представление регламентного задания>".
+
Состояние - возможны значения: "Задание выполнено", "Задание завершено с ошибками", "Задание отменено пользователем", "Задание выполняется".
+
Дата начала - дата и время начала выполнения фонового задания.
+
Дата окончания - дата и время окончания выполнения фонового задания (если задание еще выполняется, тогда пустая дата и время: <>).
+
Место выполнения - имя компьютера сети без домена, на котором выполнялось фоновое задание. Это либо имя сервера, либо имя компьютера пользователя, если регламентные задания обрабатывались в файловой информационной базе.
Дополнительно
+
Идентификатор - нужен только для продвинутого администратора, знающего внутренний язык 1С. Требуется для исследования нестандартных проблем в работе фоновых заданий, если таковые есть.
+
Ключ - значение поля Ключ, указанного в регламентном задании (на момент создания фонового задания) или другое, указанное явно, если фоновое задание создано программно, а не планировщиком сервера.
+
Имя метода метаданных - имя процедуры в конфигурации, которая выполняется или выполнялась в фоновом задании. Обычно соответствует значению поля Имя метода соответствующего регламентного задания.
Регламентное задание
+
Наименование - выбирается одно из значений полей (по порядку поиска заполненного):
+
\ No newline at end of file
diff --git "a/TestingTool_3-0/src/DataProcessors/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\230\320\244\320\276\320\275\320\276\320\262\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217/Forms/\320\244\320\276\320\275\320\276\320\262\320\276\320\265\320\227\320\260\320\264\320\260\320\275\320\270\320\265/Module.bsl" "b/TestingTool_3-0/src/DataProcessors/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\230\320\244\320\276\320\275\320\276\320\262\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217/Forms/\320\244\320\276\320\275\320\276\320\262\320\276\320\265\320\227\320\260\320\264\320\260\320\275\320\270\320\265/Module.bsl"
new file mode 100644
index 0000000..8b78c4f
--- /dev/null
+++ "b/TestingTool_3-0/src/DataProcessors/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\230\320\244\320\276\320\275\320\276\320\262\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217/Forms/\320\244\320\276\320\275\320\276\320\262\320\276\320\265\320\227\320\260\320\264\320\260\320\275\320\270\320\265/Module.bsl"
@@ -0,0 +1,61 @@
+
+#Область ОбработчикиСобытийФормы
+
+&НаСервере
+Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
+
+ Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
+ Возврат;
+ КонецЕсли;
+
+ Если Параметры.СвойстваФоновогоЗадания = Неопределено Тогда
+
+ СвойстваФоновогоЗадания = РегламентныеЗаданияСлужебный
+ .ПолучитьСвойстваФоновогоЗадания(Параметры.Идентификатор);
+
+ Если СвойстваФоновогоЗадания = Неопределено Тогда
+ ВызватьИсключение(НСтр("ru = 'Фоновое задание не найдено.'"));
+ КонецЕсли;
+
+ СообщенияПользователюИОписаниеИнформацииОбОшибке = РегламентныеЗаданияСлужебный
+ .СообщенияИОписанияОшибокФоновогоЗадания(Параметры.Идентификатор);
+
+ Если ЗначениеЗаполнено(СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания) Тогда
+
+ ИдентификаторРегламентногоЗадания
+ = СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания;
+
+ НаименованиеРегламентногоЗадания
+ = РегламентныеЗаданияСлужебный.ПредставлениеРегламентногоЗадания(
+ СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания);
+ Иначе
+ НаименованиеРегламентногоЗадания = РегламентныеЗаданияСлужебный.ТекстНеОпределено();
+ ИдентификаторРегламентногоЗадания = РегламентныеЗаданияСлужебный.ТекстНеОпределено();
+ КонецЕсли;
+ Иначе
+ СвойстваФоновогоЗадания = Параметры.СвойстваФоновогоЗадания;
+ ЗаполнитьЗначенияСвойств(
+ ЭтотОбъект,
+ СвойстваФоновогоЗадания,
+ "СообщенияПользователюИОписаниеИнформацииОбОшибке,
+ |ИдентификаторРегламентногоЗадания,
+ |НаименованиеРегламентногоЗадания");
+ КонецЕсли;
+
+ ЗаполнитьЗначенияСвойств(
+ ЭтотОбъект,
+ СвойстваФоновогоЗадания,
+ "Идентификатор,
+ |Ключ,
+ |Наименование,
+ |Начало,
+ |Конец,
+ |Расположение,
+ |Состояние,
+ |ИмяМетода");
+
+ СтандартныеПодсистемыСервер.УстановитьОтображениеЗаголовковГрупп(ЭтотОбъект);
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git "a/TestingTool_3-0/src/DataProcessors/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\230\320\244\320\276\320\275\320\276\320\262\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217/Help/ru.html" "b/TestingTool_3-0/src/DataProcessors/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\230\320\244\320\276\320\275\320\276\320\262\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217/Help/ru.html"
new file mode 100644
index 0000000..e9ae33f
--- /dev/null
+++ "b/TestingTool_3-0/src/DataProcessors/\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\265\320\230\320\244\320\276\320\275\320\276\320\262\321\213\320\265\320\227\320\260\320\264\320\260\320\275\320\270\321\217/Help/ru.html"
@@ -0,0 +1,72 @@
+
+
Предназначен для администрирования регламентных и фоновых заданий.
+
Ряд действий в программе может выполняться автоматически в фоновом режиме, по определенному расписанию. Такие действия называются регламентными заданиями, например, это ежедневная загрузка курсов валют, регулярная рассылка отчетов, отложенное проведение документов и т.п. Регламентные задания облегчают работу в программе, позволяя перенести выполнение рутинных задач в саму программу, и в то же время они снижают человеческий фактор (например, можно забыть загрузить курсы валют в один из перегруженных другими задачами дней).
+
Открывается по команде Регламентные и фоновые задания в разделе Администрирование - Поддержка и обслуживание.
В списке можно включить (или отключить) то или иное регламентное задание и поменять расписание.
+
В списке выводится:
+
- флажок в колонке означает, что регламентное задание Включено и выполняется в соответствии с заданным расписанием;
+
Наименование - полное наименование регламентного задания;
+
Состояние - информация о выполнении регламентного задания;
+
Дата окончания - дата и время завершения регламентного задания.
Обновление списка
+
+
С помощью кнопки Обновить можно актуализировать информацию в списке регламентных заданий, а также на вкладке Фоновые задания, т.к. списки связаны, при этом будет произведен отбор в соответствии с указанными ранее настройками.
Настройка расписания
+
+
Для каждого регламентного задания может быть задано расписание, в соответствии с которым регламентное задание будет автоматически запущено на исполнение. В программе поддерживаются однократные и периодические расписания.
+
+
Нажмите Настроить расписание.
Выполнение регламентного задания
+
+
Для того чтобы начать выполнение регламентного задания сразу же, нажмите Выполнить сейчас.
+
+
В файловом режиме работы программы оно будет выполнено в текущем сеансе.
+
+
В клиент-серверном режиме работы программы выполнение произойдет в фоновом задании на сервере. При выполнении процедуры в фоновом задании на сервере не меняется дата последнего выполнения, используемая для запуска по расписанию.
+
+
Одновременное выполнение двух версий одного и того же регламентного задания невозможно. Если запустить то же самое регламентное задание, которое выполняется в данный момент, то программа выведет сообщение о невозможности вторичного запуска регламентного задания.
Ввод нового регламентного задания
+
+
В некоторых случаях бывает необходимо задать два разных расписания для одного регламентного задания. Тогда в список можно добавить новое регламентное задание по одному из предопределенных шаблонов, предусмотренных в программе.
+
+
Нажмите Добавить, выберите из списка шаблон, нажмите кнопку ОК. Заполните необходимые поля.
Включение регламентного задания
+
+
С помощью соответствующей команды контекстного меню по правой кнопке мыши можно Включить или Выключить регламентное задание.
Технически, в соответствии с заданным расписанием для выполнения регламентного задания создается фоновое задание, которое выполняет регламентные действия. Например, если задано ежедневное расписание на 9:15, то каждый день в 9:15 будет запускаться новый сеанс фонового задания. После завершения регламентной операции фоновое задание автоматически завершается.
+
В списке выводится:
+
Состояние - выполнение задания;
+
Наименование - наименование фонового задания;
+
Начало - дата и время начала выполнения фонового задания;
+
Окончание - дата и время окончания выполнения фонового задания;
+
Регламентное задание - наименование регламентного задания.
Для контроля выполнения регламентных заданий можно воспользоваться отбором фоновых заданий по различным признакам:
+
+
Отбор
+
Описание
По состоянию
+
+
Позволяет выполнить отбор по состоянию (дополнительно к отбору по периоду и по регламентному заданию):
+
Выполнено;
+
Завершено с ошибками;
+
Отменено;
+
Выполняется.
Включите нужные отборы с помощью флажков.
По периоду
+
+
+
Позволяет выполнить отбор по периоду (дополнительно к отбору по состоянию и по регламентному заданию):
+
произвольный - можно установить нестандартный период;
+
все время - отбор по периоду не выполняется;
+
прошлая ночь - стандартный период 12 часов с 21:00-09:00;
+
вчера - стандартный период 24 часа с 00:00-23:59 вчерашнего дня;
+
сегодня - стандартный период 24 часа с 00:00-23:59 сегодняшнего дня.
По регламентному заданию
+
+
Позволяет выполнить отбор по регламентному заданию (дополнительно к отбору по состоянию и по периоду).
+
Включите флажок Отбирать по регламентному заданию.
+
Выберите наименование регламентного задания из списка.
+
Наименование регламентного задания "<не определено>" используется для отбора фоновых заданий, запущенных для выполнения прочих (не регламентных) заданий.
Внимание! Для того чтобы отобрать фоновые задания в соответствии с выбранными настройками, нажмите Обновить.
+
Просмотр информации о фоновом задании
+
Для того чтобы просмотреть свойства фонового задания, дважды щелкните мышью по нужной строке. Также можно нажать Открыть.
Контроль может быть либо простым, либо детальным.
+
Простой контроль - это анализ колонок Состояние и Дата окончания на вкладке Регламентные задания, а также анализ текста поля Сообщения пользователю и описание информации об ошибке в окне редактирования регламентного задания.
+
Детальный контроль - это анализ списка фоновых заданий (на вкладке Фоновые задания), которые были созданы и выполнены для выполнения регламентного задания.
+
Детальный контроль производится отбором фоновых заданий по интересующему регламентному заданию, и анализом реквизитов фоновых заданий. Следует учитывать, что сведения о выполнении регламентного задания получаются выборкой части сведений о выполнении последнего фонового задания.
+
Отбор фоновых заданий производится только по команде Обновить, поэтому после изменения настройки отбора нужно выполнить эту команду.
+
Для детального анализа хода выполнения регламентных заданий в клиент-серверном режиме см. отчет Продолжительность работы регламентных заданий из группы отчетов Анализ журнала регистрации, который открывается по соответствующей команде в разделе Администрирование - Поддержка и обслуживание - Отчеты администратора.
Конфигурация позволяет производить полнотекстовый поиск в любых объектах конфигурации, отыскивая заданную строку во всех реквизитах объектов. При наличии присоединенных файлов, содержащих текстовую информацию, поиск осуществляется также и по ним.
+
Полнотекстовый поиск предоставляет такие возможности как: поддержка транслитерации (написание русских слов символами латиницы в соответствии с ГОСТ); поддержка замещения (написание части символов в русских словах одноклавишными латинскими символами); нечеткий поиск (буквы в найденных словах могут отличаться).
+
Для включения и настройки полнотекстового поиска необходимо воспользоваться формой настройки параметров системы в разделе Настройка и администрирование.