Автоматизация создания путевых листов

Общаясь с нашими клиентами по поводу эксплуатации установленных у них систем мониторинга транспорта «Навигатор+», мы обнаружили проблему, которая относится к учету работы автотранспортных средств, конкретно — проблемe изготовления ежедневных путевых листов для каждого транспортного средства предприятия. Причем, наличие проблемы отмечают не только руководители, но и рядовые водители.

Для начала, несколько слов о правовых основаниях необходимости использования путевых листов. Данный вопрос освещен в Федеральном Законе от 08.11.2007 №259-ФЗ «Устав автомобильного транспорта и городского наземного электрического транспорта». В пункте 2 статьи 6 «Путевые листы» данного закона говорится следующее:

«Запрещается осуществление перевозок пассажиров и багажа, грузов автобусами, трамваями, троллейбусами, легковыми автомобилями, грузовыми автомобилями без оформления путевого листа на соответствующее транспортное средство».

С другой стороны в письме Минфина РФ № 03-03-06/2/161 от 25.08.09 говорится, что

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

Таким образом, необходимость использования путевого листа заключается в:

  • требовании Федерального Закона о необходимости иметь путевой лист любому непустому транспортному средству,
  • стремлении организации отнести на себестоимость продукции затраты на ГСМ и, тем самым, уменьшить налогооблагаемую прибыль.

Как представляется работа по созданию путевых листов их авторам (Приказ Минтранса РФ № 152 от 18.09.08 «Об утверждении обязательных реквизитов и порядка заполнения путевых листов»)? Наверное, так. Водитель к началу рабочего дня прибывает (на метро) к гаражу, объявляет о своем появлении и идет на медосмотр. В это время диспетчер формирует задание водителю в виде путевого листа, где указывает маршрут в виде пунктов назначения и/или названия клиента, а также ориентировочный пробег на разных участках планируемого маршрута. Маршрутный лист вручается водителю, который после инструктажа покидает гараж и выходит на линию. Прибыв в первый пункт назначения, водитель должен зафиксировать время прибытия, а также пройденное расстояние на данном сегменте маршрута, выполняя нехитрые вычисления с цифрами одометра. Перед началом движения в следующий пункт назначения, водитель фиксирует в путевом листе текущее время. Далее все должно повторяться в каждом пункте назначения: время прибытия, пробег, время убытия. Наконец, день закончен. Машина – на мойку, путевой лист – диспетчеру. Происходит сравнение полученного утром задания с реально выполненным маршрутом, сравнение пробега по путевому листу и одометру, отчет по движению горючего. На этом рабочий день завершается.

В реальной жизни описанная схема жизнеспособна, наверное, только на очень крупных автопредприятиях с хорошо отлаженным управлением и документообротом. Что же происходит в более мелких гаражах, у которых просто не хватает ресурсов делать все как «у больших»? Водитель часто (или всегда) не оставляет машину на ночь в гараже, а ставит ее под своими окнами (если это не фура, естественно). Конечно, с согласия руководства. Причины такого положения – организационные и экономические. Они очевидны и в данном контексте мы их не рассматриваем. Итак, водитель садится за руль, и намеревается ехать в офис. Тут его и настигает телефонный звонок, резко меняющий утренний маршрут: оказывается надо срочно заехать на свой склад, который где-то рядом (куда складские документы прислали по факсу), быстро загрузиться и ехать к клиенту, где товар уже ждут со вчерашнего дня. Знакомая ситуация? А как же маршрутный лист?.. Похожих примеров отличия реальной жизни от идеальной можно привести достаточно.

Часто на мини-предприятиях маршрутный лист выдается водителю вместе с обязанностью самому заполнить этот документ, который при случае должен быть сдан в бухгалтерию. Конечно, рядом с водителем должен быть экспедитор, который занимается грузом и документами на него. Жизнь заставляет руководителей экономить, иногда водитель-экспедитор един в трех лицах: он и рулит, он и грузит, он и товарные документы подписывает. А как же путевой лист? Ведь в каждом пункте назначения нужно сделать отметки о времени и пробеге… По жизни получается так, что путевой лист лежит себе в темном «бардачке» и может увидеть свет только при встрече водителя с транспортной инспекцией. Ну, нет у него времени на эти «формальности»… В лучшем случае в конце рабочего дня водитель садится за заполнение путевого листа, вспоминая сегодняшние разъезды и придумывая километраж. Хуже, когда «вспоминать и придумывать» приходится после нескольких напряженных рабочих дней, заполняя сразу стопку путевых листов.

