Секретные технологии O-Planet (Чебурашке посвящается...)

Опубликовал Олег Пономаренко (O-Planet) в раздел Сообщество - Архив

Без сомнения, бывалые 1С-ники знают, что всеми любимая семерка не справится легко с обработкой справочника в сто тысяч элементов. А в триста или пятьсот тысяч, и при этом, чтобы база не разрасталась в гигабайты, а занимала несколько дискет в архиве?..
Интрига.
Без сомнения, бывалые 1С-ники знают, что всеми любимая семерка не справится легко с обработкой справочника в сто тысяч элементов. А в триста или пятьсот тысяч, и при этом, чтобы база не разрасталась в гигабайты, а занимала несколько дискет в архиве?..

Первый клиент
Это был наш первый крупный клиент. Компания, занимающаяся лотерейным бизнесом, хорошо известная в Поволжье. Почему они обратились к программистам с тогда еще малоизвестного сайта? Думаю, они поступили, как и должны были поступить люди из их среды, с одной стороны – риск, а с другой – точный расчет. С риском понятно, а в чем был расчет? Да все просто: если мы – люди толковые, то справимся с их задачей не хуже именитых программистов, а возьмем за это, сами понимаете, как и подобает дебютантам.

Китайский дессерт
Задача была сформулирована просто: сделать программу по учету рапространения лотерейных билетов в офисе и через агентов, программу, которая позволяла бы проводить розыгрыш в реальном времени с трансляцией картинки с монитора компьютера по телеканалу, программу, которая бы при выпадании очередного шара мгновенно расчитывала бы количество выигравших билетов с учетом проданных, и сумму выигрыша по каждому туру, программу, которая бы позволяла самим определять правила розыгрыша для разных тиражей, наконец, программу, где бы учитывались выплаты по выигравшим билетам, велся бы учет комиссионных распространителей, хранилась информация по предыдущим тиражам… И на дессерт: в каждом тираже участвует от ста до пятисот тысяч билетов, которые могут быть проданы наполовину, на четверть, как угодно, в разнобой. Считайте: запись в справочнике в 20 байт, умножаем на 500000 записей, получаем мегабайт. А что такое, 20 байт? Это только наименование в 20 символов. А ведь надо вести учет по продажам, по розыгрышу. То есть один тираж грозился разростись в десятки и сотни мегабайт. В месяц же планировалось проводить по нескольку тиражей. База в пару гигобайт чистой информации, без индексных файлов за промежуток в пол года – это что-то, конечно. И если еще вспомнить, что одно из основных требований – это молниеносность статистики во время розыгрыша, то получается головоломка не хуже китайской: как это все организовать, чтобы работало быстро, надежно, да еще занимало мало места на диске.

Дебют длиною в месяц
Не знаю, кто бы из сегодняшних программистов взялся за такую задачу, сколько бы он запросил и как долго делал… Не знаю этого и про себя сегодняшнего. Но тогда был четко определен срок: один месяц. Я же провозился полтора, по поводу чего клиент не скрывал своего недовольства. А уж сколько денег я за это получил… Вспоминать сейчас стыдно, но дебют есть дебют.

Ключ боевой техники
Меня предупредили, что лотерейные билеты распространяются пачками по сто штук. Номер каждого билета в пачке состоит из номера серии (= пачки), скольких-то нулей и номера билета в пачке, начиная с первого, по сотый. Большой опыт написания на С++ разных трансляторов помог мне с выбором основной единицы хранения информации. Им должен стать 1 бит. Для чистых 1С-ников: любой символ представляет обычный байт информации, то есть, состоит из 8 бит. У любого билета есть 2 состояния: продан (1) или не продан (0). Таким образом, информацию о продаже 100 билетов я могу поместить в строку длиной 15 символов. Как? Просто: 15 * 7 = 105. Почему семь, а не весемь? Чтобы исключить из строки нули, которые 1С, как любой нормальный транслятор, воспринимает концом строки, я заполняю ее символами (2)00000001. И в каждый символ я теперь могу вписать информацию о продаже семи билетов. На пример, если были проданы первый, третий и пятый билеты, то первый быйт из 15-ти будет выглядеть, как (2)00101011. Чтобы указать, что был продан десятый билет, я должен буду сделать второй байт из пятнадцати таким: (2) 00001001 и т.д. И так, мой справочник тиража содержит два поля: код из 6 символов, что соответствует номеру серии и поля-строки в 15 символов, которое хранит информацию о продаже 100 билетов этой серии. В конце статьи я помещу процедуры работы с одной записью справочника.

