|
Автотесты для 1С: xUnitFor1C | ☑ | ||
---|---|---|---|---|
0
romix
12.02.16
✎
20:59
|
Используете ли вы эту систему в своей разработке?
https://github.com/xDrivenDevelopment/xUnitFor1C/wiki Система выглядит в целом приятно, я написал несколько простых тестов. Но все время натыкаюсь на сложности. Например не оч. понятно как выгружать тестовые данные (у меня на простом документе всё зависло) и как им удается избегать точки останова в отладчике. :-) |
|||
1
Злопчинский
12.02.16
✎
21:03
|
Не использую
Ибо Длинных разработок с нуля нет Адля мелких допилов типовых конф нафиг не нужна |
|||
2
romix
12.02.16
✎
22:25
|
(1) У нас длинная разработка с нуля. Поступило требование от руководства - тестировать. ? Думаю, что со временем такие требования станут общими, и даже 1С к ним подтянется. ?
|
|||
3
romix
12.02.16
✎
22:27
|
Смайлы пропечатались как знак ?
|
|||
4
romix
12.02.16
✎
22:34
|
Думаю что проще всего запустить тесты для процедур перед записью (проверки и заполнения), процедур проведения. Причем, только позитивные тесты (что документ в этих ситуациях не выдает исключений). Печать еще можно туда же подтянуть. Это минимум, который можно сделать не думая - получится проверка на соответствие реквизитов коду и на работоспособность запросов.
|
|||
5
Asmody
12.02.16
✎
23:04
|
||||
6
romix
14.02.16
✎
12:32
|
Сделал (для какой-то другой цели) разбор кода 1С (выделение строковых литералов и комментариев) через тестирование.
http://wiki.mista.ru/doku.php?id=1c:v8:razbor_koda_1s Тест выполнен не через xUnitFor1C, но смысл - примерно тот же (?). Оказалось, что всякий разбор чего-либо через тестирование кодить гораздо приятнее. |
|||
7
Aleksey
14.02.16
✎
12:37
|
Кому то захотелось продолжение банкета?
А ты правильно разрабатываешь на 1С? TDD (Разработка через тестирование) Нужели еще не все не наговорились на эту тему? |
|||
8
romix
14.02.16
✎
12:41
|
(7) Ага поставил теги, чтобы ветки не потерялись. ИМХО пора уже секцию заводить. :-)
|
|||
9
romix
14.02.16
✎
12:59
|
(7) Решили копать именно в направлении xUnitFor1C.
Но там повсюду какие-то сложности (возможно, они все вызваны временным несовершенством движка 1С, а когда за тестирование возьмется (?) сама 1С, все они будут так или иначе решены). Например, получение списка функций и их исполнение так, чтобы оставался работоспособным отладчик 1С. Выгрузку и загрузку тестового набора я задумываюсь сделать не через Моксели, а своей разработкой, чтобы закачивало пошагово рекурсивно через веб или файлы+LCK. |
|||
10
Aleksey
14.02.16
✎
13:05
|
||||
11
romix
14.02.16
✎
13:22
|
(10) Ага, добавил тегов.
|
|||
12
Asmody
14.02.16
✎
13:39
|
(6) Ничего странного в своей статье не находишь?
|
|||
13
romix
14.02.16
✎
13:57
|
(12) Просто небольшой пример, чтобы не потерялось.
Зачем это нужно - на диске ИТС есть штатный тест кода на соответствие стандартам. Хочу под него кое-что у себя в 1С позатачивать, вдруг получится. Но он не выявляет даже ошибочных запросов (например, когда я преднамеренно вношу в код запроса ошибки). Так что для таких тестов понадобится что-то вроде xUnitFor1C. |
|||
14
romix
14.02.16
✎
14:14
|
Читаю старую ветку
Разработка через тестирование - мракобесие и профанация...? https://ru.wikipedia.org/wiki/Smoke_test на запись документов по списку (ПередЗаписью, ОбработкаПроведения) - это, скорее всего, будет то, с чего окажется проще всего начать покрытие тестами (для начала - простыми позитивными) уже существующей написанной конфигурации. Записывается и проводится документ - хорошо, выдает исключение или не проводится - плохо. |
|||
15
romix
14.02.16
✎
14:28
|
Согласен с artbear вот здесь: "(300) Тесты ГУИ писать лучше пореже, слишком это неблагодарное и сложное дело.
Лучше всю бизнес-логику выносить из ГУИ, чтобы слой бизнес-логики был изолирован от формы". Разработка через тестирование - мракобесие и профанация...? Я у себя с формы документа массивные проверки ПередЗаписью поубирал в модуль менеджера. А там уже на форму можно не лезть, а просто тестировать на примерах документов. |
|||
16
romix
14.02.16
✎
14:40
|
Там же 318 - да, когда пишешь падающий тест сначала - это удобно. По крайней мере, для функций, которые должны что-то строковое кропотливо разбирать или парсить. Для типичных примеров разработки в 1С (таких как экзаменационные задачи) будет ли быстрее сначала создать тест? И как его создать: руками, что ли, вносить. И куда. Вот этот вопрос я пока не могу понять в xUnitFor1C, там есть какие-то таблицы, но с какой стороны к ним подойти - сходу непонятно.
|
|||
17
Злопчинский
14.02.16
✎
14:56
|
(6) чтото я в тестах не увидел теста на обработку
Стр = "//"; Почему? |
|||
18
romix
14.02.16
✎
15:35
|
||||
19
Злопчинский
14.02.16
✎
15:54
|
(18) добавить - не вопрос!
Вопрос - почему его не было? И мне кстати интересно Пройдет ли тест Стр = "|" ??? |
|||
20
romix
14.02.16
✎
17:15
|
(19) Наверняка можно еще придумать несколько тестов - будет движение к совершенству. :-)
|
|||
21
Злопчинский
14.02.16
✎
17:23
|
(20) вопрос в том, что и предыдущиая моя строка и эта - это явные граничные условмя, проверять их надо однознвчно, странно что этого нет в тестах
|
|||
22
romix
14.02.16
✎
19:23
|
(21) Тест 2. Комментарий там в любом случае не пустой, возвращает минимум // если он есть. Поэтому это не граничное условие. Но почему бы его не ввести - я только за. Лучше перебдеть, чем недобдеть.
|
|||
23
Злопчинский
14.02.16
✎
19:38
|
(22) "возвращает минимум // если он есть" - это ваше мнение, не подкрепленное тестом.
Чистый комментарий "//" - именно без текстовки - как раз вполне граничное условие, ибо неоднократно в тексте встречается обработки. я бы включил в тесты проверку обработки как минимум следующих строк Стр="//"; Стр="///"; Стр="////"; Стр="/////"; Стр="|"; Стр=""""; Стр=""""""; Стр="""|"""; - это навскидку, не думая |
|||
24
Asmody
14.02.16
✎
20:02
|
(13) Не в этом был вопрос. Посчитай количество строк кода, непосредственно решающих задачу, и количество строк в тестах.
Заметь, что тесты не покрыли и половины случаев. |
|||
25
romix
14.02.16
✎
22:15
|
(23) Все случаи имхо отработаны. Там можно и ( | ) разными способами нарисовать - кому как больше нравится. Кстати, это вики - желающие, если пример заинтересовал, могут вносить улучшения. Там же, как говорят, рулит парное программирование, просмотр чужого кода, и все такие дела. :-) Ответственных или вертикали тут нет - интернет - это одна сплошная безответственность. :-)
(24) Тесты не гарантируют отсутствия ошибок, а только уменьшают их вероятность (по кр. мере об этом, емнип, неоднократно пейсали artbear сотоварищи). Так или иначе - правьте смело. |
|||
26
Ник080808
14.02.16
✎
22:38
|
(5) а можно pumbaEO разбанить в 1с и забанить в лайф?
|
|||
27
Asmody
14.02.16
✎
22:40
|
(26) А он еще сидит на 1С? А как же принципы?
|
|||
28
Злопчинский
14.02.16
✎
23:07
|
(25) имхо - нет..
тестировать прохождение //ааа и // и //// - весьма разные вещи, имхо |
|||
29
Злопчинский
14.02.16
✎
23:14
|
и ваще непонятно.
нахрена эта тдд? если мне для верификации, нужно прогнать тест и сравнить это с эталонным результатом - который я откуда возьму? из головы? если у меня есть эталонный результат в голове - нафига мне строить тесты. которые будут мой эталонный результат из башки переносить в код. я это ВООБЩЕМ могу и без тестов сделать. не совсем тупой еще. для чего это тдд тогда? - просто некая методика, облегчающая воспроизведение моего представленяи результата в голове и его преобразования в код? тогджа такая методика д.б. достаточно формальной, чтобы ей можно было следовать "промышленным" способом. а по факту - мы имеем придумывание кода (нетривиальная операция) и придумывание тестов (та же самая нетривиальная операция) - где здесь формальность? я вон с ромиксом не могу согласиться насчет набора тестов даже в той задаче которую он нарисовал. Он считает - что тех тестов которые есть - достаточно, я - недостаточно. Вопрос: кто прав? где ИНСТРУМЕНТ? если один считает, что молотком 100 граммов забили легко гвоздик семерочку, и гвоздик десяточку - следует ли из этого что молотком 100 граммов будет также легко забить гвоздь двухсотку - кованный, четырехуголный..? |
|||
30
Хранимая Процедура
14.02.16
✎
23:16
|
(14) - а ну поподробнее прод дымовое тестирование. Это ТОЛЬКО проверка, запислася ли документ?
|
|||
31
Злопчинский
14.02.16
✎
23:17
|
что такое тдд? - дисциплина программирования?
если человек пишет изначально такой код, что я на него смотрю и мне то ли плакать, то ли смеяться хочется (мой код тогда ваще=принцесса) - с тдд он будет писать красивый код? очень сомневаюсь. будет все также криво, если даже не хуже... |
|||
32
Хранимая Процедура
14.02.16
✎
23:20
|
(29) - подброшу на вентилятор:
это для прогеров, которые страдают ретроградной амнезией, постоянно отвлекаются на мисту и прносайты, а также не могут сконцентрироваться. Им, согласно мантре Fail First нужно сначала написать, что я хочу накодить, а потом тебе continous тест раннер скажет куда в коде нужно что-то вставлять. |
|||
33
Хранимая Процедура
14.02.16
✎
23:23
|
И еще ТДД применяют для неуверенных в себе задроты.
Настоящие Чаки Норрисы уверены, что только что внесенное изменение не повлияло на другие части кода. И комитят все в продакшн. |
|||
34
Aleksey
14.02.16
✎
23:25
|
(33) А причем тут внесения изменения и разработка программы?
|
|||
35
Aleksey
14.02.16
✎
23:25
|
у нас еще нет ничего, чистый лист, о каких изменениях написанных другим программистом идёт речь?
|
|||
36
Хранимая Процедура
14.02.16
✎
23:28
|
||||
37
Хранимая Процедура
14.02.16
✎
23:31
|
(34) - когда ты разрабатываешь программу, ты вносишь последовательные изменения.
С тестами у тебя будет увереноость, что вносимые изменания не поломают уже написанный функционал. |
|||
38
Asmody
14.02.16
✎
23:36
|
(33) Чаки Норрисы никуда не коммитят, а правят прямо на продакшене.
|
|||
39
Asmody
14.02.16
✎
23:37
|
(37) Да не будет нихера такой уверенности. Точнее, эта уверенность ложная. То, что CI собрал твой код и прогнал тесты не говорит о том, что он не содержит ошибок.
|
|||
40
Хранимая Процедура
14.02.16
✎
23:43
|
(38) - ога. На площадке клиента. И клиент за это платит.
Концепт: "клиент платит за ошибки программиста" (39) - это я уже где-то слышал. Я не знаю, как там с 1С, но в JS тесты очень сильно все упрощают, особенно, если оно так делается: http://www.youtube.com/watch?v=xng_ymsnJks |
|||
41
Asmody
14.02.16
✎
23:53
|
(40) Клиент платит за результат.
А вот адептам xDD, похоже, платят за количество строк. |
|||
42
Злопчинский
15.02.16
✎
00:47
|
(41) не, с нуля писать - может и полезно будет. но писать, не зная что писать... пока я упорно всю эту разработку через тдд свожу к разработке сверху вниз.
|
|||
43
Хранимая Процедура
15.02.16
✎
01:12
|
(41) -
>А вот адептам xDD, похоже, платят за количество строк. ты так говоришь, как будто это плохо |
|||
44
Хранимая Процедура
15.02.16
✎
01:15
|
вообще TDD - это часть номрального СКРАМа
в СКРАМе нет четких требований |
|||
45
Хранимая Процедура
15.02.16
✎
01:18
|
еще ТДД очень сильно упрощает коммуникацию среди программистов.
Особенно в интернациональных тимах. |
|||
46
Ник080808
15.02.16
✎
01:28
|
(41) кстати хорошая система оплаты. Только за уменьшение количества строк
|
|||
47
Злопчинский
15.02.16
✎
02:37
|
(44)
- а почему оплата какаято не такая как договаривались? - ну потому что написали вы не то что нам хотелось... |
|||
48
Злопчинский
15.02.16
✎
02:38
|
Долой оплату за процес!
Даешь оплату за результат! |
|||
49
los_hooliganos
15.02.16
✎
05:07
|
1С как скриптовый язык не требует тестирования кода. Важнее тестировать сам бизнес-процесс.
|
|||
50
mikeA
15.02.16
✎
08:04
|
(41) бывает что по xDD РЕЗУЛЬТАТ получается быстрее, качественне и дешевле
так что it depends |
|||
51
Asmody
15.02.16
✎
08:31
|
(43) Сделай себе татуировку на лбу: "Никому не нужны программы, всем нужны результаты их работы."
|
|||
52
Хранимая Процедура
15.02.16
✎
10:06
|
(48) - программистам платят за процесс, а не за результат
|
|||
53
Mr_Rm
15.02.16
✎
10:33
|
(40) Прекрасный пример на видео с JS.
См. с 0:50 по 1:02, когда в тесте пишется сначала: expect(calculator.multiply(3,4)).toBe(13); И всё - правильный (простейший!) код тест уже не пройдёт. |
|||
54
Asmody
15.02.16
✎
10:36
|
(52) За процесс платят проституткам. Ну, может еще актёрам и певцам.
|
|||
55
Хранимая Процедура
15.02.16
✎
10:43
|
(54) - программист никогда не может отвечать за результат. По определению.
|
|||
56
Garykom
гуру
15.02.16
✎
10:48
|
(55) программист может отвечать за то что при правильных данных программа работает верно
или это будет оперативно исправлено программистом, с нахождением ошибок в исходных данных (пользователи накосячили) отвечает понятно дело руководитель и пользователь |
|||
57
vicof
15.02.16
✎
10:48
|
(55) За результат своей работы должен отвечать - или это херовый программист.
|
|||
58
Карупян
15.02.16
✎
10:53
|
Если есть бюджет на написание тестов - нужно писать.
А на нет и суда нет |
|||
59
Хранимая Процедура
15.02.16
✎
10:58
|
(57) - эх.. ты не работал программистом.
|
|||
60
artbear
15.02.16
✎
11:01
|
(0) >не оч. понятно как выгружать тестовые данные (у меня на простом документе всё зависло) и как им удается избегать точки останова в отладчике. :-)
Расшифруй оба пункта. что делаешь, что хочешь, что не так? Приглашаю в чат xUnitFor1C для более оперативных ответов от меня и других контрибьюторов https://gitter.im/xDrivenDevelopment/xUnitFor1C?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge |
|||
61
artbear
15.02.16
✎
11:06
|
(30) По дымовым тестам - в xUnitFor1C есть несколько примеров дымовых тестов.
Например, я в свое время реализовал дымовой тест открытия всех форм (формы списков и элементов, справочники, документы, отчеты, обработки). Также делаются попытки перезаписи справочника и документа, создать новый элемент/документ Тест очень полезен при обновлении конфигурации. Также есть примеры запуска разных тестов под разными пользователям. удобно для проверки работы системы для разных ролей. и т.п. и т.д |
|||
62
romix
15.02.16
✎
17:01
|
(60)(61) Ага спасибо. Рабочая база слишком велика для тестирования, хочется закачивать отдельные документы между одинаковыми конфигурациями как раз для целей тестирования.
Я полез в приложенную обработку xddDataFixtureGen, Предположим мне удалось выгрузить Моксель, а дальше с ним что делать - руками парсить? Обратной обработки для загрузки я не нашел. Может там планируется закачиватель данных - или все на практике используют что-то готовое с ИТС/Инфостарта? |
|||
63
Карупян
15.02.16
✎
17:04
|
Эх, вот если бы кто замутил проект по написанию автотестов для типовых конфиг ....
|
|||
64
Карупян
15.02.16
✎
17:05
|
(62) есть процедура по созданию из мокселя
|
|||
65
artbear
15.02.16
✎
17:33
|
(62) А доку хоть немного почитать? :)
Смотрим вводную страницу Вики проекта https://github.com/xDrivenDevelopment/xUnitFor1C/wiki Там написано: Возможно очень простое создание тестовых данных на основании табличных макетов. Эти макеты можно генерировать из реальных боевых данных. Полученные данные в тестах загружаются одной строкой кода. Посмотрите Генерация данных. Открываем Генерация данных https://github.com/xDrivenDevelopment/xUnitFor1C/wiki/Генерация-данных Читаем и вставляем в свой код |
|||
66
artbear
15.02.16
✎
17:34
|
Там же есть доп.ссылка на https://github.com/xDrivenDevelopment/xUnitFor1C/wiki/Генерация-макета-на-базе-реальных-данных
|
|||
67
artbear
15.02.16
✎
17:37
|
Пример кода для v4
Процедура ТестДолжен_СоздатьПростойСправочник() Экспорт
Пример кода для v3 Процедура Тест_ДолженСоздатьПростойСправочник() Экспорт
|
|||
68
Хранимая Процедура
16.02.16
✎
14:57
|
[ковыряя MonoDevelop] Доктор, скажите, вот в MonoDevelop есть проблемы с отладчиком - там брейкпойнты не работают.
И отладочная печать в консоль не выводится. Остается только выводить MessageBox-ом. Так вот, каковы преимущества MessageBox-Driven-Development по сравнению с Test-Driven-Development? Нужно ли мне статические блобы рефакторить в IoC и потом писать юнит тесты? Спасибо за внимание, доктор. |
|||
69
romix
17.02.16
✎
12:26
|
(65) А, спасибо. Всё еще хочу приделать закачиватель через Web-интерфейс, но попробую и так.
Насчет работы отладчика - я кажется придумал как ее реализовать, даже не теряя совместимости. Дело в том, что если мы запускаем несколько десятков функций, которые что-то тестируют, при ошибке хочется видеть точное место ошибки и дерево вызовов, если ошибка произошла где-то внутри - то есть, именно то, что мы видим при обычном тестировании и отладке руками. В тестовой обработке нужно заготовить экспортируемые функции Тест_001, Тест_002, ... Тест_100 (наверное, 100 будет достаточно). Думаю, что это также уменьшит клавиатурный процесс и объем копи-паста при создании большого числа тестовых функций. Также экспортировать функцию с максимальным номером, например ЧислоПронумерованныхТестов() - возвращает 45, если было задействовано 45 пронумерованных функций-тестов. Или выяснять максимальное число задействованных функций вызовом их с конца от 100 - первая, которая возвращает не Неопределенно - есть искомая. Можно сделать и так, и так, если сама функция ЧислоПронумерованныхФункций() возвращает Неопределенно. |
|||
70
quest
17.02.16
✎
12:41
|
(6) нафига он тебе такой? Тем более со скоростью работы 1С... Вынеси во внешнюю компоненту - будет счастье.
|
|||
71
quest
17.02.16
✎
12:47
|
+ для теста такой случай еще
а0 = "аааа |ббб //|ввв" |ггг" а1 = "аааа |ббб //ввв" |ггг" |
|||
72
Злопчинский
17.02.16
✎
13:36
|
угу... упираемся в вопрос - как определить более-менее минимальный набор тестов..? нет такого правила - превращается все в искуство, а писать без тдд или с тдд - это вообщем тоже искуство.
|
|||
73
Карупян
17.02.16
✎
13:51
|
(72) минимальный набор тестов - это 1 тест )))
|
|||
74
4St
17.02.16
✎
18:54
|
(0) Используем, хоть и не на всю катушку. Помогает даже не столько тестировать, сколько изначально грамотнее структурировать код.
|
|||
75
4St
17.02.16
✎
18:55
|
(0) хотя и регрессию пару раз отловили тестами.
|
|||
76
AnyBody
19.02.16
✎
16:47
|
Кто имеет с ними какие либо контакты, или где можно сообщить им об ошибке без регистраций каких либо.
Ошибка в плагине СериализаторMXL При загрузке макета созданного в БП2 из документа "РеализацияТоваровУслуг" с выгрузкой движений по регистру Бухгалтерии получаем ошибку: {ВнешняяОбработка.СериализаторMXL.МодульОбъекта(1077)}: ОшибкаПоиска: Реквизит <СубконтоКт2>: Искали значение <НДС18> {ВнешняяОбработка.СериализаторMXL.МодульОбъекта(993)}: Поле объекта не обнаружено (СубконтоКт2) Если потребуется, напишу как исправить/обойти. |
|||
77
vicof
19.02.16
✎
17:03
|
(76) Написал разработчику на почту
|
|||
78
artbear
19.02.16
✎
17:20
|
(76) Можно создать задачу для исправления https://github.com/xDrivenDevelopment/xUnitFor1C/issues/new
Предлагаю там же обсудить исправление. (77) Спасибо за письмо. |
|||
79
AnyBody
19.02.16
✎
17:22
|
Там регистрация требуется. Мне пока как-то без надобности.
|
|||
80
artbear
19.02.16
✎
17:24
|
(79) Лады, пиши сюда.
Жду |
|||
81
AnyBody
19.02.16
✎
17:29
|
Общий смысл ошибки заключается в том, что значение этого субконто в проводке есть перечисление.
При генерации макета колонка доп.тип в этом случае не заполняется. В коде, который загружает макет, этот реквизит в "попытке" не находит описание метаданных и валится с описанной ошибкой. Я это у себя поправил. Дальше можно руками в макете дописать "ПеречислениеСсылка.<КонкретноеИмя>". Ну и можно при генерации макета сделать то же самое. |
|||
82
AnyBody
19.02.16
✎
17:31
|
В терминах кода это выглядит так:
строка модуля объекта № 994 МетаданныеРеквизита = НаборМдРеквизитов[стрПоле.Имя]; заменена на ////*//{СТ===== № 00004 ======== 18.02.2016 16:50:54 //МетаданныеРеквизита = НаборМдРеквизитов[стрПоле.Имя]; //---- Заменено на: ---- ИмяС = Лев(стрПоле.Имя,10); ДопТ = ВРЕГ(Лев(стрПоле.ДополнительныйТип,19)); Если Режим = "ПРЕДОПРЕДЕЛЕННЫЙ" И ДопТ = "ПЕРЕЧИСЛЕНИЕССЫЛКА." И (ИмяС="СубконтоДт" или ИмяС="СубконтоКт")Тогда Иначе МетаданныеРеквизита = НаборМдРеквизитов[стрПоле.Имя]; КонецЕсли; ///////}СТ===== № 00004 ======== 18.02.2016 16:50:54 |
|||
83
AnyBody
19.02.16
✎
17:33
|
и в функции Функция ОбработатьРеквизитОбъекта(
после строк: ВызватьИсключение описаниеОшибки + " Не умею обрабатывать реквизит <"+имяРеквизита+"> у объекта <"+Мд.ПолноеИмя()+">"; КонецПопытки; строка Если ЕстьТипы И РеквизитМд.Тип.Типы().Количество() = 1 Тогда заменена на ////*//{СТ===== № 00004 ======== 19.02.2016 14:22:41 //Если ЕстьТипы И РеквизитМд.Тип.Типы().Количество() = 1 Тогда //---- Заменено на: ---- Если ЕстьТипы И РеквизитМд.Тип.Типы().Количество() = 1 И Лев(ДополнительныйТипЗначения,19) <> "ПеречислениеСсылка." Тогда ///////}СТ===== № 00004 ======== 19.02.2016 14:22:41 |
|||
84
AnyBody
19.02.16
✎
17:34
|
Возможно это и не лучшая правка, если я не совсем понял алгоритм автора.
|
|||
85
artbear
19.02.16
✎
17:46
|
(84)
1 Можешь свой доработанный вариант обработки генератора скинуть мне на мыло? aartbear(гав)gmail 2 Достаточно доработки в обработке-генераторе? обработку-тестирования xddTestRunner не нужно дорабатывать для правильного получения данных из макета? |
|||
86
artbear
19.02.16
✎
17:51
|
+ (85) вопрос 2 снимается, т.к. ты используешь версию с плагинами и изменение нужно сделать только в одном модуле.
|
|||
87
AnyBody
19.02.16
✎
17:58
|
Отправил.
|
|||
88
AnyBody
19.02.16
✎
17:59
|
Не прошло, у тебя на самом деле в начале 2 буквы аа?
|
|||
89
AnyBody
19.02.16
✎
18:01
|
Ушло.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |