Яндекс карты: отображение очень большого количества обьектов на карте

Задача: отобразить на карте  ОЧЕНЬ большого количества обьектов на карте:

Решение: для отображения используем ObjectManager с включенной кластеризаций, кроме того, обекты загружаем через JSON с типом «Feature» — т.е. метки загружаются ни как обьекты, а как «теневой массив», который не умеет отображать контент,хинты и имеет еще ряд ограничений. Этот момент мы обходим следующим образом: при наведении курсора мышки на  метку, мы переносим её в «обьекты».

javascript:

    var myMap;    
    latitude=55.76;
    longitude=37.64;
    navigator.geolocation.getCurrentPosition(
    function(location) {
      latitude=location.coords.latitude;
      longitude=location.coords.longitude;
      accuracy=location.coords.accuracy;
      ymaps.ready(init);
    },
    function(error){
        ymaps.ready(init);        
    }
    );    


function init () {
    console.log("-инициируем карту в "+latitude+" и "+longitude);
    myMap = new ymaps.Map('map', {
        center: [latitude, longitude], 
        controls: ['trafficControl','zoomControl','routeButtonControl','routeEditor'],
        zoom: 15
    }, {
        searchControlProvider: 'yandex#search'
    });    
    if (isMobile.any()) {
        console.log("-открыто на мобильнике - отключаем мультитач");
        //myMap.behaviors.disable('drag');
        myMap.behaviors.disable('multiTouch');
    }
    LoadEVCByCar(<?=$Users->defaultcar?>);
}    
function LoadEVCByCar(carcode){
    //очищаем холст
    myMap.geoObjects.removeAll();
    NormalCollection = new ymaps.GeoObjectCollection();
    //теневые не полноценные обьекты загружаем скопом
    objectManager = new ymaps.ObjectManager({clusterize: true}); 
    myMap.geoObjects.add(objectManager);        
    $.post("csdcsdcs", {  
        carcode:carcode,
        latitude:latitude,
        longitude:longitude
    }).done(function(data) {
        jsond=JSON.parse(data);
        objectManager.add(jsond);    
    });
    // по событию "попадание мышкой" теневой обьект удаляем и создаем "настоящий" полноценный, с которым далее и работаем..
    objectManager.objects.events.add(['mouseenter', 'mouseleave'], Shadow2Normal);
  
};
function Shadow2Normal (e) {
    aa=e;
    console.log(e);
    if (e.get('type') == 'mouseenter') {        
        objectIdcur = e.get('objectId');
        newob=objectManager.objects.getById(objectIdcur);
        myMap.geoObjects.remove([objectIdcur]);
        objectManager.remove([objectIdcur]);
                
        newob.options["draggable"]=false;
        newob.options["id"]=newob.id;
        NormalObject = new ymaps.GeoObject(
                {
                    id:   newob.id,
                    geometry :   newob.geometry,
                    properties:  newob.properties
                },
                    newob.options
                );
        
        NormalCollection.add(NormalObject); //добавляем в коллекцию    
        myMap.geoObjects.add(NormalCollection); // добавляем на холст                  
        
    };
}

PHP:

<?php
    $JsonEVCS=array();
    $JsonEVCS["type"]="FeatureCollection";
    
    $longitude= _POST("longitude");
    $latitude= _POST("latitude");
    $carcode= _POST("carcode");
    for ($i = 1; $i <= 10000; $i++) {
            $evcs_info=array();
            $evcs_info["type"]="Feature";
            $evcs_info["id"]=$i;        
            $evcs_info["geometry"]["type"]="Point";
            $m1=rand(0,1);if ($m1==0){$m1=-1;};
            $m2=rand(0,1);if ($m2==0){$m2=-1;};
            $evcs_info["geometry"]["coordinates"]=array($latitude+$m1*rand(1,200)/100,$longitude+$m2*rand(1,200)/100);                                
            $evcs_info["properties"]["balloonContent"]="html код";
            $evcs_info["properties"]["hintContent"]="Подсказка";
            $evcs_info["properties"]["data"]["ip"]="32у23";  
            $evcs_info["options"]["preset"]="islands#redDotIcon";
            $evcs_info["properties"]["iconContent"]="Имя";
            $evcs_info["options"]["draggable"]=false;
            $evcs_info["options"]["hideIconOnBalloonOpen"]=false;
            $JsonEVCS["features"][]=$evcs_info;
    };
  echo json_encode($JsonEVCS);

