Skip to content
Permalink
Fetching contributors…
Cannot retrieve contributors at this time
1616 lines (1243 sloc) 89.9 KB
Перем КонтекстЯдра;
Перем Ожидаем;
Перем Утверждения;
Перем ТестируемаяФорма;
Перем НужноИсключениеЕслиНеНайденоДокументов;
#Область ИнтерфейсТестирования
// директива препроцессора нужна для исключения ошибки загрузки в толстом клиенте управляемого приложения
#Если ТолстыйКлиентОбычноеПриложение Тогда
Процедура Инициализация(КонтекстЯдраПараметр) Экспорт
КонтекстЯдра = КонтекстЯдраПараметр;
Ожидаем = КонтекстЯдра.Плагин("УтвержденияBDD");
Утверждения = КонтекстЯдра.Плагин("БазовыеУтверждения");
ЗагрузитьНастройки();
КонецПроцедуры
Процедура ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр) Экспорт
КонтекстЯдра = КонтекстЯдраПараметр;
ВидыМетаданных = ВидыМетаданных();
ВидыПроверок = ВидыПроверок();
СпособыГруппировки = СпособыГруппировки();
ЗагрузитьНастройки();
НастройкаГруппировки = ПолучитьНастройкуГруппировки(Настройки);
НужноИсключениеЕслиНеНайденоДокументов = Ложь;
Если НЕ СоздатьФорму_ПолучениеФорм() Тогда
Возврат;
КонецЕсли;
СоздатьИменаОсновныхФорм();
Если ВключенСтрогийПорядокВыполнения() Тогда
НаборТестов.СтрогийПорядокВыполнения();
НаборТестов.ПродолжитьВыполнениеПослеПаденияТеста();
КонецЕсли;
Если НЕ ВидМетаданныхИсключенИзТестирования("Справочники") Тогда
ДобавитьТестыФормСправочников(НаборТестов, НастройкаГруппировки);
КонецЕсли;
Если НЕ ВидМетаданныхИсключенИзТестирования("Документы") Тогда
ДобавитьТестыФормДокументов(НаборТестов, НастройкаГруппировки);
КонецЕсли;
Если НЕ ВидМетаданныхИсключенИзТестирования("Обработки") Тогда
ДобавитьТестыФормОбработок(НаборТестов, НастройкаГруппировки);
КонецЕсли;
Если НЕ ВидМетаданныхИсключенИзТестирования("Отчеты") Тогда
ДобавитьТестыФормОтчетов(НаборТестов, НастройкаГруппировки);
КонецЕсли;
КонецПроцедуры
#КонецЕсли
#КонецОбласти
#Область Тесты
Процедура ПередЗапускомТеста() Экспорт
НужноИсключениеЕслиНеНайденоДокументов = Ложь;
СоздатьФорму_ПолучениеФорм();
НачатьТранзакцию();
КонецПроцедуры
Процедура ПослеЗапускаТеста() Экспорт
ЗакрытьФорму();
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
КонецПроцедуры
Процедура ТестДолжен_ПропуститьТестФормы(Знач ПричинаПропускаТеста) Экспорт
КонтекстЯдра.ПропуститьТест(ПричинаПропускаТеста);
КонецПроцедуры
Процедура Тест_ОткрытьФормуСуществующегоДокумента(МетаИмя,МетаФорма_ПолноеИмя,МетаФорма, ЕстьТранзакция) Экспорт
ИД = МетаИмя;
Док = ПолучитьСуществующийДокументОбъект(ИД, НужноИсключениеЕслиНеНайденоДокументов, "Тест_ОткрытьФормуСуществующегоДокумента");
Если Док <> Неопределено Тогда
ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, МетаФорма.Имя, Док.Ссылка);
КонецЕсли;
КонецПроцедуры
Процедура Тест_ПеренестиДокументНаТекущийДень_и_ОткрытьЕгоФорму(МетаИмя,МетаФорма_ПолноеИмя,МетаФорма, ЕстьТранзакция) Экспорт
ИД = МетаИмя;
Док = ПолучитьСуществующийДокументОбъект(ИД, Ложь, "Тест_ПеренестиДокументНаТекущийДень_и_ОткрытьЕгоФорму");
Если Док = Неопределено Тогда
Возврат;
КонецЕсли;
Док.Дата = ТекущаяДата();
Док.ОбменДанными.Загрузка = Истина;
Док.Записать();
ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, МетаФорма.Имя, Док.Ссылка);
КонецПроцедуры
Процедура Тест_ОткрытьФормуНовогоДокумента(МетаИмя,МетаФорма_ПолноеИмя,МетаФорма, ЕстьТранзакция) Экспорт
ИД = МетаИмя;
Док = Документы[ИД].СоздатьДокумент();
Мета = Док.Метаданные();
Если НЕ ПравоДоступа("ИнтерактивноеДобавление", Мета) Тогда
Возврат;
КонецЕсли;
Если Мета.ДлинаНомера <> 0 Тогда
Попытка
Док.УстановитьНовыйНомер();
Исключение
КонецПопытки;
КонецЕсли;
Если ЕстьНастройка("Документы.ЗначенияРеквизитовНовых." + Мета.Имя) Тогда
Для каждого Реквизит из Настройки.Документы.ЗначенияРеквизитовНовых[Мета.Имя] Цикл
Попытка
Док[Реквизит.Ключ] = ЗначениеРеквизита(Мета, Реквизит.Ключ, Реквизит.Значение);
Исключение
ВывестиСообщение(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецЕсли;
ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, МетаФорма.Имя, Док, Ложь);
КонецПроцедуры
Процедура Тест_ОткрытьФормуСуществующегоЭлементаСправочника(МетаИмя,МетаФорма_ПолноеИмя,МетаФорма, ЕстьТранзакция) Экспорт
ИД = МетаИмя;
Элем = СоздатьЭлемент(ИД, "существующий");
ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, МетаФорма.Имя, Элем.Ссылка);
КонецПроцедуры
Процедура Тест_ОткрытьФормуНовогоЭлементаСправочника(МетаИмя,МетаФорма_ПолноеИмя,МетаФорма, ЕстьТранзакция) Экспорт
ИД = МетаИмя;
Элем = Справочники[ИД].СоздатьЭлемент();
Мета = Элем.Метаданные();
Если НЕ ПравоДоступа("ИнтерактивноеДобавление", Мета) Тогда
Возврат;
КонецЕсли;
Если Мета.ДлинаНаименования <> 0 Тогда
Попытка
Элем.Наименование = "новый";
Исключение
КонецПопытки;
КонецЕсли;
Если Мета.Владельцы.Количество() Тогда
Элем.Владелец = ПолучитьСсылкуНаВладельца(Мета, "Владелец для нового");
КонецЕсли;
ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, МетаФорма.Имя, Элем, Ложь);
КонецПроцедуры
Процедура Тест_ОткрытьФормуНовогоЭлементаСправочникаСоздаваемогоКопированием(МетаИмя,МетаФорма_ПолноеИмя,МетаФорма, ЕстьТранзакция) Экспорт
ИД = МетаИмя;
Элем = СоздатьЭлемент(ИД, "копирование", "ИнтерактивноеДобавление");
Если Элем = Неопределено Тогда
Возврат;
КонецЕсли;
ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, МетаФорма.Имя, Элем.Ссылка, Истина);
КонецПроцедуры
#КонецОбласти
#Область ПереопределениеИсключений
// Переопределение исключений, чтобы не открывать формы.
// Возвращаемое значение:
// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки
//
Функция ПолучитьСписокИсключений_Справочники_Списки() Экспорт
Результат = ПолучитьИсключения(ВидыМетаданных.Справочники, ВидыПроверок.Списки);
Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда
Возврат Результат;
КонецЕсли;
Результат = Новый СписокЗначений;
// Пример Результат.Добавить("ирАлгоритмы");
Возврат Результат;
КонецФункции
// Возвращаемое значение:
// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки
//
Функция ПолучитьСписокИсключений_Справочники_Существующие() Экспорт
Результат = ПолучитьИсключения(ВидыМетаданных.Справочники, ВидыПроверок.Существующие);
Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда
Возврат Результат;
КонецЕсли;
Результат = Новый СписокЗначений;
// Пример Результат.Добавить("ирАлгоритмы");
Возврат Результат;
КонецФункции
// Возвращаемое значение:
// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки
//
Функция ПолучитьСписокИсключений_Справочники_Новые() Экспорт
Результат = ПолучитьИсключения(ВидыМетаданных.Справочники, ВидыПроверок.Новые);
Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда
Возврат Результат;
КонецЕсли;
Результат = Новый СписокЗначений;
// Пример Результат.Добавить("ирАлгоритмы");
Возврат Результат;
КонецФункции
// Возвращаемое значение:
// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки
//
Функция ПолучитьСписокИсключений_Документы_Списки() Экспорт
Результат = ПолучитьИсключения(ВидыМетаданных.Документы, ВидыПроверок.Списки);
Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда
Возврат Результат;
КонецЕсли;
Результат = Новый СписокЗначений;
// Пример Результат.Добавить("Штрафы");
Возврат Результат;
КонецФункции
// Возвращаемое значение:
// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки
//
Функция ПолучитьСписокИсключений_Документы_Существующие() Экспорт
Результат = ПолучитьИсключения(ВидыМетаданных.Документы, ВидыПроверок.Существующие);
Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда
Возврат Результат;
КонецЕсли;
Результат = Новый СписокЗначений;
// Пример Результат.Добавить("Штрафы");
Возврат Результат;
КонецФункции
// Возвращаемое значение:
// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки
//
Функция ПолучитьСписокИсключений_Документы_ПеренестиДату() Экспорт
Результат = ПолучитьИсключения(ВидыМетаданных.Документы, ВидыПроверок.ПеренестиДату);
Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда
Возврат Результат;
КонецЕсли;
Результат = Новый СписокЗначений;
// Пример Результат.Добавить("Штрафы");
Возврат Результат;
КонецФункции
// Возвращаемое значение:
// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки
//
Функция ПолучитьСписокИсключений_Документы_Новые() Экспорт
Результат = ПолучитьИсключения(ВидыМетаданных.Документы, ВидыПроверок.Новые);
Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда
Возврат Результат;
КонецЕсли;
Результат = Новый СписокЗначений;
// Пример Результат.Добавить("Штрафы");
Возврат Результат;
КонецФункции
// Возвращаемое значение:
// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки
//
Функция ПолучитьСписокИсключений_Отчеты() Экспорт
Результат = ПолучитьИсключения(ВидыМетаданных.Отчеты, "");
Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда
Возврат Результат;
КонецЕсли;
Результат = Новый СписокЗначений;
// Пример Результат.Добавить("Цены");
Возврат Результат;
КонецФункции
// Возвращаемое значение:
// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки
//
Функция ПолучитьСписокИсключений_Обработки() Экспорт
Результат = ПолучитьИсключения(ВидыМетаданных.Обработки, "");
Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда
Возврат Результат;
КонецЕсли;
Результат = Новый СписокЗначений;
Результат.Добавить("ТестОбработка_Форма_ИсключениеПриОткрытии");
Возврат Результат;
КонецФункции
// Получить список значений для исключения форм списков бизнес-процессов
//
// Возвращаемое значение:
// СписокЗначений, Ложь - ключ - это имя метаданного, Ложь возвращается, если полностью исключается вид проверки
//
Функция ПолучитьСписокИсключений_БизнесПроцессы_Списки() Экспорт
Возврат ПолучитьИсключения(ВидыМетаданных.БизнесПроцессы, ВидыПроверок.Списки);
КонецФункции
// Получить список значений для исключения существующих бизнес-процессов
//
// Возвращаемое значение:
// СписокЗначений, Ложь - ключ - это имя метаданного, Ложь возвращается, если полностью исключается вид проверки
//
Функция ПолучитьСписокИсключений_БизнесПроцессы_Существующие() Экспорт
Возврат ПолучитьИсключения(ВидыМетаданных.БизнесПроцессы, ВидыПроверок.Существующие);
КонецФункции
// Получить список значений для исключения новых бизнес-процессов
//
// Возвращаемое значение:
// СписокЗначений, Ложь - ключ - это имя метаданного, Ложь возвращается, если полностью исключается вид проверки
//
Функция ПолучитьСписокИсключений_БизнесПроцессы_Новые() Экспорт
Возврат ПолучитьИсключения(ВидыМетаданных.БизнесПроцессы, ВидыПроверок.Новые);
КонецФункции
#КонецОбласти
#Область ФормированиеСпискаТестовыхСлучаев
Процедура ДобавитьТестыФормСправочников(НаборТестов, НастройкаГруппировки)
СтрогийПорядокВыполнения = ВключенСтрогийПорядокВыполнения();
Если НастройкаГруппировки.ГруппироватьПоВидуМетаданных Тогда
НаборТестов.НачатьГруппу("Справочники", СтрогийПорядокВыполнения);
КонецЕсли;
СписокИсключений_Существующие = ПолучитьСписокИсключений_Справочники_Существующие();
СписокИсключений_Новые = ПолучитьСписокИсключений_Справочники_Новые();
СписокИсключений_Списки = ПолучитьСписокИсключений_Справочники_Списки();
Счетчик = 0;
Для Каждого МетаОбъект Из Метаданные.Справочники Цикл
Если НастройкаГруппировки.ГруппироватьПоКоличеству Тогда
Если Счетчик % НастройкаГруппировки.КоличествоВГруппе = 0 Тогда
ИмяГруппы = "Справочники (" + Строка(Счетчик + 1) + "..." + Строка(Счетчик + НастройкаГруппировки.КоличествоВГруппе) + ")";
НаборТестов.НачатьГруппу(ИмяГруппы, СтрогийПорядокВыполнения);
КонецЕсли;
КонецЕсли;
Если НастройкаГруппировки.ГруппироватьПоВидуОбъекта Тогда
НаборТестов.НачатьГруппу("Справочник." + МетаОбъект.Имя, СтрогийПорядокВыполнения);
КонецЕсли;
Счетчик = Счетчик + 1;
Если ПравоДоступа("Редактирование", МетаОбъект) Тогда
ДобавитьТестДляОдногоМетаданного_Объекты(
НаборТестов,
МетаОбъект,
"Тест_ОткрытьФормуСуществующегоЭлементаСправочника",
СписокИсключений_Существующие,
мИменаОсновныхФорм_Объекты, "Существующие элементы"
);
КонецЕсли;
Если ПравоДоступа("ИнтерактивноеДобавление", МетаОбъект) Тогда
ДобавитьТестДляОдногоМетаданного_Объекты(
НаборТестов,
МетаОбъект,
"Тест_ОткрытьФормуНовогоЭлементаСправочника",
СписокИсключений_Новые,
мИменаОсновныхФорм_Объекты,
"Новые элементы"
);
КонецЕсли;
Если ПравоДоступа("Добавление", МетаОбъект) Тогда
ДобавитьТестДляОдногоМетаданного_Объекты(
НаборТестов,
МетаОбъект,
"Тест_ОткрытьФормуНовогоЭлементаСправочникаСоздаваемогоКопированием",
СписокИсключений_Новые,
мИменаОсновныхФорм_Объекты,
"Новые через копирование элементы"
);
КонецЕсли;
ДобавитьТестДляМетаданного_ОдинОбъект(
НаборТестов,
МетаОбъект,
"ТестДолжен_ОткрытьФорму_ПоМетаФорме",
СписокИсключений_Списки,
мИменаОсновныхФорм_Списки
);
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьТестыФормДокументов(НаборТестов, НастройкаГруппировки)
СтрогийПорядокВыполнения = ВключенСтрогийПорядокВыполнения();
Если НастройкаГруппировки.ГруппироватьПоВидуМетаданных Тогда
НаборТестов.НачатьГруппу("Документы", СтрогийПорядокВыполнения);
КонецЕсли;
СписокИсключений_Существующие = ПолучитьСписокИсключений_Документы_Существующие();
СписокИсключений_Новые = ПолучитьСписокИсключений_Документы_Новые();
СписокИсключений_Списки = ПолучитьСписокИсключений_Документы_Списки();
СписокИсключений_ПеренестиДату = ПолучитьСписокИсключений_Документы_ПеренестиДату();
Счетчик = 0;
Для Каждого МетаОбъект Из Метаданные.Документы Цикл
Если НастройкаГруппировки.ГруппироватьПоКоличеству Тогда
Если Счетчик % НастройкаГруппировки.КоличествоВГруппе = 0 Тогда
ИмяГруппы = "Документы (" + Строка(Счетчик + 1) + "..." + Строка(Счетчик + НастройкаГруппировки.КоличествоВГруппе) + ")";
НаборТестов.НачатьГруппу(ИмяГруппы, СтрогийПорядокВыполнения);
КонецЕсли;
КонецЕсли;
Если НастройкаГруппировки.ГруппироватьПоВидуОбъекта Тогда
НаборТестов.НачатьГруппу("Документ." + МетаОбъект.Имя, СтрогийПорядокВыполнения);
КонецЕсли;
Счетчик = Счетчик + 1;
Если ПравоДоступа("Редактирование", МетаОбъект) Тогда
ДобавитьТестДляОдногоМетаданного_Объекты(
НаборТестов,
МетаОбъект,
"Тест_ОткрытьФормуСуществующегоДокумента",
СписокИсключений_Существующие,
мИменаОсновныхФорм_Объекты,
"Существующие документы"
);
ДобавитьТестДляОдногоМетаданного_Объекты(
НаборТестов,
МетаОбъект,
"Тест_ПеренестиДокументНаТекущийДень_и_ОткрытьЕгоФорму",
СписокИсключений_ПеренестиДату,
мИменаОсновныхФорм_Объекты,
"Перенос документа на текущий день"
);
КонецЕсли;
Если ПравоДоступа("ИнтерактивноеДобавление", МетаОбъект) Тогда
ДобавитьТестДляОдногоМетаданного_Объекты(
НаборТестов,
МетаОбъект,
"Тест_ОткрытьФормуНовогоДокумента",
СписокИсключений_Новые,
мИменаОсновныхФорм_Объекты,
"Новые документы"
);
КонецЕсли;
ДобавитьТестДляМетаданного_ОдинОбъект(
НаборТестов,
МетаОбъект,
"ТестДолжен_ОткрытьФорму_ПоМетаФорме",
СписокИсключений_Списки,
мИменаОсновныхФорм_Списки
);
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьТестыФормОбработок(НаборТестов, НастройкаГруппировки)
Если НастройкаГруппировки.ГруппироватьПоВидуМетаданных Тогда
НаборТестов.НачатьГруппу("Обработки", ВключенСтрогийПорядокВыполнения());
КонецЕсли;
ДобавитьТестПоМенеджеруМетаданных(
НаборТестов,
Метаданные.Обработки,
"ТестДолжен_ОткрытьФорму_ПоМетаФорме",
ПолучитьСписокИсключений_Обработки(),
мИменаОсновныхФорм
);
КонецПроцедуры
Процедура ДобавитьТестыФормОтчетов(НаборТестов, НастройкаГруппировки)
Если НастройкаГруппировки.ГруппироватьПоВидуМетаданных Тогда
НаборТестов.НачатьГруппу("Отчеты", ВключенСтрогийПорядокВыполнения());
КонецЕсли;
ДобавитьТестПоМенеджеруМетаданных(
НаборТестов,
Метаданные.Отчеты,
"ТестДолжен_ОткрытьФорму_ПоМетаФорме",
ПолучитьСписокИсключений_Отчеты(),
мИменаОсновныхФорм
);
КонецПроцедуры
Процедура ДобавитьТестПоМенеджеруМетаданных(НаборТестов, менеджерМетаданного, имяТеста, СписокИсключений, ИменаОсновныхФорм)
НастройкаГруппировки = ПолучитьНастройкуГруппировки(Настройки);
СтрогийПорядокВыполнения = ВключенСтрогийПорядокВыполнения();
ЭтоОтчеты = (менеджерМетаданного = Метаданные.Отчеты);
Счетчик = 0;
Для Каждого МетаОбъект Из менеджерМетаданного Цикл
Если НастройкаГруппировки.ГруппироватьПоКоличеству Тогда
Если Счетчик % НастройкаГруппировки.КоличествоВГруппе = 0 Тогда
ИмяГруппы = ?(ЭтоОтчеты, "Отчеты", "Обработки") + " (" + Строка(Счетчик + 1) + "..." +
Строка(Счетчик + НастройкаГруппировки.КоличествоВГруппе) + ")";
НаборТестов.НачатьГруппу(ИмяГруппы, СтрогийПорядокВыполнения);
КонецЕсли;
КонецЕсли;
Если НастройкаГруппировки.ГруппироватьПоВидуОбъекта Тогда
НаборТестов.НачатьГруппу(?(ЭтоОтчеты, "Отчет", "Обработка") + "." + МетаОбъект.Имя, СтрогийПорядокВыполнения);
КонецЕсли;
Счетчик = Счетчик + 1;
ДобавитьТестДляМетаданного_ОдинОбъект(НаборТестов, МетаОбъект, имяТеста, СписокИсключений, ИменаОсновныхФорм);
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьТестДляМетаданного_ОдинОбъект(НаборТестов, Знач МетаОбъект, Знач имяТеста,
Знач СписокИсключений, Знач ИменаОсновныхФорм)
ПрефиксПропускаемых = "";
ПропускатьТест = Ложь;
Если СписокИсключений = Ложь Или СписокИсключений.НайтиПоЗначению(МетаОбъект.Имя) <> Неопределено Тогда
ПропускатьТест = Истина;
ПрефиксПропускаемых = "объект находится в исключениях";
ИначеЕсли ЭтоУстаревшийМетаОбъектДляУдаления(МетаОбъект) Тогда
ПропускатьТест = Истина;
ПрефиксПропускаемых = "объект устарел";
ИначеЕсли Не ПравоДоступа("Просмотр", МетаОбъект) Тогда
ПропускатьТест = Истина;
ПрефиксПропускаемых = "нет прав интерактивного доступа у пользователя";
КонецЕсли;
Если ПропускатьТест Тогда
ПараметрыПропускаемогоТеста = НаборТестов.ПараметрыТеста(ПрефиксПропускаемых);
КонецЕсли;
МетаФормы = ПолучитьМетаФормыОбъектаДляПроверки(МетаОбъект, ИменаОсновныхФорм);
Для каждого МетаФорма Из МетаФормы Цикл
МетаФорма_ПолноеИмя = МетаФорма.ПолноеИмя();
Если Метаданные.ОсновнаяФормаОтчета = МетаФорма Тогда
МетаФорма_ПолноеИмя = МетаОбъект.ПолноеИмя() + ".Форма";
ИначеЕсли Метаданные.ОсновнаяФормаНастроекОтчета = МетаФорма Тогда
МетаФорма_ПолноеИмя = МетаОбъект.ПолноеИмя() + ".ФормаНастроек";
КонецЕсли;
//МетаОбъект.Имя <Отчет1>, МетаФорма_ПолноеИмя <Отчет.Отчет1.Форма.ФормаОтчета>
//МетаОбъект.Имя <Отчет2>, МетаФорма_ПолноеИмя <Отчет.Отчет2.Форма> // в УФ ОбщаяФорма.ФормаОтчета
ПредставлениеТеста = МетаФорма_ПолноеИмя;
ЕстьТранзакция = Истина;
ПропускатьТестФормы = Ложь;
Если Не ПропускатьТест Тогда
// Проверим, нет ли конкретно самой формы в исключениях.
ОтносительныйПутьФормы = МетаОбъект.Имя + ".Форма." + МетаФорма.Имя;
Если СписокИсключений.НайтиПоЗначению(ОтносительныйПутьФормы) <> Неопределено Тогда
ПропускатьТестФормы = Истина;
ПрефиксПропускаемых = "форма находится в исключениях";
ПараметрыПропускаемогоТеста = НаборТестов.ПараметрыТеста(ПрефиксПропускаемых);
КонецЕсли;
КонецЕсли;
Если ПропускатьТест Или ПропускатьТестФормы Тогда
ПредставлениеТеста = ПрефиксПропускаемых + " : " + ПредставлениеТеста;
ПараметрыТеста = ПараметрыПропускаемогоТеста;
ВремИмяТеста = ИмяМетодаПропускаТестов();
Иначе
ВремИмяТеста = имяТеста;
ПараметрыТеста = НаборТестов.ПараметрыТеста(МетаФорма_ПолноеИмя, ЕстьТранзакция, МетаОбъект);
КонецЕсли;
НаборТестов.Добавить(ВремИмяТеста, ПараметрыТеста, ПредставлениеТеста);
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьТестДляОдногоМетаданного_Объекты( НаборТестов, Знач МетаОбъект, Знач имяТеста,
Знач СписокИсключений, Знач ИменаОсновныхФорм,
Знач ПрефиксПредставленияТеста)
ПрефиксПропускаемых = "";
ПропускатьТест = Ложь;
Если СписокИсключений = Ложь Или СписокИсключений.НайтиПоЗначению(МетаОбъект.Имя) <> Неопределено Тогда
ПропускатьТест = Истина;
ПрефиксПропускаемых = "объект находится в исключениях";
ИначеЕсли ЭтоУстаревшийМетаОбъектДляУдаления(МетаОбъект) Тогда
ПропускатьТест = Истина;
ПрефиксПропускаемых = "объект устарел";
ИначеЕсли Не (ПравоДоступа("Просмотр", МетаОбъект) и ПравоДоступа("Добавление", МетаОбъект)) Тогда
ПропускатьТест = Истина;
ПрефиксПропускаемых = "нет прав интерактивного доступа у пользователя";
КонецЕсли;
Если ПропускатьТест Тогда
ПрефиксПредставленияТеста = ПрефиксПредставленияТеста + " : " + ПрефиксПропускаемых;
ПараметрыПропускаемогоТеста = НаборТестов.ПараметрыТеста(ПрефиксПропускаемых);
КонецЕсли;
МетаФормы = ПолучитьМетаФормыОбъектаДляПроверки(МетаОбъект, ИменаОсновныхФорм);
Для каждого МетаФорма Из МетаФормы Цикл
МетаФорма_ПолноеИмя = МетаФорма.ПолноеИмя();
ПредставлениеТеста = ПрефиксПредставленияТеста + " : " + МетаФорма_ПолноеИмя;
ЕстьТранзакция = Истина;
ПропускатьТестФормы = Ложь;
Если Не ПропускатьТест Тогда
// Проверим, нет ли конкретно самой формы в исключениях.
ОтносительныйПутьФормы = МетаОбъект.Имя + ".Форма." + МетаФорма.Имя;
Если СписокИсключений.НайтиПоЗначению(ОтносительныйПутьФормы) <> Неопределено Тогда
ПропускатьТестФормы = Истина;
ПараметрыПропускаемогоТеста = НаборТестов.ПараметрыТеста("форма находится в исключениях");
КонецЕсли;
КонецЕсли;
Если ПропускатьТест Или ПропускатьТестФормы Тогда
ПараметрыТеста = ПараметрыПропускаемогоТеста;
ВремИмяТеста = ИмяМетодаПропускаТестов();
Иначе
ПараметрыТеста = НаборТестов.ПараметрыТеста(МетаОбъект.Имя, МетаФорма_ПолноеИмя, МетаФорма, ЕстьТранзакция);
ВремИмяТеста = имяТеста;
КонецЕсли;
НаборТестов.Добавить(ВремИмяТеста, ПараметрыТеста, ПредставлениеТеста);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область РаботаСФормами
Процедура ЗакрытьФорму()
Если ТипЗнч(ТестируемаяФорма) <> Тип("Форма") и ТипЗнч(ТестируемаяФорма) <> Тип("УправляемаяФорма") Тогда
Возврат;
КонецЕсли;
ТестируемаяФорма.Модифицированность = Ложь;
Если ТестируемаяФорма.Открыта() Тогда
ТестируемаяФорма.Модифицированность = Ложь;
Попытка
ТестируемаяФорма.Закрыть();
Исключение
Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
НачатьТранзакцию();
ТестируемаяФорма.УстановитьДействие("ПередЗакрытием", Неопределено);
ТестируемаяФорма.УстановитьДействие("ПриЗакрытии", Неопределено);
ТестируемаяФорма.Закрыть();
ВызватьИсключение Ошибка;
КонецПопытки;
Иначе
Попытка
ТестируемаяФорма.Закрыть();
Исключение
КонецПопытки;
КонецЕсли;
ТестируемаяФорма = "";
КонецПроцедуры
Функция ЭтоОбычнаяФорма(Форма)
Возврат ТипЗнч(Форма) = Тип("Форма");
КонецФункции
// Портировано из подсистемы "Инструменты разработчика"
Процедура ТестДолжен_ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, ЕстьТранзакция=Ложь, МетаданныеВладельцаФормы=Неопределено) Экспорт
ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, "", Неопределено, Ложь, МетаданныеВладельцаФормы);
КонецПроцедуры
Процедура ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, МетаФорма_Имя = "", СсылкаОбъектаИлиСамОбъект = Неопределено, СоздаватьОбъект = Ложь, МетаданныеВладельцаФормы=Неопределено) Экспорт
ВыводитьСообщения = Ложь;
ВнешнийОбъект = Неопределено;
КлючВременнойФормы = "908насмь9ыв";
ИмяОперации = МетаФорма_ПолноеИмя;
ВывестиСообщение("Операция: " + ИмяОперации, УровеньЖурналаРегистрации.Информация, ВыводитьСообщения);
Форма = ПолучитьНовуюФорму(МетаФорма_ПолноеИмя, ВнешнийОбъект, КлючВременнойФормы);
Если Форма = Неопределено Тогда
Возврат;
КонецЕсли;
ЭтоФормаСсылочногоОбъекта = Ложь;
Если СсылкаОбъектаИлиСамОбъект <> Неопределено Тогда
ЭтоФормаСсылочногоОбъекта = Истина;
Иначе
Если ЭтоОбычнаяФорма(Форма) Тогда
Попытка
Пустышка = Форма.ЭтотОбъект.ЭтоНовый();
ЭтоФормаСсылочногоОбъекта = Истина;
Исключение
КонецПопытки;
Иначе
Если Форма.Параметры.Свойство("Ключ") Тогда
Попытка
Пустышка = Форма.Параметры.Ключ.Ссылка;
ЭтоФормаСсылочногоОбъекта = Истина;
Исключение
КонецПопытки;
КонецЕсли;
КонецЕсли;
Если ЭтоФормаСсылочногоОбъекта Тогда
Если ЭтоОбычнаяФорма(Форма) Тогда
СсылкаОбъектаИлиСамОбъект = Форма.Ссылка;
Иначе
СсылкаОбъектаИлиСамОбъект = Форма.Параметры.Ключ;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ЭтоФормаСсылочногоОбъекта Тогда
Если ЭтоОбычнаяФорма(Форма) Тогда
Если СоздаватьОбъект Тогда
Если СсылкаОбъектаИлиСамОбъект <> Неопределено Тогда
СсылочныйОбъект = СсылкаОбъектаИлиСамОбъект.Скопировать();
//Иначе
// СсылочныйОбъект = СсылкаОбъектаИлиСамОбъект.Метаданные;
КонецЕсли;
Иначе
СсылочныйОбъект = СсылкаОбъектаИлиСамОбъект;
КонецЕсли;
Форма = СсылочныйОбъект.ПолучитьФорму(МетаФорма_Имя, , КлючВременнойФормы);
Иначе
ПараметрыФормы = Новый Структура;
ЭтоОбъект = Ложь;
Попытка
Пустышка = СсылкаОбъектаИлиСамОбъект.ЭтотОбъект;
ЭтоОбъект = Истина;
Исключение
КонецПопытки;
Если СоздаватьОбъект Тогда
Если Не ЭтоОбъект Тогда
ПараметрыФормы.Вставить("ЗначениеКопирования", СсылкаОбъектаИлиСамОбъект);
КонецЕсли;
ИначеЕсли Не ЭтоОбъект Тогда
ПараметрыФормы.Вставить("Ключ", СсылкаОбъектаИлиСамОбъект);
КонецЕсли;
Форма = ПолучитьФормуЛкс(МетаФорма_ПолноеИмя, ПараметрыФормы, , КлючВременнойФормы);
КонецЕсли;
КонецЕсли;
Если МетаданныеВладельцаФормы <> Неопределено И Метаданные.Справочники.Содержит(МетаданныеВладельцаФормы) Тогда
Если МетаданныеВладельцаФормы.Владельцы.Количество() Тогда
ВладелецСсылка = ПолучитьСсылкуНаВладельца(МетаданныеВладельцаФормы);
Попытка
Форма.ПараметрОтборПоВладельцу = ВладелецСсылка;
Исключение
КонецПопытки;
Попытка
Форма.ПараметрВыборПоВладельцу = ВладелецСсылка;
Исключение
КонецПопытки;
КонецЕсли;
КонецЕсли;
ТестироватьФорму(Форма, ИмяОперации);
КонецПроцедуры
Процедура СоздатьИменаОсновныхФорм() Экспорт
Если Не ЗначениеЗаполнено(мИменаОсновныхФорм) Тогда
мИменаОсновныхФорм = Новый Массив();
КонецЕсли;
СоздатьИменаОсновныхФорм_Объекты();
СоздатьИменаОсновныхФормСписка();
Если мИменаОсновныхФорм.Количество() = 0 Тогда
Для каждого эл Из мИменаОсновныхФорм_Объекты Цикл
мИменаОсновныхФорм.Добавить(эл);
КонецЦикла;
Для каждого эл Из мИменаОсновныхФорм_Списки Цикл
мИменаОсновныхФорм.Добавить(эл);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура СоздатьИменаОсновныхФорм_Объекты()
Если Не ЗначениеЗаполнено(мИменаОсновныхФорм_Объекты) Тогда
мИменаОсновныхФорм_Объекты = Новый Массив();
КонецЕсли;
Если мИменаОсновныхФорм_Объекты.Количество() = 0 Тогда
мИменаОсновныхФорм_Объекты.Добавить("ОсновнаяФорма");
мИменаОсновныхФорм_Объекты.Добавить("ОсновнаяФормаОбъекта");
мИменаОсновныхФорм_Объекты.Добавить("ОсновнаяФормаГруппы");
мИменаОсновныхФорм_Объекты.Добавить("ОсновнаяФормаЗаписи");
мИменаОсновныхФорм_Объекты.Добавить("ОсновнаяФормаНастроек");
мИменаОсновныхФорм_Объекты.Добавить("ОсновнаяФормаСохранения");
мИменаОсновныхФорм_Объекты.Добавить("ОсновнаяФормаЗагрузки");
мИменаОсновныхФорм_Объекты.Добавить("ДополнительнаяФорма");
мИменаОсновныхФорм_Объекты.Добавить("ДополнительнаяФормаОбъекта");
мИменаОсновныхФорм_Объекты.Добавить("ДополнительнаяФормаГруппы");
мИменаОсновныхФорм_Объекты.Добавить("ДополнительнаяФормаЗаписи");
мИменаОсновныхФорм_Объекты.Добавить("ДополнительнаяФормаНастроек");
мИменаОсновныхФорм_Объекты.Добавить("ДополнительнаяФормаСохранения");
мИменаОсновныхФорм_Объекты.Добавить("ДополнительнаяФормаЗагрузки");
КонецЕсли;
КонецПроцедуры
Процедура СоздатьИменаОсновныхФормСписка()
Если Не ЗначениеЗаполнено(мИменаОсновныхФорм_Списки) Тогда
мИменаОсновныхФорм_Списки = Новый Массив();
КонецЕсли;
Если мИменаОсновныхФорм_Списки.Количество() = 0 Тогда
мИменаОсновныхФорм_Списки.Добавить("ОсновнаяФормаСписка");
мИменаОсновныхФорм_Списки.Добавить("ОсновнаяФормаДляВыбора");
мИменаОсновныхФорм_Списки.Добавить("ОсновнаяФормаДляВыбораГруппы");
мИменаОсновныхФорм_Списки.Добавить("ОсновнаяФормаКонстант");
мИменаОсновныхФорм_Списки.Добавить("ДополнительнаяФормаСписка");
мИменаОсновныхФорм_Списки.Добавить("ДополнительнаяФормаДляВыбора");
мИменаОсновныхФорм_Списки.Добавить("ДополнительнаяФормаДляВыбораГруппы");
мИменаОсновныхФорм_Списки.Добавить("ДополнительнаяФормаКонстант");
КонецЕсли;
КонецПроцедуры
Функция СоздатьФорму_ПолучениеФорм()
Попытка
мПолучениеФорм = ПолучитьФорму("ПолучениеФорм"); // в управляемом режиме здесь будет ошибка выполнения
Возврат Истина;
Исключение
КонецПопытки;
Возврат Ложь;
КонецФункции
// Функция - Получить мета формы объекта для проверки
//
// Параметры:
// МетаОбъект - -
// ИменаОсновныхФорм - -
//
// Возвращаемое значение:
// Массив структур - с полями "Имя,МетаФорма", где "Имя" - это ИмяОсновнойФормы, "МетаФорма" - сама мета-форма
//
Функция ПолучитьМетаФормыОбъектаДляПроверки(МетаОбъект, ИменаОсновныхФорм) Экспорт
ИспользоватьУФ = Метаданные.ИспользоватьУправляемыеФормыВОбычномПриложении ИЛИ (ТекущийРежимЗапуска() <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение);
МетаФормы = Новый Массив();
Для Каждого ИмяОсновнойФормы Из ИменаОсновныхФорм Цикл
Попытка
МетаФорма = МетаОбъект[ИмяОсновнойФормы];
Исключение
Продолжить;
КонецПопытки;
Если МетаФорма = Неопределено Тогда
Продолжить;
КонецЕсли;
Если МетаФормы.Найти(МетаФорма) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Если НЕ ИспользоватьУФ И МетаФорма.ТипФормы = Метаданные.СвойстваОбъектов.ТипФормы.Управляемая Тогда
Продолжить;
КонецЕсли;
МетаФормы.Добавить(МетаФорма);
КонецЦикла;
Возврат МетаФормы;
КонецФункции
Функция ПолучитьФормуЛкс(ИмяФормы, Параметры = Неопределено, Владелец = Неопределено, Уникальность = Неопределено, Окно = Неопределено) Экспорт
Возврат мПолучениеФорм.ПолучитьФормуЛкс(ИмяФормы, Параметры, Владелец, Уникальность, Окно);
КонецФункции
Функция ПолучитьНовуюФорму(МетаФорма, ВнешнийОбъект = Неопределено, КлючВременнойФормы = Неопределено)
Форма = ПолучитьФормуЛкс(МетаФорма, , , КлючВременнойФормы); //ирНеглобальный.
Возврат Форма;
КонецФункции
Процедура ТестироватьФорму(Форма, ИмяОперации = "") Экспорт
ТестируемаяФорма = Форма;
Форма.Открыть(); // К сожалению здесь исключения не ловятся http://partners.v8.1c.ru/forum/thread.jsp?id=1080350#1080350
Утверждения.Проверить(ТестируемаяФорма.Открыта(), "ТестируемаяФорма """+ИмяОперации+""" не открылась, а должна была открыться");
// Артур - мой код для доп.проверки формы
Если ЭтоОбычнаяФорма(ТестируемаяФорма) Тогда
ТестируемаяФорма.Обновить();
Иначе
ТестируемаяФорма.ОбновитьОтображениеДанных();
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область РаботаСНастройками
Процедура ЗагрузитьНастройки()
ПутьНастройки = "smoke";
ПлагинНастроек = КонтекстЯдра.Плагин("Настройки");
Настройки = ПлагинНастроек.ПолучитьНастройку(ПутьНастройки);
Если Не ЗначениеЗаполнено(Настройки) Тогда
Настройки = Новый Структура;
КонецЕсли;
Если ЕстьНастройка("ВыводитьСообщенияВЖурналРегистрации") Тогда
ВыводитьСообщенияВЖурналРегистрации = Настройки.ВыводитьСообщенияВЖурналРегистрации;
Иначе
ВыводитьСообщенияВЖурналРегистрации = Истина;
КонецЕсли;
НаборНастроекПоУмолчанию = СоздатьНаборНастроекПоУмолчанию();
ЗаменитьНесуществующиеНастройкиЗначениямиПоУмолчанию(Настройки, НаборНастроекПоУмолчанию);
КонецПроцедуры
Функция СоздатьНаборНастроекПоУмолчанию() Экспорт
Рез = Новый Структура;
//Рез.Вставить("ДобавлятьИмяПользователяВПредставлениеТеста", Ложь);
Возврат Новый ФиксированнаяСтруктура(Рез);
КонецФункции // ()
Процедура ЗаменитьНесуществующиеНастройкиЗначениямиПоУмолчанию(Знач Настройки, Знач НаборНастроекПоУмолчанию)
Для каждого КлючЗначение Из НаборНастроекПоУмолчанию Цикл
Если Не ЕстьНастройка(КлючЗначение.Ключ) Тогда
Настройки.Вставить(КлючЗначение.Ключ, КлючЗначение.Значение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Функция - Получить исключения
//
// Параметры:
// ВидМетаданного - -
// ВидПроверки - -
//
// Возвращаемое значение:
// СписокЗначений, Ложь - ключ - это имя метаданного, Ложь возвращается, если полностью исключается вид проверки
//
Функция ПолучитьИсключения(Знач ВидМетаданного, Знач ВидПроверки)
Если Не ЗначениеЗаполнено(Настройки) Тогда
Возврат Новый СписокЗначений;
КонецЕсли;
Результат = Неопределено;
Настройка = Неопределено;
ЕстьНастройка = Настройки.Свойство(ВидМетаданного, Настройка);
Если ЕстьНастройка Тогда
Если ТипЗнч(Настройка) = Тип("Массив") ИЛИ ВидПроверки = "" Тогда
МассивИсключений = Настройка;
Иначе
МассивИсключений = Неопределено;
Настройка.Свойство(ВидПроверки, МассивИсключений);
КонецЕсли;
Если ТипЗнч(МассивИсключений) = Тип("Массив") И ЗначениеЗаполнено(МассивИсключений) Тогда
Результат = Новый СписокЗначений;
Результат.ЗагрузитьЗначения(МассивИсключений);
ИначеЕсли МассивИсключений = Ложь Тогда
Результат = Ложь;
КонецЕсли;
КонецЕсли;
ДобавитьИсключенияПоОтключеннымФункциональнымОпциям(ВидМетаданного, Результат);
Если Не ЗначениеЗаполнено(Результат) И Результат <> Ложь Тогда
Результат = Новый СписокЗначений;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура ДобавитьИсключенияПоОтключеннымФункциональнымОпциям(ВидМетаданного, СписокЗначений)
ИсключитьФормыЗависящиеОтОтключенныхФункциональныхОпций = Ложь;
ЕстьНастройка = Настройки.Свойство("ИсключитьФормыЗависящиеОтОтключенныхФункциональныхОпций", ИсключитьФормыЗависящиеОтОтключенныхФункциональныхОпций);
Если ЕстьНастройка И Не ИсключитьФормыЗависящиеОтОтключенныхФункциональныхОпций Тогда
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(СписокЗначений) Тогда
СписокЗначений = Новый СписокЗначений;
КонецЕсли;
Если ФормыОтключенныеЧерезФункциональныеОпции = Неопределено Тогда
ФормыОтключенныеЧерезФункциональныеОпции = Новый Структура;
КонецЕсли;
Если Не ФормыОтключенныеЧерезФункциональныеОпции.Свойство(ВидМетаданного) Тогда
СписокМетаданныхФО = Новый СписокЗначений;
ФормыОтключенныеЧерезФункциональныеОпции.Вставить(ВидМетаданного, СписокМетаданныхФО);
Для каждого ФО Из Метаданные.ФункциональныеОпции Цикл
Попытка
Значение = ПолучитьФункциональнуюОпцию(ФО.Имя);
Исключение
Продолжить;
КонецПопытки;
Если ТипЗнч(Значение) = Тип("Булево") И Не Значение Тогда
Для каждого СтрОбъект Из ФО.Состав Цикл
Если СтрОбъект.Объект = Неопределено Тогда
Продолжить;
КонецЕсли;
Если Метаданные[ВидМетаданного].Содержит(СтрОбъект.Объект) Тогда
СписокМетаданныхФО.Добавить(СтрОбъект.Объект.Имя);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
СписокМетаданного = Неопределено;
Если ФормыОтключенныеЧерезФункциональныеОпции.Свойство(ВидМетаданного, СписокМетаданного) Тогда
Для Каждого Элемент Из СписокМетаданного Цикл
МДИмяОбъекта = Элемент.Значение;
Если СписокЗначений.НайтиПоЗначению(МДИмяОбъекта) = Неопределено Тогда
СписокЗначений.Добавить(МДИмяОбъекта);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Функция ВидыМетаданных() Экспорт
Если ВидыМетаданных = Неопределено Тогда
ВидыМетаданных = Новый Структура;
ВидыМетаданных.Вставить("Справочники", "Справочники");
ВидыМетаданных.Вставить("Документы", "Документы");
ВидыМетаданных.Вставить("Обработки", "Обработки");
ВидыМетаданных.Вставить("Отчеты", "Отчеты");
ВидыМетаданных.Вставить("БизнесПроцессы", "БизнесПроцессы");
ВидыМетаданных = Новый ФиксированнаяСтруктура(ВидыМетаданных);
КонецЕсли;
Возврат ВидыМетаданных;
КонецФункции
Функция ВидыПроверок() Экспорт
Если ВидыПроверок = Неопределено Тогда
ВидыПроверок = Новый Структура;
ВидыПроверок.Вставить("Списки", "Списки");
ВидыПроверок.Вставить("Существующие", "Существующие");
ВидыПроверок.Вставить("Новые", "Новые");
ВидыПроверок.Вставить("ПеренестиДату", "ПеренестиДату");
ВидыПроверок = Новый ФиксированнаяСтруктура(ВидыПроверок);
КонецЕсли;
Возврат ВидыПроверок;
КонецФункции
Функция КлючДляПропускаПоТекстуИсключения()
Возврат "ПропускаемыеИсключения";
КонецФункции
Функция ПолучитьНастройкуГруппировки(СтруктураНастроек) Экспорт
Перем СпособГруппировки;
НастройкаГруппировки = Новый Структура;
НастройкаГруппировки.Вставить("КоличествоВГруппе", 20);
Если ЗначениеЗаполнено(СтруктураНастроек) Тогда
Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
СтруктураНастроек.Свойство("СпособГруппировки", СпособГруппировки);
СтруктураНастроек.Свойство("КоличествоВГруппе", НастройкаГруппировки.КоличествоВГруппе);
КонецЕсли;
Если ТипЗнч(СпособГруппировки) <> Тип("Массив") Тогда
МассивСпособов = Новый Массив;
МассивСпособов.Добавить(СпособГруппировки);
СпособГруппировки = МассивСпособов;
КонецЕсли;
НастройкаГруппировки.Вставить("ГруппироватьПоВидуМетаданных", СпособГруппировки.Найти(СпособыГруппировки.ПоВидуМетаданных) <> Неопределено);
НастройкаГруппировки.Вставить("ГруппироватьПоВидуОбъекта" , СпособГруппировки.Найти(СпособыГруппировки.ПоВидуОбъекта) <> Неопределено);
НастройкаГруппировки.Вставить("ГруппироватьПоКоличеству" , СпособГруппировки.Найти(СпособыГруппировки.ПоКоличеству) <> Неопределено);
Иначе
НастройкаГруппировки.Вставить("ГруппироватьПоВидуМетаданных", Истина);
НастройкаГруппировки.Вставить("ГруппироватьПоВидуОбъекта" , Ложь);
НастройкаГруппировки.Вставить("ГруппироватьПоКоличеству" , Ложь);
КонецЕсли;
Возврат НастройкаГруппировки;
КонецФункции
Функция СпособыГруппировки() Экспорт
Если СпособыГруппировки = Неопределено Тогда
СпособыГруппировки = Новый Структура;
СпособыГруппировки.Вставить("НеГруппировать", "НеГруппировать");
СпособыГруппировки.Вставить("ПоВидуМетаданных", "ПоВидуМетаданных");
СпособыГруппировки.Вставить("ПоВидуОбъекта", "ПоВидуОбъекта");
СпособыГруппировки.Вставить("ПоКоличеству", "ПоКоличеству");
СпособыГруппировки = Новый ФиксированнаяСтруктура(СпособыГруппировки);
КонецЕсли;
Возврат СпособыГруппировки;
КонецФункции
// Позволяет одним вызовом получить значение из вложенных друг в друга структур
// по строке ключей, объединенных точкой.
// Пример:
// Структура = Новый Структура("Ключ1", Новый Структура("Ключ2", Новый Структура("Ключ3", 42)));
// РезультатПроверки = ЕстьНастройка("Ключ1.Ключ2.Ключ3", ВремЗнач);
// В результате получим ВремЗнач == 42
//
Функция ЕстьНастройка(ПутьНастроек, СтруктураНастроек = Неопределено)
// TODO: Метод нужно перенести в плагин "Настройки".
Если СтруктураНастроек = Неопределено Тогда
СтруктураНастроек = Настройки;
КонецЕсли;
Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
ПозТочки = Найти(ПутьНастроек, ".");
Если ПозТочки = 0 Тогда
Возврат СтруктураНастроек.Свойство(ПутьНастроек);
Иначе
ИмяТекущегоСвойства = Лев(ПутьНастроек, ПозТочки - 1);
ОстатокПути = Сред(ПутьНастроек, ПозТочки + 1);
Если СтруктураНастроек.Свойство(ИмяТекущегоСвойства) Тогда
Возврат ЕстьНастройка(ОстатокПути, СтруктураНастроек[ИмяТекущегоСвойства]);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции
Функция ВключенСтрогийПорядокВыполнения()
Если ЕстьНастройка("СтрогийПорядокВыполнения", Настройки) И Настройки.СтрогийПорядокВыполнения = Ложь Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
// Функция - Пропускаем ошибку по тексту исключения
//
// Параметры:
// ТекстИсключения - -
//
// Возвращаемое значение:
// -
//
Функция ПропускаемОшибкуПоТекстуИсключения(Знач ТекстИсключения) Экспорт
МассивТекстовИсключенийПоУмолчанию = Новый Массив;
МассивТекстовИсключенийПоУмолчанию.Добавить("Обработка не предназначена для непосредственного использования");
Если Не ЗначениеЗаполнено(Настройки) Тогда
МассивТекстовИсключений = МассивТекстовИсключенийПоУмолчанию;
Иначе
Настройка = Неопределено;
ЕстьНастройка = Настройки.Свойство(КлючДляПропускаПоТекстуИсключения(), Настройка);
Если ЕстьНастройка Тогда
МассивТекстовИсключений = Неопределено;
Если ТипЗнч(Настройка) = Тип("Массив") Тогда
МассивТекстовИсключений = Настройка;
КонецЕсли;
Если Не ЗначениеЗаполнено(МассивТекстовИсключений) Тогда
МассивТекстовИсключений = МассивТекстовИсключенийПоУмолчанию;
Иначе
Для Каждого ОжидаемыйТекстИсключения Из МассивТекстовИсключенийПоУмолчанию Цикл
МассивТекстовИсключений.Добавить(ОжидаемыйТекстИсключения);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(МассивТекстовИсключений) Тогда
Для Каждого ОжидаемыйТекстИсключения Из МассивТекстовИсключений Цикл
Если Найти(ТекстИсключения, ОжидаемыйТекстИсключения) > 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Ложь;
КонецФункции
#КонецОбласти
#Область ПоискИСозданиеОбъектов
Функция ПолучитьСуществующийДокументОбъект(ИД, НужноИсключениеЕслиНеНайденоДокументов, ДопОписаниеДляИсключения)
выборка = Документы[ИД].Выбрать(,,, "Дата Убыв");
уcпешно = выборка.Следующий();
Если Не уcпешно Тогда
Если НужноИсключениеЕслиНеНайденоДокументов Тогда
ВызватьИсключение
СтрШаблон_("%1: выборка.Следующий() - не найдено существующих документов %2! ",
ДопОписаниеДляИсключения, Ид);
Иначе
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
Док = выборка.ПолучитьОбъект();
Возврат Док;
КонецФункции
Функция ПолучитьСуществующийДокументОбъектИВернутьСсылку(ИД, НужноИсключениеЕслиНеНайденоДокументов, ДопОписаниеДляИсключения) Экспорт
Док = ПолучитьСуществующийДокументОбъект(ИД, НужноИсключениеЕслиНеНайденоДокументов, ДопОписаниеДляИсключения);
Возврат ?(Док = Неопределено, Неопределено, Док.Ссылка);
КонецФункции
Функция ПолучитьОбъектСуществующегоЭлементаСправочника(ИД, НужноИсключениеЕслиНеНайденоСправочников,
ДопОписаниеДляИсключения, Знач Отбор = Неопределено)
Если Отбор = Неопределено Тогда
Отбор = Новый Структура;
КонецЕсли;
выборка = ПолучитьРезультатЗапросаСуществующийЭлементСправочника(ИД, Отбор);
уcпешно = выборка.Следующий();
Если Не уcпешно Тогда
Если НужноИсключениеЕслиНеНайденоСправочников Тогда
ВызватьИсключение
СтрШаблон_("%1: выборка.Следующий() - не найдено существующих элементов справочника %2! ",
ДопОписаниеДляИсключения, Ид);
Иначе
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
Элем = выборка.Ссылка.ПолучитьОбъект();
Возврат Элем;
КонецФункции
Функция ПолучитьРезультатЗапросаСуществующийЭлементСправочника(ИД, Отбор)
Запрос = Новый Запрос;
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| ОбъектЗапроса.Ссылка
|ИЗ
| Справочник.%1 КАК ОбъектЗапроса";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%1", ИД);
Если Отбор.Количество() <> 0 Тогда
ТекстЗапроса = ТекстЗапроса + Символы.ПС + " ГДЕ";
Для каждого ЭлементОтбора Из Отбор Цикл
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ОбъектЗапроса." + ЭлементОтбора.Ключ + " = " + ЭлементОтбора.Значение;
КонецЦикла;
КонецЕсли;
Запрос.Текст = ТекстЗапроса;
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Возврат РезультатЗапроса;
КонецФункции
Функция ПолучитьОбъектСуществующегоЭлементаСправочникаИВернутьСсылку(ИД, НужноИсключениеЕслиНеНайденоСправочников,
ДопОписаниеДляИсключения, Знач Отбор = Неопределено) Экспорт
Элем = ПолучитьОбъектСуществующегоЭлементаСправочника(ИД, НужноИсключениеЕслиНеНайденоСправочников,
ДопОписаниеДляИсключения, Отбор);
Возврат ?(Элем = Неопределено, Неопределено, Элем.Ссылка);
КонецФункции
Функция СоздатьЭлемент(ИД, Наименование, ПроверяемоеПравоДоступа = Неопределено)
Элем = Справочники[ИД].СоздатьЭлемент();
Мета = Элем.Метаданные();
Если ПроверяемоеПравоДоступа <> Неопределено И НЕ ПравоДоступа(ПроверяемоеПравоДоступа, Мета) Тогда
Возврат Неопределено;
КонецЕсли;
Если Мета.ДлинаНаименования <> 0 Тогда
Попытка
Элем.Наименование = Наименование;
Исключение
КонецПопытки;
КонецЕсли;
Если Мета.ДлинаКода <> 0 Тогда
Элем.УстановитьНовыйКод();
КонецЕсли;
Если Мета.Владельцы.Количество() Тогда
Элем.Владелец = ПолучитьСсылкуНаВладельца(Мета, "Владелец для: " + Наименование);
КонецЕсли;
Если ЕстьНастройка("Справочники.ЗначенияРеквизитовНовых." + Мета.Имя) Тогда
Для каждого Реквизит из Настройки.Справочники.ЗначенияРеквизитовНовых[Мета.Имя] Цикл
Попытка
Элем[Реквизит.Ключ] = ЗначениеРеквизита(Мета, Реквизит.Ключ, Реквизит.Значение);
Исключение
ВывестиСообщение(ОписаниеОшибки(), УровеньЖурналаРегистрации.Предупреждение);
КонецПопытки;
КонецЦикла;
КонецЕсли;
Элем.ОбменДанными.Загрузка = Истина;
Элем.Записать();
Возврат Элем;
КонецФункции
Функция СоздатьЭлементИВернутьСсылку(ИД, Наименование, ПроверяемоеПравоДоступа = Неопределено) Экспорт
Элем = СоздатьЭлемент(ИД, Наименование, ПроверяемоеПравоДоступа);
Возврат ?(Элем = Неопределено, Неопределено, Элем.Ссылка);
КонецФункции
Функция ПолучитьМетаданныеВладельца(КоллекцияМетаданныхВладельцев, Индекс=0)
Счетчик = 0;
Для каждого Элемент из КоллекцияМетаданныхВладельцев Цикл
Если Счетчик = Индекс Тогда
Возврат Элемент;
КонецЕсли;
Счетчик = Счетчик + 1;
КонецЦикла;
ВызватьИсключение "Индекс за границей диапазона";
КонецФункции
Функция ПолучитьСсылкуНаВладельца(МетаданныеПодчиненного, НаименованиеПодчиненного="Элемент-владелец")
МетаИмяВладельца = Неопределено;
Если ЕстьНастройка("Справочники.Подчиненные") Тогда
Настройки.Справочники.Подчиненные.Свойство(МетаданныеПодчиненного.Имя, МетаИмяВладельца);
КонецЕсли;
Если МетаИмяВладельца = Неопределено Тогда
МетаИмяВладельца = ПолучитьМетаданныеВладельца(МетаданныеПодчиненного.Владельцы).Имя;
КонецЕсли;
Возврат СоздатьЭлементИВернутьСсылку(МетаИмяВладельца, НаименованиеПодчиненного);
КонецФункции
// Получить объект существующего бизнес-процеса и вернуть ссылку на объект
//
// Параметры:
// ИД - Строка - Имя бизнес-процесса
// НужноИсключениеЕслиНеНайденоБизнесПроцессов - Булево - Флаг выброса исключений
// ДопОписаниеДляИсключения - Строка - доп.текст исключения
// Отбор - Структура - Структура, в которой ключ - это имя реквизита бП, а значение - это значение реквизита отбора
//
// Возвращаемое значение:
// БизнесПроцессы.Ссылка, Неопределено - Найденный БП или Неопределено
//
Функция ПолучитьОбъектСуществующегоБизнесПроцессаИВернутьСсылку(ИД, НужноИсключениеЕслиНеНайденоБизнесПроцессов,
ДопОписаниеДляИсключения, Знач Отбор = Неопределено) Экспорт
Элем = ПолучитьОбъектСуществующегоБизнесПроцесса(ИД, НужноИсключениеЕслиНеНайденоБизнесПроцессов,
ДопОписаниеДляИсключения, Отбор);
Возврат ?(Элем = Неопределено, Неопределено, Элем.Ссылка);
КонецФункции
Функция ПолучитьОбъектСуществующегоБизнесПроцесса(ИД, НужноИсключениеЕслиНеНайденоБизнесПроцессов,
ДопОписаниеДляИсключения, Знач Отбор = Неопределено)
Если Отбор = Неопределено Тогда
Отбор = Новый Структура;
КонецЕсли;
Выборка = БизнесПроцессы[ИД].Выбрать(,, Отбор);
Уcпешно = Выборка.Следующий();
Если Не Уcпешно Тогда
Если НужноИсключениеЕслиНеНайденоБизнесПроцессов Тогда
ВызватьИсключение
СтрШаблон_("%1: выборка.Следующий() - не найдено существующих бизнес процессов %2! ",
ДопОписаниеДляИсключения, Ид);
Иначе
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
Элем = Выборка.ПолучитьОбъект();
Возврат Элем;
КонецФункции
Функция СоздатьБизнесПроцесс(ИД, ПроверяемоеПравоДоступа = Неопределено)
Элем = БизнесПроцессы[ИД].СоздатьБизнесПроцесс();
Мета = Элем.Метаданные();
Если ПроверяемоеПравоДоступа <> Неопределено И НЕ ПравоДоступа(ПроверяемоеПравоДоступа, Мета) Тогда
Возврат Неопределено;
КонецЕсли;
Если Мета.ДлинаНомера <> 0 Тогда
Элем.УстановитьНовыйНомер();
КонецЕсли;
Элем.Дата = ТекущаяДата();
Если ЕстьНастройка("БизнесПроцессы.ЗначенияРеквизитовНовых." + Мета.Имя) Тогда
Для каждого Реквизит Из Настройки.БизнесПроцессы.ЗначенияРеквизитовНовых[Мета.Имя] Цикл
Попытка
Элем[Реквизит.Ключ] = ЗначениеРеквизита(Мета, Реквизит.Ключ, Реквизит.Значение);
Исключение
ВывестиСообщение(ОписаниеОшибки(), УровеньЖурналаРегистрации.Предупреждение);
КонецПопытки;
КонецЦикла;
КонецЕсли;
Элем.ОбменДанными.Загрузка = Истина;
Элем.Записать();
Возврат Элем;
КонецФункции
// Создать новый БП и вернуть ссылку на него
//
// Параметры:
// ИД - Строка - Вид БП
// ПроверяемоеПравоДоступа - Строка - имя права доступа
//
// Возвращаемое значение:
// БизнесПроцесс.Ссылка, Неопределено - полученная ссылка или Неопределено
//
Функция СоздатьБизнесПроцессИВернутьСсылку(ИД, ПроверяемоеПравоДоступа = Неопределено) Экспорт
Элем = СоздатьБизнесПроцесс(ИД, ПроверяемоеПравоДоступа);
Возврат ?(Элем = Неопределено, Неопределено, Элем.Ссылка);
КонецФункции
#КонецОбласти
#Область ВспомогательныеМетоды
Функция ИмяМетодаПропускаТестов()
Возврат "ТестДолжен_ПропуститьТестФормы";
КонецФункции
Функция ЭтоУстаревшийМетаОбъектДляУдаления(МетаОбъект) Экспорт
Возврат Найти(НРег(МетаОбъект.Имя), НРег("Удалить")) = 1;
КонецФункции
Функция ВидМетаданныхИсключенИзТестирования(ВидМетаданных)
Если ЕстьНастройка(ВидМетаданных) Тогда
Возврат (ТипЗнч(Настройки[ВидМетаданных]) = Тип("Булево") И НЕ Настройки[ВидМетаданных]);
КонецЕсли;
Возврат Ложь;
КонецФункции
Функция ЗначениеРеквизита(МетаданныеОбъекта, ИмяРеквизита, ЗначениеРеквизитаИзФайла)
ТипРеквизита = МетаданныеОбъекта.Реквизиты[ИмяРеквизита].Тип.Типы()[0];
Если ЭтоПримитивныйТипДанных(ТипРеквизита) Тогда
Возврат МетаданныеОбъекта.Реквизиты[ИмяРеквизита].Тип.ПривестиЗначение(ЗначениеРеквизитаИзФайла);
КонецЕсли;
// Значит, это ссылочный тип данных.
Попытка
МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипРеквизита);
Если Метаданные.Справочники.Содержит(МетаданныеЗначения) Тогда
Возврат СоздатьЭлементИВернутьСсылку(МетаданныеЗначения.Имя, ЗначениеРеквизитаИзФайла);
ИначеЕсли Метаданные.Перечисления.Содержит(МетаданныеЗначения) Тогда
Возврат Перечисления[МетаданныеЗначения.Имя][ЗначениеРеквизитаИзФайла];
КонецЕсли;
// TODO: поддержку документов и других ссылочных типов данных (добавим по необходимости)
Исключение
КонецПопытки;
Возврат Неопределено;
КонецФункции
Функция ЭтоПримитивныйТипДанных(Тип)
Возврат Тип = Тип("Строка") Или Тип = Тип("Число")
Или Тип = Тип("Дата") Или Тип = Тип("Булево");
КонецФункции
Процедура ВывестиСообщение(ТекстСообщения, Знач УровеньЖР=Неопределено, Сообщать=Ложь)
Если Сообщать Тогда
Сообщить(ТекстСообщения, ?(УровеньЖР = УровеньЖурналаРегистрации.Ошибка, СтатусСообщения.ОченьВажное, СтатусСообщения.Обычное));
КонецЕсли;
Если ВыводитьСообщенияВЖурналРегистрации Тогда
Если УровеньЖР = Неопределено Тогда
УровеньЖР = УровеньЖурналаРегистрации.Информация;
КонецЕсли;
ЗаписьЖурналаРегистрации(Метаданные().Синоним, УровеньЖР, , , ТекстСообщения);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
Функция СтрШаблон_(Знач СтрокаШаблон, Знач Парам1 = Неопределено, Знач Парам2 = Неопределено, Знач Парам3 = Неопределено, Знач Парам4 = Неопределено, Знач Парам5 = Неопределено) Экспорт
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(Парам1);
МассивПараметров.Добавить(Парам2);
МассивПараметров.Добавить(Парам3);
МассивПараметров.Добавить(Парам4);
МассивПараметров.Добавить(Парам5);
Для Сч = 1 По МассивПараметров.Количество() Цикл
ТекЗначение = МассивПараметров[Сч-1];
СтрокаШаблон = СтрЗаменить(СтрокаШаблон, "%"+Сч, Строка(ТекЗначение));
КонецЦикла;
Возврат СтрокаШаблон;
КонецФункции
СписокПропускаемыхФорм = Новый СписокЗначений;
You can’t perform that action at this time.