Особняком стоит проблема мелких хищений, допускаемых несознательными водителями. Слив топлива, приписка километража, «приобретение» чеков на бензин у заправщика или в мусорном ведре близ колонки. Мелкие хищения, умноженные на число машин и умноженные на количество дней в месяце (квартале, году) превращаются в дыру значительного размера, куда проваливается весомая часть прибыли, получаемой от перемещения грузов из пункта А в пункт Б. Мы знаем случаи, когда попытки руководства навести порядок в этом секторе (например, путем внедрения на предприятии программного комплекса «Навигатор») приводило к увольнению части водителей, которые открыто заявляли о том, что лишились существенной доли своего дохода.

Иногда работу по заполнению маршрутного листа отдают в бухгалтерию. Водителям становится проще жить, но у бухгалтерии начинается полный кошмар. Молодая бухгалтерша, ничего не понимая в географии и картографии («Маш, а улица Вишневая, это где?»), с трудом находит на потолке маршрут подопечного водителя, который хоть как-то оправдывает понесенные им затраты на топливо. По просьбе одной такой бухгалтерии автор этих строк когда-то написал программку, автоматизирующую эту, мягко скажем, неадекватную работу. Но это же неправильное решение проблемы!

Теперь о главном. Что хотелось бы руководителю? Чтобы реальные проблемы были решены, причем желательно лучшим образом и с минимальными затратами. Что хотелось бы водителю? Заниматься только своей работой, которая в эпоху нескончаемых пробок и хронически сложной дорожной обстановки, является тяжелым и ответственным трудом. Что хотелось бы бухгалтеру? Чтобы маршрутные листы соответствовали действительности, чтобы они были правильно заполнены, и сданы в бухгалтерию вовремя. Есть ли решение, которое удовлетворит всех перечисленных участников документооборота? Есть. Ниже мы расскажем, как «при помощи одной кнопки» получить маршрутный лист вашего транспортного средства за любую рабочую смену водителя. Маршрутный лист будет заполнен реальными данными (пункты назначения, время прибытия-убытия, пробег по сегментам и общий пробег, время работы водителя на линии и т. д).

Интеграция программного комплекса «Навигатор» и программы 1С

Поскольку эпизодически появляющиеся в столице рекламные щиты компании «1С» сообщают о том, что программа успешно работает в более чем миллионе предприятий, поэтому именно платформа 1С v7.7 была использована для решения задачи автоматизации создания путевых листов. Наша цель — показать возможности интеграции, а не разработать некую универсальную программу.

Материал, приведенный ниже, адресован тем пользователям 1С, которые знают, что такое конфигуратор и имеют опыт создания несложных отчетов.

Необходимым условием решения задачи является наличие установленного на вашем компьютере программного комплекса «Навигатор+». Если это еще не сделано, то наш отдел продаж готов устранить это недоразумение (тел. (495) 221-22-91). Программный комплекс «Навигатор+» включает в себя базу данных, в которой хранится, и автоматически пополняется информация о передвижении ваших транспортных средств. Используя компонентную модель объекта (базы данных «Навигатор+»), мы реализуем доступ к компонентам «Навигатора+» при помощи технологии связывания и внедрения объектов OLE (Object Linking and Embedding).

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

Текст программы

Процедура ФорматированиеВремени(ЧЧ,ММ,ВремяФРМ)
	//процедура возвращает переменную ВремяФРМ в формате, необходимом для
	//использования в отчете					
	//ЧЧ-переменная, передающая часы					
	//ММ-переменная, передающая минуты					
	Если(ММ<=9) Тогда
		ММстр="0"+Строка(ММ);
	Иначе
		ММстр=Строка(ММ);
	КонецЕсли;
	Если(ЧЧ>0) Тогда
		ВремяФРМ=Строка(ЧЧ)+" ч "+ММстр+" мин";
	Иначе
		ВремяФРМ=ММстр+" мин";
	КонецЕсли;
