Групповая печать, обработка документов, справочников с возможностью выбора печатной формы (Обычное приложение)




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

94 Comments

  1. MrXaN

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

    Reply ↓
  2. sttt

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

    Reply ↓
  3. MrXaN

    (2)

    как видимо работает только в Бухе

    Reply ↓
  4. Seregalink

    Написано что работает в Бух и Торговле, а если в ЗУПе открыть будет работать?

    Reply ↓
  5. sttt

    (4)(3) не проверял в ЗУПе, возможно, что и там работает ) в УТ проверил все работает

    Reply ↓
  6. NtS

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

    Reply ↓
  7. artmicro

    А внешние печатные формы учитываются?

    Reply ↓
  8. sttt

    (6) хорошо, заявка принята :0)

    (7) также и внешние печатает

    Reply ↓
  9. Юлек я

    Ура, так долго ждала такую обработку!! Спасибо автору!!

    Reply ↓
  10. sttt

    (9) Юлек я,

    Очень приятно, что столько эмоций вызывает это творение :0) еще бы на плюсик жмакнули

    Reply ↓
  11. Fox87

    Плюс автору за обработку!

    Reply ↓
  12. olgashakirova

    Спасибо автору

    Reply ↓
  13. sttt

    Произошла досадная ошибка!!! Вчера обнаружил, что ранее загруженная обработка была абсолютно не рабочей и ведь никто не сказал!!! ))

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

    Reply ↓
  14. sttt

    ввел ошибочный адрес видеокаста забираем тут

    Reply ↓
  15. marku

    Вот если бы еще сделать пакетную печать.

    То есть комплектами печатать, например: ТОРГ12, АКТ и Счет Фактура, потом следующий документ и так далее

    Reply ↓
  16. sttt

    (15) marku, подумаю над этим

    Reply ↓
  17. dagovich

    Попробовал на Комплексная автоматизация, редакция 1.1 (1.1.13.1) печать не пошла при печати выдает ошибку:

    {Форма.Форма.Форма(163)}: Слишком много фактических параметров

    Объект.Печать(СтрокаКнопки.Имя, 1, НаПринтер, НаПринтер);

    Полез поковыряюсь внутрях!

    Reply ↓
  18. dagovich

    И насколько я разобрался, во всем этом Вы так же не решили проблему указания конкретного принтера для встроенных печатных форм. Интересно это вообще решабильно…

    Reply ↓
  19. sttt

    (17) dagovich, в ошибке видно, что в модуле документа конфигурации Комплексная автоматизация в функции Печать(…) используется другое количество параметров, скинте заголовок функции «Функция Печать(Параметр1, …» посмотрю что можно сделать

    Reply ↓
  20. aleg

    Пришлось немного доработать, чтобы заработала на моей конфе, но однозначно автору — плюс. Для отдела оформления документации очень удобная штука оказалась. Выбирают документы и растусовывают их по разным принтерам (в одном — бланки строгой отчетности, в другом — обычная бумага). Конечно, сразу немного повозникали, что слишком много настроек, но потом оценили все преимущества.

    Reply ↓
  21. sttt

    (20) aleg, спасибо ;0) настройки можно сохранять http://sttt.fatal.ru/opt.PNG красным обвел

    Reply ↓
  22. dagovich

    (19) Я уже и сам сделал. Прощения конечно что влез. Убрал в строке

    Объект.Печать(СтрокаКнопки.Имя, 1, НаПринтер, НаПринтер);

    четвертый параметр «НаПринтер». Не знаю как в других конфах в КА у метода «Печать» у всех объектов три параметра: «Имя Макета»,Кол-во экзамп.,НаПринтер

    После этого все заработало. Спасибо большое за обработку. Полезная очень.

    Reply ↓
  23. sttt

    (22) dagovich, «Убрал в строке четвертый параметр «НаПринтер»» — вот и отлично :0) постараюсь в следующей версии сделать чтобы и в КА работало

    Reply ↓
  24. СергейКа

    Чем функционально отличается от http://infostart.ru/public/19846/ ?

    Reply ↓
  25. sttt

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

    Reply ↓
  26. Фред

    Попробовал на 1с:Предприятии 8.2, БП 2.0 Принтеров немного (один), но все работает , как и задумывалось!

    В принципе, мне пока потребовалась только групповая печать, но остальное тоже посмотрел. Отбор по периоду немного не понравился, лучше бы если привязывался к рабочей дате (периоду)…Но это так, мелочь. Возможно при больших объемах и ассортименте обрабатываемых документов так удобнее. Ну и дорога ложка к обеду.Через месяц уже не так востребована будет. Ведь до конца года уйма времени!! Это 2012 неожиданно наступил, а 2013, он заранее предупредит!…))

    Одним словом, спасибо!

    Reply ↓
  27. ГБУ

    Попробовал на 1с:Предприятии 8.2, БП 2.0 Принтеров немного (один), но все работает , как и задумывалось!

    В принципе, мне пока потребовалась только групповая печать, но остальное тоже посмотрел. Отбор по периоду немного не понравился, лучше бы если привязывался к рабочей дате (периоду)…Но это так, мелочь. Возможно при больших объемах и ассортименте обрабатываемых документов так удобнее. Ну и дорога ложка к обеду.Через месяц уже не так востребована будет. Ведь до конца года уйма времени!! Это 2012 неожиданно наступил, а 2013, он заранее предупредит!…))

    Одним словом, спасибо!

    Reply ↓
  28. aleg

    Еще раз пригодилась, делал формирование пакета документов для отдела выписки. Все действительно удобно и позволяет сэкономит кучу времени при нормальной настройке.

    Reply ↓
  29. sttt

    (28) aleg, спасибо

    Reply ↓
  30. materiy_boec

    Буду тестировать. Спасибо

    Reply ↓
  31. sttt

    (30) materiy_boec, жду отзывов)))

    Reply ↓
  32. Gasilin

    Ошибка при выборе печати справочника Сотрудники:

    {Форма.Форма.Форма(1127)}: Поле объекта не обнаружено (СотрудникиОрганизаций)

    ДокументОбъект = Документы[ВидДокумента].СоздатьДокумент();

    Reply ↓
  33. Gasilin

    При выборе справочника не выдает на странице «Обработка» выдает только доступные команды «Пометка удаления» и «Родитель».

    Reply ↓
  34. IDija

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

    Кто-нибудь встречал групповую печать на управляемых формах? Желательно для УНФ.

    За ссылку буду благодарен!

    Reply ↓
  35. sttt

    (34) там она и не нужна, открываете список документов, отбираете нужное, выделяете необходимое и печатаете себе на здоровье. единственное там нет параллельной печати на различных принтерах

    Reply ↓
  36. IDija

    (35) Это понятно. Нужно под определенный случай переделать, в виде обработки

    Reply ↓
  37. sttt

    (36) что за случай?

    Reply ↓
  38. СуперСтар

    УТ ред. 10.3.21.1 (8.2.16.368)

    Попробовать печатать в окно документы Реализация ТиУ. Ничего не печатает. Не вывел в окно ни одной из предусмотренных форм — либо ошибка либо ничего.

    ?

    Reply ↓
  39. sttt

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

    Reply ↓
  40. sttt

    (38) СуперСтар, сейчас попробовал, действительно не выводит таблицу. буду разбираться.

    Reply ↓
  41. gull22

    Проверено на КА 1.1.30.2. В поле выбора для счета-фактуры выданного допускает только формы 84, 575, 283. Нет формы 1137.

    Если выбрать предварительный просмотр перед печатью, то сообщение [B]Печать недоступна!Изменился набор реквизитов[/B. В результате ничего не выводит

    Reply ↓
  42. Yureckaya

    (35) вообще, бывает, что нужна. Пример, касательно БП: в конце некоторого периода бухи формируют пакет документов — счет, акт, счет-фактура. В БП 2.0 это можно сделать, а в 3.0 и УНФ — ни разу. Можно однотипные вывести, да, а вот разные — нет. А в этом и смысл.

    Reply ↓
  43. sttt

    (42) Yureckaya, не совсем однотипные, есть списки по нескольким видам документов. нужно посмотреть, помню, что список открывало с несколькими видами документов и причем можно было пакетную печать осуществлять. правда, это было на УТ))) посмотрю в БП, может действительно реализовать такую обработку и для управляемых форм

    Reply ↓
  44. Hellgga

    Спс большое!

    А пакетная, правда, будет?

    Reply ↓
  45. sttt

    (44) Hellgga, под обычное приложение нет. Пора на управляемые переходить)

    хотя, если будет предложение сделать за оплату, то готов обсудить

    Reply ↓
  46. Hellgga

    Добрый день.

    М.б. я что-то не понимаю (юзверь, одним словом) — меня на этот вопрос подвиг Ваш ответ на (42)… Про БП 2.0

    С уважением,

    Ольга

    Reply ↓
  47. sttt

    (46) Hellgga, это мы обсуждали конфигурации на управляемых формах, такие как УТ10, 11, БП3, УНФ. Надо подумать, может и сделать…) стимула особого конечно нет…))) если бы кто профинансировал…

    Reply ↓
  48. Hellgga

    🙂 см. в личке

    Reply ↓
  49. reboot

    Выдает ошибку : {Форма.Форма.Форма(160)}: Значение не является значением объектного типа (ИмяПринтера)

    ТабДокумент.ИмяПринтера = ИмяПринтера;

    Конфигурация УПП 1.3.40

    Reply ↓
  50. sttt

    (49) reboot, по какой то причине:

    ТабДокумент = УниверсальныеМеханизмы.НапечататьВнешнююФорму(Объект.Ссылка, Расшифровка);

    не возвращает Табличный документ, необходимо посмотреть, что есть в Расшифровка, а лучше смотреть ДеревоМакетовПечати в строке 144. У вас последняя версия обработки? Эту ситуацию переделывал, вроде как месяц или пару назад. Менял в модуле формы Форма, в процедуре ПечатьДокументов, стр 205, старый вариант за комментировал, если поменять местами, может заработает. Жду результатов

    Reply ↓
  51. Ламия

    Прям хочется попробовать вашу обработку, похожа на то, что нужно.

    Reply ↓
  52. Ламия

    Что ж, возможно при использовании и выявятся какие либо недочеты, но пока, весьма довольна, спасибо.

    Reply ↓
  53. sttt

    (52) Ламия, (52) Ламия, Охотно выслушаю пожелания

    Reply ↓
  54. Гость

    Подскажите, можно ли настроить обработку, чтобы на один лист А4 печаталось 2 документа — разных, имеется в виду(для экономии бумаги, естественно)? Спасибо.

    Reply ↓
  55. sttt

    (54) В Параметры страницы не пробовали в разделе Экземпляров на страницу выбрать 2?

    Reply ↓
  56. gull22

    Попробовал открыть в КА 1.1.33.1, платформа 8.2.18.109

    Ругается

    Ошибка при выполнении файловой операции ‘D:GroupPrint.epf’

    по причине:

    Неверный формат хранилища данных

    Reply ↓
  57. gull22

    Скачал повторно все ОК

    Reply ↓
  58. Hellgga

    Я выбираю нужные формы для печати, задаю разные принтеры, но перед печатью каждый раз выскакивает окно Печать со списком принтеров и надо оттуда выбирать принтер, иначе не печатает… Задала 10 документов и 10 раз выскочило это окно 🙁

    Может, это потому, что у нас сеть?

    Reply ↓
  59. sttt

    (58) Hellgga, интересно)) не тестировал в сети. так понимаю, это системное окно, выбор принтера появляется?

    Reply ↓
  60. Hellgga

    (59) Да, оно. И получается, чтобы что-то напечатать, надо по новой уже в нём выбирать принтер на каждый док, указанный в таблице обработки. 🙁

    Reply ↓
  61. sttt

    (60) Hellgga, хорошо, в ближайшее время, попробую воспроизвести ситуацию и поправить

    Reply ↓
  62. МимохожийОднако

    Иногда требуется для разных клиентов печатать разный комплект документов. Было бы неплохо добавить количество экземпляров определенной формы и где-нибудь хранить эту настройку по каждому контрагенту.

    Reply ↓
  63. sttt

    (62) МимохожийОднако, как время появится сделаю)

    Reply ↓
  64. undo

    МимохожийОднако, поддерживаю, нужная штука указание количества экземпляров печати.

    Reply ↓
  65. mirupakovki

    Добрый день. В БП 8.3 работает?

    Reply ↓
  66. sttt

    (65) mirupakovki, день добрый, работать не будет, надо делать. Если интересно, тогда пишите на почту: st2009st (собака) qip (точка) ru

    Reply ↓
  67. Hasper

    При выборе документа выдает (Белорусская кофигурация)

    Метод объекта не обнаружен (ПолучитьСтруктуруПечатныхФорм)

    СтруктураВнутреннихПечатныхФорм = ДокументОбъект.ПолучитьСтруктуруПечатныхФорм();

    Подскажи куда копать ?

    Reply ↓
  68. Hasper

    Вот моя конфигурация.. в личку писать не могу сори) ни как не зачислят перевод(( https://yadi.sk/d/vM0nkEqNW

    Reply ↓
  69. Hasper

    p.s. пробовал писать на st2009st (собака) qip (точка) ru ((

    Reply ↓
  70. Bukaska

    (68) Hasper, скорее всего оно для российских конфигураций..

    Reply ↓
  71. sttt

    (68) Hasper, на выходных посмотрю

    Reply ↓
  72. Светлый ум

    При выборе одного принтера — не печатает на него, печатает на принтер по умолчанию.

    Reply ↓
  73. kornasto

    1С:Предприятие 8.2.12.75, конф.Альфа-Авто 4.1.01.10 при открытии выдаёт ошибку:

    {Форма.Форма.Форма(154,11)}: Процедура или функция с указанным именем уже определена (НапечататьДокумент)

    Процедура <<?>>НапечататьДокумент(Объект, НаПринтер, ИмяПринтера, ТабДокументБуфер, КоличествоЭкземпляров, ПараметрыДокумента) // 2: ТекстКнопки,

    {Форма.Форма.Форма(236,91)}: Слишком много фактических параметров (НапечататьДокумент)

    НапечататьДокумент(Объект, НаПринтер, ИмяПринтера, ТабДокумент, КоличествоЭкземпляров, <<?>>ПараметрыДокумента); // 2: ТекстКнопки,

    Reply ↓
  74. sttt

    (73) kornasto, уберите лишний параметр и будет работать. найдите и посмотрите сколько параметров у этой процедуры в вашей конфигурации

    Reply ↓
  75. sttt

    (73) kornasto, либо за 1000р сделаю сам, кинете на qiwi кошелек и сделаю красиво

    Reply ↓
  76. b-dm

    {Форма.Форма.Форма(177)}: Значение не является значением объектного типа (ИмяПринтера)

    ТабДокумент.ИмяПринтера = ИмяПринтера;

    не печатает.

    Reply ↓
  77. b-dm

    Название принтера:

    HP LaserJet P3011/P3015 PCL6

    Reply ↓
  78. sttt

    (77) b-dm, какая конфигурация?

    Reply ↓
  79. Uplifted

    Добрый день! Подскажите, пожалуйста, а эта обработка не сохраняет на диск в формате pdf? Ранее я скачивала нужную обработку, но она не работала в КА, вчера нашла эту, решила, что это доработка той, но, кажется, ошиблась, скачала, а нужной функции нет-(((. Задача одним кликом сохранить пакет документов (например, все аванс. отчеты за период в формате pdf, для последующей распечатки в другом месте и выбранные страницы).

    Reply ↓
  80. sttt

    (79) Uplifted, Как вариант, можно поставить doPdf (Виртуальный принтер) при печати указать в настройках куда сохранять PDF файлы. Какая версия платформы и конфигурации используется?

    Reply ↓
  81. Uplifted

    (80) Доброй ночи! Ответила в ЛС

    Reply ↓
  82. newtype

    Здравствуйте.Скачал Вашу обработку GroupPrint.epf 21.03.2013.Сейчас попробовал её применить для печати доп. печ. форм справочника Сотрудники в ЗУП (2.5.91.1).Выбрать доп. форму удается, но при попытке печати получаю сообщение-Печать недоступна! Изменился набор реквизитов. Что можно в ней доделать ?

    Reply ↓
  83. infokaz

    Здравствуйте!

    Нажимаю печать, выходит сообщение: «Значение не является значением объекта типа(ИмяПринтера)

    нажимаю подробно, выходит следующее сообщение:

    {Форма.Форма.Форма(177)}: Значение не является значением объектного типа (ИмяПринтера)

    ТабДокумент.ИмяПринтера = ИмяПринтера;

    Есть возможность исправить эту ошибку?

    Спасибо.

    Reply ↓
  84. Eleet

    Присоединяюсь к infokaz,ошибка таже,если используется ВПФ,обычное формы печатает нормально,конфигурация КА релиз 1.1.70.2,платформа 8.3.8.1675

    Reply ↓
  85. sttt

    (83) infokaz, какая конфигурация?

    (84) Eleet что есть ВПФ?

    Reply ↓
  86. lars-net

    (78) УПП

    Reply ↓
  87. sttt

    (86) какая версия УПП?

    Reply ↓
  88. moonchild1

    ВПФ — внешняя печатная форма, да ошибка таже(Значение не является значением объекта типа(ИмяПринтера)),происходит,как я заметил только при печати внешних форм КА 1.1.83.2 (8.3.9.2170).

    Reply ↓
  89. Maranet

    Добрый день! Обработка в УТ 10.3 на 8.1 работает?

    Reply ↓
  90. sttt

    Вроде должна — это обычные формы

    Reply ↓
  91. user661378_79637559655

    (90) доброго дня ! скажите, есть возможность скачать эту обработку сейчас в 2019 году?

    спасибо и сколько она стоит сейчас, при условии что 4ка вроде как уже снята с обслуживания

    Reply ↓
  92. sttt

    Корректировка

    Reply ↓
  93. sttt

    (91) если вам нужна помощь для внедрения, тогда можно обсудить план работ и заключить ГПХ, не обязательно касаемо обсуждаемой обработки

    Reply ↓
  94. sttt

    (91) Я не вижу никаких проблем, обработка доступна для скачивания.

    Стоит она 1 «стартмани» (https://infostart.ru/about/startmoney/), если нет стартмани тогда абонемент необходимо купить https://infostart.ru/about/service/premium/

    Reply ↓

Leave a Comment

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