Всех с трудовыми праздниками!
На майские ленивые программисты не едут на дачу, а ездят на велосипеде, а еще более ленивые программисты изобретают свой велосипед...
По случаю праздников решил немного отвлечься и выложить что-нибудь просто интересное. Часто в проектах нужно работать с картами, лучше всего конечно использовать внешние карты с API. Проекты бывают разной сложности, но для простых подойдет вот такое решение...

Начнем с конца:smile:
Скриншот карточки:

Скриншот с открытым адресом:

Скриншот с открытым маршрутом:

Для работы нужно сделать следующие действия:

  1. Добавить скрипт с методами работы с картой
  2. Добавить ссылку на скрипт
  3. Создать 2 кнопки в карточке Контрагента
  4. Добавить обработчики кнопок

Итак, к коду. Для открытия адреса используются 2 основных метода.

Открытие ссылки в IE:

function OpenPageInIE(URL) {
    var browser = new ActiveXObject("InternetExplorer.Application");
    browser.Navigate(URL);
    browser.Visible = true;
}

Формирование url:

function LoadYandexMap(Dataset, RouteOrNot) {
    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
}

Для построения маршрута нужна начальная точка - это тот адрес, который указан в Контрагенте "Наша компания":

function GetOurCompanyAddressString() {
    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)
}

Ну и конечно код сервиса и инструкция по установке всегда в вашем распоряжении.
Вопросы, замечания и предложения приветствуются!

Нравится

Поделиться

5 комментариев

Интересно! А еще как бы открыть по адресу (или без адреса), указать точное расположение, и сохранить координаты в базе :)

"Владимир Соколов" написал:

Интересно! А еще как бы открыть по адресу (или без адреса), указать точное расположение, и сохранить координаты в базе :)


И такой проект у нас как раз недавно был, правда на 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

Показать все комментарии