Добрый день!
Хочу написать статью, в которой будет реализован код для формирования документов для аренды на долгий или короткий срок.
1. Надо создать регистр сведений для того, чтобы он хранил данные о том, сколько сделано повторов. Он должен быть связан с документом, через который создаем документы.
2. Надо сформировать движение, где высчитываются месяцы аренды. Если дни аренды меньше месяца, то нам нужен один документ, а не несколько. Поэтому нам нужно выяснить, сколько месяцев аренды у нас получается. Итак, мы выяснили, что у нас больше одного месяца, и для этого формируем движение в регистр, откуда будем считывать данные. Также, считывая данные и получая дату, мы создаем документы до тех пор, пока не закончатся месяцы аренды. Затем мы очищаем регистр, но это мы записываем в модуле объекта.
МесяцНачала = Месяц(НачалоАренды);
МесяцКонца = Месяц(КонецАренды);
ЛетМеждуДатами = Год(КонецАренды) - Год(НачалоАренды);
КолВоМесяцевАренды = ЛетМеждуДатами*12 - МесяцНачала + МесяцКонца;
Если КолВоМесяцевАренды > 1 Тогда
Движения.Расш1_ПериодПовторовДок.Записывать = Истина;
Движение = Движения.Расш1_ПериодПовторовДок.Добавить();
Движение.Дата = НачалоАренды;
Движение.КолВоПовторов = 1;
Движение.КолВоМесяцевАренды = КолВоМесяцевАренды;
3. Создаем общий модуль серверный модуль вызов сервера
и записываем следующий код:
Процедура АрендыМесяцыДат() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Расш1_ПередачаВАренду.Ссылка КАК Ссылка
|ИЗ
| Документ.Расш1_ПередачаВАренду КАК Расш1_ПередачаВАренду";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ПериодПовторов = РегистрыСведений.Расш1_ПериодПовторовДок;
НаборЗаписей = ПериодПовторов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.Ссылка);
НаборЗаписей.Прочитать();
Для каждого Запись из НаборЗаписей Цикл
ДатаПроведения = ДобавитьМесяц(Запись.Дата, Запись.КолВоПовторов);
Если ДатаПроведения = ТекущаяДата() Тогда
НовыйДокумент = Документы.АктВыполненныхРабот.СоздатьДокумент();
НовыйДокумент = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Проведен = Истина;
НовыйДокумент.Записать();
Запись.КолВоПовторов = Запись.КолВоПовторов + 1;
Если Запись.КолВоПовторов > Запись.КолВоМесяцевАренды Тогда
ПериодПовторов = РегистрыСведений.Расш1_ПериодПовторовДок;
НаборЗаписей = ПериодПовторов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.Ссылка);
НаборЗаписей.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;
КонецПроцедуры
Данный код сначала считывает данные с регистра и определяет, сколько записей уже создано. Однако, для проверки точного количества созданных записей на нужный нам документ, необходимо прибавить количество повторов. Затем происходит считывание документа в движении и создание нового до тех пор, пока дата не превысит указанную дату окончания аренды. После окончания последнего дня аренды регистр будет очищен.
4. И чтобы у нас формировались документы в фоновом режиме, надо открыть модуль приложения и написать код, чтобы при запуске начинал работать наш модуль.
&Перед("ПриНачалеРаботыСистемы")
Процедура Расш1_ПриНачалеРаботыСистемы()
Расш1_Повторы.АрендыМесяцыДат();
ПодключитьОбработчикОжидания("Проверка",5);
КонецПроцедуры
Спасибо за прочтение. Надеюсь, вам этот механизм поможет!