Всех с трудовыми праздниками!
На майские ленивые программисты не едут на дачу, а ездят на велосипеде, а еще более ленивые программисты изобретают свой велосипед...
По случаю праздников решил немного отвлечься и выложить что-нибудь просто интересное. Часто в проектах нужно работать с картами, лучше всего конечно использовать внешние карты с API. Проекты бывают разной сложности, но для простых подойдет вот такое решение...
Начнем с конца
Скриншот карточки:
Скриншот с открытым маршрутом:
Для работы нужно сделать следующие действия:
- Добавить скрипт с методами работы с картой
- Добавить ссылку на скрипт
- Создать 2 кнопки в карточке Контрагента
- Добавить обработчики кнопок
Итак, к коду. Для открытия адреса используются 2 основных метода.
Открытие ссылки в IE:
var browser = new ActiveXObject("InternetExplorer.Application");
browser.Navigate(URL);
browser.Visible = true;
}
Формирование url:
if ((Dataset('CountryID') == null) && (Dataset('StateID') == null) && (Dataset('CityID') == null) && (Dataset('Address') == null))
ShowInformationDialog('Укажите адрес, пожалуйста')
else {
AddressString = GetAddressFromDataset(Dataset)
if (RouteOrNot == 'Маршрут') {
OurCompanyAddressString = FormAddressString(GetOurCompanyAddressString())
OpenPageInIE(FormURL(OurCompanyAddressString, FormAddressString(AddressString)));
}
else
OpenPageInIE(FormURL(FormAddressString(AddressString)));
}
}
function FormAddressString(AddressString) {
var space_symbol = ' '
var space_code = '%20'
try {
while (AddressString.indexOf(space_symbol) != -1)
AddressString = AddressString.substring(0, AddressString.indexOf(space_symbol)) + space_code + AddressString.substring(AddressString.indexOf(space_symbol) + 1, AddressString.length)
return AddressString
}
catch (ex) { return ''; }
}
function FormURL(AddressString, AddressString2) {
if (AddressString2 == undefined)
URL = 'http://maps.yandex.ru/?text=' + DecodeURL(AddressString) + '&l=map'
else
URL = 'http://maps.yandex.ru/?rtext=' + DecodeURL(AddressString) + '~' + DecodeURL(AddressString2) + '&l=map'
return URL
}
function DecodeURL(text) {
var text_result = text;
var source_symbols = "№ / , й ц у к е н г ш щ з х ъ ф ы в а п р о л д ж э я ч с м и т ь б ю Й Ц У К Е Н Г Ш Щ З Х Ъ Ф Ы В А П Р О Л Д Ж Э Я Ч С М И Т Ь Б Ю".split(' ');
var result_symbols = "%E2%84%96+%2F+%2C+%D0%B9+%D1%86+%D1%83+%D0%BA+%D0%B5+%D0%BD+%D0%B3+%D1%88+%D1%89+%D0%B7+%D1%85+%D1%8A+%D1%84+%D1%8B+%D0%B2+%D0%B0+%D0%BF+%D1%80+%D0%BE+%D0%BB+%D0%B4+%D0%B6+%D1%8D+%D1%8F+%D1%87+%D1%81+%D0%BC+%D0%B8+%D1%82+%D1%8C+%D0%B1+%D1%8E+%D0%99+%D0%A6+%D0%A3+%D0%9A+%D0%95+%D0%9D+%D0%93+%D0%A8+%D0%A9+%D0%97+%D0%A5+%D0%AA+%D0%A4+%D0%AB+%D0%92+%D0%90+%D0%9F+%D0%A0+%D0%9E+%D0%9B+%D0%94+%D0%96+%D0%AD+%D0%AF+%D0%A7+%D0%A1+%D0%9C+%D0%98+%D0%A2+%D0%AC+%D0%91+%D0%AE".split('+');
for (var i = 0; i source_symbols.length; i++)
while (text_result.indexOf(source_symbols[i]) != -1)
text_result = text_result.replace(source_symbols[i], result_symbols[i]);
text_result = text_result.replace(' ', '+');
return text_result;
}
function GetAddressFromDataset(Dataset) {
var separator = ', '
var CountryName = String(GetDatasetFieldValueFromDatasetByUSI('ds_Country', 'ID', Dataset('CountryID'), 'Name'))
var StateName = String(GetDatasetFieldValueFromDatasetByUSI('ds_State', 'ID', Dataset('StateID'), 'Name'))
var CityName = String(GetDatasetFieldValueFromDatasetByUSI('ds_City', 'ID', Dataset('CityID'), 'Name'))
var address_result = separator + CountryName + separator + StateName + separator + CityName + separator + Dataset('Address');
while (address_result.indexOf('null') != -1)
address_result = address_result.substring(0, address_result.indexOf('null')) + address_result.substring(address_result.indexOf('null') + 4, address_result.length)
while (address_result.indexOf(separator) == 0)
address_result = address_result.substring(separator.length, address_result.length)
if (address_result.lastIndexOf(separator) == address_result.length - separator.length)
address_result = address_result.substring(0, address_result.lastIndexOf(separator))
return address_result
}
Для построения маршрута нужна начальная точка - это тот адрес, который указан в Контрагенте "Наша компания":
var ContactID = Connector.CurrentUser.ContactID
var AccountID = GetDatasetFieldValueFromDatasetByUSI('ds_Contact', 'ID', ContactID, 'AccountID')
var SelectQueryOurCompany = Services.GetNewItemByUSI('sq_Account');
ApplySelectQueryFilter(SelectQueryOurCompany, 'ID', AccountID, true);
var DatasetOurCompany = SelectQueryOurCompany.Open();
DatasetOurCompany.Open()
return GetAddressFromDataset(DatasetOurCompany)
}
Ну и конечно код сервиса и инструкция по установке всегда в вашем распоряжении.
Вопросы, замечания и предложения приветствуются!
Интересно! А еще как бы открыть по адресу (или без адреса), указать точное расположение, и сохранить координаты в базе :)
"Владимир Соколов" написал:Интересно! А еще как бы открыть по адресу (или без адреса), указать точное расположение, и сохранить координаты в базе :)
И такой проект у нас как раз недавно был, правда на 7ке и для e-commerce - нужно было определять ближайший склад и маршрутизировать туда заказ.
P.S.: В понедельник, 5го мая выложу:)
Александр а у вас есть страница в фейсбук. есть вопрос хочу написать в личку. или в одноклассниках? подскажите
Ммм, мои контакты конечно не секрет:smile:
Почта svistunov@samarasoft.ru
Телефон +79023218417
Скайп aleksander.svistunov
Вконтакт https://vk.com/tom_sv
Фейсбук https://www.facebook.com/a.svistunov (бываю там очень редко, не пользуюсь)
Одноклассники - по-моему заводил там аккаунт лет 6 назад и вроде даже не удалял, но не пользуюсь.
"Владимир Соколов" написал:Интересно! А еще как бы открыть по адресу (или без адреса), указать точное расположение, и сохранить координаты в базе :)
Владимир, как и обещал, выкладываю пост о там, как это сделать - http://www.community.terrasoft.ru/blogs/10538