Будни автоматизации или "мне нужна программка для 3D упаковки"

31.07.14

Разработка - Математика и алгоритмы

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

Началось все с письма клиента, в котором говорилось что крупный сетевой ритейлер Х (все его знают) потребовал, чтобы отгрузки в его адрес осуществлялись не на паллетах, а в коробах заданного размера. Поэтому менеджеру, курирующему данного клиента, требуется "программка", которая по составу разноразмерных упаковок в заказе определит  необходимое количество коробов и распечатает упаковочные листы. Письмо сопровождалось просьбой не затягивать решение вопроса, поскольку момент перехода на новую систему отгрузок вот-вот наступит, а штрафные санкции могут стоить больше, чем новый автомобиль генерального. Стоимость автомобиля была известна, так как «Феррари» числилась в списке основных средств. Поэтому задача нехотя (всего одно рабочее место из почти пары сотен) была взята в работу и поставлена на контроль. Хотя более массовых задач в тот момент было море: только-только запущено свежеразработанное ПО для терминалов сбора данных на складе сырья, в режиме ошпаренной кошки велась разработка приложения для перевода торговых представителей с КПК на планшеты, отлаживалась система регистрации и контроля перемещений паллет с готовой продукцией и тому подобное.

Беглый анализ показал, что задача “container loading” является NP-полной. Объяснить это клиенту, который регулярно капризным голосом названивал с вопросом "когда же будет моя программка", мы не могли и не пытались. А Вы попробуйте сказать симпатичной девушке-менеджеру по работе с клиентами, что ее задача какая-то там полная. О чем она в первую очередь подумает? И какие у вас после этого шансы? В общем, наивная вера наших клиентов в безграничные возможности компьютеров и всемогущество программистов сыграла в тот раз с нами очередную шутку. Но нужно было выкручиваться и мы это сделали.

Чтобы объяснить приведенное далее решение требуется иметь в виду еще одно обстоятельство. Фреймворк, с которым мы работаем, основан на скриптовом языке. Хотя язык достаточно гибок и обвешен по принципу рождественской елки всякими хлопушками и погремушками, включая даже методы математической статистики, он не очень хорошо приспособлен для задач с объемными вычислениями. Обычный цикл у нас выполняется гораздо дольше, чем в компилируемом языке. Поэтому простые, но массовые вычисления бывает удобнее делать на стороне сервера непосредственно на уровне СУБД. Для работы с базой данных у нас используется язык, очень похожий на T-SQL. Поэтому не сомневаюсь, что приведенный далее код будет всем понятен.

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

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

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

Итак, сначала получаем таблицу чисел от 0 до 255 каскадным возведением в степень таблицы из 0 и 1.

SELECT 0 AS x
	INTO R1                                 
UNION
SELECT 1;

SELECT L.x + 2 * H.x AS x
	INTO R2
	FROM R1 AS L, R1 AS H;

SELECT L.x + 4 * H.x AS x
	INTO R4
	FROM R2 AS L, R2 AS H;

SELECT L.x + 16 * H.x AS x
	INTO R8
	FROM R4 AS L, R4 AS H;

Затем получаем таблицу всех возможных вращений упаковок. Кстати, интересная задача, чтобы проверить свое знание TSQL. Возможно, это новый паззл SQL для Joe Celko!

SELECT id, CASE x WHEN 0 THEN d0 WHEN 1 THEN d1 WHEN 2 THEN d2 END AS dx, x
	INTO Scan
	FROM Items, R2
	WHERE x < 3;
 
SELECT DISTINCT B0.id, B0.dx AS d0, B1.dx AS d1, B2.dx AS d2
	INTO Spin
	FROM Scan AS B0
		JOIN Scan AS B1 ON B0.id = B1.id
		JOIN Scan AS B2 ON B0.id = B2.id
	WHERE NOT(B0.x = B1.x OR B0.x = B2.x OR B1.x = B2.x);

Наконец, инициализируем таблицу решений, умножая координаты сетки на таблицу вращений.

SELECT FromLeft.x AS d0l, FromBack.x AS d1l, FromLeft.x + d0 AS d0h, FromBack.x + d1 AS d1h, 0 AS d2l, d2 AS d2h, 0 AS v, d0 * d1 AS s, id
	INTO Vista
	FROM R8 AS FromLeft, R8 AS FromBack, Spin
	WHERE FromLeft.x + d0 < = &Width AND FromBack.x + d1 < = &Depth AND d2 < = &Height;

 

Теперь выполняем цикл:

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

SELECT TOP 1 id, d0l, d1l, d2l, d0h, d1h, d2 
	FROM Vista 
	WHERE d2l + d2 < = &Height 
	ORDER BY s * d2l - v, s * d2 DESC, d2l + d2, d0l, d1l, d0h;

 

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

Изменение таблицы решений с учетом того, что некоторое место в коробе становится занятым, делается так:

SELECT Vi.d0l, Vi.d1l
, ISNULL(CASE WHEN It.d2l + It.d2 > Vi.d2l THEN It.d2l + It.d2 END, Vi.d2l) AS d2l
, Vi.d0h, Vi.d1h, Vi.d2
, Vi.v + ISNULL((CASE WHEN It.d1l < Vi.d1l THEN It.d1l ELSE Vi.d1l END - CASE	WHEN It.d0l > Vi.d0l THEN It.d0l ELSE Vi.d0l END) 
* (CASE	WHEN It.d1h < Vi.d1h THEN It.d1h ELSE Vi.d1h END - CASE	WHEN It.d1l > Vi.d1l THEN It.d1l ELSE Vi.d1l END) * It.d2, 0) AS v
, Vi.s,	Vi.id
	FROM Vista AS Vi
		LEFT JOIN Items AS It
		ON (Vi.d1l < = It.d1l AND It.d1l < Vi.d1h OR It.d1l < = Vi.d1l AND Vi.d1l < It.d1h)
			AND (Vi.d0l < = It.d0l AND It.d0l < Vi.d0h OR It.d0l < = Vi.d0l AND Vi.d0l < It.d0h)
	WHERE Vi.id <> &id AND It.id = &id;

 

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

Вот,  в общем-то, и все.

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

Ниже приведен скриншот упаковочного листа, использованного при отладке.

Скриншот упаковочного листа

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

В общем, клиент в лице девушки-менеджера остался доволен. Правда, не так, чтобы очень. А вот почему? Вряд ли ее могла расстроить инструкция к программке, в которой говорилось, что она работает только с толстым клиентом в обычных формах (это была десятая редакция). Мы ведь все знаем, что большинство наших клиентов никогда не открывают инструкций. В общем, разгадка мыслей отдельных пользователей это вам не «container loading», а действительно неразрешимая проблема.

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

P.S.: Здесь все правда и ничего не выдумано - коллеги не дадут соврать. Причем наиболее глубокое впечатление почему-то осталось у тех, кого я подвозил тогда на своей синей импрезе. Все запомнили число 200, но это были отнюдь не достигнутые проценты утилизации объема короба. - Вот такой парадокс психологии!

container loading упаковка

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1757    stopa85    12    

33

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4432    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7473    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7859    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4451    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8849    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

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

31.08.2021    7814    dusha0020    8    

70
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
94. ildarovich 7850 03.10.14 14:07 Сейчас в теме
(93) Я уже переписал и исправил обработку, составленную без особенного понимания исключительно из моих ответов, был готов ее отправить. В личной переписке корреспондент был предупрежден, что одним из условий было ее использование для апробации, для одного конкретного клиента и нераспространение. Она лежала в папке "Исходящие".
Но тут мне прислали интересную ссылку ....
Оказалось, что еще не работающая обработка, построенная из моих запросов и бесплатных советов с 1-го октября уже продается на сайте ... под авторством Салавата за целых 15 000 рублей!. (сейчас он уже обещал ее убрать)

