Как реализовать учет аренды с контролем будущих остатков в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Сфера услуг, туризм и социальный сектор
← На главную

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

Суть задачи: Имеется документ «Аренда мебели». Он должен списывать мебель со склада в момент выдачи (дата монтажа) и возвращать ее обратно в момент окончания аренды (дата демонтажа). Количество выданной мебели всегда равно количеству возвращенной. При этом даты выдачи и возврата, как правило, находятся в будущем относительно даты создания документа. Самая главная проблема — при проведении документа необходимо контролировать остатки на складе с учетом того, что в выбранный период могут существовать другие оформленные документы аренды (пересечение периодов).

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

Вариант 1. Использование Регистра Накопления и двух движений

Самый прямолинейный подход, который первым приходит на ум — заставить один документ делать движения по регистру накопления (например, ОстаткиТоваров) разными датами.

Посмотрим на алгоритм формирования движений:

  1. Первое движение: Расход. Выполняется на дату начала аренды (дата монтажа). Списываем необходимое количество номенклатуры.
  2. Второе движение: Приход. Выполняется на дату окончания аренды (дата демонтажа). Возвращаем то же самое количество номенклатуры.

Однако при таком подходе возникает сложность с контролем остатков. Обычный срез остатков на дату документа здесь не работает, так как движения происходят в будущем, и периоды разных документов могут накладываться друг на друга.

Как реализовать контроль остатков при таком подходе?

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

  1. Определяем физический остаток мебели на складе на момент начала планируемой аренды.
  2. Выполняем запрос к виртуальной таблице оборотов или физической таблице движений регистра, выбирая все записи (приходы и расходы) по нужной номенклатуре, даты которых больше или равны дате начала нашей новой аренды.
  3. Сортируем полученный результат по дате движения по возрастанию (хронологический порядок).
  4. В цикле обходим результат запроса и последовательно прибавляем/вычитаем количества из движений к нашему начальному остатку (рассчитываем нарастающий итог).
  5. Не забываем «встроить» в этот хронологический ряд планируемые движения нашего текущего документа (расход на дату монтажа и приход на дату демонтажа).
  6. Если на каком-либо шаге расчета нарастающего итога текущий остаток становится меньше нуля, это означает, что в эту дату мебели не хватит. Выводим пользователю сообщение об ошибке и отказываем в проведении.

Этот метод рабочий, но имеет недостаток: запись движений будущим числом ломает механизм оперативных итогов платформы. В реальных высоконагруженных базах от такого подхода стараются уходить.

Вариант 2. Разделение контуров учета и использование Регистра Сведений

Чтобы не портить партионный учет и текущие остатки движениями из будущего, методологически правильнее разделить фактический складской учет и контур планирования (бронирования).

Рассмотрим подход с использованием непериодического регистра сведений для контроля занятости оборудования. Назовем его, например, ЗанятостьОборудования.

Структура регистра сведений:

При проведении документа «Аренда мебели» мы не трогаем регистры складских остатков, а делаем запись в наш регистр сведений, указывая период бронирования и количество.

Как контролировать остатки при наложении периодов?

В этом случае проверка становится гораздо элегантнее. Нам нужно найти все уже существующие брони, которые пересекаются с периодом нашего нового документа. Два периода пересекаются, если выполняется простое математическое условие:

ДатаНачалаВБазе < ДатаОкончанияНовойАренды И ДатаОкончанияВБазе > ДатаНачалаНовойАренды

Разберем алгоритм проведения с контролем по регистру сведений:

  1. Получаем текущий свободный физический остаток оборудования на складе из классического регистра остатков.
  2. Делаем запрос к регистру сведений ЗанятостьОборудования с условием на пересечение дат, описанным выше.
  3. Если мы ведем просто количественный учет (без инвентарных номеров), нам нужно определить пиковую нагрузку в пересекающемся периоде. Для этого можно сгруппировать пересекающиеся периоды и просуммировать забронированное количество на каждый день интервала пересечения.
  4. Сравниваем максимальное забронированное количество с общим остатком на складе. Если СвободныйОстаток - ПиковыйРезерв - КоличествоВДокументе < 0, выдаем отказ.

Вариант 3. Использование отдельного Регистра Накопления «График аренды»

Если задача требует именно механизмов регистров накопления, создадим отдельный регистр ОжидаемаяАренда (вид регистра — остатки).

В этом регистре мы будем хранить не текущие остатки, а график изменения свободных остатков.

При проведении документа делаем движения:

Контроль остатков в этом случае сводится к получению остатков по виртуальной таблице Остатки регистра ОжидаемаяАренда на каждую дату изменения в пределах периода нового документа. Это так называемая «новая методика» контроля остатков, но адаптированная под проверку нескольких временных срезов.

Резюме

При решении задач с будущими периодами и арендой важно понимать, что запись движений будущим числом в основной товарный регистр — плохая практика для реальных конфигураций (таких как 1С:ERP или 1С:УТ). Для учебной задачи «в лоб» подойдет расчет нарастающего итога. Однако для качественной архитектуры мы рекомендуем выделять планирование в отдельные сущности: регистры сведений с периодами бронирования или обособленные регистры накопления для графиков доступности.

← На главную