Поиск и восстановление битых ссылок (обычная и управляемая форма) 8.2-8.3




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

53 Comments

  1. user618695_ka

    Подойдет ли для удаления битых ссылок на характеристику номенклатуры в регистре сведений «Цены номенклатуры»?

    Reply
  2. Xershi

    (1) обработка не удаляет, а наоборот восстанавливает ссылку, т.е. создает видимый объект конфигурации на месте удаленного!

    Reply
  3. vechiy

    Не удалось записать объект — {ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.ФормаУправляемая.Форма(187)}: Ошибка при вызове метода контекста (Записать): Значение поля «Дата» не может быть пустой датой

    Reply
  4. Xershi

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

    Reply
  5. vechiy

    (4)

    ну как бы непонятно в чем проблема

    вопрос с датой решился добавлением строки

    ИначеЕсли ТипОбъекта = «Документ» Тогда

    НовыйОбъект = Документы[ИмяОбъекта].СоздатьДокумент();

    НовыйОбъект.УстановитьСсылкуНового(Документы[ИмяОбъекта].ПолучитьСсылку(УникальныйИд));

    новыйобъект.дата=’20170510′;

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

    я неправильно пользуюсь?

    проблема следующая: зуп 3.1.2.293 платформа 8.3.8

    при попытке ввести исправление в «отпуск» возникает ошибка:

    {ОбщийМодуль.ИсправлениеДокументовРасчетЗарплаты.Модуль(1777)}: Ошибка при вызове метода контекста (Записать)

    ЗначенияПоказателейНабор.Записать();

    по причине:

    Запись с такими ключевыми полями существует! : ЗначенияПоказателейНачислений: <Объект не найден> (332:aeea68b599ce83af11e76c5cc180305c), 1, Оклад (Регистр сведений: Значения показателей начислений; Номер строки: 2)

    по этому ID получаю гуид в вашей обработке

    Reply
  6. Xershi

    (5) похоже проблема еще и в других элементах, последовательно их восстановите. И затем все равно надо похоже через обычное приложение запускать, чтобы отследить ошибку в данных! Хотя отладчик и так у вас запустится, только доступа к данным не будет в пользовательском режиме.

    Reply
  7. vechiy

    (6) а как восстановить?

    жму исправить — получаю ошибку -> копирую ид->получаю гуид->создаю объект->жму исправить->получаю ошибку уже с другим ид

    Reply
  8. Xershi

    (7) я же вам писал. У вас цепочка удаленных объектов. Вы их с какой целью восстанавливаете? Обычно после обмена такая проблема возникает или после удаления без ссылочного контроля. И во втором случае надо не восстанавливать, а удалить хвосты.

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

    Reply
  9. razmochaev

    Добрый день.

    У нас платформа 1С:Предприятие 8.3 (8.3.10.2299).

    При попытке подключить как внешнюю обработку возникает такая ошибка:

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

    Возможно, она не подходит для этой версии программы.

    Метод объекта не обнаружен (СведенияОВнешнейОбработке)

    Если просто открыть ее, то при выполнении команды «Получить GUID» возникает такая ошибка:

    {ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.ФормаУправляемая.Форма(67)}: Ошибка при вызове конструктора (УникальныйИдентификатор)

    GUID = Новый УникальныйИдентификатор(ГУИД);

    по причине:

    Недопустимое значение параметра (параметр номер ‘1’)

    Reply
  10. Xershi

    (9) добрый день! Обработка идет как внешняя! Подключать их не нужно, просто запустите из меню файл! Для подключения из БСП требуется доработка метода, который вам выдало в ошибке.

    Reply
  11. razmochaev

    (10) Хорошо, а можете проконсультировать по ошибке, связанной с недопустимым значением параметра? Я так понимаю, что он не находит объект в базе (т.е. я проверяю наличие объекта в копии базы, а в этой копии этого объекта также нет), и на это ругается?

    Reply
  12. Xershi

    (11) значит вы нажали кнопку и не заполнили нужный реквизит. Воспользуйтесь кнопкой поиска и только потом другими!

    Если речь идет об объекте метаданных, то конечно ошибка возможна, т.к. его физически нет в базе!

    Reply
  13. razmochaev

    (12) Спасибо!

    Reply
  14. ZyMik

    Ошибка при поиске битых ссылок в регистрах.

    Типовая БП (3.0.51.12).

    Валится на запросе

    ВЫБРАТЬ Об.Валюта КАК Объект,

    «РегистрБухгалтерии.Хозрасчетный.Валюта» КАК ТаблицаИсточник,

    Об.Регистратор КАК ОбъектИсточник,

    «Справочник.Валюты» КАК ТипДанных

    ИЗ

    РегистрБухгалтерии.Хозрасчетный КАК Об

    ГДЕ Об.Валюта ССЫЛКА Справочник.Валюты И ВЫРАЗИТЬ(Об.Валюта КАК Справочник.Валюты).Ссылка есть null И Об.Валюта <> Значение(Справочник.Валюты.ПустаяСсылка)

    Reply
  15. Xershi

    (14) регистры состоят из других метаданных. Поэтому теоретически их вообще можно исключить из анализа. Ошибка вам сообщила что метаданные в конфигураторе отличаются от тех что записаны в предприятии. Это особенность регистра бухгалтерии.

    Reply
  16. ZyMik

    (15)

    И? По факту обработка не работает. В данной ситуации нужно использовать ВалютаДт и ВалютаКт.

    Согласно ТИИ у меня есть битые ссылки в двух РС, но обработка их не выдала.

    Если на 8.3.6. все отлично работает (Надеюсь Вы тестирировали) — сделайте пометку, что на 8.3.8 обработка НЕ работоспособна. Чтобы другие пользователи не обломались.

    Reply
  17. Xershi

    (16) так через справочник валют не выводит? Или по каким метаданным битая ссылка?

    Reply
  18. ZyMik

    Есть типовая Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.43.29)

    На поддержке, без изменений.

    Открываю в ней Вашу обработку.

    Нажимаю Поиск — по всем регистрам

    Появляются 2 сообщения об ошибках.

    Список битых ссылок пустой.

    Хотя в регистре сведений Версии объектов есть битые ссылки.

    Если глянуть отладчиком — ошибки вылетают при выполнении запроса (Выше).

    Попробуй его открыть в консоли.

    Reply
  19. Xershi

    (18) почему так работает я вам писал в (15) . Это особенность 1С. И на таких регистрах будет ошибка, но на остальные метаданные это не влияет. Версии объектов независимый регистр, его надо почистить. Обработка такие регистры пропускает, т.к. такие данные это уже мусор, который надо зачистить, а не восстанавливать!

    Reply
  20. Xershi

    (18) в дополнение есть кнопка «Удалить». Она правда не удаляет независимые регистры, но если вам нужно можете добавить код туда и удалить! А проще всего открыть такой регистр и руками его удалить, т.к. ссылок на него просто нет!

    Reply
  21. Xershi

    (21) если вы читали тему, то она звучит так: «Поиск и восстановление битых ссылок«. регистры это не ссылочный тип!! Так что извините, что за вас не прочитали название, тут нельзя помочь!

    Reply
  22. user664177_ademar26

    Не работает не открывается форма Версия 8.3.9

    {ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.Форма.Форма(3,8)}: Процедура или функция с указанным именем не определена (СтрНайти)

    Поз = <<?>>СтрНайти(ГУИД, «:»);

    {ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.Форма.Форма(49,39)}: Процедура или функция с указанным именем не определена (СтрНайти)

    Менеджер = Менеджеры[Лев(Таблица, <<?>>СтрНайти(Таблица, «.») — 1)];

    {ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.Форма.Форма(50,67)}: Процедура или функция с указанным именем не определена (СтрНайти)

    КонкретныйМенеджер = Менеджер[Прав(Таблица, СтрДлина(Таблица) — <<?>>СтрНайти(Таблица, «.»))];

    {ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.Форма.Форма(76,9)}: Процедура или функция с указанным именем не определена (СтрНайти)

    Если <<?>>СтрНайти(НайденнаяСсылка, «<Объект не найден>») = 0 Тогда

    {ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.Форма.Форма(103,42)}: Процедура или функция с указанным именем не определена (СтрНайти)

    ГУИДУдОбъктаСтр = Сред(ГУИДУдОбъктаСтр, <<?>>СтрНайти(ГУИДУдОбъктаСтр,»:»)+1, СтрДлина(ГУИДУдОбъктаСтр));

    {ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.Форма.Форма(144,41)}: Процедура или функция с указанным именем не определена (СтрНайти)

    ТипОбъекта = Лев(ТипНайденнойСсылки, <<?>>СтрНайти(ТипНайденнойСсылки, «.») — 1);

    {ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.Форма.Форма(145,73)}: Процедура или функция с указанным именем не определена (СтрНайти)

    ИмяОбъекта = Прав(ТипНайденнойСсылки, СтрДлина(ТипНайденнойСсылки) — <<?>>СтрНайти(ТипНайденнойСсылки, «.»));

    Reply
  23. Xershi

    (23) важна не версия платформы, а версия режима совместимости конфигурации! Если у вас стоит ниже 8.3.6, то вам нужно скачать версию для 8.3.5!

    Reply
  24. user664177_ademar26

    Скачаная версия 8.3.6

    Reply
  25. Xershi

    (25) значит версию режима совместимости должна быть 8.3.6 и выше!

    Reply
  26. user664177_ademar26

    Так я не пойму что мне нужно исправить то? )

    Reply
  27. Xershi

    (27) использовать обработку для 8.3.5 или изменить режим совместимости в конфигурации!

    Reply
  28. user664177_ademar26

    А страшного ничего не произойдет если поменять режимы?

    Reply
  29. Xershi

    (29) страшного нет, но если перехода с 8.3.5 не делали, то полетит часть функционала. Раз такой вопрос задаете, выполняйте первую рекомендацию!

    Reply
  30. vania

    При восстановлении битых ссылок (например для документов) создается объект с новым идентификатором. Установка старого идентификатора не выполняется.

    ——

    Платформа: 8.3.10.2580

    Конфигурация: Бухгалтерия предприятия, редакция 3.0 (3.0.52.39)

    В конфигурации не используется режим совместимости.

    Reply
  31. Xershi

    (31) добрый вечер!

    Спасибо что сообщили о проблеме!

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

    Если потребуется обновленный вариант обработки, сообщите в личные сообщения!

    Reply
  32. ZyMik

    (22) Битые ссылки как раз в регистре.

    А в них как раз и не ищет

    Reply
  33. Xershi

    (33) я же вам уже написал. Такие данные нужно удалять, с какой целью вы их хотите восстановить?

    Регистры это вспомогательные данные, которые крепятся к ссылочным, если нет ссылочного, то такие данные не удалили!

    Если вам по какой-то причине нужно для них восстановить, то нужно переписать код в обработке.

    Данная разработка этого не предусматривает целенаправленно!

    Т.к. реализованы кнопки по удалению регистров из базы!

    Reply
  34. aleksey.kubovtsov

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

    Reply
  35. Gnej

    У клиента битые ссылки в справочниках они понятно в регистрах видны. При восстановлении справочника в регистре всме будеток?

    И еще ссылка в справочнике битая но при поиске обработке по работе со справочником находится этот объект но зайти не дает пишет объект не найден. Эта обработка сможет полечить?

    Reply
  36. Xershi

    (36) регистры удалить, битые ссылки уйдут! Либо восстановить, если информацию по ошибке удалили!

    Чтобы зайти в битую ссылку ее нужно создать, читайте описание к публикации и ее источника!

    Reply
  37. Gnej

    (37)если я приобрету и не сработает я могу вернуть?

    Reply
  38. Xershi

    (38) обработка за стартмани, такого функционала здесь нет!

    Reply
  39. Gnej

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

    Reply
  40. Xershi

    (40) нет, обработка даст ее удалить! Что и логично, а вот если ссылка была в документе или справочнике, тогда будет возможность восстановить!

    Reply
  41. Gnej

    (41)

    Reply
  42. Gnej

    (41) вот что получаю

    Не удалось создать объект — {ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.ФормаУправляемая.Форма(188)}: Ошибка при вызове метода контекста (Записать): Попытка вставки неуникального значения в уникальный индекс:

    Microsoft SQL Server Native Client 11.0: Не удается вставить повторяющуюся строку ключа в объект «dbo._Reference253» с уникальным индексом «_Reference253HPK». Повторяющееся значение ключа: (0, 0xa2939cb654afeb2b11e8a5ee8573c581).

    HRESULT=80040E2F, SQLSrvr: SQLSTATE=23000, state=1, Severity=E, native=2601, line=1

    Reply
  43. Xershi

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

    Reply
  44. begemot

    (0) Ошибку поправьте.

    Как увидеть ошибку:

    В поле «Объект не найден» вставить значение, например: «<Объект не найден> (3410:96c874d435fb680c11e781968a0c6dc0)»

    Нажимаем «ПолучитьGUID».

    Получаем ошибку «{ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.ФормаУправляемая.Форма(67)}: Ошибка при вызове конструктора (УникальныйИдентификатор)

    GUID = Новый УникальныйИдентификатор(ГУИД);

    по причине:

    Недопустимое значение параметра (параметр номер ‘1’)»

    Суть ошибки:

    В процедуре «ПолучитьGUIDУдаленногоОбъектаНаСервере» вы ощичаете ГУИДУдОбъкта от лишних данных. Но используете для этого переменну формы ГУИДУдОбъктаСтр, которая имеет ограниченную длину 36 символов. В итоге от сам ГУИД обрезается и становится неверным.

    Reply
  45. Xershi

    (45) добрый день!

    Спасибо за проявленный интерес к разработке!

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

    Reply
  46. Xershi

    (45) ввел в реквизит «Объект не найден» текст «<Объект не найден> (3410:96c874d435fb680c11e781968a0c6dc0)» (без кавычек).

    Нажал кнопку «Получить GUID ->»/

    Заполнился реквизит «GUID» текстом «8a0c6dc—8196-11e7-96c8-74d435fb680c».

    Возможно вы модифицировали обработку или же используете на каком-то режиме совместимости. В режиме совместимости 8.3.10 на платформе 8.3.14 результат на картинке:

    Reply
  47. begemot

    (47) Добрый день!

    Заполнился реквизит «GUID» текстом «8a0c6dc—8196-11e7-96c8-74d435fb680c»

    а должен заполнится значением 8a0c6dc0-8196-11e7-96c8-74d435fb680c

    в первом сегменте теряется 8ой символ!

    Reply
  48. Xershi

    (48) вы лучше покажите скрин, где у вас нашло такую строку «<Объект не найден> (3410:96c874d435fb680c11e781968a0c6dc0)»

    Похоже ошибка в формате строки. У меня битая ссылка выглядит так «<Объект не найден> (10:86ae005056c0000811e71c52548be600)».

    Reply
  49. Xershi

    (48) посмотрел код.

    И какая-то мистика. Возможно кеш или еще что влияет на работу.

    Выходило, что после выполнения:

    ГУИДУдОбъктаСтр = СтрЗаменить(ГУИДУдОбъкта,»<Объект не найден> («,»»);

    Реквизит не менялся. Возможно дело в платформе. Ранее такого бага не было.

    Но в любом случае поменяю код, чтобы не было путаницы!

    Reply
  50. Xershi

    (50) проверил разные релизы и режимы совместимости. Ошибка воспроизводится везде. Написал в поддержку 1С. И обновил публикацию для 8.3.6+.

    Reply
  51. begemot

    (49)

    Reply
  52. begemot

    (50)

    ГУИДУдОбъктаСтр — у вас реквизит формы. Тип Строка 36 символов.

    Получается:

    Если ГУИДУдОбъкта = «<Объект не найден> (2760:96c874d435fb680c11e78196e9cd5d58)»

    При выполнении кода:

    ГУИДУдОбъктаСтр = СтрЗаменить(ГУИДУдОбъкта,»<Объект не найден> («,»»);

    СтрЗаменить возвращает строку 37 символов. Но попадая в ГУИДУдОбъктаСтр она обрезается до 36!

    Здесь платформа отрабатывает так как и должна.

    ГУИДУдОбъктаСтр — нужно снять ограничение по длине, или использовать локальную переменную функции

    лГУИДУдОбъктаСтр = СтрЗаменить(ГУИДУдОбъкта,»<Объект не найден> («,»»);
    ГУИДУдОбъктаЧ = СтрЗаменить(лГУИДУдОбъктаСтр,»)»,»»);
    лГУИДУдОбъктаСтр = СтрЗаменить(ГУИДУдОбъктаЧ,»0x»,»»);
    лГУИДУдОбъктаСтр = Сред(лГУИДУдОбъктаСтр, СтрНайти(лГУИДУдОбъктаСтр,»:»)+1, СтрДлина(лГУИДУдОбъктаСтр));
    // Преобразуем GUID
    ГУИД = Сред(лГУИДУдОбъктаСтр,25,8)+»-«+Сред(лГУИДУдОбъктаСтр,21,4)+»-«+Сред(лГУИДУдОбъктаСтр,17,4)+»-«+Сред(лГУИДУдОбъктаСтр,1,4)+»-«+Сред(лГУИДУдОбъктаСтр,5,12);
    ГУИДУдОбъктаСтр = ГУИД;
    

    Показать

    Reply
  53. Xershi

    (53) да, действительно. Маска подрезала вывод. Ошибки в платформе нету.

    Reply

Leave a Comment

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