© Copyright достойный уважения




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

59 Comments

  1. CheBurator

    ..их умножат на ноль…???

    Reply
  2. O-Planet

    Всегда был ф шоке от «проявлений духовности» технарей.

    Reply
  3. kitt

    При упоминании «мистического, внеюридического воздаяния» сразу вспомнился поп их хф «День выборов» который кричал: — Я по тебе заочно анафему отпою!

    ))

    Reply
  4. venger

    (3) Да, «…мистического, внеюридического воздаяния…» — это супер:-))

    Хотя, в контексте спецслужб, это жутковато звучит. Ведь можно, чисто случайно, под машину попасть, например:-))

    Reply
  5. venger

    Кстати, все мы сидим за компами сутками, глаза портим…

    Очень рекомендую лекции о зрении, его поддержании в норме и восстановлении:

    Очки пора снимать. Как восстановить зрение на 100% (6 занятий)

    http://pravdu.ru/lessons/jdanov/

    Если у вас проблемы со зрением, это не значит, что Вы должны с этим смириться и носить очки. Да, очки помогут вам сегодня, но в итоге зрение будет только ухудшаться. Дело в том, что зрение зависит от работы глазо-двигателных мышц (продольных, поперечных). Как только вы наденете очки,ваши глазные мышцы перестанут работать.

    Основная причина близорукости, дальнозоркости, косоглазия и астигматизма — это нарушение работы глазных мышц (их всего шесть). Из этого следует, что практический любой человек может полностью восстановить зрение с помощью упражнений для глаз. Упражнения простые, но довольно эффективные. Что сегодня предлагает современная офтальмология? Она по сути бессильна и предлагает только очки (или хуже того, операцию на глаза).

    Дело в том, что основывается эта наука на постулатах двухсотлетней давности. А между тем ещё 100 лет назад американский учёный Бейтс пересмотрел теорию работы глаза. Его исследования показали, что все проблемы с глазами так или иначе связаны с состоянием глазных мышц. Если вы видите хорошо, значит у вас глазные мышцы натренированы и свободны. Если носите очки — значит одни мышцы сдавлены, другие растянуты, либо расслаблены, атрофированы.

    В наши дни русский профессор Жданов полностью изучил теорию американского учёного и подтвердил её на практике. Действительно, улучшение зрения может начаться после первых упражнений. Что особенно важно — необходимо сразу отказаться от очков, насколько это возможно! Вы спросите, почему же до сих пор эта методика лечения не распространяется? Ответ заключается в ежегодных огромных миллиардах прибыли от продаж оптических линз…

    Reply
  6. PeRom

    Так это и есть первый урок ДОТУ! Разве не так?

    Reply
  7. venger

    (6) Не, это копирайт, целиком тут:

    http://www.koba.ru/file/Dostatochno-Obschaya-Teoriya-Upravleniya.zip

    Reply
  8. venger

    (2) Кстати, O-Planet, а как тебе такая аналогия? Что скажешь в свое оправдание:-)

    Шучу, но что думаешь по этому поводу?

    У тебя есть яблоко, тебе, чтобы поделиться им с другим, надо его отдать, т.е. у тебя после этого яблока не будет.

    Чтобы дать кому-нибудь еще одно яблоко, тебе опять его надо вырастить или найти. И если ты отдашь, у тебя опять яблока не будет.

    А вот с программой все иначе, ты ее скопировал любому количеству людей и у тебя тоже осталось…

    Т.е. да, за твой труд, конечно, надо бы денюжку получить, кушать то надо, но вопрос в том, а сколько тебе надо, чтобы кушать?:-)

    Reply
  9. АЛьФ

    2(8) Столько, сколько готов заплатить тот, кому нужна программа Планета. Это рынок.

    Reply
  10. O-Planet

    (8) Аналогия не точна. Яблоко — штучный товар. Его стоимость определяется трудовыми и материальными затратами по выращиванию. Стоимость ПО на самом деле, намного выше его розничной цены. Его себестоимость оценить достаточно сложно. Тут и оригинальность идеи, и удачность реализации, и трудозатраты. Поэтому, ПО продается по рыночной стоимости, в надежде, что количество продаж покроет его истиную стоимость.

    Reply
  11. venger

    (9,10) Да, еще немного общения, и … моя детская мечта о свободном и бескорыстном мире развалится:-)

    Reply
  12. O-Planet

    (11) Кассирочка… Разрабатывалась с нуля месяц. Даже если поставить по 4 часа в 22 дня, то это — 120 часов. Итого 60000 чисто по времени. После этого дорабатывалась неоднократно, было выпущено 2 обновления. Это — еще по времени недели две. Т.е. +30000. А как учесть мониторинг рынка? Я ведь не вдруг что-то добавляю. Приходится собирать инфу, анализировать… Пожалуйста, если кто-то выложит за программу тысяч 200, то я кину ее в свободное скачивание.

    Reply
  13. АЛьФ

    2(11) Странные у тебя мечты… Ты их в супермакете тоже озвучиваешь?

    +(12) КЗК разрабатывался около года, плюс более поздние доработки более ранее время, потраченное на всякие изыскиния и приобретение необходимого опыта. Итого, допустим, 1,5 года, т.е. 18 месяцев. Пусть будут те же 60 штук в месяц. Итого что-то в районе миллиона. Плюсуем поддержку и сопровождение, раскрутку и продвижение, затраты на рекламу и т.п. Если кто-нибудь выложит 3 миллиона, то выложу КЗК 2.0 в свободный доступ с исходниками.

    Reply
  14. ineoosaki

    2(13)

    «Если кто-нибудь выложит 3 миллиона, то выложу КЗК 2.0 в свободный доступ с ИСХОДНИКАМИ»

    А как же тогда быть с теми, кто уже купил лицензионный КЗК, для защиты своего кода?

    ИМХО, некорректное заявление с твоей стороны по отношению к ним.

    Нехочешь поместить это заявление на страничку с КЗК?

    Reply
  15. АЛьФ

    2(14) С чего это вдруг «некорректное заявление»?! От открытия исходников КЗК перестанет компилировать?

    Хорошо, если ты так переживаешь, то могу за 2,5 лямя выложить без исходников.

    Reply
  16. ineoosaki

    + к 14.

    У меня сложилось впечатление, что profile_247 постит бысрее, чем думает, что постит.

    Reply
  17. ineoosaki

    2(15)

    КЗК не перестанет компилировать, но декомпилятор появиться я думаю практически в тот же день, как ты откроешь исходники. Даже ради интереса, кто-то сделает. Например MMF.

    Reply
  18. АЛьФ

    2(17) Объясни, пожалуйста, откуда у тебя такие мысли. Что-то туплю к концу дня. Как связано открытие исходников КЗК и появление декомпилятора?

    Reply
  19. ineoosaki

    для 18

    А что объяснять, когда исходники закрыты?

    Reply
  20. venger

    (13) АЛьФ, ты воспринимаешь устройство общества в котором живешь, как данность и константу:-)

    Reply
  21. venger

    (13) Кстати, раз яблоко — это не программа, то каким боком тут супермаркет?:-)

    Reply
  22. O-Planet

    (21) Супермаркет — это больше про КЗК. Кассирочка — это чистое искусство. 😉

    Reply
  23. АЛьФ

    2(19) Ну, хотя бы объясни с чего ты вдруг заявляешь, что «декомпилятор появиться я думаю практически в тот же день, как ты откроешь исходники». На чем-то же это твое «я думаю» основано.

    2(20) Я уже не в том возрасте, чтобы с ясным одухотворенным лицом бросаться переворачивать мир.

    Reply
  24. АЛьФ

    2(23) Скорее небольшая халтурка. Чистое искусство — это FormEx.

    Reply
  25. O-Planet

    (24) Неее… Тебе не понять. Если КЗК ассоциировалось с презервативом, то FormEx тянет в лучшем случае, на набор гаечных ключей.

    Reply
  26. АЛьФ

    2(21) Ну, ты расширил свои мечты до всего мира, я попытался их хотя бы в рамки супермаркета уложить.

    Reply
  27. Душелов

    Жесть какая…

    Reply
  28. ineoosaki

    2(22)

    То есть ты хочешь сказать, что т.н. «p-code» полностью необратим?

    У меня где-то сохранилась ветка с мисты на тему тестировки КЗК2, в которой есть доказательство обратного.

    Reply
  29. venger

    (22) АЛьФ, насчет изменить мир, это ты преуменьшаешь свои возможности:-)

    Это как в анекдоте про старого и молодого бычка:-)) Помнишь?

    Стоят два бычка на пригорке, а внизу пасется стадо коров.

    Молодой (с ясным одухотворенным лицом): О-о, смотри какая коровка, давай побежим, поим… ее!

    Молодой (с еще более ясным и одухотворенным лицом): О-о, нет, давай вот ту лучше, побежали быстрее!

    Старый (медленно, жуя): Не, мы спокойно спустимся и поим… все стадо:-)

    Reply
  30. АЛьФ

    2(28) Боже упаси меня от таких заявлений! Но ветку с мисты перечитай. Я хочу сказать, что если ты увидешь с исходниках pMod->Compile(), то это тебе ни чем не поможет в создании декомпилятора.

    2(29) Извини, ты опоздал. Мы с vip’ом уже давно спокойно и медленно спустились с того холма…

    Reply
  31. venger

    (12,13) O-Planet, АЛьФ, ну Вы ж непрвильно считаете.

    Где, гарантия, что, если б Вы не тратили это время на эти работы, то стопроцентно заработали бы эти суммы за это время на чем-нибудь другом? Хорошо, даже не стопроцентно, но с подавляющей долей вероятности. И кто после этого технарь?:-)))

    Reply
  32. АЛьФ

    2(31) Хорошо, предложи свой вариант подсчета на примере какого-нибудь своего коммерческого продукта.

    Reply
  33. venger

    И по поводу так любимого Вами рынка. Вот система рейтингов инфостарта чистый свободный рынок. Что массе нравится, получает больший рейтинг. Нравится юмор – плюсуют, нравится более простые работы – плюсуют их больше, чем что-то сложное или утонченное. Так в чем дело? Что за попытки ввести ручное управление рынком? Ручное модерирование, изменить правила игры себе в угоду? Двойные стандарты:-)

    Да и где Вы видели чистый свободный рынок – эта такая же утопия, как коммунизм:-)

    Reply
  34. venger

    Кстати, а чего бы не сделать такую функцию, чтобы голосовать за удаление работы или блога? Если набрало больше 15-ти или 20-ти, то удаляется автоматом? И наоборот, голосование за то, чтобы оставить. Разница за и против и будет решением на удаление? Перед удалением таких работ стоит, конечно, глянуть модератору на всяк случай, но сама идея избавления от мусора как Вам?

    Reply
  35. O-Planet

    (31) Причем тут гарантии? Мы говорим о стоимости одного часа работы, 500 руб. Если я работаю на хозяина, то он гарантированно мне это платит, так? В случае разработки чего-то, я также работаю. Но вместо хозяина мне платят юзеры. Я уже гарантированно работаю, когда что-то разрабатываю, а не в тетрис играю.

    Reply
  36. CheBurator

    (10) фигня полная…

    что бы ни продавалось на рынке — если для меня потребительская стоимость данной вещи (программы, идеи и т.д.) — маленькая — то мне она нафиг не нужна, невзирая на ее себестоимость…

    Reply
  37. CheBurator

    (13) не путайте! Кассирочка и КЗК для совершенно разных целевых групп.

    Reply
  38. venger

    (32) Интересно, когда это отсутствие альтернативной «правильной» гипотезы было аргументом в пользу ошибочной, но существующей гипотезы?

    Reply
  39. CheBurator

    авторы жгут!

    Reply
  40. venger

    У вас ЗП за 4000 долларов в месяц там???

    Reply
  41. venger

    (31) У вас ЗП за 4000 долларов в месяц там???

    Reply
  42. venger

    (35) В смысле, вопрос к этому посту по ЗП:-))

    Reply
  43. O-Planet

    (42) Я фри, не забывай. Если я работаю по 4 часа в день, то у меня 2000 р в день, если по 8, то 4000 р. Если по 20, то 10000 р. Все зависит от имеющихся заказов.

    Reply
  44. vip

    Разрешите примкнуть к обсуждению.

    > Мы с vip’ом уже давно спокойно и медленно спустились с того холма…

    Весьма польщен:)) Не совсем понятно окружающим, но суть верна.

    Ув. O-Planet!

    Процитирую тов. Че

    > Кассирочка и КЗК для совершенно разных целевых групп.

    Отбрасывая конкретику (КЗК-2, FormEx и т.д.), уровень идеи и уровень исполнения конечно абсолютно разные.

    Это раешник и классическая музыка.

    И аудитория, соответственно, разная.

    Я предпочитаю музыку классическую. Но признаю и раешник.

    Но когда городской романс назойливо лезет в первый ряд, слегка раздражает.

    Чисто из любви к красивому решению, в нескольких боевых конфах продолжаю использовать ADDY и Miracle от тов. Abadonna.

    Потому что Мастер и потому что красиво. Хотя повторил практически все.

    Но чисто из признания продолжаю использовать (и потому, что работает, не трогай).

    FormEx — отдельная песня.

    Это действительно чистое искусство, причем высочайшего уровня.

    И 1С++ из той же серии.

    И не нужно сравнивать несравнимое.

    Есть закройщик и есть портной, который сшивает выкройки вместе.

    Есть художник и есть ремесленник, который часто намного богаче художника.

    Reply
  45. venger

    (43) О тогда еще проще, где гарантия, что ты бы набрал заказов на эту сумму в тот месяц, когда ты работал над кассирочкой, например?

    Reply
  46. venger

    (43) Но даже не в это суть, допустим себестоимость даже занижена.

    Допустим, 10 тысяч долларов ее себестоимость. Тогда, продавая ее по 600 долларов (На три места: 15000 руб), чтобы окупить тебе надо продать 17 копий. Если продать еще 17 — это прибыль в сто процентов. Остальные продажи — это сверхприбыль, причем не требующая затрат на производство, только на раскрутку, которая рождает еще больше продаж. Я не завидую и в чужом кармане деньги не считаю, но назовите мне еще хотя бы 10 товаров, кроме оружия, наркотиков и т.д. у которых такая большая рентабельность, как у программ. Т.е. стоимости программ, таких как виндовс, торговля, например, явно завышена.

    Reply
  47. venger

    (43) Более того, у многих прог монополизирована, что тоже рождает известные проблемы. Я про успешные проекты, конечно.

    Reply
  48. venger

    (44) О хочу поддержать. Именно рынок, рождает ситуацию, когда попса в фаворе и приносит бешенные доходы.

    Т.е. художник всегда беднее, чем купец. И что в этом хорошего?

    Reply
  49. O-Planet

    Ed/ мшз! тьфу!

    Ув. vip!

    Я далек от идеи называть что-либо из виденного мною «чистым искусством». FormEx — в т.ч. Единственное, что здесь должно вызывать восхищение — это объем проделанной работы. Искусство начинается там, где что-то, предназначенное для одних целей, применяют совершенно для других, и это решение становится более оптимальным, красивым и экономичным. Я не даром когда-то употребил слово «системщики», потому что большинство ВКшных бирюлек основано не на красоте и оригинальности метода, а на некоем приватном знании. Пройди Чебуратор краткий двухмесячный курс С++ и com-технологий в применении к 1С, и — УВЕРЕН — он выдаст не менее грандиозное решение, а может, и более, как конечный пользователь и при его-то талантах. Вопрос — в другом: ему по роду деятельности это было не восстребовано, как и большинству из присутствующих.

    Просто эффект оригинальности всегда и везде возникает на пересечении областей знания. Обычно люди специализируются на чем-то одном. Если приходит некто, знакомый с несколькими технологиями, то для всех он — новатор. В качестве примера могу привести появление здесь Душелова. Человек, хорошо разбирающийся в .net-технологиях, буквально шутя применяет их к 1С. Собственно, почти ничего необычного, для тех, кто влядеет и той и другой группой знаний. Просто мало таких. Но они вполне заменяемы, как и все мы. С другой стороны, я просто уверен, что большинство из здесь присутствующих — появись на то необходимость — смогли бы потянуть тему FormEx, потому что многие разработки, выложенные здесь, говорят об их авторах, как о состоявшихся программистах.

    Reply
  50. O-Planet

    (45) Забудем о времени. Будем выше его 🙂 Если я набрал за 2 года, допустим, 1000 заказчиков на Кассирочку, то разве есть разница, когда они заплатят и когда они появились? Они заказчики, и этим все сказано. То, что они не появились одновремненно в тот месяц будем списывать на вредоносную солнечную активность.

    Reply
  51. vip

    (49)Ув. Щ-Здфтуе! тьфу!

    Ув. O-Planet!

    > Единственное, что здесь должно вызывать восхищение — это объем проделанной работы.

    Да, единственное, что в тебе восхищает, это неуемная страсть в продвижении попсы.

    > Искусство начинается там, где что-то, предназначенное для одних целей, применяют совершенно для других, и это решение становится более оптимальным, красивым и экономичным.

    Вот тут в точку. Это как раз об упомянутых мной разработках и разработчиках.

    > Пройди Чебуратор краткий двухмесячный курс С++ и т.д.

    Если бы у бабушки был [eq … и т.д.

    > С другой стороны, я просто уверен, что большинство из здесь присутствующих — появись на то необходимость — смогли бы потянуть и т.д.

    см. абзац выше (ни в коей мере не относится к Душелову — достойный разработчик и достойные разработки).

    А твое высказывание в (25) тянет на прямое оскорбление.

    Reply
  52. Abadonna

    (49)>смогли бы потянуть тему FormEx

    Раскатал губу :)))

    Reply
  53. venger

    (49) Начальный, ознакомительный курс С++ пол года, не меньше, а то и больше. И это только начало, если, конечно, это не с Delphi, например, кто-то по быстрому переучился, а до этого круто ваял там. Т.е. уже в принципе хороший разработчик и конструктор, назовем так, потому как кодер или программист — это несколько ограниченно.

    А по 1С курсы два месяца идут — и это даже много, для того, чтобы научиться довольно сносно работать на 1С, я про семерку.

    Так что даже по когнитивным затратам на порядки разница…

    Reply
  54. venger

    (50) Время — это все, забывать не будем про него. Ты ж про пространство не пытаешься забыть когда на работу идешь или едешь.

    А стоимость проги получается с ростом продаж должна падать:-)

    Reply
  55. venger

    (53) Причем, это я об освоении инструмента, а не про экономические, бух. и учетные знания, которые что С-шинику, что 1С-нику нужны при построении баз по фин и экономическому учету. А про разницу в потолке использования и применения я вообще молчу.

    Reply
  56. fez

    Мда. А началось все с копирайтов. 🙂

    Reply
  57. O-Planet

    (53) Зачетный топик затерялся! Писать на с++ 1С-ника научу за пару недель. Все зависит от того, как преподавать… Далее — по справочникам.

    Reply
  58. venger
  59. O-Planet

    (58) Там просто комп ниасилил. Атлон 3500+ и 1 гиг памяти, думаю, маловато для контекстной подсказки 2007-го кодегира, вот он и задумывался. А так среда как среда. Хотя мне вкладки наверху более нравятся.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *