Модуль менеджера или статические методы класса?




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

97 Comments

  1. Ish_2

    И не знаю , что скажут наши «гуру».

    Как начинающий скажу :

    Статья хорошо написана. Кратко , точно, изящно.

    Reply
  2. zfilin

    Спасибо.

    Reply
  3. leosoft

    Полезная статья, спасибо! Пишите еще! 🙂

    Reply
  4. mirco

    Спасибо, хорошо описан материал.

    Reply
  5. script

    Молодец ❗

    Reply
  6. rasswet

    для полного завершения не хватает примера, как проверить на заполненность реквизит такой-то.

    Reply
  7. CheBurator

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

    — атата!

    .

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

    Reply
  8. zfilin

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

    Reply
  9. Ish_2

    (7) По-человечески понятно.

    Что только не придумаешь , чтобы самооправдать непереход на 8.

    Reply
  10. zfilin

    (7) Все субъективно, на самом деле. Я совсем не против того, что можно очень упорядочено и организовано вести глобальный модуль 7.7, комментировать, может быть писать сопровождающие спецификации и тогда любые восьмерки становятся слишком громоздкими и неудобными по сравнению с простой 7.7

    Но мне почему-то чаще встречаются конфигурации «закрученные» настолько, что их просто неудобно читать, реже такие, что и логика начинает теряться в нагромождениях функций. Что очень печально.

    Reply
  11. CheBurator

    (9) не надо гнать волну… 😉 8-ке — свое место, 7-ке — свое… Переход на 8-ку должен быть обоснован, а если необходимости нет — то на нет и суда нет.. сижу пока что потихоньку 8-ку осваиваю…

    Reply
  12. zfilin

    (9) =(

    Reply
  13. CheBurator

    (10) да, конечно…

    Reply
  14. zfilin

    (7) (10) Не-не-не, я совсем не против, что в 8-ке тоже можно ТАКОГО сделать, что просто ужас.

    Reply
  15. coach

    В 8.2 МОЖНО обращаться к экспортным методам объекта, не записывая его. Даже из модуля формы.

    См. функцию глобального контекста ДанныеФормыВЗначение().

    Reply
  16. zfilin

    (15) Спасибо, действительно можно.

    А в ваших видеоуроках (во всяком случае в начале, 12-я часть 1-го бонуса) говорится, что нельзя.

    Статью поправлю.

    Reply
  17. coach

    (16) Да, сейчас прослушал видео-урок, действительно его нужно расширить.

    Эти видео-уроки писались достаточно давно, и сейчас требуют переработки.

    Поставил замечание в туду 🙂

    Reply
  18. Rusmus

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

    Reply
  19. Трактор

    (17)

    Поставил замечание в туду

    Не в туду, а в сюду.

    Reply
  20. Асисяй

    (19)

    Не в туду, а в сюду.

    В туду значит «в TODO»

    Reply
  21. akama2001

    спОбязателньыеРеквизиты = Документы.Заказ.ПолучитьСписокОбязательныхРеквизитов(Объект.ВидЗаказа);

    вот это жесть написана!!! Объект = Это же заказ!!! т.е. объект уже создан зачем нужно вызывать статический метод класса и передавать туда экземпляр класса то бишь объект…

    Reply
  22. zfilin

    (21) Да, не совсем удачный пример. На самом деле бывает же, что вид заказа есть, а объекта нет.

    Reply
  23. i132

    В таком модуле можно написать погашение заказа несколькими документами, например для заказа: отмена заказа или накладная (или в наборе записей, если регистр один)

    Reply
  24. a-novoselov

    Модуль менеджера объекта (только платформа 8.2)

    Этот модуль существует для многих объектов конфигурации. Основное предназначение данного модуля – это переопределение стандартного события выбора, которое возникает в момент ввода по строке и расширение функционала менеджера. Модуль компилируется на стороне сервера. В нем возможно определение экспортных свойств и методов. Вызов экспортных методов менеджера не требует создания самого объекта.

    http://www.lessons1c.ru/articles/55-moduly82.html

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

    Reply
  25. zfilin

    Да, речь идет о предопределенной процедуре «ОбработкаПолученияДанныхВыбора», которая вызывается, когда вы в поле ввода начинаете вводить текст (поле ввода должно быть типа «класса» в котором вы определяете процедуру). С ее помощью можно организовывать собственный «быстрый выбор» (или как оно называется).

    Почитайте в синтакс-помощнике, там толково написано.

    Reply
  26. naf2000

    Нашел единственное отличие методов модуля менеджера от статических:

    В методе объекта можно просто по имени вызывать такой статический метод (без упоминания самого класса): Печать(Чтото);

    Для метода менеджера все таки надо написать побольше: Документы.ЗаказПокупателя.Печать(Чтото);

    И да: даешь модуль ссылки!

    Reply
  27. dandrontiy
    Reply
  28. zfilin

    Спасибо, читал эту публикацию и даже сам не ее ссылался. =)

    Reply
  29. Sunhare

    Спасибо, написано доходчиво )

    Reply
  30. AlexO

    (27) dandrontiy,

    ПО сначала Sun, а потом и IBM

    и много он там ПРИКЛАДНЫХ приложений написал?

    Другой крупный критик ООП — это известный специалист по программированию — Александр Степанов, который работая в Bell Labs участвовал в создании C++ вместе c Бьерном Страуструпом, а впоследствии, уже по приглашению в HP Labs, написал Standard Template Library (STL).

    Т.е. хаял то, что впервые ввели в С++ — объекты и классы? А потом, продолжая хаять, еще и учавствовал в создании библиотек классов?? Он кем там работал — уборщицей? И так же что-ли шипел вслед разработчикам про их «дурацкий ООП, грязь от него одна да песок»? :))

    Все-таки, более вероятно, что в статье многое переврано.

    Ричард Столлман:

    можно считать C# в .NET 3.5 с более чем 50,000 реализованных классов „венцом эволюции“. Добавить в следующей версии .NET ещё миллион классов — что может быть более правильным и более вожделенным, с точки зрения ООП-программиста?

    И где Столлман нес такую чепуху? И где Степанов нес подорбную ахинею про программирование и математику? Что-то ссылки дают только более полный текст этой самой статьи, которая, судя по дальнейшим фразам «парни, не путайте генеалогию с гинекологией!», «Ни в каком моделировании наследования не существует — ни в электронике, ни в бухгалтерии, ни в политике, ни где бы то ни было еще.» написана отнюдь не для разбора проблем, а для какого-то околокомпьютерного журнала для подростков.

    Для незнающих, куда причислили и Степанова — про математику:

    Это как если бы математики начинали бы с аксиом. Но реально никто не начинает с аксиом, все начинают с доказательств…. Т.е. в математике вы заканчиваете аксиомой

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

    Да и сам автор, — если это был действительно он, — пытается оправдаться за безграмоность «отсутствием времени» и «в статье не ставились цели что-то доказать», а только «эта статья – чисто исторический обзор двух известных выступлений “Почему ООП провалилась“ и “Почему ООП не провалилась“.

    неразберихи в ООП так популярен рефакторинг

    — рефакторинг как никогда популярен у 1с, которая ни разу ни ООП. Но, конечно же, это говорит только о том, что рефакторинг — это неотъемлемая часть ООП… Вот оно, доказательство (нет, не аксимоам — у нас же аксиома идет после доказательства): 1С — это 100%-ое ООП! 🙂

    Reply
  31. AlexO
    Reply
  32. AlexO

    zfilin, рад, что не спите в столь позднее время, а следите за своими статьями 🙂

    Reply
  33. AlexO

    (21) akama2001,

    спОбязателньыеРеквизиты = Документы.Заказ.ПолучитьСписокОбязательныхРеквизитов(Объект.ВидЗаказа);

    вот это жесть написана!!! Объект = Это же заказ!!! т.е. объект уже создан зачем нужно вызывать статический метод класса

    Т.е. вас смущает, что в «объект» передается сам же объект (часть его)? А меня вот не смущает — т.к. я знаю, где ООП, а где 1С, где объекты ООП, и «объекты» 1С 🙂

    и передавать туда экземпляр класса то бишь объект…

    ну вот, о чем и говорил — уже нашли и классы, и ООП… и вообще, «курят» 1с не как я — затягиваются :))

    Reply
  34. AlexO

    (24) a-novoselov,

    Вызов экспортных методов менеджера не требует создания самого объекта.

    только вот что-то нет примеров применения модуля менеджера не из самого — уже созданного, — объекта для получения доступа к данным формы/процедуре модуля этого же объекта, а вызова функции в этом «модуле менеджера» другого, не текущего объекта.

    Везде требуется — передача «указателя» (см. пост (31) ) на «объект». Который должен быть создан для получения этого «указателя».

    Т.е. требует создания, требует.

    И никак иначе.

    Посмотрел внимательно этот «урок» — что-то дурной он какой-то. В частности, по модулю менеджера:

    Основное предназначение данного модуля – это переопределение стандартного события выбора, которое возникает в момент ввода по строке и расширение функционала менеджера

    Ввод по строке в 8.2 — вообще вещь неуправляемая, и каким боком тут модуль менеджера — непонятно.

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

    это верно. Собственно, это определется его (модулем менеджера) предназначением — исполняться на сервере, и быть привязанным к объекту, чтобы «светить» процедурами вовне.

    А вот про модуль команды не указано, что он компилируется — и виден, — только на клиенте и исполняется только по «кнопке»-владельцу, и больше ниоткуда.

    Reply
  35. zfilin

    (33) AlexO, Спасибо за интерес к статье, но вот прямо сейчас я, право слово, не готов даже прочесть ваш весьма развернутый комментарий. Поддался минутной слабости и шлепнул коньячку. Боюсь, что сейчас вам «наотвечаю». =)

    Но непременно посмотрю и отвечу по-делу. Наверняка вы неравнодушны к вопросу ООП в 1С, раз так подробно изложили своем мнение, а значит в какой-то степени мы с вами единомышленники, даже если и оппоненты.

    Reply
  36. AlexO

    (18) Rusmus,

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

    что вы пониматете под «модуль ссылки»? какие функции он должен нести?

    А где вы вообще в 1С8 нашли хоть какой-то контекст объектов — форм, документов, табличных частей? А тем более — в полном запрете в 8.2 использования какого-либо «контекста» объектов при разделении на Клиента и Сервер, требующего принудительной передачи «туда-сюда» данных.

    Если же вы хотите получать ДАННЫЕ ТЧ, вкладки, поля и т.д., то в 8.2 ССЫЛКА на «объект» сама по себе имеет отдаленное отношение к данные этого объекта. Т.к. — см. выше: ссылку-то с динамической формы на сервере мы видим, а вот данные — нет.

    И, боюсь, у 1С в этом случае (при уже созданной кошмарной системе УФ 8.3) останется только один вариант: делать модуль ТЧ, модуль ПоляВвода, модуль Вкладки…

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

    А из переданного в модуль менеджера объекта вы ссылку на него получить не можете? 🙂

    Reply
  37. AlexO

    (35)

    значит в какой-то степени мы с вами единомышленники, даже если и оппоненты.

    я только за то, чтобы вы, как человек, знакомый с ООП, не подменяли термины, следуя «1С-стайл», и путались сами 🙂

    Reply
  38. AlexO

    Еще про «ООП в 1С» — я вот тут развернуто про «объекты 1С» написал:

    Запутался в менеджерах и терминологии 1с

    Reply
  39. hogik

    (31)

    «… вопрос: ЗАЧЕМ и для кого эта система придумана? «©

    AlexO.

    1) Для кого.

    Для программистов, которые рассматривают «любую систему сугубо под углом RAD»(с).

    2) Зачем.

    Думаю, надо для начала ответить на вопрос — «почему?».

    «…классическая реляционная модель не имеет готовых средств для поддержки иерархии данных и ее реализация всегда требует кропотливой работы.»(с) [ http://v8.1c.ru/metod/architecture/ ]

    И при этом разработчики 1С-а путают модель СУБД с её ЯМД. 😉

    На мой взгляд, вся суть «развития» 1С-продуктов — это попытка приспособить SQL для задач предметной области, где требуется «иерархия данных».

    Reply
  40. AlexO

    (39) hogik,

    под углом RAD

    про RAD — вот здесь я уже написал свое мнение:

    «RAD — это среда быстрой разработки приложений. ПРИЛОЖЕНИЙ. Любых. Универсальных и не очень. Простых и сложных. Гибких и дубовых.

    А не тюнинг 1с-базы под нужды пользователя с параллельным изучением текущих взглядов на мир Бориса Нуралиева.»

    Для программистов

    для каких программистов? для кодеров — может быть. Для программистов — что-то не вижу ни смысла, ни цели. Одни палки в колеса.

    Мелкие исправления-поблажки с 8.2.14 — не перетягивают болото УФ.

    Reply
  41. AlexO
    Reply
  42. hogik

    (40)(41)

    … (AlexO).

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

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

    А, вот, на цитате про RAD забыл дать ссылку. 😉

    Reply
  43. AlexO

    (42) hogik,

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

    Reply
  44. hogik

    (41)(43)

    … (AlexO).

    Вы действительно считаете, что попытка «что-то путное приспособить»(с) в лице SQL — не является корнем (причиной), критикуемых Вами, «решений» от 1С-а?

    Reply
  45. AlexO

    (44) hogik,

    ну давайте не будем опять 🙂 …

    я уже лет пять назад устал доказывать — курица или яйцо, т.е. кто на что влияет — SQL, который сам по себе самодостаточная СУБД, но возможности которой используюся 1С процентов на 10. Или 1С, которая вдруг взяла — и выбрала MS SQL для хранения своих таблиц.

    Как один их «дешевых» из платных. И не таких сложных.

    Reply
  46. hogik

    (45)

    «ну давайте не будем опять 🙂 … я уже лет пять назад устал доказывать»(с)

    … (AlexO).

    Лично, мне — Вы ничего не доказывали. 🙂

    Надеюсь в фразе «SQL, который сам по себе самодостаточная СУБД,»(с) Вы описались.

    Я Вас не спрашивал почему 1С-ы выбрали ту или иную СУБД.

    Я Вас спрашивал про SQL, как — ЯМД. И его «особенности» при работе с «иерархическими данными». На коих стоит вся наша около-1С-овая деятельность. Которую Вы охарактеризовали как: «ничего нет из реального мира хранения данных, а есть каша из ссылок и вообще свалка и бардак.»(с).

    Reply
  47. a-novoselov

    (34)

    Предопределенная процедура из модуля менеджера объекта:

    ОбработкаПолученияДанныхВыбора (ChoiceDataGetProcessing)

    Синтаксис:

    ОбработкаПолученияДанныхВыбора(<ДанныеВыбора>, <Параметры>, <СтандартнаяОбработка>)

    Описание:

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

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

    Далее.

    Насчет обращения к методам объекта без создания самого объекта. В типовых конфигурациях, например, уже давно процедуры печати перенесены из модуля объекта в модуль менеджера. Зачем? Поясню. У нас есть ссылка на документ (скажем ОрдерСсылка), мы хотим его напечатать. Если экспортная процедура печати расположена в модуле объекта, то для печати документа нам нужно будет вызвать ее следующим образом: ОрдерСсылка.ПолучитьОбъект.Печать();

    Если же процедура расположена в модуле менеджера, то нам ее нужно будет вызывать как: Документы.Ордер.Печать(ОрдерСсылка);

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

    Reply
  48. AlexO

    (46) hogik,

    И его «особенности» при работе с «иерархическими данными».

    1С вольна сама разрабатывать представление как угодно. И выбран далеко не самый лучший вариант — в плане обработки и целостности данных.

    Лично, мне — Вы ничего не доказывали. 🙂

    эти споры поднимаются постоянно 🙂

    Особенно — когда новое поколение студентов подкатывает.

    Которую Вы охарактеризовали как:

    да, именно так и охарактеризовал. Вы хотите поговорить об этом? А мне цитировать самого себя про «ссылка на ссылке и ссылкой погоняет» и «в результате ничего ни проверить, ни проконтролировать»? 🙂

    SQL-то к этой 1с-ой кухне какое отношение имеет? Хорошо, раз не понимаете — другими словами, что мешало 1С выбрать более «подходящую» СУБД? Или более качественно проработать свою систему представления и хранения? Чтобы она как можно ближе ложилась на реляционные таблицы SQL? Или вообще — разработать такой 1с-сервер, который бы дублировал функции СУБД по записи, хранению, контролю, оптимизации, извлечении, анализу записей данных?

    Т.е. придумали фигню, кое-как всунули ящик, фигня там скомканная и неоптимизированная, но виноват — ящик, в который положили?

    Ну право слово, Вы уж сами-то подумайте, о чем мы тут можем спорить?

    А то все «Я Вас спрашивал про SQL, как — ЯМД», «…в лице SQL — не является корнем…», слова всякие умные 🙂

    Reply
  49. AlexO

    (47) a-novoselov,

    Насчет обращения к методам объекта без создания самого объекта.

    вот именно, обращения к методам объекта БЕЗ ПЕРЕДАЧИ ИНФО ОБ УЖЕ СОЗДАННОМ ОБЪЕКТЕ.

    Приходится писать крупно, потому что вы, как тру-1сник, уводите меня в сторону 🙂

    Причем тут МодульМенеджера и печать, когда туда (в начале обработки печати) передается этот самый созданный объект, и — вау! — вы вызываете МодульМенеджера обрабатываемого в данный момент объекта, данные о котором в полном объеме (для УФ 8.2) присутствуют и кочуют из одного общего модуля в другой, пока не дойдет это все до МодульМенеджер объекта, данные из которого и выводится на печать.

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

    И обсудим.

    И почему же ввод по строке вещь неуправляемая?

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

    А также — возможность его отключить 🙂

    Или что вы понимаете под «ввод по строке»?

    Reply
  50. zfilin

    AlexO, Извините, мне сложно понять вашу позицию в отношении ООП и 1С, так как ваша мысль разрознена по комментариям и сводится к критике комментариев других участников. В списке ваших публикаций я не нашел статей посвященных ООП, а приведенные тут ссылки на форум опять-таки, ссылаются на ваши критические комментарии обращенные к другим участникам дискуссии.

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

    Если же это не представляется возможным, то нам лучше не не вступать в дискуссию и разрабатывать тему 1С и ООП отдельно друг от друга, поскольку мне тяжело вычитывать такие разрозненные комментарии и я не вижу как бы это помогло в нашем общем деле изучения и совершенствования 1С.

    Reply
  51. AlexO

    (50)

    какую статью по «ООП в 1С» вы хотите? «Отсутствие ООП в 1С»?

    уже была масса тем, где это обсуждалось — в том числе, в последних и с вами. Берете оттуда примеры «почему ООП» или «почему не ООП» — и статья готова 🙂

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

    Reply
  52. a-novoselov

    (50) Либо очень тонкий тролль, либо неадекват… В любом случае дискуссия не будет продуктивной.

    Reply
  53. AlexO

    (50)

    мне сложно понять

    я не понимаю, почему вам сложно — я всегда пытаюсь найти и вытащить конкретные моменты несоответствия 1с парадигмам ООП.

    А не обсуждать агитки 1с.

    Но вы не хотите обсудить конкретные вопросы (например, почему «если такая ООП — такой бардак в Запутался я в терминологии 1С), а пытаетесь несуществующие, — на мой взгляд, — декларативные функции 1С обсудить в рамках «генерального сражения» — в одном месте, всеми силами, основные армии, статья противников — против агиток 1С 🙂

    Reply
  54. AlexO

    (52) a-novoselov,

    все дискуссии надменных «тру1с-ников» без агиток 1с-а сводятся к одному:

    «сам вы неадекват».

    Неужели ничего ни за собой нет, ни в голове, что без 1с-ового вранья — ничего больше нельзя сказать?!

    Reply
  55. AlexO

    Я вот — благодаря вашей «объектной модели 1С», которую вы так рьяно защищете без каких-либо доказательств, — даже не могу программно поменять тип данных у реквизита или ПоляВвода, связанного с ним, потому как для уже созданного «объекта» свойство резко стало «ТолькоДляЧтения».

    Ну, кто готов обсудить данную конкретную проблему «ООП в 1С»- почему это так, что делать, и где тут «объекты ООП»???

    Ну, кому это интересно? Или агитки интереснее читать, а потом сыпать «да вы тролль, да неадекват, да наша 1с самая-пресамая!»??

    Но только деградация вокруг да ветер пустоты…

    Reply
  56. a-novoselov

    (54) С 1С работаю около трех лет, до этого C++, PL/SQL, Oracle, базы данных на 10 000 пользователей. Согласен, что 1С не самая лучшая система, 100 пользователей кое-как тянет с жутким скрипом. Но как может адекватный человек задать вопрос «что вы понимаете под «ввод по строке»?»… Как ни странно, понимаю «Ввод по строке», но отвечать на такие вопросы бессмысленно.

    Reply
  57. zfilin

    (52) a-novoselov, Угу. Не кормите, не надо.

    Reply
  58. AlexO

    (56) a-novoselov,

    Как ни странно, понимаю «Ввод по строке»,

    ответ настоящего 1с-ника. Гордитесь.

    (57)

    Угу. Не кормите, не надо.

    а что еще может предложить тру-1сник? еще и a-novoselov подскажите в черный список занести — верно, я сильно буду переживать 🙂

    Reply
  59. AlexO

    (56) a-novoselov,

    до этого C++, PL/SQL, Oracle, базы данных на 10 000 пользователей.

    значит, впрок не пошло. Мимо пролетело.

    А меня — так вот уже достает, что ни новый проект на 1с — так куча ограничений, и часами придумывать новые и новые пути обхода 1с-ного кошмара.

    А потом на форумах 1с — видеть решения «да все нормально», «да все хорошо», «ООП в 1С!» и «наши в футбол выйграют?»

    Reply
  60. hogik

    (48)

    «Ну право слово, Вы уж сами-то подумайте, о чем мы тут можем спорить?»

    … (AlexO).

    Я, вроде, с Вами и не спорю. 😉

    Пытаюсь Вам подсунуть информацию для размышления на тему: «ЗАЧЕМ ВСЯ ЭТА ЗАТЕЯ?!»(с). Намекнул Вам о причине… Действительно — «виноват — ящик»(с).

    Но, чувствую после такого бреда с Вашей стороны: «на реляционные таблицы SQL»(с) разговаривать с Вами бесполезно. Т.е. если «студент» ставить знак равенство между моделью СУБД и ЯМД, то ему следует повторить школьную программу. 🙂

    Reply
  61. AlexO

    (60) hogik,

    знак равенство между моделью СУБД и ЯМД

    где СУБД и где SQL в 1С?

    Из чего состоит трехзвенная архитектура 1с?

    Как они взаимодействуют?

    Я-то давно знаю, что пробелы в заниях 1с-ников — массовые и зияющие. Что в 1с, что в СУБД.

    Не обижайтесь, а лучше разберитесь, и разгребите кашу по поводу СУБД и 1С 🙂

    Reply
  62. AlexO

    (60) hogik,

    и забудьте вы про свой «ЯМД» — выдрав ЯМД из СУБД, вы обозвали так весь SQL, запутались, и наворачиваете на это новые навороты 🙂

    Reply
  63. hogik

    (61)(62)

    … (AlexO).

    У меня такое впечатление, что Вы все мои высказывания пропускаете через «сито 1С» и свое понимание «объектности» как только методологию программирования.

    Для справки:

    1) Я не использую и не собираюсь использовать продукты 1С.

    2) Использую СУБД и варюсь в этой сфере с начала 70-х годов.

    Еще раз повторяю специально для Вас:

    «вся суть «развития» 1С-продуктов — это попытка приспособить SQL для задач предметной области, где требуется «иерархия данных».

    И если Вы этого пока не понимаете, то рекомендую запомнить и принять эту информацию к сведению. Возможно позже поймете… 🙂

    Reply
  64. saiten

    (49)

    Причем тут МодульМенеджера и печать, когда туда (в начале обработки печати) передается этот самый созданный объект, и — вау! — вы вызываете МодульМенеджера обрабатываемого в данный момент объекта, данные о котором в полном объеме (для УФ 8.2) присутствуют и кочуют из одного общего модуля в другой, пока не дойдет это все до МодульМенеджер объекта, данные из которого и выводится на печать.

    В (47), в общем-то, всё достаточно подробно расписано. Без создания объекта — чтобы не тащить в память из БД все реквизиты и таблицы объекта: в функцию модуля передаётся ссылка, по ссылке запросом берём только то, что нужно для печати. И никакого тягания объекта из модуля в модуль. А почему в модуле менеджера, а не в общем модуле — об этом как раз публикация.

    Кстати, обвинять эту статью в притягивании за уши парадигм ООП к 1С — это, даже не знаю, паранойя что ли… Скорее, это демонстрация людям, знакомым с ООП, концепции использования модуля менеджера через аналогию со статическими методами класса. Аналогию, кстати, весьма удачную, на мой взгляд: по сути, прочитал название — и сразу всё понятно.

    Reply
  65. saiten

    И, да простит меня автор за оффтоп, но заинтересовало вот это: (48)

    1С вольна сама разрабатывать представление как угодно. И выбран далеко не самый лучший вариант — в плане обработки и целостности данных.

    Раз выбран не лучший вариант — значит вы знаете другие? Не поделитесь знаниями, хотя бы в виде ссылок? Это не совсем праздный интерес: когда 1С стремительно начала хоронить себя в нише автоматизации торговли (УТ11, РТ2, заявление о прекращении поддержки УТ10) появилась шальная мысль — создать своё, и пока 1С не очухается и выйдет из комы пометь какой-никакой профит. Собственно, идея заглохла как только начали продумывать интерфейс библиотеки управления данными: получалось, почти один в один, как 1С:77. Что заставило крепко задуматься: то ли 1С настолько основательно разъел мозг, то ли по-другому действительно никак.

    Reply
  66. zfilin

    (64) saiten, Спасибо большое, как вы ловко всё пояснили. Я про свою статью лучше бы не сказал. =)

    Reply
  67. hogik

    (48)

    … (AlexO).

    Очень сильно 😉 присоединяюсь к вопросу из (65) сообщения, в части:

    «…вы знаете другие? Не поделитесь знаниями, …?»(с)

    P.S. И я приношу извинения автору темы «за оффтоп»(с).

    Reply
  68. AlexO

    (68) hogik,

    (65) saiten,

    Раз выбран не лучший вариант — значит вы знаете другие?

    Мне страшно становится — если вы не знаете про:

    MS SQL, немного объектный реляционный ORACLE…

    Reply
  69. yuraos

    Такс опять склоки насчет того нужен ООП или нет.

    Уже как то скучно … ну не нравится ООП 1с-овцам

    и не когда они его не реализуют в платформе!!!

    Хотя могли бы это и сделать…

    Для меня довольно очевидным, что сама платформа 1С

    была «списана» с MS Visual Basic for Application

    что рулит приложениями Оффиса.

    А там поддержка классов была с самого начала.

    Хочешь — пользуйся, хочешь — нет

    Reply
  70. yuraos

    (70)

    Другой вопросик меня интерисует:

    Модуль объекта и Модуль менеджера объекта

    фактичкски являются средством инкапсуляции и

    повторного использования функционала, связанного с объектом (или классом объектов).

    Покрайней мере я привык его так использовать … в обычном приложении.

    Но вот в управляемом приложении на платформе <= 8.2.14

    столкнулся с такой бедой:

    На стороне клиента не доступны

    (как КЛАСС — извинят меня противники ООП)

    ни сам Объект ни его Менеджер

    Соответственно не доступен и функционал, инкапсулированный в них.

    Изменилось ли что-нибудь по этой части в >= 8.2.15 и 8.3.х ???

    Reply
  71. AlexO

    (71) yuraos,

    ни сам Объектни его Менеджер

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

    Ни в 8.2.14, ни в каких других 8.2. Ни в 8.3.

    Это — управляемое приложение, поделка от 1С, в которой ценности — на грош, зато понтов и мусора — на грузовик.

    А в толстом клиенте все так и осталось — объекты доступны в контексте формы.

    Только клтиента нет как такового.

    А в УФ и клиента не сделали нормального, и перлопатили и извратили все так, что все приходится делать через одно место сервер на клиента, и с клиента — на сервер.

    Reply
  72. AlexO

    (70) yuraos,

    что сама платформа 1С

    была «списана» с MS Visual Basic for Application

    и близко не стояла.

    То, что вам кажется, будто АВТОМАТИЗАЦИЯ (rapid app dev) в чем-то похожа — то и тут ничего подобного: MS идет от задач программирования (если пишет СРЕДСТВО ПРОГРАММИРОВАНИЯ), а 1С — от содержания плевка, упавшего с потолка, и оставленного там неизвестно кем неизвестно когда.

    Reply
  73. yuraos

    (72)(73) AlexO,

    — УРА! МЫ НАУЧИЛИСЬ ВЫРЕЗАТЬ ГЛАНДЫ!!!

    — ФУУУУУУ!!!

    — Через ЖЖЖЖЖЖЖЖЖЖЖЖЖ!!!!

    — УУУУУУУ!!!



    Нелюбовь к ООП, переросшая уже на клиент-серверный уровнь !!!

    Reply
  74. yuraos

    (72) AlexO,

    самое забавное во всем этом клиент-серверном мракобесии,

    что не всегда для работы формы

    ей нужно обращаться

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



    на этот случай наверное в свойствах

    корня конфигурации добавили галку

    «Использовать обычные формы в управляемом приложении»

    Reply
  75. Lacrimosa0000

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

    Reply
  76. yuraos

    (76) Lacrimosa0000, ага, пожалуста!



    многие тут узнают, что это за зверь ООП



    и что некоторые заслуженные товарищи ЕГО за что-то невзлюбили.

    Reply
  77. Alex1Cnic

    Объясняется просто и понятно… ПЛЮССС

    Reply
  78. awk

    А что такое ООП? ООП на PHP5 это эмуляция классов через модули. На JavaScript ООП реализовано через прототипы и классов там нет и в помине. В джаве, с++ и т.п. классы определены как синтаксис, но в двоичном коде отсутствуют.

    Так кто сказал, что ООП — это классы?

    ООП Это инкапсуляция, наследование (прототипирование) и полиморфизм.

    Как реализовать полиморфизм в 1С — я знаю. (Причем, спецификация на уровне платформы не поддерживается — ковыряйся программист)

    Как реализовать на 1С инкапсуляцию? Ответа — нет.

    Как реализовать на 1С наследование (прототипирование)? Ответа — нет. Тот что есть — крив.

    Reply
  79. tindir

    Блин. статья интересна. теперь наверное во всех крупных решениях количество общих модулей уменьшится и все они уйдут в менеджеры,и УРА! опять переписывать все не типовые ВПФ и Отчеты! А тка идея очень хорошая и удобная. все методы для отдельных объектов будут только храниться в объекте (по идее должны)

    Reply
  80. LexSeIch

    Мир этому дому! Статья интересная. Коротко и ясно.

    Reply
  81. yuraos

    (80) tindir,

    все будет так хорошо и красиво только в обычном приложении



    а в управляемом приложении не все так, как бы хотелось

    с учетом замечаний в (71)



    сам недавно для совместимости с управляемыми извращениями

    часть функционала перетягивал из модуля объекта и модуля менеджера объекта

    в те самые общие модули

    Reply
  82. sound

    Мне вот тоже кажется, что очень уж много тупизны (ну или неразберихи, сложностей, всего того, о чем так рьяно пишет в каментах AlexO) они для этих управляемых форм понаворотили. Еще не знаю, что окажется сложнее для разработчика: переход с 7-ки на 8-ку, или переход с обычных форм на управляемые.

    Вообще рассуждая на тему «Зачем они это сделали» на ум приходит две мысли:

    1) Или пока не доделали, и как обычно дали сырой инструмент.

    2) Или просто философия фирмы 1С направлена на какое-то запутывание чтоли, чтоб уж если ты специалист по 1С (не

    в смысле сдал их же тупой экзамен на спеца), то уж точно никто другой, кроме таких же «собратьев 1С», пришедший в «отрасль 1С» «из других языков и программ» не смог бы сходу разобраться в логике работы прикладного решения, и не смог бы «вот тут мне добавить колонку» или «слегка подправить отчетик» — дайте новичку разобраться с логикой работы оборотно-сальдовой ведомости в бухгалтерии или с регламентированным отчетом. И чтобы без этого спеца было НуНиКакНеОбойтись, а что, вполне себе и франчам нормальное обеспечение куска хлеба. То бишь, сводится все это к какой-то банальной наживе чтоли, хотя может и не очень удачное выражение. Нет, я не против того, что любой труд должен быть оплачен, но получается у 1С все как-то через одно место.

    По теме: статья, несмотря на всю критику 1С, в принципе, полезная 🙂

    Reply
  83. zfilin

    (83) sound, А вы посмотрите видео с четвертой встречи клуба — http://club-1c.zfilin.org.ua/2013/03/blog-post.html

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

    Reply
  84. sound

    (84) Не смог посмотреть это видео, что-то со звуком, не исключаю что глюки с моей стороны.

    Может быть в общую идею управляемые формы и вписываются органично, но вот в мой мозг однозначно нет :). Если же под «неприятными деталями» подразумевается постоянный «перегон» данных с клиента на сервер, и запутывание разработчика, то это имхо маразмом попахивает, хотели сделать просто и удобно, а получилось сложно и запутанно, зато органично. Ну не знаю, не знаю, время все рассудит =)

    Reply
  85. zfilin

    (85) sound, Нет, перегон данных между клиентом и сервером это как раз одна из лучших фишек управляемых форм.

    Жаль, что со звуком не получилось, собственно, доклад изначально рассчитан на то, чтобы «уложить управляемые формы в голову разработчику». Это его главная тема.

    Reply
  86. sound

    Прошу прощения у автора за оффтоп!

    (86) посмотрел таки видео, не до конца правда, досмотрел до 10-й минуты 3-й части, утомило: во-первых, качество видео плохое, не видно что там на доске. Во-вторых, без обид, доклад так себе: докладчик путается в терминологии, доклад не структурирован, логика очень плохо просматривается, может быть я, как человек закончивший физмат, предъявляю слишком высокие требования к бесплатному видео? :). В-третьих, пока не увидел каких-то практических доводов, одна теория, похожая, кстати, на какие-то агитки от фирмы 1С (выражаясь языком AlexO), чувствуется какая-то заинтересованность в том, чтобы все не ломали, не украли, и под УФ писали, и наверное только у вас все 1С-ное покупали 🙂

    Так что «уложить управляемые формы в голову разработчику», во всяком случае в мою голову, таким видео точно не удастся, ну либо я просто не разработчик вовсе, чего я собственно не исключаю 🙂

    Ну и в-четвертых, признаюсь честно, не слишком-то много я в принципе знаком с этими управляемыми формами, поэтому сильно спорить и доказывать свою правоту не стану. Но с другой стороны, говоря о типовых конфигурациях фирмы 1С, так сказать о венце творения, что-то не заметил я тех дико функциональных конфигураций, которые бы враз затмили собой все те типовые, которые написаны под обычные формы, как 8-ка не затмила 7-ку.

    Вот есть у меня типовой «Документооборот», по тупости начальства внедряли не сами, а услугами франчей, заплатили как обычно просто гигантскую сумму денег. «Документооборот» на управляемых формах, вот фигня фигней, других слов нету! И ладно бы он прям ЛЕТАЛ, а то ведь тупит, даже не так, ТУПИТ страшно. Может «тупить» от слова «типовой»? 🙂 Весь функционал свелся к переписке служебками «чтоб история была», кароче можно было просто почту нормальную сделать, или сделать гораздо функциональнее и чтоб летало на 1С 7.7.

    Да, наверно закупив еще сервачок на пару лямов все завертится, но что-то мне подсказывает что дело-то было не в бабине. Вот когда фирма 1С перепишет все типовые (или уже?) на УФ, и своим веским словом в одночасье перестанет обновлять типовые на обычных формах, как она обычно это делает (это бизнес, детка!), вот тогда я задумаюсь о серьезном изучении УФ, может заодно за это время жизнь изменится к лучшему 🙂

    Reply
  87. zfilin

    (87) sound, Что ж, в любом случае желаю вам все-таки «разобраться и уложить», когда возникнет такая необходимость.

    Reply
  88. yuraos

    (87) sound,


    Вот есть у меня типовой «Документооборот», по тупости начальства внедряли не сами, а услугами франчей, заплатили как обычно просто гигантскую сумму денег. «Документооборот» на управляемых формах, вот фигня фигней, других слов нету! И ладно бы он прям ЛЕТАЛ, а то ведь тупит, даже не так, ТУПИТ страшно.

    Это, я бы сказал, художественная правда жызни!

    Reply
  89. yuraos

    (89)

    ЗЫ



    А еще те, у кого «Документооборот» в клиент-серверном варианте работает

    (так сказать в родной для управляемого приложения обстановке)

    те наверное знают об ошибках времени исполнения,

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

    Reply
  90. yuraos

    (90)

    ЗЫ

    ЗЫ



    таких ошибок по идее недолжно быть,

    если разработчики тестировали свою конфу для клиент-серверной базы!

    Reply
  91. batlerrett

    Хорошая годная статья по практическому применению.

    Жаль что переросла в холивор на тему 1С — это плохо/хорошо.

    1С изначально придумана для решения конкретных проблем.

    Думаю размышления к какой области относится 1С, должны волновать «бородатых» теоретиков),

    а у нас конкретные задачи учета.

    Reply
  92. vvirus

    Модуль Менеджера — мощьная идея.

    для реализации обращений ко всем у типу метаданных

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

    ЭлементПеречисления.метаданные().Получить(ЭлементПеречисления.метаданные().Индекс)).Комментарий;

    убрать функции в общих модулях и переложить их в модуль менеджера

    а в части иммитатора ООП

    как создание своего класса можно использовать внешние обработки

    Reply
  93. talych

    Спасибо за статью. Всё расписано чётко. Насчет холивара, согласен что УФ в 1С через одно место. Вместо упрощения программирования получили нечто монстрообразное ((

    Reply
  94. Патриот

    (0) +

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

    (93) vvirus,

    как создание своего класса можно использовать внешние обработки

    абсолютно согласен — у обработки есть свойства (реквизиты и экспортные переменные модуля объекта) и методы (экспортные процедуры и функции модуля объекта), есть конструктор экземпляра объекта

    ОбработкаОбъект = ВнешниеОбработки.Создать(«полный путь к файлу»);

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

    ОбработкаОбъект.Инициализировать(куча параметров);

    , где «Инициализировать» это заранее прописанный программистом метод обработки, выполняющий доконструирование объекта (первоначальную инициализацию, в зависимости от переданных параметров). А теперь вопрос, а почему только об обработках речь? Вышеописанные характеристики присущи даже формам объектов, не говоря уже о документах и справочниках. Форму можно создать, не создавая при этом объект, в ней есть всё те же импровизированные свойства методы и конструктор с деструктором. Кстати, если мы хотим нагрузить деструктор какими-то более сложными действиями, чем убийство объекта, то в можно как и в случае с методом «Инициализировать» написать метод «ДеИнициализировать». А в случае с формой так вообще можно использовать событие «ПриЗакрытии», если до этого было событие «ПриОткрытии».

    Reply
  95. zfilin

    (95) Патриот, Спасибо.

    Reply
  96. perepetulichka
    Но нужно помнить, что в 8.2 нельзя просто так обратиться к методам модуля объекта (без записаного объекта …

    То есть получается, что обращение совершенно нового незаписанного объекта к процедуре модуля объекта «ПередЗаписью» невозможно 🙂

    Основное назначение процедуры одной фразой отправлено в хлам.

    Reply
  97. zfilin

    (97) Да, слово «записанного» в этой фразе можно убрать. Поскольку речь шла о доступе к модулю объекта извне (не из контекста самого объекта), то в этом смысле нужен какой-то существующий в базе объект (записанный).

    Однако, на самом деле не обязательно. Можно создать объект, держать его в памяти, обращаться к его методам модуля, а потом спокойно его обнулить не записывая в базу. Но объект все-равно нужен.

    Reply

Leave a Comment

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