-Так что держите ухо востро!
Прикрепленные файлы:
Kolunya; CyberCerber; headMade; +3 Ответить
95. headMade 144 03.10.14 15:01 Сейчас в теме
(94)
хуже умных врагов - только хитрожопые друзья )))
96. Salavat 13 03.10.14 15:40 Сейчас в теме
(94) сразу обозначу свою т.з. - еслиб меня не заинтересовала тема, я бы не задавал столько вопросов.

по ответу - автор похоже с головой своей не совсем дружит. по-крайней мере - в этот момент.
1. Любой человек, видя объём вопросов (непустых и от одного человека) прекрасно поймёт, что тема заинтересовала. И не по тому, что запор долгий в туалете.
2.
...личной переписке корреспондент был предупрежден, что одним из условий было ее использование для апробации, для одного конкретного клиента и нераспространение
- гляньте в переписку, освежите память свою сначала. Более того - в той же переписке предлагалась цена (да, не золотые горы и он вроде обещал подумать/торговаться, но ... видя его обещания здешние, с апреля - я засомневался уже).

И последнее (надеюсь) - Вы хоть ради общего обзора - гляньте ст. 138, 137,..(остальное, из той же главы - тоже не помешает) УК РФ. Конкретно - я про переписку имею ввиду.
и - не говорите, что я вдруг угрожаю (малоли...). Я опять же - прошу только.
Надеюсь хотя бы про последнее (малоли...) не скажете, что я снова присваиваю чужое авторство.
97. ildarovich 7850 03.10.14 16:38 Сейчас в теме
(96) Salavat, а не Вы ли пытались продать мою обработку за 15 000 рублей под видом своей на сайте ...? А не Вас ли поймали за руку на конкретном плагиате "на горячем"? А не лучше ли сейчас покраснеть и публично извиниться?
Burgunchic; d4rkmesa; CyberCerber; +3 Ответить
98. Salavat 13 03.10.14 16:56 Сейчас в теме
(97)
1. я нашёл тему.
2. задавал вопросы автору и предлагал ему оплату.
3. сделал (как думал - правильно) разместил.
4. я ни где не писал про своё авторство, продавать и говорить об авторстве - это разные вещи, если Вы не в курсе.
и - я тоже могу Вас обвинить в плагиате - немоего, разумеется, но пардон - в теме также не вижу упоминаний про то, откуда/какие/методы взяты. Былиб я б элементарно прошёлся по ним сначала, т.к. здесь - не всё есть.

где я не прав/вру/... - за что я должен извиниться?

я могу также сказать - что это Вы мою обработку себе приписываете? (см. 4...)

может хватит бахвальства излишнего? я почемуто подумал, что по т/ф мы договорились уже.
101. ildarovich 7850 03.10.14 18:24 Сейчас в теме
(98) Salavat,
1. я нашёл тему.
- на первой странице Инфостарт
2. задавал вопросы автору и предлагал ему оплату.
Очень-очень-очень много вопросов, предложив для начала за готовую обработку(а мне и не нужно) 1,5(!!!) тысячи российских рублей
3. сделал (как думал - правильно) разместил.
- сложил вместе все присланные ФУНКЦИИ, даже не запросы - я замучился объяснять куда их вставлять и прислал все ключевые функции, а рисование еще раньше в одном из комментариев показал. То есть где это сделанное? В той выложенной (Вашей ее назвать нельзя) обработке практически нет никакого, кроме моего, кода, да еще В МОДУЛЕ ФОРМЫ, а не там, где полагается.
4. продавать и говорить об авторстве - это разные вещи
то есть можно продавать чужое, не уведомляя автора и не спрашивая его разрешения? - И много такого Вы уже напродавали? - Может быть, всем теперь нужно свои карманы проверить? По поводу того, что этот метод мной у кого-то заимствован - бред сивой кобылы - метод я придумал с "0", прочитав несколько статей на английском языке в зарубежных журналах (список первоисточников я приводил в одном из комментариев). Впрочем, проводить себе во вред тут ликбез по авторскому праву я не буду.
DJ_Codebase; CyberCerber; +2 Ответить
99. Salavat 13 03.10.14 17:13 Сейчас в теме
(97) чувствую Вы снова разницу не знаете, разъясняю:
"моё" - это можно сказать когда Вы мне дали (я украл - б.р.) и я её (1к1 ну или минимум изменений) продаю.
я (не отрицал этого никогда, но меня об этом и не спрашивал никто, спросили/попросилиб я бы сказал/написал) - получил от Вас тексты, пытался их собрать безуспешно (ну да - с помощью Вашей всё же получилось, почти).
но пардон - я тоже руку приложил к этому, немалую.

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

Вы уж разберитесь с собой - кто не прав.
я предложил ведь - чаю попить, успокоиться сначала.
102. ildarovich 7850 03.10.14 18:33 Сейчас в теме
(99) Salavat,
я тоже руку приложил к этому, немалую
- в чем это можно заметить?

Успокаиваться мне не нужно, так как я и так совершенно прав и оттого абсолютно спокоен. Просто некорректно и агрессивно себя ведете и мне нужно бы поставить Вас на место.
100. Salavat 13 03.10.14 17:23 Сейчас в теме
(97) и - я пишу "я прошу (меня просить)" (в этой теме), имею ввиду буквально - просьба и мой ответ. возможный,
про деньги здесь - я даже не заикался. если у Вас это также возмущение вызывает.
107. Salavat 13 03.10.14 19:15 Сейчас в теме
(97) и ещё - я сам решаю, что мне лучше/хуже.
Единственное, что безоговорочно из этой темы для себя извлёк - это то, что я ошибся изначально. Причём - во многих местах и заметно.

Можете продолжать свои попытки поставить меня в угол (но, сдаётся мне это место - по Вам скучает) - я постараюсь молчать.
103. Salavat 13 03.10.14 18:57 Сейчас в теме
на первой странице Инфостарт
- допустим - это как влияет?

Очень-очень-очень много вопросов, предложив для начала за готовую обработку(а мне и не нужно) 1,5(!!!) тысячи российских рублей
выше в теме я уже сказал много раз - почему и также сказал про цену. могу повторить ещё раз.

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

обработке практически нет никакого, кроме моего, кода, да еще В МОДУЛЕ ФОРМЫ, а не там, где полагается.
в своём глазу бревно не вижу - напоминать надеюсь ненужно. где располагать - я сам решил, т.к. - получил от Вас тексты голые.

то есть можно продавать чужое, не уведомляя автора и не спрашивая его разрешения? - И много такого Вы уже напродавали? - Может быть, всем теперь нужно свои карманы проверить? По поводу того, что этот метод мной у кого-то заимствован - бред сивой кобылы - метод я придумал с "0", прочитав несколько статей на английском языке в зарубежных журналах (список первоисточников я приводил в одном из комментариев). Впрочем, проводить себе во вред тут ликбез по авторскому праву я не буду.
я уже ответил про разницу чужого и нечужого и применении к вашему коду тогоже. повторить? я не говорил, что Ваш метод/код заимствован у когото. я сказал - нет упоминания про статьи.

- в чем это можно заметить?
хотябы в рисовании - его пришлось по-другому делать (мне).

Успокаиваться мне не нужно, так как я и так совершенно прав и оттого абсолютно спокоен. Просто некорректно и агрессивно себя ведете и мне нужно бы поставить Вас на место.
Повторять не буду уж, ок.
В каком месте я вёл/веду некорректно и/или агрессивно? Я грубил/хамил/ругался/...? Да я ведь (по т/ф) даже рот раскрыть боялся (сначала) - ведь мне с трудом удавалось, чтото попытаться сказать.

И т/ф я дал рассчитывая на нормальный человеческий разговор, а не на это. Ведь 20 минут я выслушивал про то, что я какойто гнида/козёл/...... (! это не было впрямую сказано - также как и здесь сейчас, но - попыток было достаточно заметно).

О чём мы договорились - я исполнил? Так чтож Вы всё не отстанете наконец?

