Разработка системы учета транспортных средств (ТС) в среде «1С:Предприятие 8.3» требует понимания основ архитектуры метаданных. Задача фиксации пробега и расхода топлива — это классический пример управленческого учета, где важно не только записывать данные, но и эффективно их извлекать для формирования отчетности, такой как «Эксплуатационная карта ТС» с нарастающим итогом. Рассмотрим пошагово, как правильно спроектировать этот функционал.
В процессе обсуждения на форумах часто возникает вопрос: можно ли строить отчеты напрямую по документам? Разберем, почему это решение является тупиковым. Документ — это объект для регистрации события (факта расхода или заправки). Запрос к документам для получения итогов за несколько лет заставит систему перебирать все реквизиты и табличные части, что неизбежно приведет к деградации производительности.
Правильный подход, согласно стандартам разработки 1С, заключается в использовании регистров накопления. Регистры хранят агрегированные данные в специальных таблицах итогов, что позволяет мгновенно получать результаты за любой период. Для нашей задачи мы будем использовать связку: Документ (для ввода данных) и Регистр накопления (для хранения и анализа данных).
Прежде всего, проанализируем структуру справочника ТранспортныеСредства. Нам понадобятся следующие поля:
ГосНомер (Строка)ИнвентарныйНомер (Строка)ТипТоплива (Ссылка на перечисление или справочник ВидыГСМ)НормаРасходаЗима и НормаРасходаЛето (Число) — для последующей автоматизации расчетов.Выясним, какой тип регистра нам подходит. Если нам нужно только фиксировать обороты (сколько проехали и сколько потратили), достаточно регистра вида Обороты. Однако, если в будущем планируется контролировать остатки топлива в баках на начало и конец месяца, лучше сразу выбрать регистр вида Остатки.
Настроим структуру регистра УчетПробегаИГСМ:
ТранспортноеСредство (Тип: СправочникСсылка.ТранспортныеСредства).Пробег (Число 15, 2), РасходТоплива (Число 15, 3).Водитель (СправочникСсылка.ФизическиеЛица) — это поможет в аналитике, если на одной машине работают разные люди.Рассмотрим логику документа. Он должен создаваться ежемесячно для каждой машины или содержать табличную часть со списком всех ТС. Для удобства пользователя создадим документ, где в шапке указывается ПериодРегистрации (месяц), а в табличной части — список авто.
Реквизиты табличной части:
ТранспортноеСредствоПробегЗаМесяцРасходФактическийПоказанияОдометраНаКонецПроанализируем программный код проведения документа. Нам нужно, чтобы при проведении данные попадали в наш регистр накопления. Код в модуле документа будет выглядеть примерно так:
Процедура ОбработкаПроведения(Отказ, Режим)
Для Каждого ТекСтрока Из СписокАвто Цикл
Движение = Движения.УчетПробегаИГСМ.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход; // Для регистра остатков
Движение.Период = Дата;
Движение.ТранспортноеСредство = ТекСтрока.ТранспортноеСредство;
Движение.Пробег = ТекСтрока.ПробегЗаМесяц;
Движение.РасходТоплива = ТекСтрока.РасходФактический;
КонецЦикла;
КонецПроцедуры
Важный нюанс, который часто упускают — это непрерывность показаний одометра. При вводе данных за февраль система должна проверить, что начальный пробег соответствует конечному пробегу за январь. Для этого перед записью документа мы можем выполнить запрос к регистру накопления, чтобы получить последние данные по конкретному автомобилю.
Рассмотрим пример функции получения последнего пробега:
Функция ПолучитьПоследнийПробег(ВыбАвто)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| УчетПробегаИГСМ.Пробег КАК Пробег
|ИЗ
| РегистрНакопления.УчетПробегаИГСМ КАК УчетПробегаИГСМ
|ГДЕ
| УчетПробегаИГСМ.ТранспортноеСредство = &ТранспортноеСредство
|УПОРЯДОЧИТЬ ПО
| УчетПробегаИГСМ.Период УБЫВ";
Запрос.УстановитьПараметр("ТранспортноеСредство", ВыбАвто);
// ... выполнение запроса и возврат значения
КонецФункции
Теперь разберем, как включить данные в отчет с нарастающим итогом. Самый эффективный способ — использовать Систему компоновки данных (СКД). В СКД есть мощный механизм работы с ресурсами.
Для реализации нарастающего итога пробега в настройках СКД на закладке «Ресурсы» можно использовать выражение с функцией ВычислитьВыражение. Посмотрим на пример выражения для поля ПробегСНачалаЭксплуатации:
ВычислитьВыражение("Сумма(Пробег)", , "Группировка", "Первая", "Текущая")
Это позволит системе автоматически суммировать данные от самого первого движения по машине до текущей строки отчета (месяца). Преимущество этого метода в том, что он работает крайне быстро даже на больших объемах данных, так как использует индексированные таблицы регистра накопления.
Посмотрим на ситуацию шире. Чтобы сделать систему более профессиональной, стоит внедрить следующие улучшения:
Таким образом, использование регистра накопления — это не просто «следование правилам», а залог того, что ваша конфигурация будет работать стабильно спустя годы эксплуатации, а отчеты будут формироваться за секунды. Построение системы на одних справочниках или документах — это путь к техническому долгу и медленной работе программы.