КонецПроцедуры
//-------------------------------  						
Процедура РасчетДлиныОтрезкаВремени(ВремяОтпр,ВремяПриб,ВремяВпути)
	//процедура возвращает переменную ВремяВпути, содержащую длину отрезка времени					
	//ВремяОтпр-время отправления					
	//ВремяПриб-время прибытия					
	ВремяОтпрЧЧ=Число(Сред(ВремяОтпр,1,2));
	ВремяОтпрММ=Число(Сред(ВремяОтпр,4,5));
	ВремяОтпрСС=Число(Сред(ВремяОтпр,7,8));
	ВремяОтпрСек=ВремяОтпрЧЧ*3600+ВремяОтпрММ*60+ВремяОтпрСС;

	ВремяПрибЧЧ=Число(Сред(ВремяПриб,1,2));
	ВремяПрибММ=Число(Сред(ВремяПриб,4,5));
	ВремяПрибСС=Число(Сред(ВремяПриб,7,8));
	ВремяПрибСек=ВремяПрибЧЧ*3600+ВремяПрибММ*60+ВремяПрибСС;

	ВремяВпутиСек=ВремяПрибСек-ВремяОтпрСек;
	ВремяВпутиЧЧ=Цел(ВремяВпутиСек/3600);
	ВремяВпутиММ=Цел((ВремяВпутиСек-ВремяВпутиЧЧ*3600)/60);
	ВремяВпутиСС= ВремяВпутиСек-ВремяВпутиЧЧ*3600-ВремяВпутиММ*60;

	ФорматированиеВремени(ВремяВпутиЧЧ,ВремяВпутиММ,ВремяВпути);
КонецПроцедуры
//-------------------------------	