Прессинг не запрещен
Вы скажете, что 5000 записей в справочнике с такой вот сжатой структурой данных по-прежнему, трудно обрабатывать. Согласен. Поэтому, я взял во внимание еще один факт: предполагается, что большинство билетов к моменту тиража будет распродано. Это соображение дало мне простое, но очень эффективное правило построения моего списка лотерейных билетов: предполагается, что если в справочнике отсутствует запись по какой-то серии, то это означает, что все билеты в ней проданы.

Почти микропроцессор
Кто немного знаком с технологией построения процессоров, тот знает, что большинство из них работают не с битами, а именно с байтами информации. Иными словами, чтобы получить разложение байта по битам, процессор должен сделаеть восемь последовательных операций «И»: Бит1=Байт&0xA0, Бит2=Байт&0x80 и т.д. Я тоже решил особо не мудрить и написал процедуры работы с байтом, основанные на похожей технологии.
Перем РазлБайта[8] Экспорт;

Процедура РазложитьБайт(Знач Байт) Экспорт
  Если Число(Байт)>127 Тогда
  	Байт= Байт - 128;
  	РазлБайта[8]= 1;
  Иначе
  	РазлБайта[8]= 0;
  КонецЕсли;
  Если Число(Байт)>63 Тогда
  	Байт= Байт - 64;
   	РазлБайта[7]= 1;
   Иначе
   	РазлБайта[7]= 0;
   КонецЕсли;
   Если Число(Байт)>31 Тогда
   	Байт= Байт - 32;
   	РазлБайта[6]= 1;
   Иначе
   	РазлБайта[6]= 0;
   КонецЕсли;
   Если Число(Байт)>15 Тогда
   	Байт= Байт - 16;
   	РазлБайта[5]= 1;
   Иначе
   	РазлБайта[5]= 0;
   КонецЕсли;
   Если Число(Байт)>7 Тогда
   	Байт= Байт - 8;
   	РазлБайта[4]= 1;
   Иначе
   	РазлБайта[4]= 0;
   КонецЕсли;
   Если Число(Байт)>3 Тогда
   	Байт= Байт - 4;
   	РазлБайта[3]= 1;
   Иначе
   	РазлБайта[3]= 0;
   КонецЕсли;
   Если Число(Байт)>1 Тогда
   	Байт= Байт - 2;
   	РазлБайта[2]= 1;
   Иначе
   	РазлБайта[2]= 0;
   КонецЕсли;
   РазлБайта[1]= Число(Байт);
 КонецПроцедуры

 Процедура УстановитьБит(Байт, Знач Бит, Знач Валуе) Экспорт
   РазложитьБайт(Байт);
   К= 0;
   Т= 1;
   Пока К<Бит Цикл
   	Т= Т +Т;
   	К= К + 1;
   КонецЦикла;
   Если (Валуе=1) и (РазлБайта[Бит+1]=0) Тогда
   	Байт= Число(Байт) + Т;
   КонецЕсли;
   Если (Валуе=0) и (РазлБайта[Бит+1]=1) Тогда
   	Байт= Число(Байт) - Т;
   КонецЕсли;
 КонецПроцедуры
 Функция ИзменитьБит(Байт, Знач Бит) Экспорт
   РазложитьБайт(Байт);
   К= 0;
   Т= 1;
   Пока К<Бит Цикл
   	Т= Т +Т;
   	К= К + 1;
   КонецЦикла;
   Если РазлБайта[Бит+1]=0 Тогда
   	Байт= Число(Байт) + Т;
   	РазлБайта[Бит+1]= 1;
   Иначе
   	Байт= Число(Байт) - Т;
   	РазлБайта[Бит+1]= 0;
   КонецЕсли;
   Возврат( РазлБайта[Бит+1]);
 КонецФункции
 Функция СложитьБайт() Экспорт
   Бит=1; Т=1; Рез=0;
   Пока Бит<=8 Цикл
           Если РазлБайта[Бит]=1 Тогда
                  Рез=Рез+Т;
           КонецЕсли;
   	Т= Т +Т;
   	Бит= Бит + 1;
   КонецЦикла;
   Возврат Симв(Рез);
КонецФункции