Генерация случайного имени файла при загрузке на сервере

Для того чтобы сохранить кудато в папку на сервере файл выбранный пользователем, необходимо указать его имя. Чтобы имена точно не повторялись, можно поступить например так:

$answer["error"]=true;
$answer["errortext"]="Ошибка сохранения фото (ошибка доступа)";

$uploaddir = WUO_ROOT.'/uploads'; 
if( ! is_dir( $uploaddir ) ) mkdir( $uploaddir, 0777 );
$uploaddir = WUO_ROOT.'/uploads/'.Date("Y"); 
if( ! is_dir( $uploaddir ) ) mkdir( $uploaddir, 0777 );
$uploaddir = WUO_ROOT.'/uploads/'.Date("Y")."/".Date("md"); 
if( ! is_dir( $uploaddir ) ) mkdir( $uploaddir, 0777 );

$files      = $_FILES; // полученные файлы
foreach( $files as $file ){
		$file_name = $file['name'];
                $file_name = md5(microtime() . rand(0, 9999)).uniqid().".".getExtension1($file_name);
		if( move_uploaded_file( $file['tmp_name'], "$uploaddir/$file_name" ) ){
                    $done_files = realpath( "$uploaddir/$file_name" );
                    $answer["error"]=false;
                    $answer["errortext"]="";
                    $answer["result"]=$done_files;
		}
}

echo json_encode($answer);

function getExtension1($filename) {
    return end(explode(".", $filename));
};

Одно Но! тут нет контроля, что пользватель выбрал файл без расширения. Хотя с другой стороны, я например это ограничиваю на уровне выбора файла. Например так:

<input id="fileinput" type="file" accept="image/*" capture="capture" >

1С: Преобразование данных в JSON. Вся боль и печаль.

К сожалению 1С не умеет преобразовывать абсолютно любые данные в формат JSON. Есть некоторые ограничения. Из тех которые мне попались: не умеет преобразовывать NULL, не умеет преобразовывать таблицы значений.

