1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2024-11-27 08:31:11 +02:00

Merge pull request #408 from bia-technologies/feature/local-testing

Скрипты локального запуска тестов и правки выявленных ошибок.
This commit is contained in:
Koryakin Aleksey 2024-09-08 20:40:07 +03:00 committed by GitHub
commit a7cf3b908a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
53 changed files with 1965 additions and 776 deletions

2
.gitignore vendored
View File

@ -37,3 +37,5 @@ tests/.settings/*
documentation/api/
*.jar
/tools/**/distr/
workpath/
.env

View File

@ -273,7 +273,7 @@
КонецФункции
Функция ШаблонУсловия(ВыражениеПредиката, ВыраженияПредикатов, ТипРеквизита)
Функция ШаблонУсловия(ВыражениеПредиката, ВыраженияПредикатов, ТипРеквизита) // BSLLS:CognitiveComplexity-off
Выражение = ВыражениеПредиката.ВидСравнения;
Отрицание = ЮТПредикатыСлужебныйКлиентСервер.ЭтоВыраженияОтрицания(Выражение);

View File

@ -35,12 +35,14 @@
Хранилище = Новый Соответствие();
Для Каждого Модуль Из ТестовыеМодули Цикл
Для Каждого ОсновнойМодуль Из ТестовыеМодули Цикл
Модуль = ЮТКоллекции.СкопироватьСтруктуру(ОсновнойМодуль, Ложь);
Идентификатор = ЮТИсполнительСлужебныйКлиентСервер.ИдентификаторТестовогоМодуля(Модуль);
Хранилище.Вставить(Идентификатор, Модуль);
Для Каждого Набор Из Модуль.НаборыТестов Цикл
Для Каждого Набор Из ОсновнойМодуль.НаборыТестов Цикл
Идентификатор = ЮТИсполнительСлужебныйКлиентСервер.ИдентификаторТестовогоНабора(Модуль, Набор);
Хранилище.Вставить(Идентификатор, Набор);
@ -54,9 +56,7 @@
КонецЦикла;
#Если НЕ ТолстыйКлиентОбычноеПриложение И НЕ ТолстыйКлиентУправляемоеПриложение Тогда // Исключение для толстого клиента в файловом варианте
Модуль.НаборыТестов = Новый Массив; // Уже не нужно, поэтому очистим
#КонецЕсли
КонецЦикла;

View File

@ -143,7 +143,7 @@
ПараметрыЗаписи.УникальныйИдентификаторСсылки = Контекст.УникальныйИдентификаторСсылки;
ПараметрыЗаписи.ОбменДаннымиЗагрузка = ОбменДаннымиЗагрузка;
Ссылка = ЮТТестовыеДанныеСлужебныйВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
Ссылка = ЮТТестовыеДанныеСлужебный.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
Возврат Ссылка;
@ -151,12 +151,10 @@
Функция НовыйОбъект(Контекст) Экспорт
Возврат ЮТТестовыеДанныеСлужебныйВызовСервера.НовыйОбъект(
Контекст.Менеджер,
Контекст.Данные,
Контекст.ДополнительныеСвойства,
Контекст.УникальныйИдентификаторСсылки
);
Возврат ЮТТестовыеДанныеСлужебный.НовыйОбъект(Контекст.Менеджер,
Контекст.Данные,
Контекст.ДополнительныеСвойства,
Контекст.УникальныйИдентификаторСсылки);
КонецФункции
@ -167,7 +165,7 @@
ПараметрыЗаписи.УникальныйИдентификаторСсылки = Контекст.УникальныйИдентификаторСсылки;
ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение;
Ссылка = ЮТТестовыеДанныеСлужебныйВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
Ссылка = ЮТТестовыеДанныеСлужебный.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
Возврат Ссылка;

View File

@ -56,18 +56,6 @@
КонецФункции
Функция ВыборкаИзТабличногоДокумента(ТабличныйДокумент) Экспорт
Возврат ЗапросКТабличномуДокументу(ТабличныйДокумент).Выбрать();
КонецФункции
Функция ТаблицаИзТабличногоДокумента(ТабличныйДокумент) Экспорт
Возврат ЗапросКТабличномуДокументу(ТабличныйДокумент).Выгрузить();
КонецФункции
Функция ИзХранилищаЗначений(Знач ХранилищеЗначений) Экспорт
Возврат ХранилищеЗначений.Получить();
@ -86,20 +74,4 @@
#Область СлужебныеПроцедурыИФункции
Функция ЗапросКТабличномуДокументу(ТабличныйДокумент)
ВсегоСтрок = ТабличныйДокумент.ВысотаТаблицы;
ВсегоКолонок = ТабличныйДокумент.ШиринаТаблицы;
Область = ТабличныйДокумент.Область(1, 1, ВсегоСтрок, ВсегоКолонок);
ИсточникДанных = Новый ОписаниеИсточникаДанных(Область);
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();
Возврат ПостроительОтчета.Результат;
КонецФункции
#КонецОбласти

View File

@ -132,7 +132,7 @@
КонецФункции
Функция ШаблонВыражения(Знач Выражение) Экспорт
Функция ШаблонВыражения(Знач Выражение) Экспорт // BSLLS:CognitiveComplexity-off
Отрицание = СтрНачинаетсяС(Выражение, "Не");
Если Отрицание Тогда

View File

@ -1,6 +1,6 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
// Copyright 2021-2024 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@ -18,6 +18,15 @@
#Область СлужебныйПрограммныйИнтерфейс
// Проверить тип параметра.
//
// Параметры:
// Значение - Произвольный
// ОжидаемыйТип - Тип, ОписаниеТипов - Ожидаемый тип или описание типа
// - Строка - Имена типов разделенные запятой
// ИмяМетода - Строка
// ИмяПараметра - Строка
// ЕслиУстановлен - Булево - Выполнять проверку только если значение не неопределено
Процедура ПроверитьТипПараметра(Значение, ОжидаемыйТип, ИмяМетода, ИмяПараметра, ЕслиУстановлен = Ложь) Экспорт
Если ЕслиУстановлен И Значение = Неопределено Тогда

View File

@ -63,57 +63,64 @@
// https://github.com/vanessa-opensource/add
// перенесен из Functest
ТипТабличногоДокумента = ТипЗнч(ТабличныйДокумент);
Если ТипТабличногоДокумента <> Тип("ТабличныйДокумент") И ТипТабличногоДокумента <> Тип("ПолеТабличногоДокумента") Тогда
ВызватьИсключение "ПолучитьТаблицуЗначенийИзТабличногоДокумента: Требуется тип ТабличныйДокумент или ПолеТабличногоДокумента";
КонецЕсли;
ЮТПроверкиСлужебный.ПроверитьТипПараметра(ТабличныйДокумент,
Тип("ТабличныйДокумент"),
"ЮТСравнениеСлужебныйСервер.ПолучитьТаблицуЗначенийИзТабличногоДокумента",
"ТабличныйДокумент");
Если УчитыватьТолькоВидимыеКолонки И УчитыватьТолькоВидимыеСтроки Тогда
ЮТОбщийСлужебныйВызовСервера.ТаблицаИзТабличногоДокумента(ТипТабличногоДокумента);
ЮТТестовыеДанныеСлужебныйСервер.ТаблицаИзТабличногоДокумента(ТабличныйДокумент);
КонецЕсли;
НомерПоследнейКолонки = ТабличныйДокумент.ШиринаТаблицы;
НомерПоследнейСтроки = ТабличныйДокумент.ВысотаТаблицы;
НоваяТаблицаЗначений = Новый ТаблицаЗначений;
Колонки = НоваяТаблицаЗначений.Колонки;
ТипСтрока = Новый ОписаниеТипов("Строка");
// TODO При определении видимости не учитывается наличие нескольких форматов строк, сейчас видимость колонки определяется по формату первой строки
УчитываемыеКолонки = Новый Массив;
Для НомерКолонки = 1 По НомерПоследнейКолонки Цикл
ОбластьКолонки = ТабличныйДокумент.Область(0, НомерКолонки, 1, НомерКолонки);
УчитыватьКолонку = Не УчитыватьТолькоВидимыеКолонки Или ОбластьКолонки.Видимость;
Если УчитыватьКолонку Тогда
УчитываемыеКолонки.Добавить(НомерКолонки);
ШиринаКолонки = ОбластьКолонки.ШиринаКолонки;
Если ШиринаКолонки <= 1 Тогда
ШиринаКолонки = 1;
КонецЕсли;
ИмяКолонки = "К" + Формат(Колонки.Количество() + 1, "ЧН=; ЧГ=0");
Колонки.Добавить(ИмяКолонки, ТипСтрока, ИмяКолонки, ШиринаКолонки);
КонецЕсли;
КонецЦикла;
УчитываемыеКолонки = УчитываемыеКолонки(ТабличныйДокумент, НоваяТаблицаЗначений, УчитыватьТолькоВидимыеКолонки);
ГраницаКолонок = УчитываемыеКолонки.ВГраница();
НомерПоследнейСтроки = ТабличныйДокумент.ВысотаТаблицы;
Для НомерСтроки = 1 По НомерПоследнейСтроки Цикл
Если УчитыватьТолькоВидимыеСтроки И Не ТабличныйДокумент.Область(НомерСтроки, , НомерСтроки).Видимость Тогда
УчитыватьСтроку = УчитыватьТолькоВидимыеСтроки И Не ТабличныйДокумент.Область(НомерСтроки, , НомерСтроки).Видимость;
Если УчитыватьСтроку Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = НоваяТаблицаЗначений.Добавить();
Для Индекс = 0 По ГраницаКолонок Цикл
НомерКолонки = УчитываемыеКолонки[Индекс];
Область = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
Область = ТабличныйДокумент.Область(НомерСтроки, УчитываемыеКолонки[Индекс]);
НоваяСтрока[Индекс] = Область.Текст;
КонецЦикла;
КонецЦикла;
Возврат НоваяТаблицаЗначений;
КонецФункции
Функция УчитываемыеКолонки(ТабличныйДокумент, ТаблицаЗначений, УчитыватьТолькоВидимыеКолонки)
ТипСтрока = Новый ОписаниеТипов("Строка");
НомерПоследнейКолонки = ТабличныйДокумент.ШиринаТаблицы;
Колонки = ТаблицаЗначений.Колонки;
// При определении видимости не учитывается наличие нескольких форматов строк, сейчас видимость колонки определяется по формату первой строки
УчитываемыеКолонки = Новый Массив;
Для НомерКолонки = 1 По НомерПоследнейКолонки Цикл
ОбластьКолонки = ТабличныйДокумент.Область(1, НомерКолонки);
УчитыватьКолонку = Не УчитыватьТолькоВидимыеКолонки Или ОбластьКолонки.Видимость;
Если УчитыватьКолонку Тогда
УчитываемыеКолонки.Добавить(НомерКолонки);
ИмяКолонки = "К" + Формат(Колонки.Количество() + 1, "ЧН=; ЧГ=0");
Колонки.Добавить(ИмяКолонки, ТипСтрока);
КонецЕсли;
КонецЦикла;
Возврат УчитываемыеКолонки;
КонецФункции
#КонецОбласти

View File

@ -44,7 +44,7 @@
КонецЕсли;
КонецЕсли;
Ссылка = ЮТТестовыеДанныеСлужебныйВызовСервера.СоздатьЗапись(Менеджер, Данные, ПараметрыЗаписи, Ложь);
Ссылка = ЮТТестовыеДанныеСлужебный.СоздатьЗапись(Менеджер, Данные, ПараметрыЗаписи, Ложь);
Возврат Ссылка;
@ -73,7 +73,7 @@
Данные.Удалить("РежимЗаписи");
КонецЕсли;
Ссылка = ЮТТестовыеДанныеСлужебныйВызовСервера.СоздатьЗапись(Менеджер, Данные, ПараметрыЗаписи, Ложь);
Ссылка = ЮТТестовыеДанныеСлужебный.СоздатьЗапись(Менеджер, Данные, ПараметрыЗаписи, Ложь);
Возврат Ссылка;
@ -524,7 +524,11 @@
// Результат = СлучайноеЗначениеПеречисления(Перечисление); // Результат будет содержать одно из значений перечисления "Пол" (Мужской, Женский).
Функция СлучайноеЗначениеПеречисления(Перечисление) Экспорт
#Если Сервер Тогда
Возврат ЮТТестовыеДанныеСлужебныйСервер.СлучайноеЗначениеПеречисления(Перечисление);
#Иначе
Возврат ЮТТестовыеДанныеСлужебныйВызовСервера.СлучайноеЗначениеПеречисления(Перечисление);
#КонецЕсли
КонецФункции
@ -546,7 +550,11 @@
// // объекта конфигурации "ВидыЦен" непомеченное на удаление".
Функция СлучайноеПредопределенноеЗначение(Менеджер, Отбор = Неопределено) Экспорт
#Если Сервер Тогда
Возврат ЮТТестовыеДанныеСлужебныйСервер.СлучайноеПредопределенноеЗначение(Менеджер, Отбор);
#Иначе
Возврат ЮТТестовыеДанныеСлужебныйВызовСервера.СлучайноеПредопределенноеЗначение(Менеджер, Отбор);
#КонецЕсли
КонецФункции
@ -565,14 +573,15 @@
// Результат = СлучайныйНомерТелефона(); // Результат будет содержать случайный номер телефона в формате "+7(XXX)XXX-XX-XX".
// Результат = СлучайныйНомерТелефона("666"); // Результат будет содержать случайный номер телефона в формате "+666(XXX)XXX-XX-XX".
Функция СлучайныйНомерТелефона(КодСтраны = "7") Экспорт
Результат = СтрШаблон(
"+%1(%2)%3-%4-%5",
?(ПустаяСтрока(КодСтраны), "7", КодСтраны),
Формат(СлучайноеЧисло(0, 999), "ЧЦ=3; ЧН=000; ЧВН=; ЧГ=0;"),
Формат(СлучайноеЧисло(0, 999), "ЧЦ=3; ЧН=000; ЧВН=; ЧГ=0;"),
Формат(СлучайноеЧисло(0, 99), "ЧЦ=2; ЧН=00; ЧВН=; ЧГ=0;"),
Формат(СлучайноеЧисло(0, 99), "ЧЦ=2; ЧН=00; ЧВН=; ЧГ=0;")
);
ТриЗнака = 999;
ДваЗнака = 99;
Результат = СтрШаблон("+%1(%2)%3-%4-%5",
?(ПустаяСтрока(КодСтраны), "7", КодСтраны),
Формат(СлучайноеЧисло(0, ТриЗнака), "ЧЦ=3; ЧН=000; ЧВН=; ЧГ=0;"),
Формат(СлучайноеЧисло(0, ТриЗнака), "ЧЦ=3; ЧН=000; ЧВН=; ЧГ=0;"),
Формат(СлучайноеЧисло(0, ДваЗнака), "ЧЦ=2; ЧН=00; ЧВН=; ЧГ=0;"),
Формат(СлучайноеЧисло(0, ДваЗнака), "ЧЦ=2; ЧН=00; ЧВН=; ЧГ=0;"));
Возврат Результат;
@ -858,10 +867,16 @@
// Привилегированно - Булево - Выполнить удаление в привилегированном режиме (без учета прав на объекты)
Процедура Удалить(Ссылки, Привилегированно = Ложь) Экспорт
Если ЗначениеЗаполнено(Ссылки) Тогда
ЮТТестовыеДанныеСлужебныйВызовСервера.Удалить(Ссылки, Привилегированно);
Если НЕ ЗначениеЗаполнено(Ссылки) Тогда
Возврат;
КонецЕсли;
#Если Сервер Тогда
ЮТТестовыеДанныеСлужебныйСервер.Удалить(Ссылки, Привилегированно);
#Иначе
ЮТТестовыеДанныеСлужебныйВызовСервера.Удалить(Ссылки, Привилегированно);
#КонецЕсли
КонецПроцедуры
// Возвращает объект подражателя для формирования осмысленных тестовых данных
@ -907,12 +922,23 @@
ЮТПроверкиСлужебный.ПроверитьТипПараметра(ОписанияТипов, "Структура, Соответствие", "ЮТТестовыеДанные.ЗагрузитьИзМакета", "ОписанияТипов");
Возврат ЮТТестовыеДанныеСлужебный.ЗагрузитьИзМакета(Макет,
ОписанияТипов,
КэшЗначений,
ЗаменяемыеЗначения,
ПараметрыСозданияОбъектов,
ТаблицаЗначений);
ПараметрыЗаполнения = ЮТФабрикаСлужебный.ПараметрыЗаполненияТаблицыЗначений(ПараметрыСозданияОбъектов);
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
Возврат ЮТТестовыеДанныеСлужебныйСервер.ЗагрузитьИзМакета(Макет,
ОписанияТипов,
КэшЗначений,
ЗаменяемыеЗначения,
ПараметрыЗаполнения,
ТаблицаЗначений);
#Иначе
Возврат ЮТТестовыеДанныеСлужебныйВызовСервера.ЗагрузитьИзМакета(Макет,
ОписанияТипов,
КэшЗначений,
ЗаменяемыеЗначения,
ПараметрыЗаполнения,
ТаблицаЗначений);
#КонецЕсли
КонецФункции
@ -958,7 +984,11 @@
// Длительность - Число - Длительность блокировки в секундах
Процедура УстановитьФоновуюБлокировку(Блокировка, Длительность = 30) Экспорт
#Если Сервер Тогда
ЮТТестовыеДанныеСлужебныйСервер.УстановитьФоновуюБлокировку(Блокировка, Длительность);
#Иначе
ЮТТестовыеДанныеСлужебныйВызовСервера.УстановитьФоновуюБлокировку(Блокировка, Длительность);
#КонецЕсли
КонецПроцедуры
@ -970,7 +1000,7 @@
// Ссылка - ЛюбаяСсылка
// ИмяРеквизита - Строка
// ЗначениеРеквизита - Произвольный
// ПараметрыЗаписи - см. ЮТФабрикаСлужебный.ПараметрыЗаписи
// ПараметрыЗаписи - см. ЮТОбщий.ПараметрыЗаписи
Процедура УстановитьЗначениеРеквизита(Ссылка, ИмяРеквизита, ЗначениеРеквизита, ПараметрыЗаписи = Неопределено) Экспорт
Значения = Новый Соответствие();
@ -984,10 +1014,14 @@
// Параметры:
// Ссылка - ЛюбаяСсылка - Ссылка
// ЗначенияРеквизитов - Структура, Соответствие из Произвольный - Значения реквизитов
// ПараметрыЗаписи - см. ЮТФабрикаСлужебный.ПараметрыЗаписи
// ПараметрыЗаписи - см. ЮТОбщий.ПараметрыЗаписи
Процедура УстановитьЗначенияРеквизитов(Ссылка, ЗначенияРеквизитов, ПараметрыЗаписи = Неопределено) Экспорт
#Если Сервер Тогда
ЮТТестовыеДанныеСлужебныйСервер.УстановитьЗначенияРеквизитов(Ссылка, ЗначенияРеквизитов, ПараметрыЗаписи);
#Иначе
ЮТТестовыеДанныеСлужебныйВызовСервера.УстановитьЗначенияРеквизитов(Ссылка, ЗначенияРеквизитов, ПараметрыЗаписи);
#КонецЕсли
КонецПроцедуры

