# Модули помощники При написании тестов не стоит забывать, что вы пишете код, а это значит, что вы можете использовать те же принципы, что при обычной разработке. Вы можете создавать общие модули и экспортные методы, которые упростят написание тестов для вашего продукта. Такие как модули создания тестовых данных, настройки мокирования, общих проверок и так далее. Главное сначала подумать об организации работы с ними, чтобы в будущем было проще находить нужные методы и избежать конфликтов при разработке. ## Конструкторы данных Предположим у нас есть подсистема управления складом, которая содержит документы поступления, перемещения и реализации. Создание документа поступления нам понадобится при тестировании всех видов документов, поэтому стоит вынести это в отдельный общий модуль. ```bsl title="ОбщийМодуль.ТестовыеДанныеУправлениеСкладом" Функция НовоеПоступлениеТовара(Склад, Товар, Поставщик = Неопределено) Экспорт Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПоступлениеТоваров) .ФикцияОбязательныхПолей() .Установить("Склад"); Если Поставщик = Неопределено Тогда Конструктор.Фикция("Поставщик"); Иначе Конструктор.Установить("Поставщик", Поставщик); КонецЕсли Возврат Конструктор .ТабличнаяЧасть("Товары") .ДобавитьСтроку() .Установить("Номенклатура", Товар) .ФикцияРеквизитов("Количество, Цена") .Записать(); КонецФункции ``` Бывают случаи, когда слишком сложно кастомизировать создание объекта через параметры, тогда удобнее возвращать конструктор объекта с базовым заполнением. Либо сделать набор методов-пресетов для различных кейсов. ```bsl title="ОбщийМодуль.ТестовыеДанныеУправлениеСкладом" Функция КонструкторПоступленияТовара(Склад, Поставщик = Неопределено) Экспорт Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПоступлениеТоваров) .ФикцияОбязательныхПолей() .Установить("Склад"); Если Поставщик = Неопределено Тогда Конструктор.Фикция("Поставщик"); Иначе Конструктор.Установить("Поставщик", Поставщик); КонецЕсли Возврат Конструктор; КонецФункции Функция НовоеПоступлениеТовара(Склад, Товар, Поставщик = Неопределено) Экспорт Конструктор = КонструкторПоступленияТовара(Склад, Поставщик); Возврат Конструктор .ТабличнаяЧасть("Товары") .ДобавитьСтроку() .Установить("Номенклатура", Товар) .ФикцияРеквизитов("Количество, Цена") .Записать(); КонецФункции Функция НовоеПоступлениеТовараОтЮрЛица(Склад, Товар) Экспорт Поставщик = НовоеЮрЛицо(); Конструктор = КонструкторПоступленияТовара(Склад, Поставщик); Возврат Конструктор .ТабличнаяЧасть("Товары") .ДобавитьСтроку() .Установить("Номенклатура", Товар) .ФикцияРеквизитов("Количество, Цена") .Записать(); КонецФункции Функция НовоеПоступлениеТовараОтФизЛица(Склад, Товар) Экспорт Поставщик = НовоеФизЛицо(); Конструктор = КонструкторПоступленияТовара(Склад, Поставщик); Возврат Конструктор .ТабличнаяЧасть("Товары") .ДобавитьСтроку() .Установить("Номенклатура", Товар) .ФикцияРеквизитов("Количество, Цена") .Записать(); КонецФункции ```