Часто возникает задача учета затрат на мобильные объекты — технику, оборудование, бригады, которые меняют свою дислокацию. Расход топлива или материалов фиксируется одними документами, а перемещение — другими. В этой статье разберем, как правильно спроектировать систему и построить отчет, который покажет, сколько ресурсов было потрачено на каждом объекте (в каждой локации).
Главный принцип, которому будем следовать, — не дублировать данные. Не стоит добавлять в регистр, где учитывается расход материалов, измерения, характеризующие местоположение (Группа, Направление, Подразделение). Это усложнит проведение документов и приведет к избыточности данных. Правильнее хранить информацию о местоположении и расходах в разных местах и связывать их динамически в момент построения отчета.
Рассмотрим рекомендуемую структуру объектов конфигурации.
Регистр сведений "Местоположение Объектов"
Этот регистр будет хранить историю перемещений нашей техники ("бортов"). Сделаем его периодическим.
Борт (ссылка на справочник с техникой).Группа, Направление, Ответственный, Подразделение. Все те аналитики, которые определяют "местоположение".Регистр накопления "Расход Материалов"
Этот регистр будет максимально простым. Его задача — фиксировать только сам факт расхода.
Борт, Номенклатура (топливо, ГСМ и т.д.).Количество, Сумма.При такой структуре документы списания становятся очень простыми для заполнения — пользователю не нужно каждый раз указывать, где находился борт. Система сама определит это на основе ранее введенных документов перемещения.
Теперь самое интересное — как получить отчет о расходах в разрезе местоположений. Для этого в запросе (например, в системе компоновки данных) необходимо соединить данные из наших двух регистров.
Логика запроса будет следующей:
РасходМатериалов за нужный нам период. Отсюда мы получим информацию о том, что, когда и в каком количестве было списано по каждому борту.СрезПоследних регистра сведений МестоположениеОбъектов. Мы получим срез данных о местоположении на дату документа списания (Период).Борт.Примерная структура запроса может выглядеть так:
ВЫБРАТЬ
РасходныеМатериалыОбороты.Борт,
РасходныеМатериалыОбороты.Номенклатура,
РасходныеМатериалыОбороты.КоличествоОборот,
Местоположение.Группа,
Местоположение.Направление,
Местоположение.Подразделение
ИЗ
РегистрНакопления.РасходМатериалов.Обороты(&НачалоПериода, &КонецПериода, Регистратор) КАК РасходныеМатериалыОбороты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестоположениеОбъектов.СрезПоследних(&КонецПериода, ) КАК Местоположение
ПО РасходныеМатериалыОбороты.Борт = Местоположение.Борт
И РасходныеМатериалыОбороты.Период >= Местоположение.Период
// Условие для более точного соединения, если делать через вложенный запрос или соединять с самим регистром, а не срезом
Важный момент: для корректного соединения оборотов за период со срезом данных лучше использовать соединение с виртуальной таблицей РегистрНакопления.РасходМатериалов.Обороты, где периодичность установлена в "Регистратор" или "Секунда". Затем для каждой записи оборотов получать срез на ее Период.
В итоге для каждой операции списания система автоматически "подтянет" актуальное на тот момент местоположение, и вы сможете группировать затраты по нужным аналитикам.
В реальной жизни возникают ситуации, которые усложняют учет. Проанализируем самые частые из них.
Проблема: Пользователь вводит один документ списания ГСМ в конце месяца, а за этот месяц техника успела поработать в десяти разных местах с разными бюджетами. На какую локацию отнести весь этот расход?
Решение 1 (Организационное — самое правильное): Изменить бизнес-процесс. Документы расхода должны вводиться оперативно и отражать работу на конкретном объекте. Например, по итогам смены, путевого листа или еженедельного отчета. Это обеспечит максимальную точность данных.
Решение 2 (Техническое — если процесс не изменить): Реализовать механизм пропорционального распределения.
Пример: За месяц списано 300 литров топлива. Техника 10 дней была в "Локации А" и 20 дней в "Локации Б". На "Локацию А" будет отнесено 100 литров (300 * 10/30), а на "Локацию Б" — 200 литров (300 * 20/30). Этот алгоритм требует более сложного запроса, но позволяет получить приемлемый результат даже при неидеальном вводе первички.
Проблема: В Мухосранске в бак залили топливо за счет одного бюджета. Затем технику с полным баком перевезли в Бобруйск, где она начала работать за счет другого бюджета, расходуя "мухосранское" топливо. Как это корректно учесть?
Решение: Если такая точность необходима, придется усложнить модель учета и внедрить партионный учет в разрезе местоположений.
РасходМатериалов нужно будет сделать регистром остатков, а не оборотов.Местоположение.Однако, как показывает практика, часто этими остатками можно пренебречь, считая их погрешностью. Если заказчик согласен с таким допущением, то можно оставаться на простой и элегантной схеме, описанной в самом начале.