Теперь, чтобы узнать, был ли продан, скажем 34 билет какой-либо серии, мне достаточно найти в справочнике запись по этой серии, вычислить номер байта, содержащего информацию по нужному билету, разложить этот байт и прочитать значение нужного бита:
 Функция БылЛиПродан(Серия, Номер) Экспорт
      Билеты=СоздатьОбъект(«Справочник.Билеты»);
      Если Билеты.НайтиПоКоду(Серия)=0 Тогда // Если серии нет, то она продана вся
           Возврат Перечисление.Булево.Да;
      КонецЕсли;
      НомерБайта=1+Цел(Номер/7);
      НомерБита=2+Номер%7; // помним, что первый – всегда 1 и не участвует в анализе 
      Байт=Сред(Билеты.Номера,НомерБайта,1);
      РазложитьБайт(Байт);
      Возврат ?(РазлБайта[НомерБита]=1, Перечисление.Булево.Да, Перечисление.Булево.Нет);
 КонецФункции

То, что остается между строк
Разумеется, приведенный пример работы со справочником билетов является, как говорится, решением в лоб. Он лишь нагладно показывает технологию работы. Для достижения максимальной скорости работы описанный метод обращения к справочнику не подойдет, особенно, если программа работает в сети. Для того, чтобы все летало мы … Впрочем, это будет очередной из тысячи нюансов, использованных при создании той программы. А обо всем ведь, как известно, не напишешь.

Ленточки, шампанское и теория бума
Никогда не забуду тот день, когда моя программа впервые засияла на мониторах не только моего компьютера. На первый розыгрыш благоразумно не пригласили телевидение, впрочем, в гостях недостатка не было. Более того, розыгрыш проходил в стенах … нашего епархиального управления, и среди почетных гостей восседал сам Архиепископ. Похоже, администрация той конторы посчитала, что иерарх Церкви предстанет тем незаинтересованным лицом, которое подтвердит, что при розыгрыше не было ни каких подтасовок. Действительно, шары вынимались из закрытого мешка разными людьми, а девушка под моим чутким руководством вносила очередную цифру в мою программу, которая мгновенно (что и требовалось) выплевывала число выигравших билетов и сумму выигрыша очередного тура. Хочу заметить, что в нашей Вселенной действует, по видимому, еще не открытый, объективный закон, который гласит, что самые невероятные и неожиданные ошибки всплывают на этапе первой сдачи программы. Все шло хорошо, до тех пор, пока девушка-оператор вдруг вместо двойки, выпавшей на очередном шаре, не ввела по ошибке тройку. И поскольку на беду эта цифра оказалась последней в этом туре, то программа, не задумываясь, посчитала число выигравших (???) билетов, только с тройкой. Я же с ужасом понял, что не предусмотрел откат последней цифры. И правильно, на этапе тестирования мы не вынимали щары из мешка, а просто вводили цифры, подчас, спонтанно, но всегда без ошибок. А теперь возникла заминка, и я представил, что бы было, если бы наш миллионный город сейчас следил за работой моей программы по телевизорам, точнее, как я лезу в конфигуратор, что-то там исправляю (я ведь до этого отключил возможность переигрывания тура по просьбе заказчика!), как потом мы заново вбиваем всю информацию по уже выпавшим шарам. Благо – наша публика оказалась не притязательна. Точнее, всем особо не было дела до того, что там происходит за компьютером. Владыко не имел лотерейных билетов, и ему хотелось только одного, чтобы все это поскорее закончилось. Поэтому, на второй минуте паузы он начал беспокойно ерзать и спрашивать, когда, наконец, мы будем продолжать. И мы продолжили.

Пост что-то
После многих лет работы с 1С, я по-прежнему, рассматриваю тот свой первый проект, как удавшееся, законченное решение. Думаю, описанный метод компановки данных можно применять не только в программе по учету лотерейных билетов. На пример, ЖКХ, медицина... В этих сферах учета также справочники представляются достаточно объемными. Но с другой стороны, очень часто статистическая информация по ним может быть представлена двумя или несколькими ответами: да – нет, платил – не платил, прошел – не прошел и т.д. И в этом случае о представлении символа в качестве набора байтов можно вспомнить, чтобы все стало оптимально и быстро.

