Файл тестов для xUnitFor1C: тестирование печатных форм документов

10.08.18

Разработка - Инструментарий разработчика

Автоматическое формирование печатных форм документов с помощью xUnitFor1C.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Файл тестов для xUnitFor1C: тестирование печатных форм документов:
.7z 4,34Kb
7
7 Скачать (1 SM) Купить за 1 850 руб.

Получив большую пользу и удовольствие от тестирования одной изрядно переработанной конфигурации с помощью xUnitFor1C и файлов тестов, которые доступны в репозитории этого проекта, захотел "расширить и углубить" и написать своей файл тестов для проверки формирования печатных форм (как встроенных в конфигурацию, так и внешних).

Проверяет, что печатная форма (табличный документ): а. формируется; б. содержит по крайней мере одну строку (т.е. высота табличного документа > 0).

Работает неидеально!!! Но иногда лучше тупой топор, чем голые руки.

Используются механизмы БСП. Тестировалось на БП 3.0.57.10.

Проект на гитхабе: https://github.com/q-i/tests_for_xUnitFor1C

Рацпредложения приветствуются.

Исходный код модуля обработки файла тестов (лицензия Apache 2.0 для совместимости с проектом xUnitFor1C):

Перем КонтекстЯдра;
Перем Утверждения;

//{ основная процедура для юнит-тестирования xUnitFor1C
Процедура Инициализация(КонтекстЯдраПараметр) Экспорт
	КонтекстЯдра = КонтекстЯдраПараметр;
	Утверждения = КонтекстЯдра.Плагин("БазовыеУтверждения");
КонецПроцедуры

Процедура ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр) Экспорт
	КонтекстЯдра = КонтекстЯдраПараметр;
	
	Для Каждого МетаОбъект Из Метаданные.Документы Цикл
		Если ПравоДоступа("Просмотр", МетаОбъект) Тогда
			ДобавитьТестыДляДокумента(НаборТестов, МетаОбъект);
		КонецЕсли; 
	КонецЦикла; 
	
КонецПроцедуры
//}

//{ Блок юнит-тестов
Функция ПолучитьДокументыДляПечати(МетаОбъект, УсловияВидимости = Неопределено)
	
	КолвоТестируемыхДокументов = 1; // здесь можно указать количество документов, для которых нужно проверить каждую форму
	
	Результат = Новый Массив; 
	
	ШаблонТекстаЗапроса = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	Док.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.СчетНаОплатуПокупателю КАК Док
	|ГДЕ
	|	&ДопУсловия
	|
	|УПОРЯДОЧИТЬ ПО
	|	ВЫБОР
	|		КОГДА Док.Проведен
	|			ТОГДА 0
	|		КОГДА Док.ПометкаУдаления
	|			ТОГДА 2
	|		ИНАЧЕ 1
	|	КОНЕЦ,
	|	Док.Дата УБЫВ";
	ШаблонТекстаЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "Документ.СчетНаОплатуПокупателю", "Документ." + МетаОбъект.Имя);
	ШаблонТекстаЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "ВЫБРАТЬ ПЕРВЫЕ 1", "ВЫБРАТЬ ПЕРВЫЕ " + Формат(КолвоТестируемыхДокументов, "ЧГ="));
	
	Запрос = Новый Запрос;
	Запрос.Текст = ШаблонТекстаЗапроса;
	
	ОперацииУсловий = Новый Соответствие;
	ОперацииУсловий.Вставить(ВидСравнения.Равно, "=");
	ОперацииУсловий.Вставить(ВидСравненияКомпоновкиДанных.Равно, "=");
	ОперацииУсловий.Вставить(ВидСравнения.Больше, ">");
	ОперацииУсловий.Вставить(ВидСравненияКомпоновкиДанных.Больше, ">");
	ОперацииУсловий.Вставить(ВидСравнения.БольшеИлиРавно, ">=");
	ОперацииУсловий.Вставить(ВидСравненияКомпоновкиДанных.БольшеИлиРавно, ">=");
	ОперацииУсловий.Вставить(ВидСравнения.Меньше, "<");
	ОперацииУсловий.Вставить(ВидСравненияКомпоновкиДанных.Меньше, "<");
	ОперацииУсловий.Вставить(ВидСравнения.МеньшеИлиРавно, "<=");
	ОперацииУсловий.Вставить(ВидСравненияКомпоновкиДанных.МеньшеИлиРавно, "<=");
	ОперацииУсловий.Вставить(ВидСравнения.НеРавно, "<>");
	ОперацииУсловий.Вставить(ВидСравненияКомпоновкиДанных.НеРавно, "<>");
	
	ДопУсловия = "";
	Если ТипЗнч(УсловияВидимости) = Тип("Массив") Тогда
		Для Каждого Условие Из УсловияВидимости Цикл
			ТекТекстУсловия = "";
			ТекОперация = ОперацииУсловий.Получить(Условие.ВидСравнения);
			Если ТекОперация <> Неопределено Тогда
				ТекТекстУсловия = Условие.Реквизит + " " + ТекОперация + " &" + Условие.Реквизит;
			ИначеЕсли Условие.ВидСравнения = ВидСравнения.ВСписке
				Или Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке Тогда
				ТекТекстУсловия = Условие.Реквизит + " В(&" + Условие.Реквизит + ")";
			ИначеЕсли Условие.ВидСравнения = ВидСравнения.НеВСписке
				Или Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке Тогда
				ТекТекстУсловия = "НЕ " + Условие.Реквизит + " В(&" + Условие.Реквизит + ")";
			ИначеЕсли Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено Тогда
				// TODO: обработать условие видимости "Заполнено"
			ИначеЕсли Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено Тогда
				// TODO: обработать условие видимости "Не заполнено"
			КонецЕсли;
			Если НЕ ПустаяСтрока(ТекТекстУсловия) Тогда
				ДопУсловия = ДопУсловия + ?(ПустаяСтрока(ДопУсловия), "", " И ") + ТекТекстУсловия;
				Запрос.УстановитьПараметр(Условие.Реквизит, Условие.Значение);
			КонецЕсли; 
		КонецЦикла; 
	КонецЕсли;
	
	Если НЕ ПустаяСтрока(ДопУсловия) Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ДопУсловия", ДопУсловия);
	Иначе 
		Запрос.УстановитьПараметр("ДопУсловия", Истина);
	КонецЕсли; 
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если РезультатЗапроса.Пустой() Тогда
		// нет документов для тестирования :(
		Если НЕ ПустаяСтрока(ДопУсловия) Тогда
			// возможно причина пустого результата в доп.условиях:
			// попробуем без них
			Запрос = Новый Запрос;
			Запрос.Текст = ШаблонТекстаЗапроса;
			Запрос.УстановитьПараметр("ДопУсловия", Истина);
			РезультатЗапроса = Запрос.Выполнить();
		КонецЕсли; 
	КонецЕсли; 
	
	Если НЕ РезультатЗапроса.Пустой() Тогда
		Результат = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Ссылка");
	КонецЕсли; 

	Возврат Результат;
	
КонецФункции

Процедура ДобавитьТестыДляДокумента(НаборТестов, МетаОбъект)
	
	// TODO: реализовать возможность указания исключаемых объектов, а то у некоторых документов в менеджере нет процедуры ДобавитьКомандыПечати()
	Попытка
		КомандыПечати = УправлениеПечатью.КомандыПечатиОбъекта(МетаОбъект);
	Исключение
		//Сообщить("Не удалось получить команды печати для документа " + МетаОбъект + ": " + ОписаниеОшибки());
		Возврат;
	КонецПопытки; 
	
	Если КомандыПечати.Количество() = 0 Тогда
		Возврат;
	КонецЕсли; 
	
	НаборТестов.НачатьГруппу("Документ." + МетаОбъект.Имя);
	
	Для Каждого ТекущаяКомандаПечати  Из КомандыПечати Цикл
		СтруктураКоманды = Новый Структура;
		Для Каждого Колонка Из КомандыПечати.Колонки Цикл
			ИмяКолонки = Колонка.Имя;
			СтруктураКоманды.Вставить(ИмяКолонки, ТекущаяКомандаПечати[ИмяКолонки]);
		КонецЦикла; 
		ПараметрыТеста = НаборТестов.ПараметрыТеста(МетаОбъект.Имя, СтруктураКоманды);
		ДопИнфо = "Идентификатор = " + ТекущаяКомандаПечати.Идентификатор;
		Если ТекущаяКомандаПечати.МенеджерПечати = "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки" Тогда
			ДопИнфо = "Ссылка = " + ТекущаяКомандаПечати.ДополнительныеПараметры.Ссылка + "; " + ДопИнфо;
		КонецЕсли;
		ПредставлениеТеста = МетаОбъект.Имя + ": " + ТекущаяКомандаПечати.Представление + " : " + "{" + ДопИнфо + "}";
		НаборТестов.Добавить("Тест_ПолучитьПечатнуюФорму", ПараметрыТеста, ПредставлениеТеста);
	КонецЦикла; 
		
КонецПроцедуры
	
Процедура ПередЗапускомТеста() Экспорт
	//НачатьТранзакцию();
КонецПроцедуры

Процедура ПослеЗапускаТеста() Экспорт
	//Если ТранзакцияАктивна() Тогда
	//    ОтменитьТранзакцию();
	//КонецЕсли;
КонецПроцедуры

