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