С работами, созданными по нашим секретным технологиям, можно ознакомиться в салоне продаж "Белка": Бизнес Электроника ( http://www.belkamag.ru ), либо на нашей домашней странице
____________________________________
НУ ШО, РЕЙТИНГ ПЛЮСАНЕМ, ИЛИ КАК???

www.infostart.ru и www.its-spb.ru

См. также

Добавить вознаграждение
Комментарии
1. Сhe Burashka (CheBurator) 15.07.06 15:20 Сейчас в теме
Нормалек. Известно давно - грамотный подход к проектировке структуры данных решает очень много.
Не понял, почему только эта статья мне посвящается ;-)
2. Сhe Burashka (CheBurator) 15.07.06 15:24 Сейчас в теме
Плюсанул. Секретов особых в статье нет, но напоминание хорошее - не надо забывать основы.
С другой стороны - в крайности бросаться тоже не надо.
Если известна "область применимости" задачи - то можно ограничиться "частным" решением, б.м. не таким высокоскоростным/трудоемким, но в условиях "области применимости" вполне обеспечивающем требуемое время отклика и леггким в манипуляции. Типа так...
3. Олег Пономаренко (O-Planet) 6633 15.07.06 21:28 Сейчас в теме
> Не понял, почему только эта статья мне посвящается
Ну ... я подумал просто, что описанное - супер круто :) А ты разные финты ушами любишь...

На самом деле, оно действительно, не круто, а обычно. Но ведь найдутся же проги, кто эту задачу решал бы в лоб, старательно колотя 300 тыщ билетов в базу, а потом сетуя, что тормозит ведь 1С!!!
4. Аркадий Кучер (Abadonna) 3648 15.07.06 23:31 Сейчас в теме
>Для чистых 1С-ников: любой символ представляет обычный байт >информации..
А бывает чистый водитель "Запорожца"?
Программист или программист (и по фиг на чем рулить), или -... непечатные слова ;)
5. Сhe Burashka (CheBurator) 15.07.06 23:36 Сейчас в теме
Нельзя быть мастером во всем (имхо). Чистый 1Сник - нафиг никому не нужен... что с ним делать? Программировать на 1С он может умеет, а вот как ему объяснить - ЧТО программировать? Часть сил, которые. конечно бы, лучше направить на совершенстование алгоритмов/повышение квалификации - приходится отдавать общению с персоналам, консультациям с бухом, попытка понять, что нужно коммерческому и т.д. - поэтому алгоритмы не всегда такие, как они должны быть...
Пожелаем О-Планету радовать нас аналогичными статьями.
Спсб.
6. Олег Пономаренко (O-Planet) 6633 16.07.06 16:53 Сейчас в теме
Нет, тут чел наехал конкретно на то, что если некто назвался программистом, то он по определению знает, что такое бит, и что можно и в 1С смоделировать побитные операции, есмли это потребуется. В этом смысле, я очень часто встречал именно чистых 1С-ников, на пример, в нашем городе это выпускники экономических специальностей ВУЗов, с уклоном в прикладное программирование. Ну не уверен я, что им известны тонкости внутреннего представления данных. Для них программирование известно, действительно, только на макро уровне. и что в этом такого? Бывают же программисты, которые кроме ассемблера ничего больше не признают!

Кстати, чистого водителя Запорожца я тоже встречал. Он свою машинку буквально по винтикам перебрал. И когда ему ее пришлось продать, и пересесть на другую, то он просто заболел.

7. AAA (aaa) 17.07.06 08:16 Сейчас в теме
Прикольно. Только зачем вообще это на 1с надо было делать?:)
8. Олег Пономаренко (O-Planet) 6633 17.07.06 15:25 Сейчас в теме
Я разрывался между Builder C++ и 1С. Выбрал 1С, чтобы лучше его изучить.
9. Олег Пономаренко (O-Planet) 6633 17.07.06 15:27 Сейчас в теме
Потом, по моему, это было пожелание и клиента, чтобы желательно 1С. Если на С, то дорабатывать кто будет потом? А 1С открыт для изменений.
10. Сhe Burashka (CheBurator) 17.07.06 16:21 Сейчас в теме
>Если на С, то дорабатывать кто будет потом? А 1С открыт для изменений.
Документировать надо разработку... ;-)
11. Аркадий Кучер (Abadonna) 3648 18.07.06 19:55 Сейчас в теме
>Нет, тут чел наехал конкретно
Во-первых, я не наезжал.
Во-вторых, проведи эксперимент (я неоднократно проводил),
спроси любого буха сколько надо начислить, чтобы на руки вышло 10000 рублей?
Статистика: 80% ответов выглядят так 10000*1.13=11300.
Всё потому, что арифметики за 3-й класс этот бух не знает, и составить
уравнение Х-0.13Х=10000 не в состоянии.
Хоть режьте меня - НЕ БУХГАЛТЕР ЭТО.
И программист, не знающий элементарных основ, - НЕ ПРОГРАММИСТ, а так - пользователь макроуровня...
12. Олег Пономаренко (O-Planet) 6633 18.07.06 20:16 Сейчас в теме
Ну, не знаю, с какими бухами кто общается... Именно, нормальный бухгалтер никогда и не будет составлять уравнений. Он просто на автомате наберет на калькуляторе 10000 / (1-0.13) . По крайней мере, я с такими работаю, и не раз наблюдал подобные расчеты. Особенно, это касается НДС. Кстати, я никогда не протестую против * 1.13 по определенным причинам! ;)