Процедура Выполнить()

	Перем ВремяВпути, РабочееВремя;
	//задаем путь к базе данных "Навигатор"					
	ИмяПути= "C:\Nmap";

	Если ФС.СуществуетФайл(ИмяПути) = 0 Тогда
		Предупреждение("Путь к информационной базы не найден!");
		Возврат;
	КонецЕсли;

	Nmap=СоздатьОбъект("Nmap.GisDatabase");

	Nmap.Open(ИмяПути);

	Таб=СоздатьОбъект("Таблица");
	Таб.ИсходнаяТаблица("");

	ДатаДокумента=Формат(ВыбДата, "Д(0)ДДММММГГГГ");

	//список контрольных точек					
	Nmap.ClearRoute(); //очищаем список КТ
	//добавляем выбранные контрольные точки с номерами с 12 по 16					
	Для НомерКонтрольнойТочки=12 по 16 Цикл
		Nmap.AddRoutePoint(НомерКонтрольнойТочки);
	КонецЦикла;

	ПробегИтого=0;

	tToday  =Строка(ВыбДата)+Строка(" 00:00:00");
	tTonight=Строка(ВыбДата)+Строка(" 23:59:59");

	//Получаем имя ровера					
	RoverName=Nmap.GetRoverName(nRoverID);
	//из названия транспортного средства получаем госномер и фамилию водителя  					
	ГосНомер=Сред(Nmap.GetRoverName(nRoverID),1,8);
	Водитель=Сред(Nmap.GetRoverName(nRoverID), 9);
	// Пробег ровера      					
	dRun = Nmap.GetRoverRun (nRoverID, tToday, tTonight);
	//определяем количество сегментов трека					
	nCount=Nmap.DetectSegments (nRoverID, tToday, tTonight);

	Таб.ВывестиСекцию("Шапка");

	iТопливоСтарт=0;
	iТопливоФиниш=0;

	ПервыйСегментДвижения="да";
	НомерПервогоСегментаДвижения=0;
	НомерПоследнегоСегментаДвижения=nCount-1;
	Nпп=0;
	//просматриваем последовательно все сегменты маршрута 					
	Для nSegment = 0 по nCount-1   Цикл
		Nпп=Nпп+1;
		ИмяКТ="";
		// Получаем информацию о сегменте маршрута с номером nSegment    				
		nSegmentType = Nmap.GetSegmentType(nSegment);
						
		Если nSegmentType = 1 Тогда
			Тип="Движение";
			Адрес="";
			Пробег = Nmap.GetSegmentRun(nSegment);
			ПробегИтого=ПробегИтого+Пробег;
			Если (ПервыйСегментДвижения="да") Тогда
				НомерПервогоСегментаДвижения=nSegmentType;
				ПервыйСегментДвижения="нет";
			КонецЕсли;
			НомерПоследнегоСегментаДвижения=nSegment;
		Иначе
			Если nSegmentType = 2 Тогда
				Тип="Остановка";
				Адрес = Nmap.GetSegmentLocation(nSegment);
				Пробег=0;
				//определяем, есть ли рядом контрольная точка		
				nPointID = Nmap.GetCloseCtrlPoint(nSegment);
				Если (nPointID) <> 0 Тогда
					ИмяКТ = Nmap.GetCtrlPtName(nPointID);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
						
		ТопливоНач=0;
		ТопливоКон=0;
		//получаем уровень топлива в начале сегмента маршрута				
		nFuelIn = Nmap.GetSegmentFuelIn (nSegment);
		Если nFuelIn > 0 Then
			ТопливоНач=nFuelIn;
		КонецЕсли;
		//получаем уровень топлива в конце сегмента маршрута				
		nFuelOut = Nmap.GetSegmentFuelOut (nSegment);
		Если nFuelOut > 0 Then
			ТопливоКон=nFuelOut;
		КонецЕсли;
						
		//определяем запас топлива при старте				
		Если(iТопливоСтарт=0)  Тогда
			//это первый сегмент маршрута ("старт")			
			Если((ТопливоНач<>0) И (ТопливоКон<> 0)) Тогда
				ТопливоНаСтарте=МИН(ТопливоНач,ТопливоКон);
				iТопливоСтарт=1;
			Иначе
				Если((ТопливоНач<>0) И (ТопливоКон=0)) Тогда
					ТопливоНаСтарте=ТопливоНач;
					iТопливоСтарт=1;
				Иначе
					Если((ТопливоНач=0) И (ТопливоКон<>0)) Тогда
						ТопливоНаСтарте=ТопливоКон;
						iТопливоСтарт=1;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		//определяем запас топлива при финише				
		Если((ТопливоНач<>0) И (ТопливоКон<> 0)) Тогда
			ТопливоНаФинише=МИН(ТопливоНач,ТопливоКон);
		Иначе
			Если((ТопливоНач<>0) И (ТопливоКон=0)) Тогда
				ТопливоНаФинише=ТопливоНач;
			Иначе
				Если((ТопливоНач=0) И (ТопливоКон<>0)) Тогда
					ТопливоНаФинише=ТопливоКон;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		//определяем время в начале и в конце данного сегмента маршрута				
		ВремяНач =Сред(Nmap.GetSegmentInStr (nSegment),10);
		ВремяКон =Сред(Nmap.GetSegmentOutStr (nSegment),10);
		//определяем промежуток времени на данном сегменте				
		РасчетДлиныОтрезкаВремени(ВремяНач,ВремяКон,ВремяВпути);
						
		Если(ТопливоНач=0) Тогда
			ПечТопливоНач="";
		Иначе
			ПечТопливоНач=ТопливоНач;
		КонецЕсли;

		Если(ТопливоКон=0) Тогда
			ПечТопливоКон="";
		Иначе
			ПечТопливоКон=ТопливоКон;
		КонецЕсли;
		//выводим в таблицу строку с характеристиками данного сегмента маршрута				
		Таб.ВывестиСекцию("Строка");
	КонецЦикла;//по сегментам маршрута
						
	//выполняем итоговые вычисления					
						
	//расход топлива на 100км					
	РасходТопливаФакт=Число(ТопливоНаСтарте)-Число(ТопливоНаФинише)+ЗаправкаТопливаПоДокументам;
	Если(ПробегИтого<>0) Тогда
		РасходНа100кмФакт=РасходТопливаФакт/ПробегИтого*100;
	Иначе
		РасходНа100кмФакт=0;
	КонецЕсли; 					
	//расчет экономии и перерасхода					
	Если(РасходНа100кмФакт>РасходНа100кмНорма) Тогда
		Перерасход=РасходТопливаФакт-РасходНа100кмНорма*ПробегИтого/100;
		Экономия=0;
	КонецЕсли;
	Если(РасходНа100кмФакт<РасходНа100кмНорма) Тогда
		Перерасход=0;
		Экономия=РасходНа100кмНорма*ПробегИтого/100-РасходТопливаФакт;
	КонецЕсли;
	Если(РасходНа100кмФакт=РасходНа100кмНорма) Тогда
		Перерасход=0;
		Экономия=0;
	КонецЕсли;
	//подсчет времени работы водителя на линии					
	ВремяНачРаботы =Сред(Nmap.GetSegmentInStr (НомерПервогоСегментаДвижения),10);
	ВремяКонРаботы =Сред(Nmap.GetSegmentOutStr (НомерПоследнегоСегментаДвижения),10);
	ФорматированиеВремени(Число(Сред(ВремяНачРаботы,1,2)),Число(Сред(ВремяНачРаботы,4,5)),ВремяВпути);
	РасчетДлиныОтрезкаВремени(ВремяНачРаботы,ВремяКонРаботы,РабочееВремя);
	СпидометрКон=Цел(СпидометрНач+ПробегИтого);
	//выводим в таблицу итоговые характеристики пройденного маршрута					
	Таб.ВывестиСекцию("Итого");
	//					
	Таб.Показать("");
