Подготовка к ЕГЭ сына — школьника (по информатике)




Принцип обмена данными из 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='\

50 Comments

  1. insurgut

    Первое точно не так делается. Логика примерно такая:

    МаксЧисло = -999999999;
    Если ПервоеЧисло > МаксЧисло Тогда
    МаксЧисло = ПервоеЧисло;
    КонецЕсли;
    Если ВтороеЧисло > МаксЧисло Тогда
    МаксЧисло = ВтороеЧисло;
    КонецЕсли;
    Если ТретьеЧисло > МаксЧисло Тогда
    МаксЧисло = ТретьеЧисло;
    КонецЕсли;
    Если ЧетвертоеЧисло > МаксЧисло Тогда
    МаксЧисло = ЧетвертоеЧисло;
    КонецЕсли;
    Сообщить(«Максимум: » + МаксЧисло);

    Показать

    Но ЕГЭ штука такая, им не всегда подходит более простое решение.

    Reply
  2. vasilev2015

    Да, я написал: не читайте, будем переделывать. За идею спасибо, хотел переделать как ниже, но Ваш вариант лучше.

    Если ПервоеЧисло > ВтороеЧисло Тогда

    Если ПервоеЧисло > ТретьеЧисло Тогда

    Иначе

    КонецЕсли

    Иначе

    Если ВтороеЧисло > ТретьеЧисло Тогда

    Иначе

    КонецЕсли

    КонецЕсли

    Reply
  3. insurgut

    (2) поторопился, там даже от одного условия можно избавится:

    МаксЧисло = ПервоеЧисло;
    Если ВтороеЧисло > МаксЧисло Тогда
    МаксЧисло = ВтороеЧисло;
    КонецЕсли;
    Если ТретьеЧисло > МаксЧисло Тогда
    МаксЧисло = ТретьеЧисло;
    КонецЕсли;
    Если ЧетвертоеЧисло > МаксЧисло Тогда
    МаксЧисло = ЧетвертоеЧисло;
    КонецЕсли;
    Сообщить(«Максимум: » + МаксЧисло);

    Показать

    Но меня не отпускает ощущение, что скрыт какой-то подвох в задании. 🙂

    Reply
  4. spacecraft

    (3)

    Но меня не отпускает ощущение, что скрыт какой-то подвох в задании. 🙂

    правильные ощущения. Условия: «Нахождение минимума и максимума …»

    (2)

    program min_max_of_four_numbers_without_arrays_or_cycles;
    var
    first_number, second_number, third_number, forth_number, min_number, max_number:real;
    begin
    writeln(‘Последовательно введите четыре числа, которые необходимо сравнить’);
    readln(first_number, second_number, third_number, forth_number);
    
    if (first_number > second_number) then
    begin
    min_number := second_number;
    max_number := first_number;
    end
    else
    begin
    min_number := first_number;
    max_number := second_number;
    end;
    if (min_number > third_number) then
    min_number := third_number;
    if (min_number > forth_number) then
    min_number := forth_number;
    if (max_number < third_number) then
    max_number := third_number;
    if (max_number < forth_number) then
    max_number := forth_number;
    writeln(‘Max = ‘, max_number);
    writeln(‘Mix = ‘, min_number);
    
    end.

    Показать

    Reply
  5. insurgut

    Задание 8 (на паскаль думаю сами интерпретируете):

    НачальноеЧисло = Формат(ТекущаяДата(), «ДФ=HHmmss»);
    ГСЧ = Новый ГенераторСлучайныхЧисел(НачальноеЧисло);
    
    //генерация массива
    МассивЧисел = Новый Массив;
    РазмерМассива = 9;
    Сообщить(«Массив:»);
    Для Сч = 0 По РазмерМассива — 1 Цикл
    СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, 235959);
    МассивЧисел.Добавить(СлучайноеЧисло);
    Сообщить(СлучайноеЧисло);
    КонецЦикла;
    
    //поиск максимальных
    ПервоеМакс = 0;
    ВтороеМакс = 0;
    Для Сч = 0 По РазмерМассива — 1 Цикл
    Если МассивЧисел[Сч] > ПервоеМакс Тогда
    ВтороеМакс = ПервоеМакс;
    ПервоеМакс = МассивЧисел[Сч];
    КонецЕсли;
    КонецЦикла;
    Сообщить(«Первое: » + ПервоеМакс);
    Сообщить(«Второе: » + ВтороеМакс);
    

    Показать

    Reply
  6. insurgut

    (4) да как бы понятно, что на минимум нужно операций по аналогии добавить, я не об этом.

    Reply
  7. Man4kin

    (5) Без использования массивов и циклов же ?

    Reply
  8. insurgut

    (7) за однократный проход массива же?

    Reply
  9. vasilev2015

    (5) Когда элемент МассивЧисел[Сч] сравниваем с ПервоеМакс и ВтороеМакс, то элемент может изменить ВтороеМакс или обе переменные, а здесь только одно условие.

    Reply
  10. starik-2005

    (4) а зачем так много кода?

    var min_num, max_num, ent_num : double;
    begin
    writeln(‘Последовательно введите четыре числа, которые необходимо сравнить’);
    
    readLn(ent_num);
    min_num := ent_num;
    max_num := ent_num;
    
    readLn(ent_num);
    min_num := min(ent_num, min_num) ;
    max_num := max(ent_num, max_num) ;
    
    readLn(ent_num);
    min_num := min(ent_num, min_num) ;
    max_num := max(ent_num, max_num) ;
    
    readLn(ent_num);
    min_num := min(ent_num, min_num) ;
    max_num := max(ent_num, max_num) ;
    
    writeln(‘Max = ‘, max_num);
    writeln(‘Mix = ‘, min_num);
    end.
    
    

    Показать

    Reply
  11. vasilev2015

    (10) я между прочим, на публикацию вдохновился после вашей заметки о пузырке. : -)))

    Reply
  12. insurgut

    (9) если честно, то ничего не понял 🙂 элемент массива не сравнивается со вторым максимальным, только с первым. Второе максимальное сравнивать ни с чем не нужно.

    Reply
  13. spacecraft

    (10) Ваш код вообще не скомпилится. min() и max() находятся в отдельной библиотеке, которую не факт, что можно использовать на ЕГЭ.

    Reply
  14. starik-2005

    (13) можно заменить на «if ent_num > max_num then max_num := ent_num;»

    var min_num, max_num, ent_num : double;
    begin
    writeln(‘Последовательно введите четыре числа, которые необходимо сравнить’);
    
    readLn(ent_num);
    min_num := ent_num;
    max_num := ent_num;
    
    readLn(ent_num);
    if ent_num < min_num then min_num := ent_num;
    if ent_num > max_num then max_num := ent_num;
    
    readLn(ent_num);
    if ent_num < min_num then min_num := ent_num;
    if ent_num > max_num then max_num := ent_num;
    
    readLn(ent_num);
    if ent_num < min_num then min_num := ent_num;
    if ent_num > max_num then max_num := ent_num;
    
    writeln(‘Max = ‘, max_num);
    writeln(‘Mix = ‘, min_num);
    end.

    Показать

    Reply
  15. spacecraft

    (14) и? Чем этот код лучше моего? Лишним if?

    Reply
  16. starik-2005

    (15) отсутствием лишних переменных и читаемостью как минимум.

    Reply
  17. spacecraft

    (16) спорное утверждение. Куча readLn внутри когда не способствуют лучшей читаемости этого кода.

    Reply
  18. starik-2005

    (17) каждому свое. Веток ветвления у Вас тоже 6, если считать блок «else». Блоки зачем-то, которые совершенно не нужны. Лишние переменные — это всегда минус баллы на олимпиадах. Но ведь главное, чтобы работало, да? А вот проверяющим ЕГЭ читаемость будет важнее.

    Reply
  19. sergathome
    Оказывается, из двоичной системы счисления очень удобно переводить в восьмеричную. Каждая триада переходит в одну цифру.

    Да, немногие помнют ужо линейку ДВК и славного её дитёныша БК-0010. Там оно изо всех щелей 😉

    Reply
  20. starik-2005

    А вот по заветам Никлауса Вирта — процедурное программирование!

    procedure minmax(min, max, ent : double)
    begin
    readLn(ent);
    if ent > max them max := ent;
    if ent < min them min := ent;
    end;
    
    var min_num, max_num, ent_num : double;
    begin
    writeln(‘Последовательно введите четыре числа, которые необходимо сравнить’);
    
    readLn(ent_num);
    min_num := ent_num;
    max_num := ent_num;
    
    minmax(min_num, max_num, ent_num);
    minmax(min_num, max_num, ent_num);
    minmax(min_num, max_num, ent_num);
    
    writeln(‘Max = ‘, max_num);
    writeln(‘Mix = ‘, min_num);
    end.

    Показать

    Reply
  21. vasilev2015

    (12) из массива {2,1,5,4,3} нужно выбрать второй по-минимуму 2 или второй по-максимуму 4. Код из статьи мы проверяли.

    Reply
  22. insurgut

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

    //генерация массива
    РазмерМассива = 5;
    МассивЧисел = Новый Массив;
    МассивЧисел.Добавить(2);
    МассивЧисел.Добавить(1);
    МассивЧисел.Добавить(5);
    МассивЧисел.Добавить(4);
    МассивЧисел.Добавить(3);
    
    //поиск второго максимального числа
    ПервоеМакс = 0;
    ВтороеМакс = 0;
    Для Сч = 0 По РазмерМассива — 1 Цикл
    Если МассивЧисел[Сч] > ПервоеМакс Тогда
    ВтороеМакс = ПервоеМакс;
    ПервоеМакс = МассивЧисел[Сч];
    КонецЕсли;
    КонецЦикла;
    Сообщить(«Второе: » + ВтороеМакс);

    Показать

    Reply
  23. starik-2005

    Кстати, по поводу квадратного уравнения, то эту задачу вроде бы все должны были в школе еще решать:

    введите а, б, ц
    д = б * б — 4 * а * ц
    если д < 0 тогда Нет корней!
    корень1 = (-б + корень(д)) / (2 * а)
    если д > 0 тогда корень2 = (-б — корень(д)) / (2 * а)
    
    Reply
  24. starik-2005

    Кстати, есть такой ресурс — codewars.com — там много интересных задачек.

    Reply
  25. vadim1011985

    Тут на инфостарте есть статья по сортировке массивов там есть «Гномья сортировка» которая за один цикл (без вложенных) сортирует массив , поэтому поиск 2-го максимума или минимума можно построить на ней , тогда 1, 2-ой элемент будут 2-мя минимумами , а последний и предпоследний 2-мя максимумами

    4. Алгоритм «Гномья сортировка».

    Алгоритм так странно назван благодаря голландскому ученому Дику Груну.

    Гномья сортировка основана на технике, используемой обычным голландским садовым гномом (нидерл. tuinkabouter). Это метод, которым садовый гном сортирует линию цветочных горшков. По существу он смотрит на следующий и предыдущий садовые горшки: если они в правильном порядке, он шагает на один горшок вперёд, иначе он меняет их местами и шагает на один горшок назад. Граничные условия: если нет предыдущего горшка, он шагает вперёд; если нет следующего горшка, он закончил.

    Дик Грун

    Вот собственно и все описание алгоритма «Гномья сортировка». Что интересно, алгоритм не содержит вложенных циклов, а сортирует весь массив за один проход.

    Функция ГномьяСортировка(Знач Массив)
    
    i = 1;
    j = 2;
    
    Пока i < Массив.Количество() Цикл // Сравнение < — Сортировка по возрастанию, > — по убыванию
    
    Если Массив[i-1]
    i = j;
    j = j + 1;
    Иначе
    Замена = Массив[i];
    Массив[i] = Массив[i — 1];
    Массив[i — 1] = Замена;
    i = i — 1;
    Если i = 0 Тогда
    i = j;
    j = j + 1;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    
    Возврат Массив;
    КонецФункции

    Показать

    Ссылка на статью

    Reply
  26. vasilev2015

    (22) Мы разошлись в понимании «второй максимальный» я себе представлял, что среди всего массива выбрать максимум, убрать его из рассмотрения, выбрать еще раз максимум — это будет ответ. А Вы представляете, что максимум должен быть локальным.Проверю еще раз условия задачи. В любом случае, спасибо.

    Reply
  27. vasilev2015

    (24) у меня узкие интересы: нужно подготовить к ЕГЭ, но ресурс посмотрю.

    Reply
  28. capitan

    Reply
  29. starik-2005

    (28) 30 секунд, однако… Странные задачи.

    Reply
  30. capitan

    (29)Это из серии загадок, на которые дети отвечают за пару секунд, а взрослые — за пару часов

    давайте сложнее

    Reply
  31. Octopus

    (30) Вчера?

    Reply
  32. herfis

    (25)

    сортирует весь массив за один проход

    Очень лукавая формулировка. Цикл-то один, но «одним проходом» это назвать никак нельзя.

    Reply
  33. vasilev2015

    (30) Послезавтра ?

    Reply
  34. capitan

    (31)

    (33)

    Гугл в помощь ) Я тоже не решил

    Reply
  35. insurgut

    (26) все я понял, где собака зарыта 🙂

    Исправленный код:

    НачальноеЧисло = Формат(ТекущаяДата(), «ДФ=HHmmss»);
    ГСЧ = Новый ГенераторСлучайныхЧисел(НачальноеЧисло);
    
    //генерация массива
    МассивЧисел = Новый Массив;
    РазмерМассива = 9;
    Сообщить(«Массив:»);
    Для Сч = 0 По РазмерМассива — 1 Цикл
    СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, 235959);
    МассивЧисел.Добавить(СлучайноеЧисло);
    Сообщить(СлучайноеЧисло);
    КонецЦикла;
    
    //поиск максимальных
    ПервоеМакс = 0;
    ВтороеМакс = 0;
    Для Сч = 0 По РазмерМассива — 1 Цикл
    Если МассивЧисел[Сч] > ПервоеМакс Тогда
    ВтороеМакс = ПервоеМакс;
    ПервоеМакс = МассивЧисел[Сч];
    ИначеЕсли МассивЧисел[Сч] > ВтороеМакс Тогда
    ВтороеМакс = МассивЧисел[Сч];
    КонецЕсли;
    КонецЦикла;
    Сообщить(«Первое: » + ПервоеМакс);
    Сообщить(«Второе: » + ВтороеМакс);
    

    Показать

    Пример №1

    Пример №2
    Reply
  36. insurgut

    (25) мы алгоритмы сортировок в институте изучали 🙂

    Reply
  37. insurgut

    (33)

    Reply
  38. herfis

    (25) Слыхал что когда нужно быстро на коленке сообразить хоть какую-то сортировку, то сортировка Шелла хороший кандидат. Типа золотой середины между более эффективными но более сложными алгоритмами и более медленными «учебными» алгоритмами.

    Reply
  39. vasilev2015

    (35) да, у нас также получилось. Только мы не использовали, что числа неотрицательные, поэтому присваиваем не нули, а первые элементы.

    Reply
  40. SlavaKron

    (30) В массиве дат, отсортированном по убыванию.

    Reply
  41. insurgut

    (39) ну вместо 0 можно присвоит обоим переменным значение первого элемента массива, а сам цикл начать со второго элемента — результат будет тем же, а условий меньше. Ну и в самом цикле поиска в вашем примере на одно условие больше, можно обойтись всего двумя.

    Reply
  42. herfis

    (30) В самолете?

    Reply
  43. starik-2005

    (30) сначала думал, что в календаре, оказалось, что в словаре. Ну тоже неплохо…

    Reply
  44. starik-2005

    (20) кстати, рекурсия — это не цикл!

    procedure minmax(i: integer; min, max, ent : double)
    begin
    if i < 4 then begin
    readLn(ent);
    if (ent > max) or not i then max := ent;
    if (ent < min) or not i then min := ent;
    minmax(i + 1, min_num, max_num, ent_num);
    end
    else begin
    writeln(‘Max = ‘, max);
    writeln(‘Mix = ‘, min);
    end;
    end;
    
    var min_num, max_num, ent_num : double;
    begin
    writeln(‘Последовательно введите четыре числа, которые необходимо сравнить’);
    minmax(0, min_num, max_num, ent_num);
    end.

    Показать

    Reply
  45. vadim1011985

    (2)

    По моему это самый простой и короткий способ искать мин и макс а вообще если есть встроенная функция max и min то тогда код получается еще короче т.е. сама функция не нужна

    Function Max (a,b)

    begin

    If a>b then

    return a

    else

    return b;

    end;

    Procedure FindMaxValue ()

    var maxValue,a,b,c,d:int;

    begin

    writeln(‘Последовательно введите четыре числа, которые необходимо сравнить’);

    readln(a, b, c, d);

    maxValue = Max (Мax(a,b),Мax(с,d));

    end;

    Reply
  46. starik-2005

    (45) в идеале что-то такое получается:

    var a,b,c,d : double;
    begin
    writeln(‘Последовательно введите четыре числа, которые необходимо сравнить’);
    readLn(a,b,c,d);
    writeLn(‘Max: ‘, max(max(a,b),max(c,d)));
    writeLn(‘Min: ‘, min(min(a,b),min(c,d)));
    end.
    
    Reply
  47. roman77

    А почему такая дискриминация — только сыновья? У меня дочка в прошлом году готовилась к информатике и ИкТ, успешно сдала. Не буду поддерживать 🙂

    Reply
  48. roman77

    (1) В контрольных заданиях всё подробно расписано. В последней задаче за простое решение (перебором) дают 2 балла, за сложное 4 балла. Все методисты и здравомыслящие люди советуют решать на 2 балла, ибо при сложном решении есть высокая вероятность накосячить и не получить ни одного бала.

    Reply
  49. vasilev2015

    (47) Исправил в статье https://infostart.ru/public/983886/. Вместо «Отец, Сын» вставил «Родитель, Ребенок».

    Reply
  50. addinaq

    (1)

    Попарное сравнение может

    Перем Первая,Вторая,Третья,Четвертая
    
    ?(Первая>Вторая,ИскомоеПервойПары=Первая,ИскомоеПервойПары=Вторая);
    ?(Третья>Четвертая,ИскомоеВторойПары=Третья,ИскомоеВторойПары=Четвертая);
    Максимум = ?(ИскомоеПервойПары>ИскомоеВторойПары,ИскомоеПервойПары,ИскомоеВторойПары);
    
    ?(Первая<Вторая,ИскомоеПервойПары=Первая,ИскомоеПервойПары=Вторая);
    ?(Третья<Четвертая,ИскомоеВторойПары=Третья,ИскомоеВторойПары=Четвертая);
    Минимум = ?(ИскомоеПервойПары<ИскомоеВторойПары,ИскомоеПервойПары,ИскомоеВторойПары);
    

    Показать

    Reply

Leave a Comment

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