13. Олег Пономаренко (O-Planet) 6633 18.07.06 20:37 Сейчас в теме
А что ты понимаешь под основами? Когда-то мне пришлось разбираться с функционированием вязальных автоматов "Соболь", собранных на базе итальянского ЧПУ. Там вместо языка программирования был талмуд с кодами команд. Я посидел недельку и формализовал енто в приемлемый ассемблер, даже с параметрическими командами, а потом его и реализовал, и на его базе придумал и запрограммировал пару десятков переплетений, из которых потом классную женскую одежду шили. Это круто или это основы? Формализация языка, программирование, дизайн трикотажных переплетений, постановка на производство... (И 800 руб в месяц, ведь это была подработка, и было это 5 лет назад :) ) Для сравнения: когда надо было разработать ассемблер по системе кодов для модуля формирования изображения авиа индикатора в КБ, где я работал, один Казанский институт делал это пол года, и представляете, сколько он взял?!

ОДНАКО!!! Когда я смотрю сейчас на вакансии программистов, которых ищут разные западные компании, то понимаю, что все мое С++ и 1С - это фигня! По этим признакам сейчас и программиста нельзя уже отличить от пользователя.
14. Аркадий Кучер (Abadonna) 3648 18.07.06 23:20 Сейчас в теме
>Кстати, я никогда не протестую против * 1.13 по определенным причинам!
А напрасно не возражаешь ;)
11300*0.87=9831 (и плакали наши чистые 10 штук)
>Это круто или это основы?
Это НОРМАЛЬНО для программиста (и круто). В моем понятии программист - человек, имеющий ВРОЖДЕННОЕ алгоритмическое мышление (пусть даже и компа в глаза не видел никогда).
Но всё равно основы знать должен каждый, считающий себя программистом: согласись, нельзя зваться филологом, если алфавита не знаешь!


15. Сhe Burashka (CheBurator) 19.07.06 02:14 Сейчас в теме
Чего-то я не вштырил за что вы бодаетесь?
Против кого мне дружить ;-)
16. Аркадий Кучер (Abadonna) 3648 19.07.06 09:21 Сейчас в теме
Ды мы не бодаемся! Это просто философия...
Я люблю математику, поэтому люблю и четкие определения терминов, в данном случае речь идет о термине "программист".
Я его по одному определяю, другие по другому...
--------------------------------------------------------------------
"И только то я знаю совершенно, что ничего не знаю совершенно"
И. Лойола (кажись) сказал
17. Олег Пономаренко (O-Planet) 6633 20.07.06 01:01 Сейчас в теме
> А напрасно не возражаешь ;) 11300*0.87=9831 (и плакали наши чистые 10 штук)
Хе-е-е... тут морковь иная. Мне 10 штук дать хотят, и наровят из него налог взять. нет бы умножить на 0.87 - они пытаются ПОДОБРАТЬ число, которое при умножении на 1.13 давало бы 10. Находят. 8900 на пример. :) Раза 4 такое было!
18. Аркадий Кучер (Abadonna) 3648 20.07.06 05:11 Сейчас в теме
>ПОДОБРАТЬ число, которое при умножении на 1.13 давало бы 10. >Находят. 8900 на пример. :)
Так ты ж как раз мой пример и подтвердил про бухов ;) Подобрать!
10000/0.87=11494,25 - вот оно искомое.
Арифметика за 3-4 класс (основы!). У В. Суворова есть пример как на 4 курсе экономического факультета дали задачу от 3/5 отнять 1/2 (в простых дробях). Во времени не ограничивали, решили правильно около 20% студентов. А потом эти... двигали советскую социалистическую экономику ;)
19. VasilyKushnir (vasilykushnir) 20.07.06 12:51 Сейчас в теме
20. Олег Пономаренко (O-Planet) 6633 20.07.06 16:07 Сейчас в теме
Маленькая поправочка: я писал не про бухов, а про расчетчиков з/п. Это они так, почему-то, любят считать.