КонецПроцедуры

Приведем пример работы программы автоматического создания путевого листа

Начальные условия. База данных программы мониторинга транспорта «Навигатор» установлена в директории С:\Nmap. В программном комплексе «Навигатор» уже были созданы контрольные точки (КТ) с номерами 12-16, соответствующие пунктам возможного маршрута водителя. Указанным контрольным точкам были присвоены следующие имена:

Номер КТ 12 13 14 15 16
Имя КТ Поставщик Офис Покупатель Склад Гараж

Предполагается, что в названии транспортного средства присутствует номер а/м и фамилия водителя.

Исходные данные, вводимые пользователем: норма расхода топлива для данного транспортного средства — 20л/100км, от водителя получены подтверждающие документы на заправку 33л топлива, показания одометра на начало данного рабочего дня — 123456 км.

Программа мониторинга. Окно ввода данных для формирования путевого листа

Объект нашего исследования — реальный автомобиль, находящийся на реальном маршруте. Названия пунктов назначения мы, конечно, переименовали. При этом трудозатраты такие: заполнение в исходной форме даты маршрута, выбор машины из списка всех машин предприятия, внесение количества литров заправленного горючего (по чекам водителя), нормы расхода топлива для данной машины, показания одометра на начало дня. Если норму расхода топлива и показания одометра хранить в отдельной таблице, то на ввод трех оставшихся данных у бухгалтера уйдет секунд 15. Еще несколько секунд работы программы — и путевой лист готов.

Программа мониторинга траспорта. Путевой лист

Заметим, что для путевого листа не существует унифицированной формы, хотя и существует Приказ Минтранса РФ № 152 от 18.09.08, регламентирующий состав и порядок заполнения путевого листа. Каждое предприятие пользуется тем, что когда-то было разработано в бухгалтерии, и к чему уже все привыкли. Путевой лист, приведенный выше, является лишь примером, и демонстрирует возможности программы. Форма, в которой размещены данные, полученные из программного комплекса «Навигатор», может быть произвольная.

Конечно, на пути автоматизации путевых листов могут быть проблемы. Ну, например, отражение в бухгалтерском документе (а путевой лист является таковым) незапланированных (а может быть и «левых») рейсов водителя, бросающийся в глаза явный перерасход топлива и т.п. Автоматизация процесса приводит к исключению человеческого фактора, при этом «честные» путевые листы могут стать настоящим откровением для всех участников процесса. Конечно, всегда остается возможность внесения ручных правок в сформированный документ, что может рассматриваться скорее как исключение, чем правило. Ручными правками бухгалтерия может вылечить следствие проблемы, а не ее причину (сговор водителя и бухгалтера мы не рассматриваем). Причиной проблемы (нецелевым использованием транспорта, нечестностью водителей) должен заняться руководитель, заинтересованный в максимальной эффективности своего транспортного предприятия. Мы же предлагаем для этого инструмент, экономический эффект от которого будет получен в первый месяц его применения.

28 декабря 2010 г.