Быстрое создание начального полного подчиненного узла РИБ




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

79 Comments

  1. wirg

    это напоминает статью с мисты, вот зачем справочники чистить, на мой взгляд многие справочники должны остаться, как и регистры сведений

    Reply
  2. PowerBoy

    (1) Очищаются только объекты которых НЕТ В СОСТАВЕ ПЛАНА ОБМЕНА, как правило там находятся настройки обменов, настройки пользователей и т.д. Для каждого узла они разные и Вам все равно понадобилось бы их изменять и удалять.

    Reply
  3. DitriX

    К примеру у меня база ведется уже 2 года, весит 3гига, на ней 20 распределеннок, так вот, я жду часа полтора — два (сервер стоит на i7) на каждый образ, и что самое интересное, образ конфы создается минуты 3 — 5, а вот данные перегружаются два часа.

    Вопрос — как это спасет например меня, если придется ждать тех же 2 часа пока перегрузятся данные?

    Reply
  4. PowerBoy

    (3) Копирование файла базы данных занимает минуты 🙂

    Reply
  5. DitriX

    (4) кажется понял принцип, жаль мне не подходит 🙁

    Reply
  6. SiAl

    😀 Наименования узлов порадовали. Москва у вас не центр? Заграница?

    Reply
  7. Юрий С

    Интересная мысль.

    Наверное, это можно было бы и вручную сделать, но в любом случае — обработка проще.

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

    Плюсанул.

    Reply
  8. anig99

    (1) ага… статья УРБД в 4 шага более подробная, а обработки по управлению узлами тут публиковали более удобные….По незачет….

    Reply
  9. luns

    Комментатор в (8) прав.

    Reply
  10. PowerBoy

    (8) Во первых в статье «УРБД в 4 шага» о данном способе ни слова не сказано, во вторых покажите мне здесь такую же обработку с данным функционалом.

    Reply
  11. anig99

    (10) Ага…по поводу названия статьи сорь… Не та статья, где-то видимо перепечатку видел с дополнением… Там и УРБД в 4 шага и вот эта статья были вместе

    http://www.kb.m***a.ru/article.php?id=325&

    Альтернативное создание начального образа в УРБД

    А по поводу обработки …Вот например http://infostart.ru/public/20819/

    Reply
  12. PowerBoy

    (11) Я делал обработку по методике из ИТС, она несколько отличается от той, что в статье. Странно сравнивать готовую обработку со статьей, которую надо найти, разобраться в ней и еще ручками поработать. По приведенной Вами ссылке на обработку, нет даже упоминания на альтернативный способ создания узла.

    Reply
  13. anig99

    (12) а я и не говорил, что в обработке есть ссылка…просто имея статьи и данную обработку (если лень самому писать) можно сделать всё то же самое + гибкость для сложных случаев… Вот не люблю я обработки с одной «волшебной» кнопкой…Не прочитай эту статью, я нифига бы не понял, а что собственно делает это замечательная обработка с куцым описанием… И менее опытные пользователи тем более не поймут, а чего они там делают этой кнопкой. Поэтому и незачет… Если будете упорствовать — влеплю минус за отсутствие описания…

    Ещё раз. Дайте внятное описание ЧТО и ЗАЧЕМ делает обработка, а не просто инструкцию куда ткнуть.

    Reply
  14. PowerBoy

    (13) Подробное описание действий обработки, которые можно повторить ручками находится в … — правильно в самой обработке, только нажмите кнопку Help. Вот Вам вторая «волшебная» кнопка. 🙂

    Reply
  15. artbear

    (14) И правда, описал бы проблему при обычном тормозном и монопольном создании.

    Намного было бы легче воспринимать непродвинутым пользователям.

    Reply
  16. anig99

    (14) которую нужно скачать потратив рейтинг

    Reply
  17. PowerBoy

    (15)(16) Проблема только одна, она написана в моем заголовке «ждать часами». Приводить здесь полную методику с ИТС считаю нарушением копирайта 1с и правил инфостарта.

    Reply
  18. VchikA

    Хотел бы отписать пару комментариев и был бы рад если поделитесь своими мыслями.

    Есть база размер 6ГБ. есть 8 подчиненных узлов. При попытки создания подчиненного узла(как описано выше), с помощью данной обработки, проходит 45 минут после чего выдается ошибка (Внутренняя ошибка компоненты DBENG8 ).

    При повторной попытки, прошел час и выскочила ошибка с просьбой завершить работу.

    Начал создавать начальный образ стандартным способом, после 50 мин РИБ была готова.

    Пробовал данную обработку на другой базе, размером 400 мб. Все работает и создается образ довольно быстро.

    Вопрос: в чем может быть проблема? чтобы избежать в дальнейшем такой проблемы. И почему обработка в одной базе создает распределенный узел за пару минут, а в другой тратиться на это час?, Проблема с обработкой или базой?

    Reply
  19. steep

    (18) Скорее всего вам нужно вложения электронных писем и база станет поменьше

    Reply
  20. PowerBoy

    (18) Вероятно, сбой происходит при чистке объектов не участвующих в обмене. Попробовать отловить отладчиком на каком объекте возникает сбой или в обработке закомментировать код удаления этих объектов.

    Reply
  21. VchikA

    Спасибо всем. Помогло внутреннее тестирование и исправление. при тестировании вылезли ошибки в плане обмена.

    (18) встроенный почтовый клиент не используется. Просто база такая большая, ведется с 7 года.

    Reply
  22. Lissenok

    Помогло и не раз!!!!

    Благабдарю…. ))))

    Reply
  23. Urgat

    у меня база весит 4.5 гига и браз создается часов 14 после чего пишется что конфигурация не соответствует…

    а с этой обработкой все сразу взлетело за минуты :)))

    PS +

    Reply
  24. artbear

    Хорошая обработка.

    Но есть небольшие недочеты.

    1. в случае каких-то ошибок при работе обработки (см.ниже) остается включенным монопольный режим 🙁

    ИМХО нужно

    а) либо через попытку ловить ошибки и отключать монопольный режим

    б) либо просто добавтиь кнопку на форму для отключения монопольного режима.

    2. возможны ошибки при работе обработки

    а) если конфа подключена к хранилищу, то создать главный узел нельзя, и обработка вылетит и далее п.1

    б) если у пользователя нет прав на удаление узлов в плане обмена, также будет выдана ошибка в процессе работы и снова п.1

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

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

    Приходится опять загружать копию и все по-новой.

    т.е. скорость работы все-таки слабая получается на самом деле.

    Reply
  25. artbear

    (24+) к п.2б

    // — Артур — 11.06.2010

    Если НЕ ПравоДоступа(«Удаление», ПодчиненныйУзел.Метаданные()) Тогда

    Предупреждение(«Нет прав на удаление узлов для данного плана обмена <«+ТекПланОбмена+»> «);

    Возврат;

    КонецЕсли;

    // —завершение

    Reply
  26. DoubleT

    А что делать если центральная база весит более 20 Гб? 😮

    Reply
  27. PowerBoy

    (26) Вот для таких баз и предназначена эта обработка 🙂

    Reply
  28. slavich

    Обработачка интересная. Вопросик. В данный момент столкнулся с проблемкой. Главная база 55 гигов, распределенка 32 узла, мне нужно из главной базы зделать еще одну но вышестоящую, воть…

    Reply
  29. PowerBoy

    (28) Попробую с ходу ответить не думая :)…

    1.Делаешь узел, далее копию базы.

    2.Эту обработку применяешь для одной из баз.(только ее — обработку модифицировать придется — она чистит другие планы обмена и параметры обмена — их надо убрать)

    3.В другой базе ручками вычищаешь старые обмены и оставляешь только твой один.

    Reply
  30. Wastern

    А есть такая же только под 8.2 ?

    Reply
  31. Ex

    Очень помогает! Спасибо.

    Reply
  32. undo

    создание УРИБ в восьмерке стало ещё интереснее, начали работать в октябре с базой, перенесли все документы из 7.7 с начала года, дописали программу, а потом решили сделать удалённую базу, и столкнулся с проблемой что при создании базы программа вываливается с ошибкой и закрывается. Надеюсь поможет данная обработка решить проблему.

    Reply
  33. PereYP

    на 8,2 заработает? и если план обмена полный что поудаляет?

    Reply
  34. PereYP

    на 8.2.14.519 и КА 1.1.14 отработала нормально,правда долго,часа 4 чего-то шуршала,но в итоге сделала узел, что считаю приемлемым результатом,т.к. сама 1с при создании образа вылетала с ошибкой рантайм с++. спасибо за обработку

    Reply
  35. Sveta1234

    Автору респект! Обработка сводит создание подчиненного узла к мизерным временным затратам: база весит 4 гига — 3-4 минуты и вуаля!

    Reply
  36. Belomor

    Годная, хорошая обработка, а то два дня убил на штатные методы создания периферийки

    Reply
  37. Sirgeli

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

    Reply
  38. vprus

    А как насчет доработки обработки? В принципе обработка очень нужная и полезная.

    Reply
  39. bolush

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

    Reply
  40. kondrat1C

    а у меня вываливается:

    {Форма.Форма(91)}: Ошибка при вызове метода контекста (Записать): Ошибка при выполнении обработчика — ‘{ПланОбмена.ПоМагазину(155)}: Ошибка при вызове метода контекста (ЗарегистрироватьИзменения): Недопустимое значение параметра (параметр номер ‘1’)’

    ТекУзел.Записать();

    {ПланОбмена.ПоМагазину(155)}: Ошибка при вызове метода контекста (ЗарегистрироватьИзменения): Недопустимое значение параметра (параметр номер ‘1’)

    ПланыОбмена.ЗарегистрироватьИзменения(Ссылка, Метаданные.РегистрыСведений.ИнформативныеОстаткиТоваровПоМагазинам);
    Reply
  41. alsky-2003

    очень помогла обработка, даже спасла. Спасибо огромное автору

    Reply
  42. Котяня

    Большое спасибо за обработку.

    На дописанной базе УТ 10.3.18.3 (8.2.14.540) отработала примерно за 30 минут. Размер базы 2,5 Гб.

    Отработала нормально после проведения тестировани и исправления конфигурации с удалением ссылок на несуществующие объекты.

    Reply
  43. LexBG

    Очень помогла Ваша обработка. Спасибо за труд!

    Reply
  44. sergey_at

    Очень помогла Ваша обработка. Спасибо

    Reply
  45. sergey_at

    Помогло внутреннее тестирование и исправление. при тестировании вылезли ошибки в плане обмена.

    Reply
  46. Boudybuilder

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++­++++++++++++++++++++++++++++++++++++++++

    Буду проверять . По коментах вижу что все ок. Я ведь обычными средствами выгружаю , база весит не много , 500 МБ , но все равно до кон

    Reply
  47. PowerBoy

    (47)Вероятно, сбой происходит при чистке объектов не участвующих в обмене. Попробовать отловить отладчиком на каком объекте возникает сбой или в обработке закомментировать код удаления этих объектов.

    В следующей версии сделаю эту возможность опциональной.

    Reply
  48. alexey0879

    У меня не работает на ЗиУП 2.5.60.1 (8.2.14.540) Пишет внешняя обработка не может быть прочитана текущей версией программы, хотя посты сверху убедили меня что все будет работать, в чем может быть причина?

    Reply
  49. Шапокляк

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

    Reply
  50. misha.zhemchugov

    Вот если бы кто сделал что-то подобное по Организации. 🙂

    Reply
  51. agulaev

    База УТ 10.3.6.8 протестирована и исправлена. Весит 5 ГБ. Узел создался за 1 минуту. Очистились: лишние планы обмена, история обменов, настройки обменов и лишние пользователи. Создать нужных пользователей, их настройки и настроить их дополнительные права, а также настроить обмены — пара пустяков (кстати, при стандартном создании узла эту работу тоже надо сделать!). Отличная работа. Респект!

    Reply
  52. kiv1980

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

    Reply
  53. kvazymoda

    Добрый день.

    Обработка подзависла на какое-то время. База УПП, 120Гб.

    Я бы предложил доработать:

    1 Сделать чистку, чего-либо, опциональной на форме.

    2 Т.к. обработка может отрабатывать продолжительное время, то необходимо, обязательно, Выводить сообщения вида:

    «….Удаляются записи плана обмена, справочника и т.п.»

    …..Удаляются записи справочника… »

    и т.п.

    Reply
  54. kvazymoda

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

    Reply
  55. Lapitskiy

    обработка хорошая, создать РИБ удалось — движок 8.3, конфигурация УТ 10.3 (да-да)

    Reply
  56. TODD22

    Обработка при удалении данных регистра сведений вывалилась с ошибкой «недостаточно прав доступа».

    Но узел вроде создала… будем смотреть дальше.

    Reply
  57. rimbo

    Респект автору!

    Обработка реально экономит время и нервы.

    Скачал и опробовал при создании узлов по магазину — все ОК.

    Однако при создании узла обмена «Синхронизация данных через универсальный формат»

    вывалился с ошибкой: «Ошибка исключительной блокировки информационной базы.»

    1С:Предприятие 8.3 (8.3.7.1917)

    Розница, редакция 2.2 (2.2.2.12)

    Права все есть…

    Прошу посмотреть что не так…

    С уважением,

    rimbo

    Reply
  58. PowerBoy

    (59) такое может быть, если не отключено выполнение фоновых задач.

    Reply
  59. TODD22

    (59)

    вывалился с ошибкой: «Ошибка исключительной блокировки информационной базы.»

    На фоновое задание попал. Обмен скорее всего по расписанию настроен и в этот момент запустил обмен в ручную.

    Reply
  60. alesha777

    Статью с Мисты это конечно напоминает, но……

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

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

    Полезная обработка.

    Reply
  61. alesha777

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

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

    помню что где то в настройках надо подправить, а забыл где ?

    Reply
  62. Al-77

    Ошибка исключительной блокировки информационной базы. постоянно такая ошибка фоновые отключены. база файловая.

    Reply
  63. kondrat1C

    (64) а в списке активных пользователей никого лишнего нету?

    Reply
  64. it_sar

    Вылетает на ошибке: РЕГЛАМЕНТНОЕ ЗАДАНИЕ НЕ НАЙДЕНО, ВОЗМОЖНО УДАЛЕНО ДРУГИМ ПОЛЬЗОВАТЕЛЕМ

    Reply
  65. it_sar

    {ВнешняяОбработка.СозданиеПодчиненногоУзла.МодульОбъекта(56)}: Ошибка при вызове метода контекста (Удалить)

    Узлы.Ссылка.ПолучитьОбъект().Удалить();

    по причине:

    Ошибка при выполнении обработчика — ‘ПередУдалением’

    по причине:

    {Справочник.СценарииОбменовДанными.МодульМенеджера(238)}: Ошибка при вызове метода контекста (Записать)

    СценарийОбменаДанными.Записать();

    по причине:

    Ошибка при выполнении обработчика — ‘ПриЗаписи’

    по причине:

    {ОбщийМодуль.РегламентныеЗаданияСервер.Модуль(837)}: Регламентное задание не найдено.

    Возможно, оно удалено другим пользователем.

    ВызватьИсключение( НСтр(«ru = ‘Регламентное задание не найдено.

    Reply
  66. it_sar

    База файловая Розница — 2.2.6. — все синхронизации удалены. Фоновые отключены

    Reply
  67. tezdal

    вываливается ошибка при очистке

    Доступ. Отказ в доступе

    Регистр сведений. Версии подсистем областей данных

    Право изменение.

    а так все ок

    Reply
  68. Taska

    Не работает в рознице 2.2.7.42

    Reply
  69. PowerBoy

    (70)

    Происходит дополнительно обработка данных при создании узла в которой и происходит ошибка.

    Вероятно эта обработка вызывается при условии заполнения определенных реквизитов. Попробуйте не заполнять эти реквизиты, например там есть «Дата свертки» (Розница 2.2) или если не дает сохранить узел из формы — очистить эти реквизиты потом, можно PowerTools. И только потом запустить Создание узла.

    Reply
  70. baracuda

    Вываливается ошибка, нарушение прав доступа..

    Reply
  71. baracuda

    Правда запускал обработку на серверной базе, может в этом дело..

    Reply
  72. baracuda

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

    Reply
  73. baracuda

    в общем добавил в место ошибки Попытку-Исключение. По итогу имеем вроде бы образ, но в нем полно данных. Как документов всех магазинов так и заполненных регистров. Автору спасибо за то что дал хоть какую то альтернативу.

    Reply
  74. independ

    (75) если нетрудно, а в каком месте нужно добавить попытку-исключение?

    Reply
  75. baracuda

    (76) в модуле обработку, в процедуре суСоздатьОбразПодчиненногоУзла

    править следующий код, в приложении скрин

    Reply
  76. baracuda

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

    Reply
  77. independ

    (77) спасибо, пригодится

    Reply
  78. sapervodichka

    также полезным может быть отк/подкл узла https://infostart.ru/public/706733/

    Reply
  79. user1042801

    )60)Приветствую.Нужна эта обработка.Смысла нет покупать подписку из за одной обработки.Не могли бы вы скинуть на почту koop-kruf96@mail.ru.Буду очень признателен.

    Reply

Leave a Comment

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