Групповая обработка справочников и документов (Управляемая форма) v 3.3




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

99 Comments

  1. kompas-dm

    (0) Посмотрите эту работу от Поручика

    Reply ↓
  2. kser87

    (1) kompas-dm, такая тоже есть. Но простые пользователи ее не воспринимают обычно.

    Reply ↓
  3. Поручик

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

    Reply ↓
  4. Поручик

    (2) Отбор по дополнительным свойствам и реквизитам в СКД происходит через ссылку на объект.

    Reply ↓
  5. petrov_al

    Простите, не подскажете где можно взять обработку «Изменение выделенных объектов».

    Reply ↓
  6. Поручик

    (5) Нигде. Это принадлежность конфигураций на БСП (Управление торговлей 11, Розница 2, УНФ). Копай типовые

    Reply ↓
  7. kser87

    (5) petrov_al, Обработка называется «ГрупповоеИзменениеОбъектов». У нее есть один большой недостаток: для того, чтобы добавить ее к нужному объекту, нужно менять конфигурацию.

    Reply ↓
  8. kser87

    (4) Поручик, Насколько я знаю, это происходит в том случае, если у объекта в Конфигураторе указана таблица характеристик. Вкладка «данные»- кнопка «Характеристики». Иначе их приходится указывать на вкладке «характеристики» в конструкторе запроса СКД.

    Reply ↓
  9. chum

    Спасибо за работу! Давно искал.

    А как настроить отбор, чтобы туда не попали группы, а только входящие в их состав элементы?

    Reply ↓
  10. kser87

    (9) chum, поставить отбор по полю родитель. Или поставить отбор по полю «ссылка», вид сравнения = «В группе»

    Reply ↓
  11. chum

    (10) не получилось. В номенклатуре группы, подгруппы и т.п.

    «Или поставить отбор по полю «ссылка», вид сравнения = «В группе» «, так в отбор попадают не только элементы, но и группы в которые они входят.

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

    Reply ↓
  12. kser87

    (11) chum, тогда ставьте еще условие ЭтоГруппа = Ложь;

    Reply ↓
  13. chum

    (12) получилось.

    Большое человеческое спасибо!

    Мало того что сделал, так ещё и пользоваться научил…

    Reply ↓
  14. kser87

    (13) chum, Не за что, обращайтесь

    Reply ↓
  15. s_uu

    А существует ли групповая обработка регистров сведений??

    Reply ↓
  16. kser87

    (15) s_uu, для обычного приложения разработано много обработок.

    Reply ↓
  17. internetname

    Нужная вещь.

    Reply ↓
  18. DimanYa

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

    Подскажите какая обработка лучше ваша или Поручика? а то ограничен в средствах для скачивания.

    Reply ↓
  19. kser87

    (18) DimanYa, Если вы специалист по 1С, то качайте конечно у Поручика. Она сложнее для понимания, но функций у нее значительно больше.

    Reply ↓
  20. wunderland

    (2)такое простым пользователям вообще давать нельзя. мало того что «с шашкой на голо…» та к еще и шашка тротиловая 🙂

    Reply ↓
  21. kser87

    (20) wunderland, но для спеца вещь незаменимая

    Reply ↓
  22. Йожкин Кот

    Плюсую. Но не хватает в выборе типа объекта ПВХ, Планов видов расчета. Доделайте, если не трудно.

    PS. Да и Планы счетов, Бизнес-процессы и Задачи до кучи можно добавить.

    Reply ↓
  23. Re:аниматор

    Не хватает обработки табличных частей документа, а так все хорошо!

    Reply ↓
  24. kser87

    (22) Йожкин Кот, сейчас в отпуске) выйду, добавлю ПВХ и План видов расчета. Бизнес-процессы и задачи потом тоже можно сделать. На счет Плана Счетов: сомневаюсь в необходимости. Что вы хотите там менять групповой обработкой?

    Reply ↓
  25. kser87

    (24) Это уже реализовано

    Reply ↓
  26. s_uu

    Обработка помогла, спасибо!

    Reply ↓
  27. Йожкин Кот

    (24) я ж написал «до кучи» 🙂

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

    Reply ↓
  28. KliMich

    Спасибо! Пригодиться.

    Reply ↓
  29. Йожкин Кот

    спс за ПВХ и ПВР!

    Reply ↓
  30. kser87

    (29) Йожкин Кот, будьте аккуратнее с ними.

    Reply ↓
  31. Alex_E

    Вещь нужная! Добавьте птичку «Отключить контроль записи».

    Reply ↓
  32. kser87

    (31) Alex_E, Что вы имеете в виду?

    Reply ↓
  33. Alex_E

    (32) Иногда надо например сделать групповое изменения в договорах контрагентов (после переноса из 7.7 итп), но изменить их не дает контроль. Если установить при обработке ОбменДанными = Истина — то изменения пройдут, но лучше это сделать отключаемой опцией, потому и написал

    Добавьте птичку «Отключить контроль записи».

    .

    Reply ↓
  34. kser87

    (33) Alex_E, Сделаю, спасибо за совет. Сам бы никогда не додумался до этого.

    Reply ↓
  35. Shrek2015

    хорошая штука. спасибо автору!

    Reply ↓
  36. Samojlov_Denis

    в 11.1.2.10 не работает — что то там с правами доступа намудрили

    Reply ↓
  37. kser87

    (36) anado, расскажите подробнее: что такое «11.1.2.10». Если выдает ошибку, то копируйте текст ошибки.

    Reply ↓
  38. Samojlov_Denis

    (37) это конфигурация «Управление торговли» 11.1.2.10

    Платформа: 1С:Предприятие 8.2 (8.2.18.109)

    Конфигурация: Управление торговлей, редакция 11.1 (11.1.2.10) (http://v8.1c.ru/trade/)

    Copyright © ООО «1C», 2003-2013. Все права защищены

    (http://www.1c.ru)

    Режим: Файловый (без сжатия)

    Приложение: Тонкий клиент

    Локализация: Информационная база: русский (Россия), Сеанс: русский (Россия)

    Ошибки:

    ———————————————————————————

    08.08.2013 23:02:52

    {Форма.Форма.Форма(907)}: Ошибка при вызове метода контекста (ОтменитьТранзакцию)

    ОтменитьТранзакцию();

    по причине:

    Транзакция не активна

    Показать

    {Форма.Форма.Форма(901)}: Ошибка при вызове метода контекста (Записать): Нарушение прав доступа!
    Reply ↓
  39. kser87

    (38) anado, ошибка с неактивной транзакцией моя скорее всего, а

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

    {Форма.Форма.Форма(901)}: Ошибка при вызове метода контекста (Записать): Нарушение прав доступа!

    на всякий случай:

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

    Reply ↓
  40. Samojlov_Denis

    (39) неактивная транзакция это следствие, ошибки нарушения прав доступа — а эта ошибка присуще всем внешним обработкам, которые изменяют данные (не только вашей) в УТ 11.1.2.10 видимо что-то с правами намутили. Ни одна обработка, которая адекватно работала с документами в УТ 11.1.2.9, теперь не пашет.

    Reply ↓
  41. dyak84

    Автор а с табличними полями твоя обработка работает, по скриншотам не видно добав еще скринов.З труд спасибо так держать. Заслуженое 5+++++

    Reply ↓
  42. kser87

    (40) anado, объясняю ситуацию:

    1) Обработка должна изменить 10 объектов в единой транзакции.

    2) 7 успешно изменяются, а запись 8-го вызывает ошибку.

    3) При этом вызывается метод «ОтменитьТранзакцию()», транзакция становится неактивной.

    4) Но обработка продолжала пытаться изменить оставшиеся 2 объекта. Это и являлось ошибкой.

    5) Запись 9-го объекта вызвала ошибку. Снова вызывается метод «ОтменитьТранзакцию()», но транзакция уже была неактивна после п.3. именно это и вызвало ошибку:

    {Форма.Форма.Форма(907)}: Ошибка при вызове метода контекста (ОтменитьТранзакцию)

    ОтменитьТранзакцию();

    по причине:

    Транзакция не активна

    Я внес такую доработку: при выполнении обработки в единой транзакции, при появлении ошибки, обработка прерывается, а потом вызывается метод «ОтменитьТранзакцию()».

    P.S. К сожалению, про косяки с правами ничего сказать не могу, т.к. с УТ не работаю.

    Reply ↓
  43. kser87

    (41) dyak84, Спасибо! Учту ваше замечание

    Reply ↓
  44. skyp

    Спасибо за обработку! Как раз то, что нужно!

    Reply ↓
  45. Samojlov_Denis

    (42) потестил 1.5 в УТ 11.1.2.10 при добавлении обработки штатными способами — вываливаются тежи ошибки, но если запускать обработку Файлоткрыть… то всё работает — непонятно, глюк какой то.

    З.Ы. Да ещё нюанс при проведении документов надо включать сортировку по дате, по умолчанию стоит по виду документа. Я бы посоветовал исправить, что бы визуальная сортировка не влияла на последовательность проведения документов.

    Reply ↓
  46. kser87

    (45) anado, с первым попробую воспроизвести, может получиться разобраться.

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

    Reply ↓
  47. Samojlov_Denis

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

    Reply ↓
  48. kser87

    (47) anado, ну для перепроведения документов лучше воспользоваться обработкой «Проведение документов» с ИТС

    Reply ↓
  49. Samojlov_Denis

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

    Reply ↓
  50. JIexa_74

    Не открывается почему то: файл—открыть—-и тишинааа…

    1с 8.2 (8.2.18) УТ10.3 !

    В чем может быть проблема.

    В конфиге открывал там все норм….

    Reply ↓
  51. Поручик

    (50) Ржачно. УТ 10.3 работает в управляемом режиме? Ваша проблема в незнании матчасти. Пользуйтесь обычной обработкой из комплекта УТ 10.3

    Reply ↓
  52. clab

    Спасибо за обработку !!! очень нужная вещь,

    Пофиксили падение на реквизите с типом значения «ХранилищеЗначений» (Форма строки 760-766)

            Массив = Новый Массив;
    Массив.Добавить(Тип(«ХранилищеЗначения»));
    ОписаниеТиповХранилище = Новый ОписаниеТипов(Массив);
    Для Каждого ЭлементРеквизита Из ТаблицаКопия Цикл
    Если ЭлементРеквизита.ОписаниеТипов = ОписаниеТиповХранилище тогда
    Продолжить;
    КонецЕсли;

    (и 781-783)

                Если ЭлементРеквизита.ОписаниеТипов = ОписаниеТиповХранилище тогда
    Продолжить;
    КонецЕсли;
    Reply ↓
  53. serega3914

    Штука нужная в арсенале. +

    Reply ↓
  54. mixagor

    Спасибо, все работает. Вещь нужная!

    Reply ↓
  55. Поручик

    (0) Почему бы сразу не добавлять отбор и сортировку по всем полям объекта, только по умолчанию с отключенным использованием? Посмотри, как у меня по ссылке в первом посте сделано. Если лень скачивать, то я сделал заполнение отбора, сортировки при первом выборе объекта метаданных. Так удобнее.

    Reply ↓
  56. Aspirant

    хорошая штука, потестим!

    Reply ↓
  57. Logarifm_Andre11111111111111

    Замечательная обработка.

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

    Reply ↓
  58. SAS99

    Добавить бы еще возможность сохранения нескольких вариантов настроек.

    Reply ↓
  59. kit

    Работает, плюсанул.

    Reply ↓
  60. Поручик

    (0) Добавьте фикс из поста (52) . Иначе ошибка.

    Reply ↓
  61. kser87

    (60) Поручик, есть такой! поправлю в ближайшее время

    Reply ↓
  62. kser87

    (55) Поручик, Потому, что полей может быть очень много и искать нужный элемент будет неудобно.

    Reply ↓
  63. Alister

    Спасибо за обработку, очень помогла. Только не понравилось, что при снятии флажка у одного из видов документов полностью очистились элементы отбора, пришлось их заполнять заново, ИМХО это не очень удобно.

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

    Reply ↓
  64. kser87

    (63) Alister, действительно. Что-нибудь придумаю

    Reply ↓
  65. Alister

    Еще одни косяк: выбираю вид «Документы», выбираю кнопкой «все», галки проставляются у всех видов документов, но при отборе пишет сообщение, что надо выбрать хотя бы один объект метаданных, вручную снимаюставлю галку — начинает работать.

    Reply ↓
  66. kser87

    (65) Alister, поправлю

    Reply ↓
  67. kser87

    (65)(63) внес поправки в код обработки.

    По поводу отбора: сохраняются только доступные всем выбранным объектам поля отбора.

    Reply ↓
  68. Alister
    По поводу отбора: сохраняются только доступные всем выбранным объектам поля отбора.

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

    п.с. можно уже скачивать ?

    Reply ↓
  69. kser87

    (68) Alister, был ответ на сообщение(63). Можно качать

    Reply ↓
  70. Alister

    (69) спасибо — все получилось.

    Reply ↓
  71. mikeA

    Обработка объектов производится на клиенте или на сервере?

    Reply ↓
  72. kser87

    (72) mikeA, конечно на сервере.

    Reply ↓
  73. mikeA

    (73)

    ну да, понятно что на сервере, не так выразился )))

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

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

    Reply ↓
  74. kser87

    (74) mikeA, все сразу передается на сервер, индикатора нет. С точки зрения производительности передавать по одной вообще не имеет смысла

    Reply ↓
  75. mikeA

    (75) спасибо, тогда качаю. что-то подобное и искал.

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

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

    Reply ↓
  76. kser87

    (76) mikeA, попробую

    Reply ↓
  77. rokhin

    Спасибо за обработку. Добавлял возможность корректировки в режиме обмена.

    Не из-за увеличения скорости, а чтоб обойти запрет при проверке.

    Однако не сразу заметил «уход» на функционал типовой конфигурации, попотел ))))

    Reply ↓
  78. kser87

    (78) rokhin, честно говоря, не очень понял фразу. Вы сами добавляли возможность обработки в режиме «ОбменДанными.Загрузка = Истина»?

    Reply ↓
  79. rokhin

    да. Вы точно сформулировали.

    Reply ↓
  80. oleg212

    Спасибо за старую-добрую обработку теперь для управляемых форм.

    Reply ↓
  81. ejka

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

    Reply ↓
  82. kser87

    (82) ejka, пожалуйста! В типовой есть альтернатива: «Групповое изменение объектов». Она не слишком удачная)

    Reply ↓
  83. Поручик

    А в типовых на БСП хоть что-то удачное есть? Универсальный обмен XML и тот сделан фактически на отъеппитесь.

    Reply ↓
  84. kser87

    (84) Поручик, не будьте так жестоки. Есть и удачные вещи. Мне очень пригодилась подсистема «Варианты отчетов». «Дополнительные свойства» интересно сделаны.

    Reply ↓
  85. feel063

    Спасибо!Искал для управляемых форм

    Reply ↓
  86. Хегга

    Безумно нужная вещь, и сделана с тщанием. Один косяк — не работает.

    Точнее, работает, но в Бухгалтерия предприятия, редакция 3.0 (3.0.28.7) в поле «Тип объекта» пишет только Справочник, а переключателя типов — нет.

    Проверил на древней 3.0.23.9 — там все в порядке.

    Автор, поправь пожалуйста, а то страсть как Документы поправить хочется.

    Reply ↓
  87. Поручик

    Если речь идёт об 1С:Предприятии 8.3 (8.3.4.389), то работает.

    Reply ↓
  88. kser87

    (87) Хегга, если это в «Такси», то нужно просто кликнуть левой кнопкой мыши по полю с выбором типа. Тогда вывалится список

    Reply ↓
  89. kser87

    (87) Хегга, добавил в 8.3 привычную кнопку списка в поле выбора типа. Попробуйте

    Reply ↓
  90. Хегга

    Проверил. Версия 2.3 работает на «отлично». Большое спасибо за молниеносную оперативность.

    Reply ↓
  91. kser87

    (91) Хегга, не за что. Спасибо за активную пользовательскую позицию)

    Reply ↓
  92. vbuots

    В Вашей обработке явно!!! не хватает отбора и установки общих реквизитов.

    Reply ↓
  93. BodunOff

    А изменение реквизитов объектов в ней предусмотрено? Задача, все товары из выбранного документа «Установка Цен Номенклатуры» перекинуть в другую ценовую группу.

    Reply ↓
  94. kser87

    (93) vbuots, постараюсь сделать

    Reply ↓
  95. kser87

    (94) BodunOff, изменение реквизитов — это основное назначение обработки.

    Ценовая группа — это что? Реквизит товара?

    Reply ↓
  96. BodunOff

    (95) Да, это реквизит номенклатуры.

    Reply ↓
  97. kser87

    (97) BodunOff, понял, что вы хотите сделать. К сожалению, моя обработка вам не поможет. Если вы владеете встроенным языком 1С, то воспользуйтесь этим: (1)

    Reply ↓
  98. BodunOff

    (98) Смотрел её, к сожалению мозга недостаточно чтобы реализовать произвольный запрос. Стандартом там также до этого реквизита не добраться((( Спасибо, Ваша обработка всё равно легла в коллекцию «Must have»!

    Reply ↓
  99. Поручик

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

    Reply ↓

Leave a Comment

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