View File

@ -56,7 +56,7 @@
Иначе
Значение = ЮТТестовыеДанныеСлужебныйВызовСервера.ФикцияЗначенияБазы(Тип, РеквизитыЗаполнения);
Значение = ФикцияЗначенияБазы(Тип, РеквизитыЗаполнения);
КонецЕсли;
@ -158,6 +158,56 @@
КонецФункции
Функция ГенераторСлучайныхЧисел() Экспорт
Возврат ЮТКонтекстСлужебный.ЗначениеКонтекста(ИмяКонтекстаГенераторСлучайныхЧисел());
КонецФункции
Функция СоздатьЗапись(Менеджер, Данные, ПараметрыЗаписи, ВернутьОбъект) Экспорт
#Если Сервер Тогда
Возврат ЮТТестовыеДанныеСлужебныйСервер.СоздатьЗапись(Менеджер, Данные, ПараметрыЗаписи, ВернутьОбъект);
#Иначе
Возврат ЮТТестовыеДанныеСлужебныйВызовСервера.СоздатьЗапись(Менеджер, Данные, ПараметрыЗаписи, ВернутьОбъект);
#КонецЕсли
КонецФункции
// Создает новый объект и заполняет его данными
//
// Параметры:
// Менеджер - Произвольный
// Данные - Структура - Данные заполнения объекта
// ДополнительныеСвойства - Структура - Дополнительные свойства объекта
// УникальныйИдентификаторСсылки - УникальныйИдентификатор - Уникальный идентификатор, который будет установлен в качестве ссылки для объекта
//
// Возвращаемое значение:
// Произвольный - Созданный объект
Функция НовыйОбъект(Менеджер, Данные, ДополнительныеСвойства = Неопределено, УникальныйИдентификаторСсылки = Неопределено) Экспорт
#Если Сервер Тогда
Возврат ЮТТестовыеДанныеСлужебныйСервер.НовыйОбъект(Менеджер, Данные, ДополнительныеСвойства, УникальныйИдентификаторСсылки);
#Иначе
Возврат ЮТТестовыеДанныеСлужебныйВызовСервера.НовыйОбъект(Менеджер, Данные, ДополнительныеСвойства, УникальныйИдентификаторСсылки);
#КонецЕсли
КонецФункции
Функция ФикцияЗначенияБазы(ТипЗначения, РеквизитыЗаполнения = Неопределено) Экспорт
#Если Сервер Тогда
Возврат ЮТТестовыеДанныеСлужебныйСервер.ФикцияЗначенияБазы(ТипЗначения, РеквизитыЗаполнения);
#Иначе
Возврат ЮТТестовыеДанныеСлужебныйВызовСервера.ФикцияЗначенияБазы(ТипЗначения, РеквизитыЗаполнения);
#КонецЕсли
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ОбработчикиСобытий
Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт
@ -192,38 +242,6 @@
#КонецОбласти
Функция ЗагрузитьИзМакета(Макет, ОписанияТипов, КэшЗначений, ЗаменяемыеЗначения, ПараметрыСозданияОбъектов, ТаблицаЗначений) Экспорт
ПараметрыЗаполнения = ЮТФабрикаСлужебный.ПараметрыЗаполненияТаблицыЗначений(ПараметрыСозданияОбъектов);
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
Возврат ЮТТестовыеДанныеСлужебныйСервер.ЗагрузитьИзМакета(Макет,
ОписанияТипов,
КэшЗначений,
ЗаменяемыеЗначения,
ПараметрыЗаполнения,
ТаблицаЗначений);
#Иначе
Возврат ЮТТестовыеДанныеСлужебныйВызовСервера.ЗагрузитьИзМакета(Макет,
ОписанияТипов,
КэшЗначений,
ЗаменяемыеЗначения,
ПараметрыЗаполнения,
ТаблицаЗначений);
#КонецЕсли
КонецФункции
Функция ГенераторСлучайныхЧисел() Экспорт
Возврат ЮТКонтекстСлужебный.ЗначениеКонтекста(ИмяКонтекстаГенераторСлучайныхЧисел());
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция СлучайноЗначениеСистемногоПеречисления(Тип)
Менеджер = ЮТМетодыСлужебный.ВычислитьБезопасно(ЮТТипыДанныхСлужебный.ИмяСистемногоПеречисления(Тип));

View File