Процедура Тест_ПолучитьПечатнуюФорму(МетаИмя, КомандаПечати) Экспорт
	
	ДокументыДляПечати = ПолучитьДокументыДляПечати(Метаданные.Документы[МетаИмя], КомандаПечати.УсловияВидимости);
	Если ДокументыДляПечати.Количество() = 0 Тогда
		Возврат;
	КонецЕсли; 
	
	Для Каждого ДокСсылка Из ДокументыДляПечати Цикл
		НачалоСообщенияОбОшибке = "Печать документа " + ДокСсылка + ": ";
		КоллекцияПечатныхФорм = ПолучитьКоллекциюПечатныхФорм(КомандаПечати, ДокСсылка);
		Утверждения.Проверить(ТипЗнч(КоллекцияПечатныхФорм) = Тип("ТаблицаЗначений"), НачалоСообщенияОбОшибке + "Ожидалось, что КоллекцияПечатныхФорм будет иметь тип Таблица значений!");
		Утверждения.Проверить(КоллекцияПечатныхФорм.Количество() > 0, НачалоСообщенияОбОшибке + "Ожидалось, что будет количество элементов в КоллекцияПечатныхФорм будет больше 0!");
		Для Каждого СтрокаТаблицы Из КоллекцияПечатныхФорм Цикл
			ТабДок = СтрокаТаблицы.ТабличныйДокумент;
			Утверждения.Проверить(ТабДок <> Неопределено, НачалоСообщенияОбОшибке + "Ожидалось, что будет получен табличный документ, а получено значение <Неопределено>!");
			Утверждения.Проверить(ТабДок.ВысотаТаблицы > 0, НачалоСообщенияОбОшибке + "Ожидалось, что высота полученного табличного документа будет больше 0!");
		КонецЦикла; 
		
	КонецЦикла; 
	
КонецПроцедуры

Функция ПолучитьКоллекциюПечатныхФорм(КомандаПечати, ДокументДляПечати) 
 
	Результат = Неопределено;
	
	ДокументыДляПечати = Новый Массив;
	ДокументыДляПечати.Добавить(ДокументДляПечати);
	
	Если КомандаПечати.МенеджерПечати = "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки" 
		И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
			// печать внешней печатной формы
			ДополнительнаяОбработкаСсылка	= КомандаПечати.ДополнительныеПараметры.Ссылка;
			ПараметрыИсточника				= Новый Структура;
			ПараметрыИсточника.Вставить("ИдентификаторКоманды", КомандаПечати.Идентификатор);
			ПараметрыИсточника.Вставить("ОбъектыНазначения",    ДокументыДляПечати);
			КоллекцияПечатныхФорм			= Неопределено;
			ОбъектыПечати					= Новый СписокЗначений;
			ПараметрыВывода					= Неопределено;
			УправлениеПечатью.ПечатьПоВнешнемуИсточнику(
				ДополнительнаяОбработкаСсылка, 
				ПараметрыИсточника, 
				КоллекцияПечатныхФорм,
				ОбъектыПечати, 
				ПараметрыВывода
			);
			Результат = КоллекцияПечатныхФорм;
	Иначе 
		// печать встроенной печатной формы
		ИмяМенеджераПечати              = КомандаПечати.МенеджерПечати;
		ИменаМакетов					= КомандаПечати.Идентификатор;
		МассивОбъектов					= ДокументыДляПечати;
		ПараметрыПечати					= Новый Структура("ДополнительныеПараметры", КомандаПечати.ДополнительныеПараметры);
		ДопустимыеТипыОбъектовПечати	= Неопределено;
		ПечатныеФормы = УправлениеПечатью.СформироватьПечатныеФормы(
			ИмяМенеджераПечати, 
			ИменаМакетов, 
			МассивОбъектов, 
			ПараметрыПечати, 
			ДопустимыеТипыОбъектовПечати
		);
		Результат = ПечатныеФормы.КоллекцияПечатныхФорм;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции
//}

 

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    170018    939    403    

906

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    13086    100    46    

104

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    26753    90    48    

134

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    16936    41    15    

75

SALE! %

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3840 руб.

14.01.2013    190718    1151    0    

918

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

15000 руб.

10.11.2023    11457    40    27    

66

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    935    2    0    

5

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    103998    244    100    

306
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. artbear 1565 10.08.18 13:14 Сейчас в теме
Очень интересные тесты.

Получились некие практически "дымовые" тесты печатных форм для БСП-конфигураций, верно?
2. q_i 584 10.08.18 20:29 Сейчас в теме
(1) Да, идея была именно такая. Понимаю, что реализация не блещет (в частности, есть есть проблемы с запуском "клиентских" печатных форм, т.к. тест работает на сервере), но несколько ошибок мы у себя уже с помощью этих тестов отловили. Возможно, кому-то другому тоже пригодится.
Оставьте свое сообщение