Реализация расчета стоимости по адресу доставки в УТ 10.3. Нужна помощь с советом

1. silvestor 14.06.16 08:48 Сейчас в теме
Сейчас столкнулся с такой задачей, она интересная, но в моей практике первая. Реализовать механизм автоматического расчета стоимости доставки по адресу доставки, так как у контрагента плательщик один а адресов куча, вот думаю как лучше это реализовать? Но пока только придумал два варианта, первый это получать координаты через google api maps, через json парсить и уже на основе координат рассчитывать км и потом стоимость,( минусы этого варианта: завязанность на интернете, и не точно считает км так как не прокладывается маршрут, а вычисляется по суди прямая от точки до точки.) Второй вариант это создания справочника с зонами в которых будут прописаны зоны доставки по областям, и уже на основе этих зон сделать регистр сведений в который будут писаться контрагенты с адресами доставки, зонами и тарифом. Третий вариант пока еще не придумал, прошу совета у вас, посоветуете или подскажите как можно еще реализовать?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. config 190 14.06.16 10:38 Сейчас в теме
(1) silvestor, второй вариант. Крупные фирмы обычно считают как раз по зонам доставки. Гугл иногда неточен, точнее, обычно всегда неточен.
К тому же этот вариант прост в разработке и в основном зависит от пользователя, а не от Гугла или интернета. И он более гибок, легко довнести какие-то исключения.
3. silvestor 15.06.16 14:07 Сейчас в теме
Реализовал вот так короче, чтобы обойтись только одним справочником, не знаю правильно это или нет, но так как адрес доставки представляет собой строку в документе вкладка дополнительно, и пользователь может туда вводить данные от руки, что при записи в регистр может дублироваться чтобы не плодить лишние записи. Сделал так.
Интересно мнение гуру по 1с.

Функция РасчетСтоимостиПровозаГруза(СсылкаНаОбъект) Экспорт 
	  
	Грузополучатель = ?(Не ЗначениеЗаполнено(СсылкаНаОбъект.Грузополучатель),СсылкаНаОбъект.Контрагент,СсылкаНаОбъект.Грузополучатель);
	
	Попытка
		Запрос = Новый Запрос;
		
		Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
		|	КонтактнаяИнформация.Поле2 КАК Регион,
		|	КонтактнаяИнформация.Поле4 КАК Город,
		|	КонтактнаяИнформация.Представление
		|ИЗ
		|	(ВЫБРАТЬ
		|		ВидыКонтактнойИнформации.Ссылка КАК Ссылка
		|	ИЗ
		|		Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
		|	ГДЕ
		|		ВидыКонтактнойИнформации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
		|		И ВидыКонтактнойИнформации.ВидОбъектаКонтактнойИнформации = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовКонтактнойИнформации.Контрагенты)) КАК ВложенныйЗапрос
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
		|		ПО ВложенныйЗапрос.Ссылка = КонтактнаяИнформация.Вид.Ссылка
		|ГДЕ
		|	КонтактнаяИнформация.Объект = &Контрагент
		|	И КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
		|	И КонтактнаяИнформация.Представление ПОДОБНО """ + СокрЛП(СсылкаНаОбъект.АдресДоставки) + """";
		
		Запрос.УстановитьПараметр("Контрагент",Грузополучатель);
		Результат = Запрос.Выполнить().Выгрузить();
		
		СтруктураАдреса = Новый Структура;                                          
		Для каждого Строка Из Результат Цикл 
			СтруктураАдреса.Вставить("Регион", Строка.Регион);
			СтруктураАдреса.Вставить("Город", Строка.Город);
		КонецЦикла;
		
		Запрос = Новый Запрос;
		
		Запрос.Текст = "ВЫБРАТЬ
		|	ЗоныОбслуживанияСоставЗоны.Ссылка.Наименование,
		|	ЗоныОбслуживанияСоставЗоны.Ссылка.Цена,
		|	ЗоныОбслуживанияСоставЗоны.Организация,
		|	ЗоныОбслуживанияСоставЗоны.Регион,
		|	ЗоныОбслуживанияСоставЗоны.Город
		|ИЗ
		|	Справочник.ЗоныОбслуживания.СоставЗоны КАК ЗоныОбслуживанияСоставЗоны
		|ГДЕ
		|	(ЗоныОбслуживанияСоставЗоны.Регион = &Регион
		|			ИЛИ ЗоныОбслуживанияСоставЗоны.Регион = """")
		|	И (ЗоныОбслуживанияСоставЗоны.Город = &Город
		|			ИЛИ ЗоныОбслуживанияСоставЗоны.Город = """")";
		Запрос.УстановитьПараметр("Регион",СтруктураАдреса.Регион);
		Запрос.УстановитьПараметр("Город",СтруктураАдреса.Город);
		
		Если Запрос.Выполнить().Пустой() тогда 
			Сообщить("Проверте правильность заполнения адреса доставки в сообветствии с ""Адресным классификатором""");
		Иначе
			Выборка = Запрос.Выполнить().Выбрать();
			
			
			Пока Выборка.Следующий() Цикл 
				Если Выборка.Организация = СсылкаНаОбъект.Организация Тогда 
					Если Выборка.Регион = СтруктураАдреса.Регион  и Выборка.Город = СтруктураАдреса.Город Тогда 	
						Цена = Выборка.цена;
						Сообщить("" + Цена + " 1");
						Прервать;
					ИначеЕсли Выборка.Регион = СтруктураАдреса.Регион и Выборка.Город <> СтруктураАдреса.Город Тогда 			
						Цена = Выборка.Цена;
						Сообщить("" + Цена + " 2");
						Прервать;
					ИначеЕсли Выборка.Регион <> СтруктураАдреса.Регион и Выборка.Город <> СтруктураАдреса.Город Тогда
						Цена = Выборка.Цена;
						Сообщить("" + Цена + " 3");
						Прервать;	
					КонецЕсли;
				Иначе 
					Цена = 0;
				КонецЕсли;
				
			КонецЦикла;	
		КонецЕсли;
		
		Возврат Цена;
	Исключение
	     Сообщить("В поле ""Адрес доставки"" введен не корректный адрес доставки, необходимо проверить!");	
	КонецПопытки;
				
КонецФункции
Показать
4. silvestor 15.06.16 14:10 Сейчас в теме
Это еще черновик, просто склепал сейчас проверил все работает, и заодно пользователей к порядку заведения адресов через "Классификатор адресов" приучу, а не от балды и как придется.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот