INFOSTART EVENT 2018 EDUCATION

Второй тур голосования за доклады.
Окончание 5 сентября.

Харитонов Михаил | Директор | 2iS

«Управленческий учет и Интеграция – близнецы-братья. Опыт проектов»

- Как быстро с нуля организовать полноценный УУ в любой конфигурации 1С? - Секреты эффективной архитектуры Плана счетов и Регистра бухгалтерии - Как получить Баланс и P&L без программирования? - Приёмы и примеры эффективного сбора данных для УУ из разных систем - Оптимизируй это… Взгляд на рабочую базу УУ клиента через 10 лет. Приёмы и решения. - Распараллеливаем потоки загрузки, приемки, обработки и расчета итогов - Декларативные описания и конструкторы или «разработчик больше не нужен» - Автоматическая документация без «писателей»

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

Сообщество - Архив

46
Без сомнения, бывалые 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
46

См. также

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

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

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

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



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

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


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

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

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