Хотя, :((( сейчас вот сижу в отделе, где двое бкхов, а одна вообще, аудитор. Задал им эту задачку... Получились ответы 11150, 11300 и ... "однозначно сказать нельзя" :) Может, это маленькая фирма просто?
21. Олег Пономаренко (O-Planet) 6633 20.07.06 16:08 Сейчас в теме
Маленькая поправочка: я писал не про бухов, а про расчетчиков з/п. Это они так, почему-то, любят считать.

Хотя, :((( сейчас вот сижу в отделе, где двое бухов, а одна вообще, аудитор. Задал им эту задачку... Получились ответы 11150, 11300 и ... "однозначно сказать нельзя" :) Может, это маленькая фирма просто?
22. Сhe Burashka (CheBurator) 21.07.06 02:02 Сейчас в теме
Ой! И ви мне будете рассказывать...?
;-)
23. defini (defini) 447 24.07.06 15:34 Сейчас в теме
"Нельзя быть мастером во всем (имхо). Чистый 1Сник - нафиг никому не нужен... что с ним делать? Программировать на 1С он может умеет, а вот как ему объяснить - ЧТО программировать?"...
Что значит "Чистый 1Сник"?
24. Владимир (Martyn) 25.07.06 15:13 Сейчас в теме
Мастером во всем - значит ни в чем, но я согласен если программист то как минимум алгоритмическое мышление.
Никто ведь не посадит за штурвал истребителя человека с нарушениями вестибулярного аппарата :-)
25. Maniac (Eugeneer) 03.08.06 00:47 Сейчас в теме
Прикольное решение. Но хотелось бы увидеть тесты сравнения решения в лоб и вашего. Конкретные цифры говоорят о многом, кабы не о всем.
26. Rexx 03.08.06 15:33 Сейчас в теме
Ну и чо прикольного? Нормальные люди это обязаны были знать и пользоваться еще в начале 80-х годов прошлого века во временв PC XT. Детсад сплошной.
27. Олег Пономаренко (O-Planet) 6633 04.08.06 03:30 Сейчас в теме
> Нормальные люди это обязаны были знать и пользоваться еще в начале 80-х годов прошлого века во временв PC XT.
ИМЕННО! Просто нормальные люди вырасли из детсадовского возраста и могли что-то подзабыть.
28. Олег Пономаренко (O-Planet) 6633 09.08.06 16:34 Сейчас в теме
Мож фотки выложить этого?..
29. AlexQC (alexqc) 06.10.06 10:57 Сейчас в теме
А почему "РазложитьБайт" таким образом написано? Лично я бы в цикле делал. Так что, быстрее работает?
30. Gari 06.10.06 18:21 Сейчас в теме
ну прям и не знаю...
у меня есть клиент, в справочнике товаров которого на сегодня 485 тыс. товаров... база живет уже 3 года и ни каких проблем. Едино что... при архивировании она обрезает справочник гдет на 200 тыс. посему живет она исключительно в сиквеле и в нем же делается архив каждую ночь.
31. Доржи Цыденов (support) 4368 06.10.06 23:56 Сейчас в теме
485 тыс?! А можно статью про эту базу?
32. Олег Пономаренко (O-Planet) 6633 10.10.06 01:36 Сейчас в теме
Скорее всего, в базе давно происходят необратимые и неуловимые процессы. Так вот и рождается искуственный интеллект...
33. Андрей (MILBOR) 21.04.07 23:55 Сейчас в теме
Веселинький тут у вас диалог...
34. xChange (xChange) 13.07.07 21:09 Сейчас в теме
35. Олег Пономаренко (O-Planet) 6633 14.07.07 19:04 Сейчас в теме
[q]MILBOR, xChange[/q]
"Новенькие", - подумал Штирлиц.
37. Олег Пономаренко (O-Planet) 6633 10.06.09 14:12 Сейчас в теме
38. Артур Аюханов (artbear) 838 10.06.09 14:13 Сейчас в теме
(37) Это у тебя новый вид апа :) ?
39. Олег Пономаренко (O-Planet) 6633 10.06.09 14:15 Сейчас в теме
(38) Это фиксин решил мну апать. Во всех топиках отписался. А потом ведь попросит комиссионные наверняка...