Как обхожу проблему NULL в запросах:

		|	ВЫБОР
		|		КОГДА ПользователиПриложения.КлиентЮрлицо.Наименование ЕСТЬ NULL
		|			ТОГДА """"
		|		ИНАЧЕ ПользователиПриложения.КлиентЮрлицо.Наименование
		|	КОНЕЦ КАК КлиентЮрлицоНаименование

Как преобразовываю Таблицу Значений:

Вариант 1:

    Если ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда
        Значение1 = ОбщегоНазначения.ТаблицаЗначенийВМассив(Значение);
    КонецЕсли;

Вариант 2 (по сути «ручной» вариант первого варианта):

	МассивАвто=Новый Массив();
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		ТаблицаАвтомобилейПользователя=Новый структура("AutoName,AutoCode","","");		
		ТаблицаАвтомобилейПользователя.AutoName=ВыборкаДетальныеЗаписи.Наименование;
		ТаблицаАвтомобилейПользователя.AutoCode=ВыборкаДетальныеЗаписи.Код;
	КонецЦикла;
	
	Информация.ТаблицаАвтомобили=МассивАвто;

Убираем из URL адресной строки на странице сайта лишнее

Задача: убрать из адресной строки страницы сайта открытой по ссылке из поисковика Яндекса, «лишнюю» информацию, которая идет «прицепом» от яндекса.

Решение:

<script>    
function UrlBrowserYandexCuter(){
   path=document.location.pathname.split("yclid");
   path=path[0];
   search=document.location.search.split("yclid");;
   search=search[0];
   hash=document.location.hash.split("yclid");;
   hash=hash[0];
   url=path+search+hash;
   if (url.slice(-1)=="?"){
    url=url.substring(0, url.length - 1);   
   };
   history.replaceState(null,null, url);
};
UrlBrowserYandexCuter();
</script>

1С: проверка вилидности email и пароля

Ну например можно организовать вот так:

Функция ПарольСоответствуетТребованиям (Пароль) экспорт
	УстановитьПроверкуСложностиПаролейПользователей(Истина);
	ВременныйПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
	ВременныйПользовательИБ.АутентификацияСтандартная = Истина;
	ВременныйПользовательИБ.Имя = НСтр("ru = 'Временный пользователь'")+
	" (" + Строка(Новый УникальныйИдентификатор) + ")";
	ВременныйПользовательИБ.Пароль = Пароль;
	ХорошийПароль = Истина;
	Попытка
		ВременныйПользовательИБ.Записать();
	Исключение
		ХорошийПароль = Ложь;
	КонецПопытки;
	ВременныйПользовательИБ.Удалить();
Возврат ХорошийПароль;
КонецФункции
Функция ПроверкаВалидностиEmail(Адрес) Экспорт
    ЛатинскиеБуквы = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    Цифры = "0123456789";
    //ищем крайний справа символ @ для правильного выделения локальной и доменной части
    ИндексСобаки = Найти(Адрес,"@");
    //1. строка адреса вообще не содержит разделителя
    Если ИндексСобаки = 0 Тогда
        Возврат ЛОЖЬ;
    КонецЕсли;
    УрезаемаяСтрока = Сред(Адрес, ИндексСобаки+1);
    Пока Найти(УрезаемаяСтрока,"@") > 0 Цикл
        ИндексСобаки = ИндексСобаки + Найти(УрезаемаяСтрока,"@");
        УрезаемаяСтрока = Сред(УрезаемаяСтрока, ИндексСобаки+1);
    КонецЦикла;
    ДоменнаяЧасть = Сред(Адрес, ИндексСобаки+1);
    ЛокальнаяЧасть = Лев(Адрес, ИндексСобаки-1);
    //2. Проверяем длину локальной части
    Если СтрДлина(ЛокальнаяЧасть) < 1 ИЛИ СтрДлина(ЛокальнаяЧасть) > 64 Тогда
        Возврат ЛОЖЬ;
    КонецЕсли;
    //3. Проверяем длину доменной части
    Если СтрДлина(ДоменнаяЧасть) < 1 ИЛИ СтрДлина(ДоменнаяЧасть) > 255 Тогда
        Возврат ЛОЖЬ;
    КонецЕсли;
    //4. Проверяем что локальная части не начинается и не заканчивается на "."
    Если Лев(ЛокальнаяЧасть, 1) = "." ИЛИ Прав(ЛокальнаяЧасть, 1) = "." Тогда
        Возврат ЛОЖЬ;
    КонецЕсли;
    //5. Локальная части не содержит 2 или более "." подряд
    Если Найти(ЛокальнаяЧасть, "..") > 0 Тогда
        Возврат ЛОЖЬ;
    КонецЕсли;
    //Проверка доменной части
    //6. Доменная часть не начинается с точки
    Если Лев(ДоменнаяЧасть, 1) = "." Тогда
        Возврат ЛОЖЬ;
    КонецЕсли;
    //7. Доменная часть не содержит 2 или более "." подряд
    Если Найти(ДоменнаяЧасть, "..") > 0 Тогда
        Возврат ЛОЖЬ;
    КонецЕсли;
    //8. Проверка частей доменной части
    //каждая часть начинается с буквы и заканчивается буквой или цифрой
    //каждая часть длиной не более 63 символов
    ИдентификаторыДоменнойЧасти = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ДоменнаяЧасть, ".");
    Для Каждого ИдентификаторДомена ИЗ ИдентификаторыДоменнойЧасти Цикл
        Если СтрДлина(ИдентификаторДомена) > 63 Тогда
            Возврат ЛОЖЬ;
        КонецЕсли;
        Если Найти(ЛатинскиеБуквы, Лев(ИдентификаторДомена,1)) = 0
            //для доменов, нарушающих RFC 1035 п.2.3.1, например @1c.ru :)
            И Найти(Цифры, Лев(ИдентификаторДомена,1)) = 0
            Тогда
            Возврат ЛОЖЬ;
        КонецЕсли;
        Если Найти(ЛатинскиеБуквы, Прав(ИдентификаторДомена,1)) = 0 И Найти(Цифры, Прав(ИдентификаторДомена,1)) = 0 Тогда
            Возврат ЛОЖЬ;
        КонецЕсли;
    КонецЦикла;
    //Все проверки пройдены - радуемся
    Возврат ИСТИНА;
КонецФункции

Жизнь замечательных грибов