@ -20,138 +20,25 @@
Функция СоздатьЗапись(Знач Менеджер, Знач Данные, Знач ПараметрыЗаписи, Знач ВернутьОбъект) Экспорт
ПараметрыЗаписи = ПараметрыЗаписи(ПараметрыЗаписи);
Объект = НовыйОбъект(Менеджер, Данные, ПараметрыЗаписи.ДополнительныеСвойства, ПараметрыЗаписи.УникальныйИдентификаторСсылки);
КлючЗаписи = ЗаписатьОбъект(Объект, ПараметрыЗаписи);
ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(КлючЗаписи);
Если ВернутьОбъект Тогда
Возврат Объект;
Иначе
Возврат КлючЗаписи;
КонецЕсли;
Возврат ЮТТестовыеДанныеСлужебныйСервер.СоздатьЗапись(Менеджер, Данные, ПараметрыЗаписи, ВернутьОбъект);
КонецФункции
// Создает новый объект и заполняет его данными
//
// Параметры:
// Менеджер - Произвольный
// Данные - Структура - Данные заполнения объекта
// ДополнительныеСвойства - Структура - Дополнительные свойства объекта
// УникальныйИдентификаторСсылки - УникальныйИдентификатор - Уникальный идентификатор, который будет установлен в качестве ссылки для объекта
//
// Возвращаемое значение:
// Произвольный - Созданный объект
Функция НовыйОбъект(Знач Менеджер,
Знач Данные,
Знач ДополнительныеСвойства = Неопределено,
Знач УникальныйИдентификаторСсылки = Неопределено) Экспорт
Функция НовыйОбъект(Знач Менеджер, Знач Данные, Знач ДополнительныеСвойства, Знач УникальныйИдентификаторСсылки) Экспорт
ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(Менеджер);
Менеджер = ЮТОбщий.Менеджер(ОписаниеОбъектаМетаданных);
ЭтоРегистр = ЮТМетаданные.ЭтоРегистр(ОписаниеОбъектаМетаданных);
Объект = СоздатьОбъект(Менеджер, ОписаниеОбъектаМетаданных.ОписаниеТипа, Данные);
Если ДополнительныеСвойства <> Неопределено Тогда
ЮТКоллекции.ДополнитьСтруктуру(Объект.ДополнительныеСвойства, ДополнительныеСвойства);
КонецЕсли;
Если УникальныйИдентификаторСсылки <> Неопределено И ОписаниеОбъектаМетаданных.ОписаниеТипа.Ссылочный Тогда
Ссылка = Менеджер.ПолучитьСсылку(УникальныйИдентификаторСсылки);
Объект.УстановитьСсылкуНового(Ссылка);
КонецЕсли;
Если ЭтоРегистр Тогда
ЗаполнитьНаборРегистра(Объект, Данные);
Возврат Объект;
КонецЕсли;
ЗаполнитьЗначенияСвойств(Объект, Данные);
Если ОписаниеОбъектаМетаданных.ОписаниеТипа.ТабличныеЧасти Тогда
Для Каждого ОписаниеТабличнойЧасти Из ОписаниеОбъектаМетаданных.ТабличныеЧасти Цикл
ИмяТабличнойЧасти = ОписаниеТабличнойЧасти.Ключ;
Если НЕ Данные.Свойство(ИмяТабличнойЧасти) Тогда
Продолжить;
КонецЕсли;
Для Каждого Запись Из Данные[ИмяТабличнойЧасти] Цикл
Строка = Объект[ИмяТабличнойЧасти].Добавить();
ЗаполнитьЗначенияСвойств(Строка, Запись);
КонецЦикла;
КонецЦикла;
КонецЕсли;
ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных);
Возврат Объект;
Возврат ЮТТестовыеДанныеСлужебныйСервер.НовыйОбъект(Менеджер, Данные, ДополнительныеСвойства, УникальныйИдентификаторСсылки);
КонецФункции
Процедура Удалить(Знач Ссылки, Привилегированно = Ложь) Экспорт
Процедура Удалить(Знач Ссылки, Знач Привилегированно) Экспорт
Если ТипЗнч(Ссылки) <> Тип("Массив") Тогда
Ссылки = ЮТКоллекции.ЗначениеВМассиве(Ссылки);
КонецЕсли;
Ошибки = Новый Массив;
Если Привилегированно И НЕ ПривилегированныйРежим() Тогда
УстановитьПривилегированныйРежим(Истина);
КонецЕсли;
Для Каждого Ссылка Из Ссылки Цикл
УдалитьСсылку(Ссылка, Ошибки);
КонецЦикла;
ОбновитьНумерациюОбъектов();
Если ЗначениеЗаполнено(Ошибки) Тогда
ВызватьИсключение СтрСоединить(Ошибки, Символы.ПС);
КонецЕсли;
ЮТТестовыеДанныеСлужебныйСервер.Удалить(Ссылки, Привилегированно);
КонецПроцедуры
Функция ФикцияЗначенияБазы(Знач ТипЗначения, Знач РеквизитыЗаполнения = Неопределено) Экспорт
Функция ФикцияЗначенияБазы(Знач ТипЗначения, Знач РеквизитыЗаполнения) Экспорт
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);
Если ОбъектМетаданных = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Если Метаданные.Перечисления.Содержит(ОбъектМетаданных) Тогда
Возврат СлучайноеЗначениеПеречисления(ОбъектМетаданных);
КонецЕсли;
ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(ОбъектМетаданных);
Менеджер = ЮТОбщий.Менеджер(ОбъектМетаданных);
Объект = СоздатьОбъект(Менеджер, ОписаниеОбъектаМетаданных.ОписаниеТипа, РеквизитыЗаполнения);
Если ЗначениеЗаполнено(РеквизитыЗаполнения) Тогда
ЗаполнитьЗначенияСвойств(Объект, РеквизитыЗаполнения);
КонецЕсли;
ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных);
КлючЗаписи = ЗаписатьОбъект(Объект, ПараметрыЗаписи());
ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(КлючЗаписи);
Возврат КлючЗаписи;
Возврат ЮТТестовыеДанныеСлужебныйСервер.ФикцияЗначенияБазы(ТипЗначения, РеквизитыЗаполнения);
КонецФункции
@ -173,97 +60,25 @@
Функция СлучайноеЗначениеПеречисления(Знач Перечисление) Экспорт
Менеджер = ЮТОбщий.Менеджер(Перечисление);
НомерЗначения = ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(Менеджер.Количество());
Возврат Менеджер.Получить(НомерЗначения - 1);
Возврат ЮТТестовыеДанныеСлужебныйСервер.СлучайноеЗначениеПеречисления(Перечисление);
КонецФункции
Функция СлучайноеПредопределенноеЗначение(Менеджер, Отбор) Экспорт
Функция СлучайноеПредопределенноеЗначение(Знач Менеджер, Знач Отбор) Экспорт
ИмяТаблицы = ЮТМетаданные.НормализованноеИмяТаблицы(Менеджер);
Условия = ЮТест.Предикат(Отбор)
.Реквизит("Предопределенный").Равно(Истина);
ОписаниеЗапроса = ЮТЗапросыСлужебныйКлиентСервер.ОписаниеЗапроса(ИмяТаблицы, Условия, "Ссылка");
Данные = ЮТЗапросы.РезультатЗапроса(ОписаниеЗапроса);
Если Данные.Количество() = 1 Тогда
Значение = Данные[0].Ссылка;
ИначеЕсли Данные.Количество() > 1 Тогда
Индекс = ЮТест.Данные().СлучайноеЧисло(0, Данные.Количество() - 1);
Значение = Данные[Индекс].Ссылка;
Иначе
Значение = Неопределено;
КонецЕсли;
Возврат Значение;
Возврат ЮТТестовыеДанныеСлужебныйСервер.СлучайноеПредопределенноеЗначение(Менеджер, Отбор);
КонецФункции
Процедура УстановитьЗначенияРеквизитов(Знач Ссылка, Знач ЗначенияРеквизитов, Знач ПараметрыЗаписи = Неопределено) Экспорт
Процедура УстановитьЗначенияРеквизитов(Знач Ссылка, Знач ЗначенияРеквизитов, Знач ПараметрыЗаписи) Экспорт
Объект = Ссылка.ПолучитьОбъект();
ПараметрыЗаписи = ПараметрыЗаписи(ПараметрыЗаписи);
Для Каждого Элемент Из ЗначенияРеквизитов Цикл
Объект[Элемент.Ключ] = Элемент.Значение;
КонецЦикла;
ЗаписатьОбъект(Объект, ПараметрыЗаписи);
ЮТТестовыеДанныеСлужебныйСервер.УстановитьЗначенияРеквизитов(Ссылка, ЗначенияРеквизитов, ПараметрыЗаписи);
КонецПроцедуры
Процедура УстановитьФоновуюБлокировку(Блокировка, Длительность) Экспорт
Процедура УстановитьФоновуюБлокировку(Знач Блокировка, Знач Длительность) Экспорт
ОписаниеБлокировки = ОписаниеБлокировки(Блокировка);
Параметры = ЮТКоллекции.ЗначениеВМассиве(ОписаниеБлокировки, Длительность);
Задание = ФоновыеЗадания.Выполнить("ЮТТестовыеДанныеСлужебныйВызовСервера.УстановитьБлокировку", Параметры);
Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
//@skip-check empty-except-statement
Попытка
ФоновыеЗадания.ОжидатьЗавершения(ЮТКоллекции.ЗначениеВМассиве(Задание), 1);
Исключение
// Исключение не интересно
КонецПопытки;
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Задание.УникальныйИдентификатор);
КонецЕсли;
Если Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
ВызватьИсключение Задание.ИнформацияОбОшибке;
ИначеЕсли Задание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда
ВызватьИсключение "Фоновое задание с блокировкой завершилось";
КонецЕсли;
КонецПроцедуры
Процедура УстановитьБлокировку(ОписаниеБлокировки, Длительность) Экспорт
Блокировка = Новый БлокировкаДанных();
Для Каждого ОписаниеЭлемента Из ОписаниеБлокировки Цикл
Элемент = Блокировка.Добавить();
ЗаполнитьЗначенияСвойств(Элемент, ОписаниеЭлемента, "Область, Режим");
Для Каждого ОписаниеПоля Из ОписаниеЭлемента.Поля Цикл
Элемент.УстановитьЗначение(ОписаниеПоля.Поле, ОписаниеПоля.Значение);
КонецЦикла;
КонецЦикла;
// BSLLS:BeginTransactionBeforeTryCatch-off
// BSLLS:PairingBrokenTransaction-off
// BSLLS:PairingBrokenTransaction-off
НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
// BSLLS:BeginTransactionBeforeTryCatch-on
// BSLLS:PairingBrokenTransaction-on
// BSLLS:PairingBrokenTransaction-on
//@skip-check lock-out-of-try
Блокировка.Заблокировать();
ЮТОбщий.Пауза(Длительность);
ЮТТестовыеДанныеСлужебныйСервер.УстановитьФоновуюБлокировку(Блокировка, Длительность);
КонецПроцедуры
@ -274,254 +89,3 @@
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Создать объект.
//
// Параметры: ОписаниеМенеджера -
// См. ОписаниеМенеджера
// Менеджер - Произвольный - Менеджер
// ОписаниеТипа - см. ЮТМетаданные.СтруктураОписанияОбъектаМетаданных
// Данные - Структура
// Возвращаемое значение:
// Произвольный - Создать объект
Функция СоздатьОбъект(Менеджер, ОписаниеТипа, Данные)
Если ОписаниеТипа.Конструктор = "СоздатьЭлемент" Тогда
ЭтоГруппа = ?(Данные = Неопределено, Ложь, ЮТКоллекции.ЗначениеСтруктуры(Данные, "ЭтоГруппа", Ложь));
Если ЭтоГруппа Тогда
Результат = Менеджер.СоздатьГруппу();
Иначе
Результат = Менеджер.СоздатьЭлемент();
КонецЕсли;
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьДокумент" Тогда
Результат = Менеджер.СоздатьДокумент();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьСчет" Тогда
Результат = Менеджер.СоздатьСчет();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьВидРасчета" Тогда
Результат = Менеджер.СоздатьВидРасчета();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьУзел" Тогда
Результат = Менеджер.СоздатьУзел();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьНаборЗаписей" Тогда
Результат = Менеджер.СоздатьНаборЗаписей();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьМенеджерЗаписи" Тогда
Результат = Менеджер.СоздатьМенеджерЗаписи();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьБизнесПроцесс" Тогда
Результат = Менеджер.СоздатьБизнесПроцесс();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьЗадачу" Тогда
Результат = Менеджер.СоздатьЗадачу();
Иначе
ВызватьИсключение СтрШаблон("Для %1 не поддерживается создание записей ИБ", ОписаниеТипа.Имя);
КонецЕсли;
Возврат Результат;
КонецФункции
// Записать объект.
//
// Параметры:
// Объект - Произвольный - Объект
// ПараметрыЗаписи - см. ЮТОбщий.ПараметрыЗаписи
//
// Возвращаемое значение:
// ЛюбаяСсылка
Функция ЗаписатьОбъект(Объект, ПараметрыЗаписи)
Если ПараметрыЗаписи.ОбменДаннымиЗагрузка Тогда
Объект.ОбменДанными.Загрузка = Истина;
КонецЕсли;
Попытка
Если ПараметрыЗаписи.РежимЗаписи <> Неопределено Тогда
Объект.Записать(ПараметрыЗаписи.РежимЗаписи);
Иначе
Объект.Записать();
КонецЕсли;
Если ПараметрыЗаписи.ОбменДаннымиЗагрузка Тогда
Объект.ОбменДанными.Загрузка = Ложь;
КонецЕсли;
Возврат КлючЗаписи(Объект);
Исключение
ЮТРегистрацияОшибок.ДобавитьПояснениеОшибки(СтрШаблон("Не удалось записать объект `%1` (%2)", Объект, ТипЗнч(Объект)));
ВызватьИсключение;
КонецПопытки;
КонецФункции
Процедура ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных)
АнглийскийЯзык = ЮТОкружение.ИспользуетсяАнглийскийВстроенныйЯзык();
ИмяТипаДокумент = ?(АнглийскийЯзык, "Document", "Документ");
ИмяРеквизитаКод = ?(АнглийскийЯзык, "Code", "Код");
ИмяРеквизитаНаименование = ?(АнглийскийЯзык, "Description", "Наименование");
ОписаниеТипа = ОписаниеОбъектаМетаданных.ОписаниеТипа;
Если ОписаниеТипа.Имя = ИмяТипаДокумент Тогда
Если НЕ ЗначениеЗаполнено(Объект.Дата) Тогда
Объект.Дата = ТекущаяДатаСеанса();
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Объект.Номер) Тогда
Объект.УстановитьНовыйНомер();
КонецЕсли;
КонецЕсли;
УстановитьНовыйКод = ОписаниеОбъектаМетаданных.ОписаниеТипа.УстановитьНовыйКод
И ОписаниеОбъектаМетаданных.Реквизиты.Свойство(ИмяРеквизитаКод)
И ОписаниеОбъектаМетаданных.Реквизиты[ИмяРеквизитаКод].Обязательный
И Не ЗначениеЗаполнено(Объект.Код);
УстановитьНаименование = ОписаниеОбъектаМетаданных.Реквизиты.Свойство(ИмяРеквизитаНаименование)
И ОписаниеОбъектаМетаданных.Реквизиты[ИмяРеквизитаНаименование].Обязательный
И НЕ ЗначениеЗаполнено(Объект.Наименование);
Если УстановитьНовыйКод Тогда
Объект.УстановитьНовыйКод();
КонецЕсли;
Если УстановитьНаименование Тогда
РеквизитНаименование = ОписаниеОбъектаМетаданных.Реквизиты[ИмяРеквизитаНаименование];
Объект.Наименование = ЮТТестовыеДанные.Фикция(РеквизитНаименование.Тип);
КонецЕсли;
КонецПроцедуры
Функция КлючЗаписи(Объект)
ТипЗначения = ТипЗнч(Объект);
Если ЮТТипыДанныхСлужебный.ЭтоТипОбъекта(ТипЗначения) Тогда
Возврат Объект.Ссылка;
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоМенеджерЗаписи(ТипЗначения) Тогда
Описание = ЮТМетаданные.ОписаниеОбъектаМетаданных(Объект);
КлючевыеРеквизиты = Новый Структура();
Для Каждого Реквизит Из Описание.Реквизиты Цикл
Если Реквизит.Значение.ЭтоКлюч Тогда
КлючевыеРеквизиты.Вставить(Реквизит.Ключ, Объект[Реквизит.Ключ]);
КонецЕсли;
КонецЦикла;
Менеджер = ЮТОбщий.Менеджер(Описание);
Возврат Менеджер.СоздатьКлючЗаписи(КлючевыеРеквизиты);
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоТипНабораЗаписей(ТипЗначения) Тогда
КлючевыеРеквизиты = Новый Структура();
Для Каждого ЭлементОтбора Из Объект.Отбор Цикл
КлючевыеРеквизиты.Вставить(ЭлементОтбора.Имя, ЭлементОтбора.Значение);
КонецЦикла;
Менеджер = ЮТОбщий.Менеджер(Объект);
Возврат Менеджер.СоздатьКлючЗаписи(КлючевыеРеквизиты);
Иначе
Сообщение = ЮТИсключения.НеподдерживаемыйПараметрМетода("ЮТТестовыеДанныеВызовСервера.КлючЗаписи", Объект);
ВызватьИсключение Сообщение;
КонецЕсли;
КонецФункции
Функция ПараметрыЗаписи(ВходящиеПараметрыЗаписи = Неопределено)
Если ВходящиеПараметрыЗаписи = Неопределено Тогда
Возврат ЮТОбщий.ПараметрыЗаписи();
Иначе
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ЗаполнитьЗначенияСвойств(ПараметрыЗаписи, ВходящиеПараметрыЗаписи);
Возврат ПараметрыЗаписи;
КонецЕсли;
КонецФункции
Процедура ЗаполнитьНаборРегистра(Набор, ДанныеЗаписи)
Запись = Набор.Добавить();
ЗаполнитьЗначенияСвойств(Запись, ДанныеЗаписи);
Для Каждого ЭлементОтбора Из Набор.Отбор Цикл
ЭлементОтбора.Установить(Запись[ЭлементОтбора.Имя]);
КонецЦикла;
КонецПроцедуры
Процедура УдалитьСсылку(Значение, ОшибкиОбработки)
ТипЗначения = ТипЗнч(Значение);
Если Значение = Неопределено ИЛИ ЮТТипыДанныхСлужебный.ЭтоТипПеречисления(ТипЗначения) Тогда
Возврат;
КонецЕсли;
Попытка
Если ЮТТипыДанныхСлужебный.ЭтоТипОбъекта(ТипЗначения) Тогда
Если НЕ Значение.ЭтоНовый() Тогда
Значение.Удалить();
КонецЕсли;
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ТипЗначения) Тогда
Объект = Значение.ПолучитьОбъект();
Если Объект <> Неопределено Тогда
Объект.Удалить();
КонецЕсли;
Иначе
Менеджер = ЮТОбщий.Менеджер(ТипЗначения);
Запись = Менеджер.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись, Значение);
Запись.Прочитать();
Запись.Удалить();
КонецЕсли;
Исключение
ОшибкиОбработки.Добавить(ЮТРегистрацияОшибокСлужебный.ПредставлениеОшибки("Удаление " + Значение, ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Функция ОписаниеБлокировки(Блокировка)
Описание = Новый Массив();
Для Каждого Элемент Из Блокировка Цикл
Описание.Добавить(ОписаниеЭлементаБлокировки(Элемент));
КонецЦикла;
Возврат Описание;
КонецФункции
Функция ОписаниеЭлементаБлокировки(ЭлементБлокировки)
Описание = Новый Структура;
Описание.Вставить("Область", ЭлементБлокировки.Область);
Описание.Вставить("Режим", ЭлементБлокировки.Режим);
Описание.Вставить("Поля", Новый Массив);
Для Каждого Поле Из ЭлементБлокировки.Поля Цикл
ОписаниеПоля = Новый Структура;
ОписаниеПоля.Вставить("Поле", Поле.Поле);
ОписаниеПоля.Вставить("Значение", Поле.Значение);
КонецЦикла;
Возврат Описание;
КонецФункции
#КонецОбласти

View File

@ -18,12 +18,7 @@
#Область СлужебныйПрограммныйИнтерфейс
Функция ЗагрузитьИзМакета(Знач Макет,
Знач ОписанияТипов,
КэшЗначений,
Знач ЗаменяемыеЗначения,
Знач ПараметрыЗаполнения,
Знач ТаблицаЗначений) Экспорт
Функция ЗагрузитьИзМакета(Макет, ОписанияТипов, КэшЗначений, ЗаменяемыеЗначения, ПараметрыЗаполнения, ТаблицаЗначений) Экспорт
Таблица = ЗагрузитьВТаблицуИзМакета(Макет, ОписанияТипов, КэшЗначений, ЗаменяемыеЗначения, ПараметрыЗаполнения);
@ -44,6 +39,238 @@
КонецФункции
Функция ВыборкаИзТабличногоДокумента(ТабличныйДокумент) Экспорт
Возврат ЗапросКТабличномуДокументу(ТабличныйДокумент).Выбрать();
КонецФункции
Функция ТаблицаИзТабличногоДокумента(ТабличныйДокумент) Экспорт
Возврат ЗапросКТабличномуДокументу(ТабличныйДокумент).Выгрузить();
КонецФункции
Функция СоздатьЗапись(Менеджер, Данные, ПараметрыЗаписи, ВернутьОбъект) Экспорт
ПараметрыЗаписи = ПараметрыЗаписи(ПараметрыЗаписи);
Объект = НовыйОбъект(Менеджер, Данные, ПараметрыЗаписи.ДополнительныеСвойства, ПараметрыЗаписи.УникальныйИдентификаторСсылки);
КлючЗаписи = ЗаписатьОбъект(Объект, ПараметрыЗаписи);
ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(КлючЗаписи);
Если ВернутьОбъект Тогда
Возврат Объект;
Иначе
Возврат КлючЗаписи;
КонецЕсли;
КонецФункции
Функция НовыйОбъект(Знач Менеджер, Данные, ДополнительныеСвойства, УникальныйИдентификаторСсылки) Экспорт
ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(Менеджер);
Менеджер = ЮТОбщий.Менеджер(ОписаниеОбъектаМетаданных);
ЭтоРегистр = ЮТМетаданные.ЭтоРегистр(ОписаниеОбъектаМетаданных);
Объект = СоздатьОбъект(Менеджер, ОписаниеОбъектаМетаданных.ОписаниеТипа, Данные);
Если ДополнительныеСвойства <> Неопределено Тогда
ЮТКоллекции.ДополнитьСтруктуру(Объект.ДополнительныеСвойства, ДополнительныеСвойства);
КонецЕсли;
Если УникальныйИдентификаторСсылки <> Неопределено И ОписаниеОбъектаМетаданных.ОписаниеТипа.Ссылочный Тогда
Ссылка = Менеджер.ПолучитьСсылку(УникальныйИдентификаторСсылки);
Объект.УстановитьСсылкуНового(Ссылка);
КонецЕсли;
Если ЭтоРегистр Тогда
ЗаполнитьНаборРегистра(Объект, Данные);
Возврат Объект;
КонецЕсли;
ЗаполнитьЗначенияСвойств(Объект, Данные);
Если ОписаниеОбъектаМетаданных.ОписаниеТипа.ТабличныеЧасти Тогда
Для Каждого ОписаниеТабличнойЧасти Из ОписаниеОбъектаМетаданных.ТабличныеЧасти Цикл
ИмяТабличнойЧасти = ОписаниеТабличнойЧасти.Ключ;
Если НЕ Данные.Свойство(ИмяТабличнойЧасти) Тогда
Продолжить;
КонецЕсли;
Для Каждого Запись Из Данные[ИмяТабличнойЧасти] Цикл
Строка = Объект[ИмяТабличнойЧасти].Добавить();
ЗаполнитьЗначенияСвойств(Строка, Запись);
КонецЦикла;
КонецЦикла;
КонецЕсли;
ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных);
Возврат Объект;
КонецФункции
Процедура Удалить(Ссылки, Привилегированно) Экспорт
Если ТипЗнч(Ссылки) <> Тип("Массив") Тогда
Ссылки = ЮТКоллекции.ЗначениеВМассиве(Ссылки);
КонецЕсли;
Ошибки = Новый Массив;
Если Привилегированно И НЕ ПривилегированныйРежим() Тогда
УстановитьПривилегированныйРежим(Истина);
КонецЕсли;
Для Каждого Ссылка Из Ссылки Цикл
УдалитьСсылку(Ссылка, Ошибки);
КонецЦикла;
ОбновитьНумерациюОбъектов();
Если ЗначениеЗаполнено(Ошибки) Тогда
ВызватьИсключение СтрСоединить(Ошибки, Символы.ПС);
КонецЕсли;
КонецПроцедуры
Функция ФикцияЗначенияБазы(ТипЗначения, РеквизитыЗаполнения) Экспорт
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);
Если ОбъектМетаданных = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Если Метаданные.Перечисления.Содержит(ОбъектМетаданных) Тогда
Возврат СлучайноеЗначениеПеречисления(ОбъектМетаданных);
КонецЕсли;
ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(ОбъектМетаданных);
Менеджер = ЮТОбщий.Менеджер(ОбъектМетаданных);
Объект = СоздатьОбъект(Менеджер, ОписаниеОбъектаМетаданных.ОписаниеТипа, РеквизитыЗаполнения);
Если ЗначениеЗаполнено(РеквизитыЗаполнения) Тогда
ЗаполнитьЗначенияСвойств(Объект, РеквизитыЗаполнения);
КонецЕсли;
ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных);
КлючЗаписи = ЗаписатьОбъект(Объект, ПараметрыЗаписи());
ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(КлючЗаписи);
Возврат КлючЗаписи;
КонецФункции
Функция СлучайноеЗначениеПеречисления(Перечисление) Экспорт
Менеджер = ЮТОбщий.Менеджер(Перечисление);
НомерЗначения = ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(Менеджер.Количество());
Возврат Менеджер.Получить(НомерЗначения - 1);
КонецФункции
Функция СлучайноеПредопределенноеЗначение(Менеджер, Отбор) Экспорт
ИмяТаблицы = ЮТМетаданные.НормализованноеИмяТаблицы(Менеджер);
Условия = ЮТест.Предикат(Отбор)
.Реквизит("Предопределенный").Равно(Истина);
ОписаниеЗапроса = ЮТЗапросыСлужебныйКлиентСервер.ОписаниеЗапроса(ИмяТаблицы, Условия, "Ссылка");
Данные = ЮТЗапросы.РезультатЗапроса(ОписаниеЗапроса);
Если Данные.Количество() = 1 Тогда
Значение = Данные[0].Ссылка;
ИначеЕсли Данные.Количество() > 1 Тогда
Индекс = ЮТест.Данные().СлучайноеЧисло(0, Данные.Количество() - 1);
Значение = Данные[Индекс].Ссылка;
Иначе
Значение = Неопределено;
КонецЕсли;
Возврат Значение;
КонецФункции
Процедура УстановитьЗначенияРеквизитов(Ссылка, ЗначенияРеквизитов, ПараметрыЗаписи) Экспорт
Объект = Ссылка.ПолучитьОбъект();
ПараметрыЗаписи = ПараметрыЗаписи(ПараметрыЗаписи);
Для Каждого Элемент Из ЗначенияРеквизитов Цикл
Объект[Элемент.Ключ] = Элемент.Значение;
КонецЦикла;
ЗаписатьОбъект(Объект, ПараметрыЗаписи);
КонецПроцедуры
Процедура УстановитьФоновуюБлокировку(Блокировка, Длительность) Экспорт
ОписаниеБлокировки = ОписаниеБлокировки(Блокировка);
Параметры = ЮТКоллекции.ЗначениеВМассиве(ОписаниеБлокировки, Длительность);
Задание = ФоновыеЗадания.Выполнить("ЮТТестовыеДанныеСлужебныйСервер.УстановитьБлокировку", Параметры);
Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
//@skip-check empty-except-statement
Попытка
ФоновыеЗадания.ОжидатьЗавершения(ЮТКоллекции.ЗначениеВМассиве(Задание), 1);
Исключение
// Исключение не интересно
КонецПопытки;
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Задание.УникальныйИдентификатор);
КонецЕсли;
Если Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
ВызватьИсключение Задание.ИнформацияОбОшибке;
ИначеЕсли Задание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда
ВызватьИсключение "Фоновое задание с блокировкой завершилось";
КонецЕсли;
КонецПроцедуры
Процедура УстановитьБлокировку(ОписаниеБлокировки, Длительность) Экспорт
Блокировка = Новый БлокировкаДанных();
Для Каждого ОписаниеЭлемента Из ОписаниеБлокировки Цикл
Элемент = Блокировка.Добавить();
ЗаполнитьЗначенияСвойств(Элемент, ОписаниеЭлемента, "Область, Режим");
Для Каждого ОписаниеПоля Из ОписаниеЭлемента.Поля Цикл
Элемент.УстановитьЗначение(ОписаниеПоля.Поле, ОписаниеПоля.Значение);
КонецЦикла;
КонецЦикла;
// BSLLS:BeginTransactionBeforeTryCatch-off
// BSLLS:PairingBrokenTransaction-off
// BSLLS:PairingBrokenTransaction-off
НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
// BSLLS:BeginTransactionBeforeTryCatch-on
// BSLLS:PairingBrokenTransaction-on
// BSLLS:PairingBrokenTransaction-on
//@skip-check lock-out-of-try
Блокировка.Заблокировать();
ЮТОбщий.Пауза(Длительность);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@ -75,7 +302,7 @@
ПараметрыЗагрузки = ПараметрыЗагрузки(КолонкиМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения);
Выборка = ЮТОбщийСлужебныйВызовСервера.ВыборкаИзТабличногоДокумента(ДанныеМакета);
Выборка = ВыборкаИзТабличногоДокумента(ДанныеМакета);
Пока Выборка.Следующий() Цикл
@ -244,7 +471,7 @@
КонецФункции
Функция ДанныеМакета(Знач Макет)
Функция ДанныеМакета(Макет)
ТипПараметра = ТипЗнч(Макет);
ДанныеМакета = Неопределено;
@ -585,4 +812,251 @@
#КонецОбласти
Функция ЗапросКТабличномуДокументу(ТабличныйДокумент)
ВсегоСтрок = ТабличныйДокумент.ВысотаТаблицы;
ВсегоКолонок = ТабличныйДокумент.ШиринаТаблицы;
Область = ТабличныйДокумент.Область(1, 1, ВсегоСтрок, ВсегоКолонок);
ИсточникДанных = Новый ОписаниеИсточникаДанных(Область);
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();
Возврат ПостроительОтчета.Результат;
КонецФункции
Функция СоздатьОбъект(Менеджер, ОписаниеТипа, Данные)
Если ОписаниеТипа.Конструктор = "СоздатьЭлемент" Тогда
ЭтоГруппа = ?(Данные = Неопределено, Ложь, ЮТКоллекции.ЗначениеСтруктуры(Данные, "ЭтоГруппа", Ложь));
Если ЭтоГруппа Тогда
Результат = Менеджер.СоздатьГруппу();
Иначе
Результат = Менеджер.СоздатьЭлемент();
КонецЕсли;
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьДокумент" Тогда
Результат = Менеджер.СоздатьДокумент();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьСчет" Тогда
Результат = Менеджер.СоздатьСчет();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьВидРасчета" Тогда
Результат = Менеджер.СоздатьВидРасчета();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьУзел" Тогда
Результат = Менеджер.СоздатьУзел();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьНаборЗаписей" Тогда
Результат = Менеджер.СоздатьНаборЗаписей();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьМенеджерЗаписи" Тогда
Результат = Менеджер.СоздатьМенеджерЗаписи();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьБизнесПроцесс" Тогда
Результат = Менеджер.СоздатьБизнесПроцесс();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьЗадачу" Тогда
Результат = Менеджер.СоздатьЗадачу();
Иначе
ВызватьИсключение СтрШаблон("Для %1 не поддерживается создание записей ИБ", ОписаниеТипа.Имя);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЗаписатьОбъект(Объект, ПараметрыЗаписи)
Если ПараметрыЗаписи.ОбменДаннымиЗагрузка Тогда
Объект.ОбменДанными.Загрузка = Истина;
КонецЕсли;
Попытка
Если ПараметрыЗаписи.РежимЗаписи <> Неопределено Тогда
Объект.Записать(ПараметрыЗаписи.РежимЗаписи);
Иначе
Объект.Записать();
КонецЕсли;
Если ПараметрыЗаписи.ОбменДаннымиЗагрузка Тогда
Объект.ОбменДанными.Загрузка = Ложь;
КонецЕсли;
Возврат КлючЗаписи(Объект);
Исключение
ЮТРегистрацияОшибок.ДобавитьПояснениеОшибки(СтрШаблон("Не удалось записать объект `%1` (%2)", Объект, ТипЗнч(Объект)));
ВызватьИсключение;
КонецПопытки;
КонецФункции
Процедура ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных)
АнглийскийЯзык = ЮТОкружение.ИспользуетсяАнглийскийВстроенныйЯзык();
ИмяТипаДокумент = ?(АнглийскийЯзык, "Document", "Документ");
ИмяРеквизитаКод = ?(АнглийскийЯзык, "Code", "Код");
ИмяРеквизитаНаименование = ?(АнглийскийЯзык, "Description", "Наименование");
ОписаниеТипа = ОписаниеОбъектаМетаданных.ОписаниеТипа;
Если ОписаниеТипа.Имя = ИмяТипаДокумент Тогда
Если НЕ ЗначениеЗаполнено(Объект.Дата) Тогда
Объект.Дата = ТекущаяДатаСеанса();
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Объект.Номер) Тогда
Объект.УстановитьНовыйНомер();
КонецЕсли;
КонецЕсли;
УстановитьНовыйКод = ОписаниеОбъектаМетаданных.ОписаниеТипа.УстановитьНовыйКод
И ОписаниеОбъектаМетаданных.Реквизиты.Свойство(ИмяРеквизитаКод)
И ОписаниеОбъектаМетаданных.Реквизиты[ИмяРеквизитаКод].Обязательный
И Не ЗначениеЗаполнено(Объект.Код);
УстановитьНаименование = ОписаниеОбъектаМетаданных.Реквизиты.Свойство(ИмяРеквизитаНаименование)
И ОписаниеОбъектаМетаданных.Реквизиты[ИмяРеквизитаНаименование].Обязательный
И НЕ ЗначениеЗаполнено(Объект.Наименование);
Если УстановитьНовыйКод Тогда
Объект.УстановитьНовыйКод();
КонецЕсли;
Если УстановитьНаименование Тогда
РеквизитНаименование = ОписаниеОбъектаМетаданных.Реквизиты[ИмяРеквизитаНаименование];
Объект.Наименование = ЮТТестовыеДанные.Фикция(РеквизитНаименование.Тип);
КонецЕсли;
КонецПроцедуры
Функция КлючЗаписи(Объект)
ТипЗначения = ТипЗнч(Объект);
Если ЮТТипыДанныхСлужебный.ЭтоТипОбъекта(ТипЗначения) Тогда
Возврат Объект.Ссылка;
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоМенеджерЗаписи(ТипЗначения) Тогда
Описание = ЮТМетаданные.ОписаниеОбъектаМетаданных(Объект);
КлючевыеРеквизиты = Новый Структура();
Для Каждого Реквизит Из Описание.Реквизиты Цикл
Если Реквизит.Значение.ЭтоКлюч Тогда
КлючевыеРеквизиты.Вставить(Реквизит.Ключ, Объект[Реквизит.Ключ]);
КонецЕсли;
КонецЦикла;
Менеджер = ЮТОбщий.Менеджер(Описание);
Возврат Менеджер.СоздатьКлючЗаписи(КлючевыеРеквизиты);
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоТипНабораЗаписей(ТипЗначения) Тогда
КлючевыеРеквизиты = Новый Структура();
Для Каждого ЭлементОтбора Из Объект.Отбор Цикл
КлючевыеРеквизиты.Вставить(ЭлементОтбора.Имя, ЭлементОтбора.Значение);
КонецЦикла;
Менеджер = ЮТОбщий.Менеджер(Объект);
Возврат Менеджер.СоздатьКлючЗаписи(КлючевыеРеквизиты);
Иначе
Сообщение = ЮТИсключения.НеподдерживаемыйПараметрМетода("ЮТТестовыеДанныеВызовСервера.КлючЗаписи", Объект);
ВызватьИсключение Сообщение;
КонецЕсли;
КонецФункции
Функция ПараметрыЗаписи(ВходящиеПараметрыЗаписи = Неопределено)
Если ВходящиеПараметрыЗаписи = Неопределено Тогда
Возврат ЮТОбщий.ПараметрыЗаписи();
Иначе
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ЗаполнитьЗначенияСвойств(ПараметрыЗаписи, ВходящиеПараметрыЗаписи);
Возврат ПараметрыЗаписи;
КонецЕсли;
КонецФункции
Процедура ЗаполнитьНаборРегистра(Набор, ДанныеЗаписи)
Запись = Набор.Добавить();
ЗаполнитьЗначенияСвойств(Запись, ДанныеЗаписи);
Для Каждого ЭлементОтбора Из Набор.Отбор Цикл
ЭлементОтбора.Установить(Запись[ЭлементОтбора.Имя]);
КонецЦикла;
КонецПроцедуры
Процедура УдалитьСсылку(Значение, ОшибкиОбработки)
ТипЗначения = ТипЗнч(Значение);
Если Значение = Неопределено ИЛИ ЮТТипыДанныхСлужебный.ЭтоТипПеречисления(ТипЗначения) Тогда
Возврат;
КонецЕсли;
Попытка
Если ЮТТипыДанныхСлужебный.ЭтоТипОбъекта(ТипЗначения) Тогда
Если НЕ Значение.ЭтоНовый() Тогда
Значение.Прочитать();
Значение.Удалить();
КонецЕсли;
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ТипЗначения) Тогда
Объект = Значение.ПолучитьОбъект();
Если Объект <> Неопределено Тогда
Объект.Удалить();
КонецЕсли;
Иначе
Менеджер = ЮТОбщий.Менеджер(ТипЗначения);
Запись = Менеджер.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись, Значение);
Запись.Прочитать();
Запись.Удалить();
КонецЕсли;
Исключение
ОшибкиОбработки.Добавить(ЮТРегистрацияОшибокСлужебный.ПредставлениеОшибки("Удаление " + Значение, ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Функция ОписаниеБлокировки(Блокировка)
Описание = Новый Массив();
Для Каждого Элемент Из Блокировка Цикл
Описание.Добавить(ОписаниеЭлементаБлокировки(Элемент));
КонецЦикла;
Возврат Описание;
КонецФункции
Функция ОписаниеЭлементаБлокировки(ЭлементБлокировки)
Описание = Новый Структура;
Описание.Вставить("Область", ЭлементБлокировки.Область);
Описание.Вставить("Режим", ЭлементБлокировки.Режим);
Описание.Вставить("Поля", Новый Массив);
Для Каждого Поле Из ЭлементБлокировки.Поля Цикл
ОписаниеПоля = Новый Структура;
ОписаниеПоля.Вставить("Поле", Поле.Поле);
ОписаниеПоля.Вставить("Значение", Поле.Значение);
КонецЦикла;
Возврат Описание;
КонецФункции
#КонецОбласти

View File

@ -1850,7 +1850,7 @@
ПолноеОписаниеПроверки = ЮТСтроки.ДобавитьСтроку(Контекст.ПрефиксОшибки, ОписаниеПроверки, " ");
ПараметрыСообщенийОбОшибке = ЮТПредикатыСлужебныйКлиентСервер.ПараметрыСообщенийОбОшибке(ПолноеОписаниеПроверки,
,
"проверяемое значение",
Контекст.ОбъектПроверки.Представление);
Результат = ЮТПредикатыСлужебныйКлиентСервер.ПроверитьПредикаты(Контекст.ОбъектПроверки.Значение,
Предикат,

View File

@ -28,4 +28,10 @@
КонецПроцедуры
Процедура Инициализация(ПараметрыЗапуска) Экспорт
ПомощникТестированияВызовСервера.ПервичнаяНастройка();
КонецПроцедуры
#КонецОбласти

View File

@ -28,16 +28,10 @@
КонецПроцедуры
Процедура ПередКаждымТестом() Экспорт
ЮТКонтекстСлужебный.УстановитьЗначениеКонтекста("__ПараметрыЗапуска", ЮТКонтекстСлужебный.ПараметрыЗапуска());
КонецПроцедуры
Процедура ПослеКаждогоТеста() Экспорт
СохраненныеПараметрыЗапуска = ЮТКонтекстСлужебный.ЗначениеКонтекста("__ПараметрыЗапуска");
ЮТКонтекстСлужебный.УстановитьЗначениеКонтекста("КонтекстПараметрыЗапуска", СохраненныеПараметрыЗапуска);
КлиентскиеПараметрыЗапуска = ЮТКонтекстСлужебный.ПараметрыЗапуска();
ЮТКонтекстСлужебныйВызовСервера.УстановитьЗначениеКонтекста("КонтекстПараметрыЗапуска", КлиентскиеПараметрыЗапуска);
КонецПроцедуры
@ -142,9 +136,24 @@
ДеревоТестов = ДТОткрытиеФормСлужебныйВызовСервера.ТипыТестов();
ЮТест.ОжидаетЧто(ДеревоТестов, "Глобальная настройка")
.НеЗаполнено();
Если НЕ ЮТест.Окружение().ТолстыйКлиент Тогда
ЮТест.ОжидаетЧто(ДеревоТестов, "Глобальная настройка (Тонкий клиент)")
.НеЗаполнено();
Иначе
Утверждение = ЮТест.ОжидаетЧто(ДеревоТестов, "Глобальная настройка (Толстый клиент)")
.Заполнено()
.ИмеетДлину(1)
.Свойство("[0].ИмяКоллекции").Равно("Справочники")
.Свойство("[0].Объекты").ИмеетДлину(1)
.Свойство("[0].Объекты[0].Имя").Равно("Банки");
#Если ТолстыйКлиентОбычноеПриложение Тогда
Утверждение
.Свойство("[0].Объекты[0].ТипыТестов").ИмеетДлину(5);
#Иначе
Утверждение
.Свойство("[0].Объекты[0].ТипыТестов").ИмеетДлину(2);
#КонецЕсли
КонецЕсли;
// Для коллекции метаданных
БазоваяНастройка = БазоваяНастройка();
БазоваяНастройка.ДымовыеТесты.ОткрытиеФорм.Вставить("Документы", Новый Структура("УправляемыеФормы", Ложь));
@ -165,14 +174,14 @@
ДеревоТестов = ДТОткрытиеФормСлужебныйВызовСервера.ТипыТестов();
ЮТест.ОжидаетЧто(ДеревоТестов, "Настройка для объекта метаданных")
Утверждение = ЮТест.ОжидаетЧто(ДеревоТестов, "Настройка для объекта метаданных")
.Заполнено()
.Содержит(ЮТест.Предикат().Реквизит("ИмяКоллекции").Равно("Справочники"))
.Свойство("[0].Объекты")
.Содержит(ЮТест.Предикат().Реквизит("Имя").Равно("Валюты"))
.НеСодержит(ЮТест.Предикат().Реквизит("Имя").Равно("Банки"))
;
.Свойство("[0].Объекты");
Утверждение.Содержит(ЮТест.Предикат().Реквизит("Имя").Равно("Валюты"));
#Если ТонкийКлиент Тогда
Утверждение.НеСодержит(ЮТест.Предикат().Реквизит("Имя").Равно("Банки"));
#КонецЕсли
// Для переопределение настройки
БазоваяНастройка = БазоваяНастройка();
БазоваяНастройка.ДымовыеТесты.ОткрытиеФорм.Вставить("УправляемыеФормы", Ложь);
@ -278,7 +287,7 @@
Процедура УстановитьПараметрыДымовыхТестов(ПараметрыЗапуска)
ЮТКонтекстСлужебный.УстановитьЗначениеКонтекста("КонтекстПараметрыЗапуска", ПараметрыЗапуска);
ЮТКонтекстСлужебныйВызовСервера.УстановитьЗначениеКонтекста("КонтекстПараметрыЗапуска", ПараметрыЗапуска);
КонецПроцедуры
#КонецОбласти

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="1d679118-cd54-4ee6-804a-81fead23318c">
<name>ОМ_ДТОткрытиеФормСлужебныйВызовСервера</name>
<server>true</server>
<clientManagedApplication>true</clientManagedApplication>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -31,6 +31,9 @@
Процедура ЛомающийКонтекстТест() Экспорт
#Если ТолстыйКлиентУправляемоеПриложение Или ТолстыйКлиентОбычноеПриложение Тогда
ЮТест.Пропустить("На файловой базе не работает");
#КонецЕсли
ЮТест.ОжидаетЧто(ЮТКонтекстСлужебный.ДанныеКонтекста())
.ЭтоНеНеопределено();

View File

@ -21,22 +21,17 @@
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ДобавитьТест("ОписаниеОбъектаМетаданных")
.ДобавитьСерверныйТест("ОписаниеОбъектаМетаданных").СПараметрами(Истина)
.ДобавитьКлиентскийТест("ОписаниеОбъектаМетаданных").СПараметрами(Ложь)
.ДобавитьТест("РегистрыДвиженийДокумента")
.ДобавитьТест("НормализованноеИмяТаблицы")
;
КонецПроцедуры
Процедура ОписаниеОбъектаМетаданных() Экспорт
Процедура ОписаниеОбъектаМетаданных(НаСервере) Экспорт
#Если Сервер Тогда
ДляСервера = Истина;
#Иначе
ДляСервера = Ложь;
#КонецЕсли
Данные = ПомощникТестированияВызовСервера.ТестовыеДанныеДляОписаниеОбъектаМетаданных(ДляСервера);
Данные = ПомощникТестированияВызовСервера.ТестовыеДанныеДляОписаниеОбъектаМетаданных(НаСервере);
Для Каждого Значение Из Данные Цикл

View File

@ -24,9 +24,8 @@
.ДобавитьТест("Пауза")
.ДобавитьТест("ВывестиВКонсоль")
.ДобавитьТест("ЗначениеСвойства")
.ДобавитьТест("ОписаниеТиповЛюбаяСсылка")
.ДобавитьСерверныйТест("Менеджер")
.ДобавитьСерверныйТест("ЗначениеСвойства_Субконто")
.ДобавитьСерверныйТест("ЗначениеСвойства_Субконто").ВТранзакции()
;
КонецПроцедуры
@ -91,21 +90,12 @@
КонецПроцедуры
Процедура ОписаниеТиповЛюбаяСсылка() Экспорт
ЛюбаяСсылка = ЮТОбщий.ОписаниеТиповЛюбаяСсылка();
ЮТест.ОжидаетЧто(ЛюбаяСсылка)
.ИмеетТип("ОписаниеТипов")
.Что(ЛюбаяСсылка.СодержитТип(Тип("СправочникСсылка.Банки")));
КонецПроцедуры
#Если Сервер Тогда
Процедура ЗначениеСвойства_Субконто() Экспорт
Валюта = ЮТест.Данные().СоздатьЭлемент(Справочники.Валюты);
Счет = ЮТест.Данные().КонструкторОбъекта("ПланыСчетов.Основной")
.ФикцияОбязательныхПолей()
.Установить("Валютный", Истина)
.Установить("Количественный", Истина)
.ТабличнаяЧасть("ВидыСубконто")

View File

@ -164,17 +164,38 @@
Процедура ЗначенияРавны_ТабличныйДокумент() Экспорт
Макет1 = ЮТОбщий.Макет("ОбщийМакет.ЮТ_МакетТестовыхДанных");
Макет2 = ЮТОбщий.Макет("ОбщийМакет.ЮТ_МакетТестовыхДанных");
Равные = ЮТест.Варианты("Область1, Область2")
.Добавить("R2C1:R3C2", "R2C3:R3C4")
.Добавить("R2C1:R2C2", "R2C3:R2C4")
.Добавить("R4C2", "R4C6");
Макет3 = ЮТОбщий.Макет("ОбщийМакет.ЮТ_МакетТестовыхДанных.R2C1:R5C10");
Макет4 = ЮТОбщий.Макет("ОбщийМакет.ЮТ_МакетТестовыхДанных.R2C2:R5C11");
Для Каждого Вариант Из Равные.СписокВариантов() Цикл
Макет1 = ЮТОбщий.Макет("ОбщийМакет.ЮТ_СравнениеТабличныхДокументов." + Вариант.Область1);
Макет2 = ЮТОбщий.Макет("ОбщийМакет.ЮТ_СравнениеТабличныхДокументов." + Вариант.Область2);
Описание = СтрШаблон("Равные области: `%1` и `%2`", Вариант.Область1, Вариант.Область2);
ЮТест.ОжидаетЧто(Макет1, Описание)
.Равно(Макет2);
КонецЦикла;
ЮТест.ОжидаетЧто(Макет1, "Равные макеты")
.Равно(Макет2);
НеРавные = ЮТест.Варианты("Область1, Область2")
.Добавить("R1C1:R4C2", "R1C3:R4C4")
.Добавить("R1C1:R3C2", "R1C3:R3C4")
.Добавить("R2C1:R4C2", "R2C3:R4C4")
.Добавить("R1C2:R2C2", "R1C4:R2C4")
.Добавить("R1C2:R2C2", "R1C4:R2C4")
.Добавить("R1C2:R1C3", "R1C4:R1C5")
.Добавить("R4C2", "R4C4")
;
ЮТест.ОжидаетЧто(Макет3, "Разные макеты")
.НеРавно(Макет4);
Для Каждого Вариант Из НеРавные.СписокВариантов() Цикл
Макет1 = ЮТОбщий.Макет("ОбщийМакет.ЮТ_СравнениеТабличныхДокументов." + Вариант.Область1);
Макет2 = ЮТОбщий.Макет("ОбщийМакет.ЮТ_СравнениеТабличныхДокументов." + Вариант.Область2);
Описание = СтрШаблон("Разные области: `%1` и `%2`", Вариант.Область1, Вариант.Область2);
ЮТест.ОжидаетЧто(Макет1, Описание)
.НеРавно(Макет2);
КонецЦикла;
КонецПроцедуры

View File

@ -58,6 +58,7 @@
.СПараметрами("HTTPСервисЗапрос")
.СПараметрами("ОбъектXDTO")
.СПараметрами("ОбъектМетаданных")
.ДобавитьТест("ОписаниеТиповЛюбаяСсылка")
;
КонецПроцедуры
@ -111,6 +112,16 @@
КонецПроцедуры
Процедура ОписаниеТиповЛюбаяСсылка() Экспорт
ЛюбаяСсылка = ЮТОбщий.ОписаниеТиповЛюбаяСсылка();
ЮТест.ОжидаетЧто(ЛюбаяСсылка)
.ИмеетТип("ОписаниеТипов")
.Что(ЛюбаяСсылка.СодержитТип(Тип("СправочникСсылка.Банки")));
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -58,7 +58,7 @@
.ДобавитьТест("УказаниеПараметровПоУмолчанию")
.ДобавитьТест("ИмеетМетод")
.ДобавитьСерверныйТест("ПроверкаМетодаВТранзакции").ВТранзакции(Ложь)
.ДобавитьТест("ПроверкаМетодаВТранзакцииНаКлиенте", , , "КлиентУправляемоеПриложение")
.ДобавитьТест("ПроверкаМетодаВТранзакцииНаКлиенте", , , "КлиентУправляемоеПриложение").ВТранзакции(Ложь)
.ДобавитьСерверныйТест("СравнениеСложныхОбъектов")
.ДобавитьТест("ФормированиеСообщения")
.ДобавитьТест("НачинаетсяС")
@ -1847,6 +1847,9 @@
Процедура ПроверкаМетодаВТранзакцииНаКлиенте() Экспорт
#Если НЕ ТонкийКлиент Тогда
ЮТест.Пропустить("Только для тонкого клиента");
#КонецЕсли
ОшибкаИспользованияТранзакции = "Использование транзакции доступно только на сервере (толстом клиенте)";
Попытка

View File

@ -76,14 +76,11 @@
Процедура ПослеВсехТестов() Экспорт
ЮТест.Контекст().Значение("Коллекция").Добавить("ПослеВсехТестов");
#Если Клиент Тогда
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция"))
.ИмеетДлину(24); // Количество вызванных обработчиков событий
#Иначе
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция"))
.ИмеетДлину(26); // Количество вызванных обработчиков событий
#КонецЕсли
// Нелья точно понять сколько будет тестов для толстого клиента в файловом режиме
ЮТест.ОжидаетЧто(ЮТест.Контекст().Значение("Коллекция").Количество())
.ВСписке(ЮТКоллекции.ЗначениеВМассиве(24, 26));
КонецПроцедуры
Процедура Пропустить() Экспорт

View File

@ -1,6 +1,6 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
// Copyright 2021-2024 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@ -110,4 +110,11 @@
КонецПроцедуры
Процедура ПервичнаяНастройка() Экспорт
ИнициализироватьПредопределенныеДанные();
ОбновитьНумерациюОбъектов();
КонецПроцедуры
#КонецОбласти

View File

@ -0,0 +1,208 @@
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://v8.1c.ru/8.2/data/spreadsheet" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<languageSettings>
<currentLanguage>ru</currentLanguage>
<defaultLanguage>#</defaultLanguage>
<languageInfo>
<id>ru</id>
<code>Русский</code>
<description/>
</languageInfo>
</languageSettings>
<columns>
<size>6</size>
</columns>
<rowsItem>
<index>0</index>
<row>
<c>
<i>1</i>
<c>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>1</v8:content>
</v8:item>
</tl>
</c>
</c>
<c>
<i>3</i>
<c>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>11</v8:content>
</v8:item>
</tl>
</c>
</c>
<c>
<c>
<f>1</f>
</c>
</c>
<c>
<c>
<f>1</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>1</v8:content>
</v8:item>
</tl>
</c>
</c>
</row>
</rowsItem>
<rowsItem>
<index>1</index>
<row>
<c>
<i>1</i>
<c>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>2</v8:content>
</v8:item>
</tl>
</c>
</c>
<c>
<i>3</i>
<c>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>2</v8:content>
</v8:item>
</tl>
</c>
</c>
<c>
<c>
<f>1</f>
</c>
</c>
<c>
<c>
<f>1</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>2</v8:content>
</v8:item>
</tl>
</c>
</c>
</row>
</rowsItem>
<rowsItem>
<index>2</index>
<row>
<c>
<i>1</i>
<c>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>3</v8:content>
</v8:item>
</tl>
</c>
</c>
<c>
<i>3</i>
<c>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>3</v8:content>
</v8:item>
</tl>
</c>
</c>
<c>
<c>
<f>1</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>1</v8:content>
</v8:item>
</tl>
</c>
</c>
<c>
<c>
<f>1</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>3</v8:content>
</v8:item>
</tl>
</c>
</c>
</row>
</rowsItem>
<rowsItem>
<index>3</index>
<row>
<c>
<i>1</i>
<c>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>4</v8:content>
</v8:item>
</tl>
</c>
</c>
<c>
<i>3</i>
<c>
<f>0</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>44</v8:content>
</v8:item>
</tl>
</c>
</c>
<c>
<c>
<f>1</f>
</c>
</c>
<c>
<c>
<f>1</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>4</v8:content>
</v8:item>
</tl>
</c>
</c>
</row>
</rowsItem>
<templateMode>true</templateMode>
<defaultFormatIndex>1</defaultFormatIndex>
<height>4</height>
<vgRows>4</vgRows>
<format>
<width>72</width>
</format>
</document>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonTemplate xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="071892ea-a320-47ce-85f7-e06f7a9a1d75">
<name>ЮТ_СравнениеТабличныхДокументов</name>
<synonym>
<key>ru</key>
<value>Ю т сравнение табличных документов</value>
</synonym>
</mdclass:CommonTemplate>

View File

@ -24,6 +24,7 @@
</languages>
<subsystems>Subsystem.Тесты_ЮТПодключаемыеМодули</subsystems>
<commonTemplates>CommonTemplate.ЮТ_МакетТестовыхДанных</commonTemplates>
<commonTemplates>CommonTemplate.ЮТ_СравнениеТабличныхДокументов</commonTemplates>
<commonTemplates>CommonTemplate.ЮТ_ТестовыеДанныеMarkdown</commonTemplates>
<commonModules>CommonModule.Интеграция</commonModules>
<commonModules>CommonModule.НастройкаYAxUnit</commonModules>

View File

@ -1,90 +0,0 @@
FROM alpine:latest as downloader
ARG ONEC_USERNAME
ARG ONEC_PASSWORD
ARG ONEC_VERSION
ENV installer_type=server
ENV downloads=downloads/platform83/${ONEC_VERSION}
COPY ./scripts/download_og.sh /download_og.sh
WORKDIR /tmp
COPY ./distr ./${downloads}
RUN rm ./${downloads}/.gitkeep \
&& rm -rf ${downloads}/thin.client*.tar.gz \
&& rm -rf ${downloads}/client*.tar.gz \
&& rm -rf ${downloads}/1c_edt*.tar.gz \
&& if [ -z "$(ls -A ${downloads})" ]; then \
apk --no-cache add bash curl grep tar \
&& set -x \
&& sync; /download_og.sh; \
fi \
&& rm -rf ${downloads}/*thin*.tar.gz \
&& ls ${downloads} \
&& for file in ${downloads}/*.tar.gz; do tar -xzf "$file"; done \
&& rm -rf ${downloads}/*.*
FROM debian:bullseye-slim as base
ARG ONEC_VERSION
ENV installer_type=server
ARG gosu_ver=1.11
ARG nls_enabled=false
ENV nls=$nls_enabled
COPY ./scripts/install.sh /install.sh
COPY --from=downloader /tmp/*.* /tmp/
WORKDIR /tmp
SHELL ["/bin/bash", "-c"]
RUN ls . \
&& chmod +x /install.sh \
&& sync; /install.sh
# create symlink to current 1c:enterprise directory
COPY ./scripts/create-symlink-to-current-1cv8.sh /create-symlink-to-current-1cv8.sh
RUN chmod +x /create-symlink-to-current-1cv8.sh \
&& /create-symlink-to-current-1cv8.sh \
&& rm /create-symlink-to-current-1cv8.sh
ADD https://github.com/tianon/gosu/releases/download/$gosu_ver/gosu-amd64 /bin/gosu
RUN chmod +x /bin/gosu
FROM debian:bullseye-slim
LABEL maintainer="Anton Kvashenkin <anton.jugatsu@gmail.com> (@jugatsu)"
ARG onec_uid="999"
ARG onec_gid="999"
COPY --from=base /opt /opt
COPY --from=base /bin/gosu /bin/gosu
RUN set -xe \
&& apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
locales \
imagemagick \
fontconfig \
&& rm -rf \
/var/lib/apt/lists/* \
/var/cache/debconf \
&& localedef -i ru_RU -c -f UTF-8 -A /usr/share/locale/locale.alias ru_RU.UTF-8
ENV LANG ru_RU.UTF-8
RUN groupadd -r grp1cv8 --gid=$onec_gid \
&& useradd -r -g grp1cv8 --uid=$onec_uid --home-dir=/home/usr1cv8 --shell=/bin/bash usr1cv8 \
&& mkdir -p /var/log/1C /home/usr1cv8/.1cv8/1C/1cv8/conf /opt/1cv8/current/conf \
&& chown -R usr1cv8:grp1cv8 /var/log/1C /home/usr1cv8
VOLUME /home/usr1cv8/.1cv8 /var/log/1C
COPY ./server/logcfg.xml /home/usr1cv8/.1cv8/1C/1cv8/conf
COPY ./server/logcfg.xml /opt/1cv8/current/conf
COPY ./server/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 1540 1541 1545 1560
CMD ["ragent"]

View File

@ -0,0 +1,2 @@
export EDT_VERSION=2023.3.5+10
export ONEC_VERSION=8.3.21.1895

View File

@ -0,0 +1,90 @@
# Создан на основании https://github.com/firstBitMarksistskaya/onec-docker/blob/feature/first-bit/server/Dockerfile
# Начало основной стадии сборки
FROM ubuntu:20.04 as installer
# Копируем скрипты и файлы установки
ARG ONEC_VERSION
ARG gosu_ver=1.11
ARG nls_enabled=false
ENV nls=$nls_enabled
ENV installer_type=server
# Установка зависимостей и настройка локали
RUN apt-get update \
&& apt-get install -yq \
procps \
tzdata \
debconf-utils \
curl \
fontconfig \
unixodbc \
ttf-mscorefonts-installer \
libgsf-1-114 \
keyboard-configuration \
&& dpkg-reconfigure -f noninteractive tzdata \
&& dpkg-reconfigure -f noninteractive keyboard-configuration \
&& apt-get install -yq geoclue-2.0 gstreamer1.0-plugins-bad \
&& export LANG=ru_RU.UTF-8
COPY ./scripts/install_new.sh /install.sh
COPY ./distr/current /tmp
WORKDIR /tmp
RUN ls -ona \
&& chmod +x /install.sh \
&& sync; /install.sh
# Создание символической ссылки на текущую директорию 1C
COPY ./scripts/create-symlink-to-current-1cv8.sh /create-symlink-to-current-1cv8.sh
RUN chmod +x /create-symlink-to-current-1cv8.sh \
&& /create-symlink-to-current-1cv8.sh \
&& rm /create-symlink-to-current-1cv8.sh
# Установка gosu
ADD https://github.com/tianon/gosu/releases/download/$gosu_ver/gosu-amd64 /bin/gosu
RUN chmod +x /bin/gosu
# Переход к финальному образу
FROM ubuntu:20.04
LABEL maintainer="ivanov egor"
# Создание пользователя и установка локали
ARG onec_uid="999"
ARG onec_gid="999"
COPY --from=installer /opt/1cv8 /opt/1cv8
COPY --from=installer /bin/gosu /bin/gosu
RUN set -xe \
&& apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
locales \
iproute2 \
imagemagick \
fontconfig \
ca-certificates \
&& rm -rf /var/lib/apt/lists/* /var/cache/debconf \
&& localedef -i ru_RU -c -f UTF-8 -A /usr/share/locale/locale.alias ru_RU.UTF-8
ENV LANG ru_RU.UTF-8
# Настройка группы и пользователя
RUN groupadd -r grp1cv8 --gid=$onec_gid \
&& useradd -r -g grp1cv8 --uid=$onec_uid --home-dir=/home/usr1cv8 --shell=/bin/bash usr1cv8 \
&& mkdir -p /var/log/1C /home/usr1cv8/.1cv8/1C/1cv8/conf /opt/1cv8/current/conf \
&& chown -R usr1cv8:grp1cv8 /var/log/1C /home/usr1cv8
# Копирование конфигурационных файлов
COPY ./conf.cfg /home/usr1cv8/.1cv8/1C/1cv8/conf
COPY ./conf.cfg /opt/1cv8/current/conf
# Установка точки входа и выполнение дополнительных настроек
COPY ./docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
RUN apt-get update && apt-get install -yq procps
RUN chmod +x /opt/1cv8/current/ragent
# Настройка точки входа и экспонирование портов
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
EXPOSE 1540 1541 1545 1560
CMD ["ragent"]

View File

@ -0,0 +1,11 @@
WORK_PATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
source $WORK_PATH/../../.env
rm -rf $WORK_PATH/distr/current/*
cp -r $WORK_PATH/distr/$ONEC_VERSION/* $WORK_PATH/distr/current/
docker build \
-t onec-server:$ONEC_VERSION \
-f $WORK_PATH/Dockerfile \
$WORK_PATH/

View File

@ -0,0 +1 @@
DisableUnsafeActionProtection=.*

View File

@ -0,0 +1,67 @@
#!/bin/bash
# Установка значений по умолчанию
setup_defaults() {
DEFAULT_PORT=1540
DEFAULT_REGPORT=1541
DEFAULT_RANGE=1560:1591
DEFAULT_SECLEVEL=0
DEFAULT_PINGPERIOD=1000
DEFAULT_PINGTIMEOUT=5000
DEFAULT_DEBUG=-tcp
DEFAULT_DEBUGSERVERPORT=1550
DEFAULT_RAS_PORT=1545
}
# Настройка команды запуска ragent
setup_ragent_cmd() {
RAGENT_CMD="gosu usr1cv8 /opt/1cv8/current/ragent"
RAGENT_CMD+=" /port ${PORT:-$DEFAULT_PORT}"
RAGENT_CMD+=" /regport ${REGPORT:-$DEFAULT_REGPORT}"
RAGENT_CMD+=" /range ${RANGE:-$DEFAULT_RANGE}"
RAGENT_CMD+=" /seclev ${SECLEVEL:-$DEFAULT_SECLEVEL}"
RAGENT_CMD+=" /d ${D:-/home/usr1cv8/.1cv8}"
RAGENT_CMD+=" /pingPeriod ${PINGPERIOD:-$DEFAULT_PINGPERIOD}"
RAGENT_CMD+=" /pingTimeout ${PINGTIMEOUT:-$DEFAULT_PINGTIMEOUT}"
RAGENT_CMD+=" /debug ${DEBUG:-$DEFAULT_DEBUG}"
[ -n "$DEBUGSERVERADDR" ] && RAGENT_CMD+=" /debugServerAddr $DEBUGSERVERADDR"
RAGENT_CMD+=" /debugServerPort ${DEBUGSERVERPORT:-$DEFAULT_DEBUGSERVERPORT}"
[ -n "$DEBUGSERVERPWD" ] && RAGENT_CMD+=" /debugServerPwd $DEBUGSERVERPWD"
}
# Настройка команды запуска ras
setup_ras_cmd() {
RAS_CMD="gosu usr1cv8 /opt/1cv8/current/ras cluster --daemon"
RAS_CMD+=" --port ${RAS_PORT:-$DEFAULT_RAS_PORT}"
RAS_CMD+=" localhost:${PORT:-$DEFAULT_PORT}"
}
# Изменение прав доступа к директории пользователя
change_directory_permissions() {
chown -R usr1cv8:grp1cv8 /home/usr1cv8
}
# Главная функция скрипта
main() {
setup_defaults
change_directory_permissions
if [ "$1" = "ragent" ]; then
setup_ragent_cmd
setup_ras_cmd
echo "Запускаем ras с необходимыми параметрами"
echo "Выполняемая команда: $RAS_CMD"
$RAS_CMD 2>&1 & # Запуск ras в фоновом режиме
echo "Запускаем ragent с необходимыми параметрами"
echo "Выполняемая команда: $RAGENT_CMD"
exec $RAGENT_CMD 2>&1
else
# Если первый аргумент не 'ragent', выполняем команду, переданную в аргументах
"$@"
fi
}
# Вызов главной функции
main "$@"

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="/var/log/1C" history="1">
<event>
<eq property="name" value="excp"/>
</event>
<property name="all"/>
</log>
</config>

View File

@ -0,0 +1,7 @@
#!/bin/bash
set -e
platform_path=$(find / -type f -name "1cv8c" -exec dirname {} \; -or -type f -name "1cv8" -exec dirname {} \; -or -type f -name "ragent" -exec dirname {} \; -or -type f -name "crserver" -exec dirname {} \; | uniq)
mkdir -p /opt/1cv8 \
&& ln -s $platform_path /opt/1cv8/current

View File

@ -0,0 +1,72 @@
#!/bin/bash
if [ -z "$ONEC_USERNAME" ]
then
echo "ONEC_USERNAME not set"
exit 1
fi
if [ -z "$ONEC_PASSWORD" ]
then
echo "ONEC_PASSWORD not set"
exit 1
fi
if [ -z "$ONEC_VERSION" ]
then
echo "ONEC_VERSION not set"
exit 1
fi
ONEC_RELEASE=`echo $ONEC_VERSION | cut -d . -f 3`
echo "Release: "$ONEC_RELEASE
echo "Downloading Oneget tool from https://github.com/firstBitMarksistskaya/oneget"
curl -L -o oneget.tar.gz https://github.com/firstBitMarksistskaya/oneget/releases/latest/download/oneget_Linux_x86_64.tar.gz \
&& mkdir /tmp/oneget_tool \
&& tar xzf oneget.tar.gz -C /tmp/oneget_tool \
&& rm oneget.tar.gz
if [ ! -f /tmp/oneget_tool/oneget ]; then
echo "Oneget not found!"
exit 1
fi
if [[ "$ONEC_RELEASE" -lt "20" ]]; then
package="deb"
package_installer_type="."$installer_type
else
package="linux"
package_installer_type=""
fi
case "$installer_type" in
edt)
echo "EDT"
/tmp/oneget_tool/oneget get "edt:linux@"$ONEC_VERSION
;;
server)
/tmp/oneget_tool/oneget get "platform:"$package$package_installer_type".x64@"$ONEC_VERSION
;;
server32)
/tmp/oneget_tool/oneget get "platform:"$package${package_installer_type/32/}".x32@"$ONEC_VERSION
;;
client)
if [[ "$ONEC_RELEASE" -lt "20" ]]; then
/tmp/oneget_tool/oneget get "platform:"$package".server.x64@"$ONEC_VERSION
fi
/tmp/oneget_tool/oneget get "platform:"$package$package_installer_type".x64@"$ONEC_VERSION
;;
client32)
if [[ "$ONEC_RELEASE" -lt "20" ]]; then
/tmp/oneget_tool/oneget get "platform:"$package".server.x32@"$ONEC_VERSION
fi
/tmp/oneget_tool/oneget get "platform:"$package${package_installer_type/32/}".x32@"$ONEC_VERSION
;;
thin-client)
/tmp/oneget_tool/oneget get "platform:"$package"."$installer_type".x64@"$ONEC_VERSION
;;
thin-client32)
/tmp/oneget_tool/oneget get "platform:"$package"."${installer_type/32/}".x32@"$ONEC_VERSION
esac

View File

@ -0,0 +1,234 @@
#!/bin/bash
# Аргументы скрипта
ONEC_USERNAME=$1
ONEC_PASSWORD=$2
ONEC_VERSION=$3
installer_type=$4
if [ "$installer_type" = "edt" ]; then
FOLDER_NAME="DevelopmentTools10"
else
FOLDER_NAME="Platform83"
fi
DOWNLOADS_PATH=/tmp/downloads/${FOLDER_NAME}/${ONEC_VERSION}
# Преобразование версии для различных целей
ONEC_VERSION_DOTS=$ONEC_VERSION
ONEC_VERSION_UNDERSCORES=$(echo $ONEC_VERSION_DOTS | sed 's/\./\_/g')
ESCAPED_VERSION=$(echo $ONEC_VERSION_DOTS | sed 's/\./\\./g')
# Поищем дистрибутив в папке distr и если он есть скопируем его куда надо и распакуем
copy_distr_to_downloads_path() {
found=1
found_run_file=1
case "$installer_type" in
edt)
local edt_pattern="1c_edt_distr_offline_${ONEC_VERSION}_*_linux_x86_64.tar.gz"
# Ищем файлы, соответствующие шаблону
local matching_files=($(ls /distr/$edt_pattern 2> /dev/null))
if [ ${#matching_files[@]} -gt 0 ]; then
local edt_filename=${matching_files[0]}
echo "Найден локальный дистрибутив: $edt_filename"
cp $edt_filename $DOWNLOADS_PATH/
found=0
else
echo "Локального дистрибутива edt не найдено в папке distr"
fi
;;
server)
local file_name_srv="deb64_$ONEC_VERSION_UNDERSCORES.tar.gz"
local file_name_platform="server64_$ONEC_VERSION_UNDERSCORES.tar.gz"
local file_name_run="setup-full-$ONEC_VERSION_DOTS-x86_64.run"
if [ -f "/distr/$file_name_srv" ]; then
echo "Найден локальный дистрибутив: $file_name_srv"
cp /distr/$file_name_srv $DOWNLOADS_PATH/
found=0
elif [ -f "/distr/$file_name_platform" ]; then
echo "Найден локальный дистрибутив: $file_name_platform"
cp /distr/$file_name_platform $DOWNLOADS_PATH/
found=0
elif [ -f "/distr/$file_name_run" ]; then
echo "Найден локальный дистрибутив: $file_name_run"
cp /distr/$file_name_run $DOWNLOADS_PATH/
found=0
found_run_file=0
fi
;;
server32)
local file_name_srv="deb_$ONEC_VERSION_UNDERSCORES.tar.gz"
local file_name_platform="server32_$ONEC_VERSION_UNDERSCORES.tar.gz"
if [ -f "/distr/$file_name_srv" ]; then
echo "Найден локальный дистрибутив: $file_name_srv"
cp /distr/$file_name_srv $DOWNLOADS_PATH/
found=0
elif [ -f "/distr/$file_name_platform" ]; then
echo "Найден локальный дистрибутив: $file_name_platform"
cp /distr/$file_name_platform $DOWNLOADS_PATH/
found=0
fi
;;
client)
local file_name_deb="client_$ONEC_VERSION_UNDERSCORES.deb64.tar.gz"
local file_name_platform="server64_$ONEC_VERSION_UNDERSCORES.tar.gz"
local file_name_run="setup-full-$ONEC_VERSION_DOTS-x86_64.run"
if [ -f "/distr/$file_name_deb" ]; then
echo "Найден локальный дистрибутив: $file_name_deb"
cp /distr/$file_name_deb $DOWNLOADS_PATH/
found=0
elif [ -f "/distr/$file_name_platform" ]; then
echo "Найден локальный дистрибутив: $file_name_platform"
cp /distr/$file_name_platform $DOWNLOADS_PATH/
found=0
elif [ -f "/distr/$file_name_run" ]; then
echo "Найден локальный дистрибутив: $file_name_run"
cp /distr/$file_name_run $DOWNLOADS_PATH/
found=0
found_run_file=0
fi
;;
esac
if [ $found -eq 0 ] && [ $found_run_file -eq 1 ] ; then
# Распаковка скачанных файлов (если такие есть)
for file in $DOWNLOADS_PATH/*.tar.gz; do
tar -xzf "$file" -C $DOWNLOADS_PATH
rm -f "$file"
done
fi
return $found
}
check_local_distr() {
copy_distr_to_downloads_path
found=$?
if [ $found -ne 0 ]; then
return $found
fi
check_file
local_distr_found=$?
return $local_distr_found
}
# Функция для скачивания дистрибутива
download_distr() {
local distr_filter=$1
echo "Попытка скачать дистрибутив с фильтром: $distr_filter"
yard releases -u $ONEC_USERNAME -p $ONEC_PASSWORD get \
--app-filter "$APP_FILTER" \
--version-filter $ESCAPED_VERSION \
--path /tmp/downloads \
--distr-filter "$distr_filter" \
--download-limit 1
}
# Функция проверки наличия нужных файлов после распаковки
check_file() {
found=1
# Проверяем, появились ли файлы в каталоге
if [ "$installer_type" = "edt" ]; then
# Для edt проверяем наличие специфичного файла
if ls $DOWNLOADS_PATH/1ce-installer-cli 1> /dev/null 2>&1; then
echo "Дистрибутив найден и скачан: $filter"
found=0
else
echo "Не найден файл 1ce-installer-cli"
echo "Содержимое каталога $DOWNLOADS_PATH:"
ls -l $DOWNLOADS_PATH
fi
elif ls $DOWNLOADS_PATH/*.deb 1> /dev/null 2>&1 || ls $DOWNLOADS_PATH/*.run 1> /dev/null 2>&1; then
echo "Дистрибутив найден и скачан: $filter"
found=0
else
echo "Не найден дистрибутив по шаблону: $filter"
fi
return $found
}
# Попытка скачивания дистрибутива для каждого фильтра
try_download() {
# Определим фильтры для скачивания. Если шаблонов >1 они должны разделяться "|" Скачивается дистрибутив по первому найденному шаблону.
APP_FILTER="Технологическая платформа *8\.3"
case "$installer_type" in
edt)
echo "Скачиваем дистрибутив EDT"
APP_FILTER="1C:Enterprise Development Tools"
DISTR_FILTERS="Дистрибутив для оффлайн установки 1C:EDT для ОС Linux 64 бит|Дистрибутив 1C:EDT для ОС Linux для установки без интернета"
;;
server)
echo "Скачиваем дистрибутив для установки 64-битного сервера"
DISTR_FILTERS="Технологическая платформа 1С:Предприятия \(64\-bit\) для Linux$|Сервер 1С:Предприятия \(64\-bit\) для DEB-based Linux-систем$"
;;
server32)
echo "Скачиваем дистрибутив для установки 32-битного сервера"
DISTR_FILTERS="Технологическая платформа 1С:Предприятия для Linux$|Сервер 1С:Предприятия для DEB-based Linux-систем$"
;;
client)
echo "Скачиваем дистрибутив для установки 64-битного клиента 1с"
DISTR_FILTERS="Технологическая платформа 1С:Предприятия \(64\-bit\) для Linux$|Клиент 1С:Предприятия \(64\-bit\) для DEB-based Linux-систем$"
;;
client32)
echo "Скачиваем дистрибутив для установки 32-битного клиента 1с"
DISTR_FILTERS="Технологическая платформа 1С:Предприятия для Linux$|Клиент 1С:Предприятия для DEB-based Linux-систем$"
;;
thin-client)
echo "Скачиваем дистрибутив для установки 32-битного тонкого клиента 1с"
DISTR_FILTERS="Тонкий клиент 1С:Предприятия \(64\-bit\) для DEB-based Linux-систем$|Тонкий клиент 1С:Предприятия \(64\-bit\) для Linux$"
;;
thin-client32)
echo "Скачиваем дистрибутив для установки 32-битного тонкого клиента 1с"
DISTR_FILTERS="Тонкий клиент 1С:Предприятия для DEB-based Linux-систем$|Тонкий клиент 1С:Предприятия для Linux$"
;;
esac
echo $DISTR_FILTERS
local download_success=1
IFS='|'
read -ra FILTERS <<< "$DISTR_FILTERS"
for filter in "${FILTERS[@]}"; do
download_distr "$filter"
check_file
download_success=$?
if [ $download_success -eq 0 ]; then
break
fi
done
return $download_success
}
# Удаление ненужных файлов
mkdir -p $DOWNLOADS_PATH
rm -f $DOWNLOADS_PATH/.gitkeep
chmod 777 -R /tmp
# Проверяем, есть ли дистрибутивы локально
check_local_distr
local_distr_found=$?
if [ $local_distr_found -ne 0 ]; then
echo "Скачаных дистрибутивов не найдено. Попытаемся скачать через yard."
if [ "$ONEC_VERSION" = "8.3.24.1342" ] || [ "$ONEC_VERSION" = "8.3.24.1368" ]; then
echo "Ошибка: Скачивание версии 8.3.24.1342 и 8.3.24.1368 не поддерживается. Скачайте и распакуйте релиз самостоятельно, и поместите его в папку distr"
exit 1
else
echo "Версия 1с: $ONEC_VERSION"
fi
try_download
download_attempted=$?
if [ $download_attempted -ne 0 ]; then
echo "Ошибка: не удалось найти дистрибутив ни локально, ни удаленно."
exit 1
fi
fi

View File

@ -0,0 +1,78 @@
#!/bin/bash
ONEC_RELEASE=`echo $ONEC_VERSION | cut -d . -f 3`
echo "Release: "$ONEC_RELEASE
nls_install="ru"
if [[ "$ONEC_RELEASE" -lt "20" ]]; then
case "$installer_type" in
edt)
echo "edt"
;;
server)
if [ "$nls" = true ]; then \
dpkg -i 1c-enterprise*-{common,server}*.deb; \
else \
dpkg -i 1c-enterprise*-{common,server}_*.deb; \
fi
;;
server32)
if [ "$nls" = true ]; then \
dpkg -i 1c-enterprise*-{common,server,ws,crs}*.deb; \
else \
dpkg -i 1c-enterprise*-{common,server,ws,crs}_*.deb; \
fi
;;
client)
if [ "$nls" = true ]; then \
dpkg -i 1c-enterprise*-{common,server}_*.deb; \
dpkg -i 1c-enterprise*-{common,client}*.deb; \
else \
dpkg -i 1c-enterprise*-{common,server,client}_*.deb; \
fi
;;
client32)
;;
thin-client)
if [ "$nls" = true ]; then \
dpkg -i 1c-enterprise83-thin-client*.deb; \
else \
dpkg -i 1c-enterprise83-thin-client_*.deb; \
fi
;;
thin-client32)
curl --fail -b /tmp/cookies.txt -o thin-client32.tar.gz -L "$THINCLIENT32LINK"
esac
else
if [ "$nls" = true ]; then
nls_install="az,ar,hy,bg,hu,el,vi,ka,kk,zh,it,es,lv,lt,de,pl,ro,ru,tr,tk,fr,uk"
else
nls_install="ru"
fi
case "$installer_type" in
edt)
echo "edt"
;;
server)
set -x
echo $nls_install
./setup-full-${ONEC_VERSION}-x86_64.run --mode unattended --enable-components server,ws,$nls_install
;;
server32)
./setup-full-${ONEC_VERSION}-i386.run --mode unattended --enable-components server,ws,config_storage_server,$nls_install
;;
client)
./setup-full-${ONEC_VERSION}-x86_64.run --mode unattended --enable-components server,client_full,$nls_install
;;
client32)
./setup-full-${ONEC_VERSION}-i386.run --mode unattended --enable-components server,client_full,$nls_install
;;
thin-client)
./setup-thin-${ONEC_VERSION}-x86_64.run --mode unattended --enable-components ru
;;
thin-client32)
./setup-thin-${ONEC_VERSION}-i386.run --mode unattended --enable-components ru
;;
esac
fi

View File

@ -0,0 +1,94 @@
#!/bin/bash
# Установка из .deb пакетов
install_from_deb() {
case "$installer_type" in
server)
if [ "$nls" = true ]; then
dpkg -i 1c-enterprise*-{common,server}*.deb
else
dpkg -i 1c-enterprise*-{common,server}_*.deb
fi
;;
server_crs)
if [ "$nls" = true ]; then
dpkg -i "1c-enterprise*-{common,server,ws,crs}*.deb"
else
dpkg -i "1c-enterprise*-{common,server,ws,crs}_*.deb"
fi
;;
client)
if [ "$nls" = true ]; then
dpkg -i "1c-enterprise*-{common,server,client}*.deb"
else
dpkg -i "1c-enterprise*-{common,server,client}_*.deb"
fi
;;
thin-client)
if [ "$nls" = true ]; then
dpkg -i "1c-enterprise83-thin-client*.deb"
else
dpkg -i "1c-enterprise83-thin-client_*.deb"
fi
;;
esac
}
# Установка из .run файла
install_from_run() {
local run_components=""
local run_file=$(ls *.run | head -1)
if [ -z "$run_file" ]; then
echo "Не найден файл установки .run"
exit 1
fi
chmod +x "$run_file"
if [ "$nls" = true ]; then
nls_install="az,ar,hy,bg,hu,el,vi,ka,kk,zh,it,es,lv,lt,de,pl,ro,ru,tr,tk,fr,uk"
else
nls_install="ru"
fi
case "$installer_type" in
server)
run_components="server,ws,config_storage_server,$nls_install"
;;
server_crs)
run_components="server,ws,config_storage_server,$nls_install"
;;
client)
run_components="server,client_full,$nls_install"
;;
client32)
run_components="server,client_full,$nls_install"
;;
thin-client)
run_components="ru"
;;
thin-client32)
run_components="ru"
;;
esac
if [ -n "$run_components" ]; then
./"$run_file" --mode unattended --enable-components $run_components
else
echo "Не указаны компоненты для установки"
exit 1
fi
}
# Определяем, есть ли .deb файлы
if ls *.deb 1> /dev/null 2>&1; then
echo "Установка из .deb пакетов"
install_from_deb
elif ls *.run 1> /dev/null 2>&1; then
echo "Установка из .run файла"
install_from_run
else
echo "Не найдены файлы установки"
exit 1
fi

View File

@ -0,0 +1,8 @@
#!/bin/bash
set -e
FILE=/usr/share/ca-certificates/mozilla/DST_Root_CA_X3.crt
if [[ -f "$FILE" ]]; then
rm -r $FILE
update-ca-certificates
fi

View File

@ -1,6 +1,6 @@
services:
onec-server:
image: onec-server:${echo }
image: onec-server:${ONEC_VERSION}
container_name: onec-server
restart: always
depends_on:

Binary file not shown.

View File

@ -0,0 +1,30 @@
CONNECTION_STRING=$1
JOB_NAME=$2
BASE_ARGUMENTS="$CONNECTION_STRING /DisableStartupDialogs /DisableStartupMessages /Out $TMP_PATH/$JOB_NAME.log"
DESIGNER_COMMAND="$ONEC_PATH/1cv8 DESIGNER $BASE_ARGUMENTS"
echo "=========== Загрузка конфигурации ($JOB_NAME)"
$DESIGNER_COMMAND /LoadCfg $BINARY_PATH/configuration.cf /UpdateDBCfg
SUCCESS=$?
cat $TMP_PATH/$JOB_NAME.log
EXTENSIONS_SET=("smoke" "tests" "yaxunit")
for key in "${EXTENSIONS_SET[@]}";do
if [[ $SUCCESS -eq 0 ]]; then
echo "=========== Загрузка расширения $key ($JOB_NAME)"
$DESIGNER_COMMAND /LoadCfg $BINARY_PATH/$key.cfe -Extension $key /UpdateDBCfg
SUCCESS=$?
cat $TMP_PATH/$JOB_NAME.log
fi
done
if [[ $SUCCESS -eq 0 ]]; then
echo "=========== Снятие безопасного режима ($JOB_NAME)"
$ONEC_PATH/1cv8 ENTERPRISE $BASE_ARGUMENTS /Execute $LIB_PATH/DisableSafeMode.epf
SUCCESS=$?
cat $TMP_PATH/$JOB_NAME.log
fi
exit $SUCCESS

View File

@ -0,0 +1,16 @@
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
function print_success {
echo -e "${GREEN}#${NC} $1"
}
function print_error {
echo -e "${RED}#${NC} $1"
}
function print_warn {
echo -e "${YELLOW}#${NC} $1"
}

View File

@ -0,0 +1,38 @@
. $LIB_PATH/print.sh
MODE=$1
CONNECTION_STRING=$2
JOB_NAME=$3
CONFIG=$TMP_PATH/yaxunit-config-$JOB_NAME.json
case "$MODE" in
"Ordinary" ) APP=1cv8; RUN_MODE="/RunModeOrdinaryApplication";;
"Thick" ) APP=1cv8; RUN_MODE="/RunModeManagedApplication";;
"Thin" ) APP=1cv8c;;
esac
cat >$CONFIG <<EOL
{
"reportFormat": "jUnit",
"reportPath": "$RESULT_PATH/report-$JOB_NAME.xml",
"closeAfterTests": true,
"exitCode": "$RESULT_PATH/exit-code-$JOB_NAME.txt",
"projectPath": "$ROOT_PATH",
"logging": {
"console": false
}
}
EOL
echo "=========== Тестирование $JOB_NAME"
$ONEC_PATH/$APP ENTERPRISE $CONNECTION_STRING /DisableSplash /DisableStartupDialogs /DisableStartupMessages $RUN_MODE /C "RunUnitTests=$CONFIG"
RESULT=$(head -n 1 $RESULT_PATH/exit-code-$JOB_NAME.txt)
RESULT=${RESULT:1:1}
if [[ "$RESULT" == "0" ]]; then
print_success "Тестирование $JOB_NAME завершилось успешно"
else
print_error "Тестирование $JOB_NAME завершилось с ошибкой"
fi

View File

@ -0,0 +1,38 @@
TEMP_DB_PATH=$TMP_PATH/file-db
rm -rf $TEMP_DB_PATH/*
extensions=("smoke" "tests" "yaxunit")
configuration_exists=0
if [[ -f $BINARY_PATH/configuration.cf ]]; then
configuration_exists=1
echo " Сборка конфигурации не требуется"
fi
extensions_set=()
for key in "${extensions[@]}";do
if [[ -f $BINARY_PATH/$key.cfe ]]; then
echo " Сборка $key не требуется"
else
extensions_set+=($key)
fi
done
if [[ ${#extensions_set[@]} -eq 0 && $configuration_exists -eq 1 ]]; then
exit 0
fi
echo " Создание информационной базы"
$ONEC_PATH/ibcmd infobase create --db-path=$TEMP_DB_PATH --import=$EXPORT_PATH/configuration --apply --force
if [[ $configuration_exists -eq 0 ]]; then
echo " Сохрание тестовой конфигурации"
$ONEC_PATH/ibcmd infobase config save --db-path=$TEMP_DB_PATH $BINARY_PATH/configuration.cf
fi
for key in "${extensions_set[@]}";do
echo " Импорт расширения $key"
$ONEC_PATH/ibcmd infobase config import --db-path=$TEMP_DB_PATH --extension=$key $EXPORT_PATH/$key
echo " Сохрание расширения $key"
$ONEC_PATH/ibcmd infobase config save --db-path=$TEMP_DB_PATH --extension=$key $BINARY_PATH/$key.cfe
done

View File

@ -0,0 +1,24 @@
PROJECT_NAME=$1
PROJECT_PATH=$2
. $LIB_PATH/print.sh
function calc_hash {
find $1 -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum
}
hash_file_name=$EXPORT_PATH/$PROJECT_NAME.hash
current_hash=$(calc_hash $ROOT_PATH/$PROJECT_PATH/src);current_hash=${current_hash:0:40}
if [ -f $hash_file_name ]; then
old_hash=$(head -n 1 $hash_file_name)
fi
if [[ "$current_hash" != "$old_hash" ]]; then
print_warn "$PROJECT_NAME, исходники изменены. Будет выполнена сбора"
rm -rf $EXPORT_PATH/$PROJECT_NAME
rm -rf $BINARY_PATH/$PROJECT_NAME.*
echo $current_hash>$hash_file_name
else
print_success "$PROJECT_NAME, исходники не изменены. Будут использованы существующие артефакты"
fi

View File

@ -0,0 +1,9 @@
PROJECT_NAME=$1
PROJECT_PATH=$2
if [[ -d $EXPORT_PATH/$PROJECT_NAME ]]; then
echo " Конвертация $PROJECT_NAME не требуется"
else
echo " Конвертация $PROJECT_NAME"
$EDT_PATH/1cedtcli -data $TMP_PATH/ws -timeout 300 -command export --configuration-files $EXPORT_PATH/$PROJECT_NAME --project $ROOT_PATH/$PROJECT_PATH
fi

View File

@ -0,0 +1,14 @@
MODE=$1
JOB_NAME=${MODE}Application-File
TEST_DB_PATH=$DB_PATH/$MODE
CONNECTION_STRING=/F$TEST_DB_PATH
rm -rf $TEST_DB_PATH
echo "=========== Создание информационной базы ($JOB_NAME)"
$ONEC_PATH/1cv8 CREATEINFOBASE File=$TEST_DB_PATH /DisableStartupDialogs /DisableStartupMessages /Out $TMP_PATH/$JOB_NAME.log
cat $TMP_PATH/$JOB_NAME.log
if $LIB_PATH/prepare-db.sh $CONNECTION_STRING $JOB_NAME; then
$LIB_PATH/run-tests.sh $MODE $CONNECTION_STRING $JOB_NAME
fi

View File

@ -0,0 +1,12 @@
MODE=$1
JOB_NAME=${MODE}Application-Server
DB_NAME=DB_${MODE}Application
CONNECTION_STRING=/S\"localhost\\$DB_NAME\"
echo "=========== Создание информационной базы ($JOB_NAME)"
$ONEC_PATH/1cv8 CREATEINFOBASE Srvr=localhost\;Ref=$DB_NAME\;DBMS=PostgreSQL\;DBSrvr=localhost\;DB=$DB_NAME\;DBUID=postgres\;CrSQLDB=Y\;SchJobDn=Y /DisableStartupDialogs /DisableStartupMessages /Out $TMP_PATH/$JOB_NAME.log
cat $TMP_PATH/$JOB_NAME.log
if $LIB_PATH/prepare-db.sh $CONNECTION_STRING $JOB_NAME; then
$LIB_PATH/run-tests.sh $MODE $CONNECTION_STRING $JOB_NAME
fi

View File

@ -0,0 +1,61 @@
source .env
SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
WORK_PATH=/tmp/yaxunit-test
EDT_PATH=/opt/1C/1CE/components/1c-edt-$EDT_VERSION-x86_64
ONEC_PATH=/opt/1cv8/x86_64/$ONEC_VERSION
PROJECT_PATH=$SCRIPTPATH/../..
DB_PATH=$WORK_PATH/file-db
mkdir -p $WORK_PATH
# echo "Конвертация configuration"
# $EDT_PATH/1cedtcli -data $WORK_PATH/ws -timeout 300 -command export --configuration-files $WORK_PATH/configuration --project $PROJECT_PATH/fixtures/demo-configuration
# echo "Конвертация yaxunit"
# $EDT_PATH/1cedtcli -data $WORK_PATH/ws -timeout 300 -command export --configuration-files $WORK_PATH/yaxunit --project $PROJECT_PATH/exts/yaxunit
# echo "Конвертация smoke"
# $EDT_PATH/1cedtcli -data $WORK_PATH/ws -timeout 300 -command export --configuration-files $WORK_PATH/smoke --project $PROJECT_PATH/exts/smoke
# echo "Конвертация тесты"
# $EDT_PATH/1cedtcli -data $WORK_PATH/ws -timeout 300 -command export --configuration-files $WORK_PATH/tests --project $PROJECT_PATH/tests
rm -rf $DB_PATH
echo "=========== Создание информационной базы"
$ONEC_PATH/ibcmd infobase create --db-path=$DB_PATH --import=$WORK_PATH/configuration --apply --force
echo "=========== Импорт расширения Smoke"
$ONEC_PATH/ibcmd infobase config import --db-path=$DB_PATH --extension=Smoke $WORK_PATH/smoke
$ONEC_PATH/ibcmd infobase config apply --db-path=$DB_PATH --extension=Smoke --force
echo "=========== Импорт расширения tests"
$ONEC_PATH/ibcmd infobase config import --db-path=$DB_PATH --extension=tests $WORK_PATH/tests
$ONEC_PATH/ibcmd infobase config apply --db-path=$DB_PATH --extension=tests --force
echo "=========== Импорт расширения YAXUNIT"
$ONEC_PATH/ibcmd infobase config import --db-path=$DB_PATH --extension=YAXUNIT $WORK_PATH/yaxunit
$ONEC_PATH/ibcmd infobase config apply --db-path=$DB_PATH --extension=YAXUNIT --force
$ONEC_PATH/ibcmd infobase config extension update --db-path=$DB_PATH --name=Smoke --safe-mode=no --unsafe-action-protection=no
$ONEC_PATH/ibcmd infobase config extension update --db-path=$DB_PATH --name=tests --safe-mode=no --unsafe-action-protection=no
$ONEC_PATH/ibcmd infobase config extension update --db-path=$DB_PATH --name=YAXUNIT --safe-mode=no --unsafe-action-protection=no
cat >$WORK_PATH/yaxunit-config.json <<EOL
{
"reportFormat": "jUnit",
"reportPath": "$WORK_PATH/report.xml",
"closeAfterTests": true,
"exitCode": "$WORK_PATH/exit-code.txt",
"logging": {
"console": true
}
}
EOL
$ONEC_PATH/ibsrv --db-path=$DB_PATH --daemon
IBSRV_PID=$!
echo "IBSRV PID=$IBSRV_PID"
$ONEC_PATH/1cv8c /WS "http://localhost:8314" /C"RunUnitTests=$WORK_PATH/yaxunit-config.json" /DisableStartupDialogs /DisableStartupMessages /DisableUnrecoverableErrorMessage
kill $IBSRV_PID

View File

@ -0,0 +1,65 @@
#!/bin/bash
export SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
source $SCRIPTPATH/../.env
export EDT_PATH=/opt/1C/1CE/components/1c-edt-$EDT_VERSION-x86_64
export ONEC_PATH=/opt/1cv8/x86_64/$ONEC_VERSION
export WORK_PATH=$(realpath $SCRIPTPATH/../workpath)
export ROOT_PATH=$(realpath $SCRIPTPATH/../../../)
export STEPS_PATH=$(realpath $SCRIPTPATH/steps)
export LIB_PATH=$(realpath $SCRIPTPATH/lib)
export TMP_PATH=$WORK_PATH/tmp
export DB_PATH=$WORK_PATH/file-db
export EXPORT_PATH=$WORK_PATH/export
export BINARY_PATH=$WORK_PATH/binary
export RESULT_PATH=$WORK_PATH/result
mkdir -p $DB_PATH
mkdir -p $EXPORT_PATH
mkdir -p $BINARY_PATH
mkdir -p $TMP_PATH
mkdir -p $RESULT_PATH
rm -rf $TMP_PATH/*
rm -rf $RESULT_PATH/*
cat >~/.1cv8/1C/1cv8/conf/conf.cfg <<EOL
DisableUnsafeActionProtection=.*
EOL
declare -A SOURCES_HASH
declare -A SOURCE_PATHS=( ["yaxunit"]="exts/yaxunit" ["smoke"]="exts/smoke" ["tests"]="tests" ["configuration"]="fixtures/demo-configuration")
declare projects=()
echo "=========== Анализ исходников ==========="
for key in "${!SOURCE_PATHS[@]}"; do
$STEPS_PATH/clean-outdated.sh $key ${SOURCE_PATHS[$key]}
done
echo "=========== Конвертация исходников ==========="
for key in "${!SOURCE_PATHS[@]}"; do
$STEPS_PATH/convert-to-xml.sh $key ${SOURCE_PATHS[$key]}
done
echo "=========== Сборка исходников ==========="
if ! $STEPS_PATH/build-artifacts.sh; then
exit 1
fi
echo "=========== Запуск сервера 1с в Docker ==========="
docker compose -f $SCRIPTPATH/../onec-server/docker-compose.yml up -d --force-recreate --renew-anon-volumes
echo "=========== Запуск тестирования ==========="
$STEPS_PATH/run-filedb-test.sh Ordinary &
$STEPS_PATH/run-filedb-test.sh Thick &
$STEPS_PATH/run-filedb-test.sh Thin &
$STEPS_PATH/run-serverdb-test.sh Ordinary &
$STEPS_PATH/run-serverdb-test.sh Thick &
$STEPS_PATH/run-serverdb-test.sh Thin &
wait

View File

@ -4,50 +4,11 @@
"version": "2.1",
"ФорматEDT": true
},
"АвтоТестирование": {
"Выполнять": true,
"ВыполнятьБазовые": true,
"ВыполнятьxUnit": true,
"ТестыxUnitВРасширении": true,
"ИсполнительxUnitВРасширении": true,
"ВыполнятьVanessa": false,
"ПредварительнаяПодготовкаБазы": false,
"ПередаватьПокрытиеТестамиВСонар": false
},
"АвтоДокументирование": {
"Выполнять": false,
"КодПространстваConfluence": "yaxunit",
"ПоследнийОбработанныйКоммит": "",
"Шаблоны": ""
},
"АнализИсходников": {
"Выполнять": true,
"ДочерниеПроекты": []
},
"АвтоСборка": {
"ВключитьНомерСборки": true,
"ОбновлятьВерсиюКонфигурации": false,
"КаталогРасположенияСборок": "\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\yaxunit",
"КаталогРасположенияСборокRelease": "\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\yaxunit\\releases",
"КаталогРасположенияОбразов": "\\\\dellin.local\\bia\\СРПО\\1с_install\\Конфигурации ДЛ\\БСП\\spec",
"ВыполнятьНаСервернойБазе": false
},
"Уведомления": {
"Выполнять": true,
"Ответственные": [{
"Адресат": "arch-bots",
"Транспорт": "rocketchat"
}]
},
"СвязанныеПроекты": {
"bsp": {
"Репозиторий": "git@gitlab.dellin.ru:orais/bsp/bsp.git",
"Ветка": "master",
"Назначение": "Основная конфигурация"
}
},
"Precommt4onecСценарии": {
"ИспользоватьСценарииРепозитория": true,
"КаталогЛокальныхСценариев": "tools\\precommit"
"ОтключенныеСценарии": [
"РазборОтчетовОбработокРасширений.os"
],
"КаталогЛокальныхСценариев": "tools/precommit"
}
}