[BarcodeGenerator] — "Генерация штрихкодов" ActiveX-компонента для 1С




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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='\

99 Comments

  1. Душелов

    Как вставить штрихкод в документ ворда, когда удаленному пользователю запрещено использование внедренных ActiveX-ов и не установлены шрифты, аналогичные ean13.ttf с диска ИТС?

    Компонента поможет 😉

    Reply ↓
  2. vip

    (0) В 7.7 не рисует.

    Объект нормально создается, а контейнер пустой.

    Reply ↓
  3. Арчибальд

    Отзывчивый ты наш…:))))

    Reply ↓
  4. vip

    (3) Ты про что?

    Reply ↓
  5. Душелов

    (2) Размеры контейнера какие? Попробуй использовать привязки.

    Reply ↓
  6. vip

    (5) Какие привязки?

    Контейнер на всю форму должен быть?

    Reply ↓
  7. Душелов

    (6) Ну класс растягивания что-ли.

    Возможно размер контейнера больше, чем форма, потому сам штрихкод находится за пределами формы.

    Я вообщем, завтра до 7-ки доберусь, посмотрю.

    Reply ↓
  8. Душелов

    (6) И методы, как в 8-ке используешь?

    ШК.ШиринаШтрихкода = ШиринаШтрихкода;

    ШК.ВысотаШтрихкода = ВысотаШтрихкода;

    ШК.Штрихкод = Штрихкод;

    ШК.ВыводитьТекст = ВыводитьТекст;

    Попытка

    ШК.ТипШтрихкода = ТипШтрихкода;

    Исключение

    Сообщить(ОписаниеОшибки());

    КонецПопытки;

    Попытка

    ШК.Сгенерировать();

    Исключение

    Сообщить(ОписаниеОшибки());

    КонецПопытки;

    Reply ↓
  9. Душелов

    Если после генерации ошибки нет, попробуй сохранить в файл — будет ли там картинка.

    Reply ↓
  10. vip

    (7) Извиняюсь, работает.

    Почему-то подумал, что без генерации должен отображаться какой-нибудь умолчальный.

    Reply ↓
  11. Душелов

    (10) Хе… :))) Не, ну можно сделать и умолчальный…

    Reply ↓
  12. CheBurator

    Хорошо бы сразу дать ссылочку на скачивание 1С++ класса…

    вопрос: без него никак?

    Reply ↓
  13. CheBurator

    Василий, а стоит ли внутри какая-нибудь «защита» при невозможности генерации требуемого ШК? например, если ШК допускает только цифры, а нерадивый разработчег вбабахал туда нецифровые символы — возвращает ли метод Сгенерировать код возврата? типа 0 — плохо, 1 — ок.

    …???

    Reply ↓
  14. Арчибальд
  15. Душелов

    (13) Срабатывает исключение.

    А вообще, метод Сгенерировать() — возвращает результат, типа «булево».

    Reply ↓
  16. Ёпрст

    Одно мне не ясно .. нафига всё это нужно ?…

    Reply ↓
  17. Ёпрст

    Главное, активихс запрещен, а вот ВК — нет…

    гы…

    🙂

    Reply ↓
  18. vip

    (12) Продолжаешь лениться в изучении 1С++.

    Продолжаешь пугаться слова «класс».

    АктивИкс это ВСТРОЕННЫЙ класс, без него никак ;))

    Он нужен для показа активиксов на форме.

    У меня ощущение, что ты не в курсе вообще, что дает работа с любыми активиксами непосредственно на форме.

    Reply ↓
  19. Душелов

    (17) АктивИксы запрещены, внедренные в ворд и на стороне покупателя (к примеру). А ВК — это для генерации (на стороне продавца).

    Reply ↓
  20. Dwiss

    А зачем весь этот изврат, типовая компонента не подходит что ли? я все делал с помощью ее и отображал на форме и карточки печатал с закодированным ФИО в виде ШК, смысл? Для чего это надо???

    Reply ↓
  21. Душелов

    (20) см 1 и 19 комменты.

    Reply ↓
  22. lucius

    А ответьте убогому — зачем типовая компонента, зачем ActiveX, что трудно реализовать алгоритм формирования штрихкода и использовать соответствующий шрифт ttf?

    Я так уже лет 5 живу, и никаких хитрых «помогалочек» не нужно

    или разобраться с чужим активиксом проще, чем прочесть алгоритм формирования штрихкода и реализовать его?

    Reply ↓
  23. Душелов

    (22) Вы документы, сохраненные в экзеле клиентам (к примеру) тоже с этими соответствующими шрифтами высылаете?

    Reply ↓
  24. Ёпрст

    (23) не боись — вышлем в jpeg-е :))

    Reply ↓
  25. lucius

    я как-то больше pdf-аю…

    но в общем — да, прикладываю шрифт (как и сама 1С для своих регламентированных)

    с другой стороны нет у меня таких постоянных клиентов, может раз в год появляется — так что «сытый пешему не товарсчь»

    Reply ↓
  26. CheBurator

    (18) НЕ! не пугаюсь!! уже работает один класс — ввод в ТЗ напрямую в ячейки!! 😉 Времени просто особо нет и то что можно без особого изврата без классов — то без классов…

    Reply ↓
  27. vip

    (26) Путаешь пользовательские классы и встроенные.

    Хотя встроенные наверно лучше называть объектами.

    Reply ↓
  28. Душелов

    (10) Добавил предварительну. генерацию и свойство «Авторазмер»

    Reply ↓
  29. CheBurator

    (27) не путаю, вроде.. в (26) речь идет именно о пользовательском классе

    Reply ↓
  30. CheBurator

    (25) я бы таких любителей пдф-ания на месте расстреливал… придет заявка в пдфе на 10 листах да еще в таблицеподобной форме — чем мне эту заявку оттуда АВТОМАТОМ выковыривать?

    Reply ↓
  31. CheBurator

    (20) типовая компонента позволяет рисовать ITF14..?

    Reply ↓
  32. lucius

    (30) ну к счастью для мирососуществования «бодливой корове» аллах…. уменьшил возможности…

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

    8о\r

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

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

    ;о))

    Reply ↓
  33. CheBurator

    (32) в (30) ругаюсь на любителей обмена информацией в формате ПДФ, ШК тут никаким боком, ясен пень, не относится…

    …

    ну как попробуете с ашаном или метро ЛИЧНО договориться о нужном и удобном для вас формате обмена — сообщите!

    Reply ↓
  34. Dwiss

    (31) И часто ты рисуешь в ITF14??? Мне изо всех ШК за 10 лет понадобились только EAN-8,13 и Code39,128 все — ну и вот у меня вопрос куда и под какие задачи это нужно?

    Reply ↓
  35. Лев

    Идея хорошая

    Reply ↓
  36. CheBurator

    (34) ты видать просто не представляешь степени изощренности клиентов 😉

    Reply ↓
  37. Alex_Sun

    Dwiss — Попробуй офис 2007 версии стандарт.

    Reply ↓
  38. Dwiss

    (36) Точно Сергей, изощренности у них хватет 🙂

    (37) Что мне в нем пробовать и зачем?

    Reply ↓
  39. Alex_Sun

    Dwiss — на твой (20) пост. в офисе 2007 стандарт всех таких возможностей нет.А Делать нада.

    Reply ↓
  40. Dwiss

    (39) А надо ли — задйся вопрсом, разве нельзя все сделать из 1с не используя офис.

    Reply ↓
  41. Alex_Sun

    Можно. Но форма договора особенно если частенько изменяется и вносятся изменения… Лучше формировать из ворда. Я вот своих кадровиков пересадил на ворд. теперь шарашат трудовые договора из ворда только так. причем если какие то новшества меня не дергают понапрасну а сами вносят в шаблон дополнения. Ну это все дело вкуса знаете ли.

    Reply ↓
  42. Душелов

    — добавлена генерация 2D-кода QR Code

    Reply ↓
  43. CheBurator

    е! вау! автор жжот!

    Reply ↓
  44. Душелов

    (43) Кстати, очень даже веселая штучка оказалась.. Я даже русские буквы закодировал и распознал 🙂

    Reply ↓
  45. CheBurator

    (44) Для QR спецсканер нужен?

    Reply ↓
  46. Душелов

    (45) Типа того http://www.barscanner.ru/event.php/event=1288

    Но я распознавал из картинки (BarcodeReader мой)

    Reply ↓
  47. CheBurator

    (46) думает ли аффтар 😉 расширять список распознаваемых ШК?

    Reply ↓
  48. Душелов

    (47) а каких, например?

    Reply ↓
  49. Арчибальд

    (48)ИМХО, произвольный набор пикселов. Трехмерный, естественно :))

    Reply ↓
  50. CheBurator

    ye// там где про сканер — там еще 2D всякие есть… если уж делать — так подорвать бизнес всем халявщикам… 😉

    Reply ↓
  51. Душелов

    (50) А зачем всякие 2Д, если этого достаточно? Смысла, думаю, нет…

    Reply ↓
  52. CheBurator

    в принципе да…

    Reply ↓
  53. CheBurator

    Ждем новых заманух! 😉

    Reply ↓
  54. Adecvator

    dushelov, а можно выложить обработку для 7.7. Скачивал с Вашего сайта, так там демка на 3 процедуры. Если можно. Заранее благодарен.

    Reply ↓
  55. Душелов

    (54) Берете любой пример работы с активиксом с 1С++ и используете методы компоненты.

    Reply ↓
  56. RegrZ

    dushelov спасибо огромное за QR Code!

    у меня небольшая проблема с сохранением картинки из обработки, метод СохранитьКартинку() отрабатывает возвращает истина, а файла никакого не сохраняется. компоненту регистрировал, разложил библиотеки в in, system32,

    .net установлен

    Reply ↓
  57. RegrZ

    другие коды например EAN13 нормально сохраняются в картинку, если после EAN13 сформировать QR Code и сохранить, то сохраняется опять EAN13, посмотри пожалуйста в чем дело.

    Reply ↓
  58. RegrZ

    ребята подскажите как на макет добавить этот объект, там нет ActiveX в меню объектов для вставки в таблицу 🙁

    Reply ↓
  59. RegrZ

    dushelov, для того чтобы эта обработка стала бестселлером среди штрихкодеров, еще бы добавить DataMatrix, и PDF417

    Reply ↓
  60. RegrZ

    platform for all 2D code users with two-dimensional coding and decoding platform provide technical support and development assistance. 2D code types include : PDF417, Qr_Code. DataMatrix and MaxCode, Aztec, etc. (2006-09-28, Visual C++, 169KB, Downloads 138)

    http://narod.ru/disk/10710575000/43680512BarMadeBase.rar.html

    описание на китайском…

    Reply ↓
  61. RegrZ

    Не могу опубликовать сообщения со ссылками и описаниями библиотек, много интересного нашел а опубликовать не получается… может это оттого что на англицком?

    Reply ↓
  62. RegrZ

    http://y8y8.narod.ru/fath_BarcodeX_NET_v2.0.zip

    дот нет Компонента на все штрих-коды включая Datamatrix и PDF417, для виндовых форм, поддерживает управляемый код, генерит все картинки, незнаю как опубликовать оригинальное описание, сюда не пропускает тексты на английском, а описывать все это на русском неохота 🙁

    примеры на вижл бейсике

    Reply ↓
  63. RegrZ

    http://y8y8.narod.ru/13898393DataMatrixDec20061217.zip

    Datamatrix decoder, примеры на С

    Reply ↓
  64. RegrZ

    SDK — для мобильных платформ:

    читалка на яве для всех 2D штрихкодов.

    http://y8y8.narod.ru/1985492QRWinCE.rar

    Reply ↓
  65. RegrZ

    PDF417, QR_CODE, DATAMATRIX controls and examples, it is applicable

    (2008-07-03, MultiPlatform, 2318KB,)

    http://y8y8.narod.ru/113172210PkEncodeDemo2.0.zip

    Reply ↓
  66. Душелов

    (63) Только то, что она «крякнутая», то уже использование не желательное!

    Reply ↓
  67. Душелов

    (57) Сейчас посмотрю

    Reply ↓
  68. Душелов

    (57) Обновил.

    Reply ↓
  69. RegrZ

    (67) я не уверен что она крякнутая, может она купленная?

    Reply ↓
  70. Душелов

    (70) Открой архив…

    Reply ↓
  71. RegrZ

    (69) Спасибо, я заменил библиотеки, теперь при нажатии выполнить в тестовой обработке выдает «Невозможно загрузить файл или сборку QRcode version=1.0.3476.19169 или один из зависимых от них компонентов. Найденное определение манифеста сборки не соответствует ссылке на сборку.»

    пытался зарегать компонент снова на компе где стояла предыдущая версия, и на другом где ее не было, при запуске файла «reg.bat» выдает тоже — «Failed to load dependency QRcode of assemly Dushelov.barcode1C… Найденное определение манифеста сборки не соответствует ссылке на сборку.»

    Посмотри пожалуйста что там еще не так…

    (71) точно варез, мы тут в глубинке не так чувствительны к лицензионности нам очень далеки эти проблемы, прошу прощения если что 🙂

    Reply ↓
  72. RegrZ

    +(72) забыл сказать что при этом обработка отлично формирует остальные ШК, за исключением QR. видимо проблема в очередной сборке QRcode.dll

    Reply ↓
  73. Kenzo

    У меня тоже QRcode не сработал

    Reply ↓
  74. Душелов

    Обновил.

    Reply ↓
  75. RandomDV

    Люди, подскажите все-таки — как вывести штрихкод в макет под 8.1 ?

    Reply ↓
  76. Душелов

    В макет вставить поле картинки и при выводе на печать туда выводить картинку из компоненты.

    Reply ↓
  77. Alex_Sun

    Авторство вещь важная, но ненужно доводить его до само выпячивания, в названиях Соmобъектов или процедурах. Ему самое место в скромной кнопкой about. 🙂 — А так очень достойная разработка.

    Reply ↓
  78. Душелов

    (79) При чем тут самовыпячивание? Мелкософт тоже самовыпячивается, везде MS, как и апл, как и все остальные. Это — бренд, а не самовыпячивание.

    Reply ↓
  79. vip

    (80) Пральна. Стесняться не надо. Автор имеет полное право на любое название.

    У меня одна из ВК назывется semen.dll, а ее объект MyCatSemen.

    Прототип сейчас храпит рядом со мной под кондёром.

    Reply ↓
  80. dotBY

    бррр… есть проблема, EAN-13, штрихкод 4811424058982, продукт реально существует и корел генерит штрихкод под него… а обработка выдает «EEAN13-3: Country assigning manufacturer code not found»… это чё за зверь?

    Reply ↓
  81. Zigbee

    есть возможность немного доработать?

    нужно чтобы над штрихкодом выводился заголовок (простая строка рус.+лат.+цифирки) и галочка «выводить заголовок».

    а вообще, мы пользуемся и радуемся!

    Reply ↓
  82. Душелов

    (83) Для QR Code ?

    Reply ↓
  83. Zigbee

    нет, для code128 или других простых типов штрихкодов

    Reply ↓
  84. Alex161177

    У меня проблема с кодировкой кирилицы. Установив вашу компоненту и запустив обработку ГенерацияШтрихкода.epf. в поле штрихкод я набрал для примера «Добрый день». Получил картинку 2D-кода (QR Code) потом я сосканировал ее на сайте (http://zxing.org/w/decode.jspx — Online Decoder) я получил Äîáðûé äåíü (пробовал изменять кодировки в браузере не помогает). Тот же результат я получил если сканировать распечатаную картинку телефоном. Подскажите пожалуйста в чем проблема?

    Reply ↓
  85. Душелов

    (86) А разме в штрихкодах испольуется кириллица?

    Reply ↓
  86. Душелов

    (85) Это — «ВыводитьТекст»

    Reply ↓
  87. Трактор

    Прикольно!

    Вот бы ещё для такую же ВК для web клиента 8.2.

    Reply ↓
  88. Alex161177

    Если в обработке убрать галочку «Выводить текст» а в поле штрихкод набрать «Добрый день» то результат сосканированный на сайте (http://zxing.org/w/decode.jspx — Online Decoder) получил Äîáðûé äåíü. Это проблемма в компоненте или я делаю что-то не так?

    Reply ↓
  89. Душелов

    (90) «ВыводитьТекст» тут совсем не при чем. Тот пост был адресован (85)

    Вы где-то видели использование кириллицы в штрихкодах?

    Reply ↓
  90. Душелов

    (89) Так в 8.2 она и используется у меня.

    В контексте сервера работает, генерит картинку и на клиент выводит уже готовую картинку на макет.

    Reply ↓
  91. Alex161177

    Если я генерирую штрихкод например на сайте (http://qrcc.ru/generator.php) и пишу текст «Добрый день» , тогда сосканировав картинку на сайте (http://zxing.org/w/decode.jspx — Online Decoder) я получаю результат ===> «Добрый день» .

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

    Reply ↓
  92. Alex161177

    У меня вопрос задачу описанную в (93) возможно выполнить используя вашу компоненту или она не умеет пока работать с кирилицей?

    Reply ↓
  93. Душелов

    (94) Посмотрим…

    Reply ↓
  94. Zigbee

    (88) «Выводить текст» — это выводить текст штрихкода, а «Выводить заголовок» — это выводить заголовок.

    Например, заголовок — «пирожок с вишней», штрихкод — «pirog001»;

    заголовок — «пирожок с капустой», штрихкод — «pirog023»

    Reply ↓
  95. miroshnik

    Всем добрый день.

    Помогите пожалуйста справиться с установкой новичку (можно сказать полному «нулю» 😳 ).

    Нужно установить в 1С генератор штрих-кода. Microsoft .NET есть.

    reg.bat запустила. Что дальше? в 1С в меню «Формы» не вижу…

    Reply ↓
  96. miroshnik

    Ау! Ребята. Действительно очень надо.

    Подскажите, что дальше делать! 1С-8.1.

    Reply ↓
  97. GarageINC1981

    +(78) Как это сделать практически не подскажешь, хоть кусочки кода… как это делается???

    Reply ↓
  98. GarageINC1981

    Как достать картинку из компоненты чтоб вставить в поле картинки… Просто сохранить а потом удалить?

    Reply ↓
  99. Душелов

    (100) Именно так.

    Reply ↓

Leave a Comment

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