Повторю - я не считаю себя в чём-либо виноватым перед Вами.
Добавлю - если посчитаю себя виноватым (перед Вами) - здесь же публично принесу извинения. Я в этом - проблем не испытываю.
106. CheBurator 3119 03.10.14 19:11 Сейчас в теме
Салават - бяка.
abrafaks; CyberCerber; SvoyakMartin; 13KrAs; cleaner_it; +5 Ответить
108. Salavat 13 03.10.14 19:16 Сейчас в теме
109. CheBurator 3119 03.10.14 19:28 Сейчас в теме
с учетом осмотров профилей салавата и ильдаровича, однозначно салават - бяка. ибо потреблятель. вклада в сообщество нет. быкабябкабяка.
ильдарович - кузяво!
110. Salavat 13 03.10.14 19:36 Сейчас в теме
(109) CheBurator, в текущей ситуации - расцениваю только как подхалимство. намереннное или нет - не интересно даже.
111. CheBurator 3119 03.10.14 19:49 Сейчас в теме
(110) да пофиг. у ильдаровича есть что посчитать и почерпнуть, за что ему спасибо.
а про остальное - умолчу.
112. Salavat 13 03.10.14 19:57 Сейчас в теме
(111) CheBurator, если почитать, то - да. но я рассчитывал на именно - подчерпнуть.
в этом - я ошибся.
113. ildarovich 7850 10.10.14 09:00 Сейчас в теме
(112) Salavat, вам нужно выполнить свое обещание и убрать обработку, построенную на основе моего кода, с того сайта. Иначе будут неприятности.
114. bystrov-e 122 14.06.15 15:08 Сейчас в теме
115. CheBurator 3119 15.06.15 00:40 Сейчас в теме
116. os01 15.08.16 17:47 Сейчас в теме
Замечательны и красивы как сам практический поход с решением, так и изложение.
Самообладание и выдержка автора по ходу переписки заслуживает отдельных похвал и уважения!
WarAn; Yakud3a; +2 Ответить
117. WarAn 18.07.17 23:24 Сейчас в теме
Автор, спасибо! Твое решение достойно любой книги знаний. А салават, конечно, конченый му#ак! Жаль, что его город аж в 1800 км от меня, а то надо было бы поговорить с такой тварью.
118. Ibrogim 1311 20.02.18 08:34 Сейчас в теме
Если автор ildarovich то знаю, что будет круто. правда приходится искать и включать мозг. Жаль, что нет обработки, чтобы посмотреть на эту красоту вживую .
119. пользователь 06.05.20 14:17
Сообщение было скрыто модератором.
...
120. пользователь 06.05.20 15:35
Сообщение было скрыто модератором.
...
121. пользователь 10.12.20 12:49
Сообщение было скрыто модератором.
...
122. пользователь 10.12.20 13:03
Сообщение было скрыто модератором.
...
127. user634051_alex_st1988 30.12.21 18:49 Сейчас в теме
Добрый день. Продаётся ли механизм (обработка)? Спасибо.
128. ildarovich 7850 01.01.22 23:18 Сейчас в теме
(127) Да, но пока не через ИС, это скорее проекты, так как сначала требуется проверка и подстройка алгоритма под конкретные данные.
129. dgonson 177 29.07.22 17:32 Сейчас в теме
Добрый день. Какова стоимость обработки и можно ли ее приобрести?
130. ildarovich 7850 08.08.22 13:22 Сейчас в теме
(129) Обработка давнишняя, создавалась под конкретного клиента и особенности его товаров, продавать ее я не предполагал.
Могу создать новую на основе тех и более новых наработок специально для вас...
131. Trendsetter 26.02.24 12:50 Сейчас в теме
(130) Добрый день. А порядок цифр уточнить можно для УПП? Или, быть может, предложение по созданию новой обработки уже не актуально? 2 года прошло как никак)
132. ildarovich 7850 27.02.24 14:36 Сейчас в теме
(131) Эти вопросы лучше в переписке обсудить. Все актуально.
Оставьте свое сообщение