gifts2017

DBEng32 (8.0.1.2, Share) – выполнение прямых запросов и в монопольном режиме для DBFной версии 1С:Предприятие 7.7 в среде 1С++

Опубликовал Владимир (hogik) в раздел Программирование - Инструментарий

Решение проблемы выполнения прямых запросов в монопольном режиме и исправление ошибки “CodeBase –56” для DBFной версии 1С:Предприятие 7.7.
Тестирование проводилось в 1С++ версии 2.0.3.7 с применением “Microsoft OLE DB Provider for Visual FoxPro 9.0” версии 1.2 от 16/05/2008. Время выполнения запроса по методике, описанной в http://infostart.ru/profile/2905/blogs/482/ составляет 28-30 секунд.

Внимание!
Версии 8.0.0.x – бета-тестирование. Пробуйте разработку на отладочной базе данных.
Установка.
В каталоге …\BIN переименовать DBEng32.dll в DBEng33.dll и распаковать архив в этот каталог.
Что делает данная разработка?
Перехватываются все функции DBEng32.dll. В функциях открытия таблиц выполняется проверка режима запуска сессии 1С. Если 1С запускается в монопольном режиме, то таблицы открываются в эксклюзивном режиме, закрываются и открываются в разделяемом режиме. Для функций, требующих эксклюзивного доступа к таблицам (реиндексация, упаковка, удаление всех записей), таблица закрывается, открывается в эксклюзивном режиме, выполняется “эксклюзивная функция”, закрывается и открывается в разделяемом режиме. Для рабочих таблиц, используемых в штатных запросах, режим открытия не изменяется.
Т.е. особенности выполнения прямых запросов через “OLE DB VFP 9” остаются и при использовании данной разработки – блокировка таблицы при выполнении запроса. И, как следствие появление ошибки “File is in use by another user” при выполнении следующей последовательности операторов:
НачатьТранзакцию();
Обновление таблицы “ААА”.
Запрос к таблице “ААА”.
ЗафиксироватьТранзакцию();

И это происходит в рамках одной сессии в любом режиме запуска сессии 1С с использованием или без использования данной разработки.

История изменений версий.
8.0.0.1 (бета-версия)
Первая опубликованная версия.
8.0.0.2 (бета-версия)
Добавлена возможность вывода отладочной информации в файлы C:\DBEng32_*.log.
Для активизации этого режима необходимо установить переменную среды текущего процесса в единицу: “SET DBEng32_Debug=1”. При включенном флаге вывода отладочной информации, система 1С будет работать очень медленно.
8.0.0.3 (бета-версия)
1) Убраны отладочные операторы. Это снижает загрузку процессора и повышает скорость работы в некоторых задачах до 30%. При этом повышение общей производительности сильно зависит от условий запуска сессии 1С. Наибольший эффект достигается при использовании системы в локальном режиме одним пользователем. Т.к. доля времени, затрачиваемая на операции ввода/вывода, уменьшается в общем времени, за счет системного и аппаратного кэширования.
2) Добавлена возможность вывода подробной отладочной информации: “SET DBEng32_Debug=2”.
P.S. В разработке “DBEng32 SEQ” отладочные операторы убираться не будут.
8.0.0.4 (бета-версия)
Добавлены переменные среды текущего процесса:
SET DBEng32_NoSEQ=1 – отключает алгоритм исправления ошибки “CodeBase –56”.
SET DBEng32_NoShare=1 – отключает алгоритм открытия таблиц БД в разделяемом режиме при запуске сессии 1С в монопольном режиме.
SET DBEng32_StopSEQ=1 – включает выдачу сообщения с ожиданием действия пользователя после выполнения метода BeginReadSequence().
По умолчанию значение всех переменных равно нулю (выключено). Значения переменных считываются в момент запуска сессии 1С.
Примеры:
1) Штатный режим работы 1С:
SET DBEng32_NoSEQ=1
SET DBEng32_NoShare=1
2) Максимальная производительность при использовании прямых запросов 1SQLite с защитой от возникновения ошибки “CodeBase –56”:
SET DBEng32_NoSEQ=0
SET DBEng32_NoShare=1
3) Возможность использования прямых запросов через “OLE DB VFP 9” c защитой от возникновения ошибки “CodeBase –56”:
SET DBEng32_NoSEQ=0
SET DBEng32_NoShare=0
4) Возможность использования прямых запросов через “OLE DB VFP 9” без защиты от возникновения ошибки “CodeBase –56”:
SET DBEng32_NoSEQ=1
SET DBEng32_NoShare=0
При использовании данного режима следует учитывать, что ошибка может возникнуть и без применения 1SQLite. Но вероятность этого очень мала.
5) Тест на появление ошибки “CodeBase –56” при использовании прямых запросов 1SQLite:
SET DBEng32_NoSEQ=1
SET DBEng32_NoShare=1
SET DBEng32_StopSEQ=1
Тест проводится в двух сессиях 1С. Локальный/сетевой режим – безразлично. В процессе запуска 1С будут выдаваться диалоговые окошки с заголовком “DBEng32 Share” и именем таблицы, для которой выдан метод BeginReadSequence(). Их нужно “угрюмо прожимать”.
После загрузки обеих сессий 1С надо в одной сессии запустить запрос 1SQLite, дождаться появления окошка с заголовком “DBEng32 Share” но не “прожимать” это окошко. А в другой сессии запустить любую задачу, обновляющую таблицу, имя которой выдалось в окошке. На моей тестовой платформе сбой происходит примерно через одну минуту. Если не удастся получить эту ошибку – выходите со мной на контакт.
8.0.0.5 (бета-версия)
Восстановлен монопольный режим открытия рабочих таблиц. Это может повысить скорость выполнения штатных запросов.
8.0.0.6 (бета-версия)
Исправлена ошибка "При добавлении любого реквизита в шапку...". Подробнее см. сообщения 33-35 данной темы.
8.0.0.7 (бета-версия)
Исправлена ошибка "...при изменении кодовой страницы в Висте...". Подробнее см. сообщение 36 данной темы.
8.0.0.9 (бета-версия)
1) Добавлен алгоритм взаимодействия с утилитой LockDB. См. http://infostart.ru/public/86647/
2) Добавлена переменная среды текущего процесса: DBEng32_LockDB - задаёт количество миллисекунд между опросами блокировок транзакций со стороны "DBEng32 Share" при взаимодействии с утилитой LockDB. Рекомендуется устанавливать значение - 1000 (одна секунда) и более. Умолчание для переменной - одна секунда.

8.0.1.1
Добавлена переменная среды текущего процесса DBEng32_Exclusive.
Описание см.: http://infostart.ru/public/87339/ .

8.0.1.2
Исправлена ошибка в полном пересчете бухгалтерских итогов.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
DBEng32_8012.zip
.zip 41,64Kb
25.10.12
100
.zip 41,64Kb 100 Бесплатно

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Андрей (Свой) 23.08.08 21:08
подскажите, пожалуйста, эта разработка чем отличается от вашей http://infostart.ru/profile/2905/projects/2308/?cp=all ?
о каких прямых запросах в DBF идет речь ? о тех что в 1Cqlite ?
2. Владимир (hogik) 23.08.08 21:23
(1)(Свой)
Данная разработка включает в себя исправление ошибки “CodeBase –56”. Эта ошибка не связана с 1SQLite. Ошибка существует сама по себе. Просто проявляется она значительно чаще при использовании 1SQLite.
Кроме этого в данной разработке обеспечена возможность выполнения прямых запросов в монопольном режиме с помощью, например, “Microsoft OLE DB Provider for Visual FoxPro 9.0”.
3. kiruha Дронов (kiruha) 24.08.08 00:34
Огромный респект )
Смогу тестировать со вторника
4. kiruha Дронов (kiruha) 24.08.08 00:40
1. Вопрос - а такое исправление не может привести к некорректности данных
во время проведения (если использовать только родные средства 1С)
Т.е. как осуществляется блокировка таблиц во время внесения изменений?
2. И возможна ли блокировка на уровне записей, а не только таблиц?
3. Версия 1С - 27 релиз? Для других релизов (25, 26) подходит?
5. Андрей (Свой) 24.08.08 01:02
hogik, не могли бы вы привести текст фрагмент процедуры с запросом которые вы использовали, чтобы воспроизвести
6. Владимир (hogik) 24.08.08 01:17
(4)(kiruha)
Ответы по пунктам.
1) Нет.
2) Да.
3) В 19-ой и 25-ой версиях нет существенных отличий в DBEng32. Я отлаживаюсь в 19-ой версии. Проверял свои предыдущие разработки на 25-ой версии. Больше у меня нет информации по этому вопросу – жалоб от пользователей не поступало. Можете прислать мне библиотеку из своей версии – я проведу их сравнение.
7. Владимир (hogik) 24.08.08 01:21
8. kiruha Дронов (kiruha) 24.08.08 02:11
(6)
п.2 Т.е. возможен аналог "гибких блокировок" для ДБФ ?!!!
Планируется ли развивать это направление?

п.3 У меня тоже 25 версия
9. Владимир (hogik) 24.08.08 03:33
(8)(kiruha)
“возможен аналог "гибких блокировок" для ДБФ ?”
Для меня этот вопрос очень странен - после моего “Да” на “возможна ли блокировка на уровне записей?”. Возможно под “гибкими блокировками” мы понимаем разные вещи. Поясните, пожалуйста, свой вопрос.
“Планируется ли развивать это направление?”
В моём понимании этого термина – я ломаю голову над этим пару лет (в фоновом режиме). Но эта тема у меня связана (в голове) с другой разработкой – “DBEng32 для Advantage 8.1”.
10. kiruha Дронов (kiruha) 24.08.08 04:29
(9) Извиняюсь - вопрос скорее был риторический.
Уж очень сладкой кажется возможность )
И думаю не только у меня.
Пока это единственная проблема которая мешает хорошо жить на ДБФ.
11. Владимир (hogik) 24.08.08 05:06
(10)(kiruha)
Мы действительно говорим о разных вещах. Это, на мой взгляд, задача общая. А DBFы или YYYы – какая разница. Но, на данный момент, важно тестировать “DBEng32 Share”. Жду от Вас информацию о результатах…
12. Артур Аюханов (artbear) 26.08.08 12:44
(Автор) Посмотри, плиз, http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/315#315
и след. посты с анализом.
Что скажешь?
Т.е. подозрение, что работа с данными затормозилась :(
13. Владимир (hogik) 26.08.08 15:35
(12)(artbear)
Посмотрел.
Если ИТЗ.ДобавитьИндекс() работает с информационное базой данных то:
1) Должно появиться замедление в монопольном режиме запуска 1Са при использовании версии 8.x.x.x.
2) Замедление может быть связано с тем, что выполняется чтение DBFов с использованием Begin/EndReadSequence(), а в версиях 8.x.x.x и 7.0.0.3 эти методы активизируются только внутри транзакции.
14. kiruha Дронов (kiruha) 26.08.08 17:02
(13)
п1
На небольших базах, где пользователей до 5-10 человек - иногда
использовал обертку запроса 1С в транзакцию - время выполнения уменьшалось в разы
(но и вероятность нарваться на "ожидание захвата таблицы" у других пользователей тоже увеличивается в разы )
В монопольном режиме все тип топ.
Не может быть с этим связано?

п2 Правка DBEng32 может потенциально влиять на разделенный режим?
Или затрагивает только монопольный?
15. Владимир (hogik) 26.08.08 17:52
(14)(kiruha)
“Не может быть с этим связано?”
Если Вы о вопросе из (12), то в ИТЗ (говорят на форуме 1С++) вообще нет обращений к БД.
“Правка DBEng32 может потенциально влиять на разделенный режим?”
В моей задумке влияет только на проблему “CodeBase –56”. :-)
Но “оборачивается” все вызовы DBEng32.dll в независимости от режима запуска 1С.
16. kiruha Дронов (kiruha) 26.08.08 19:36
(16) Вы не поняли.
В ИТЗ (в том варианте который стал более медленным) во время сортировки : для каждого элемента строки ИТЗ
выполняется запрос к базе - вынимается наименование и потом происходит сортировка ИТЗ по ней.

Грубо говоря это тест на выполнение в цикле запросов к базе для получение наименований справочника (без ИТЗ)
Мое предположение - в транзакции (в том числе во время проведения) - все операции 1С существенно ускоряются
- соответственно отключение этого режима ведет к замедлению.
17. kiruha Дронов (kiruha) 26.08.08 19:39
А второй вопрос был потому - если изменения никак не затрагивают разделенный режим -
то даже замедления - не так и важно.
18. Владимир (hogik) 26.08.08 22:22
(16-17)(kiruha)
“Вы не поняли”
Естественно – не понял. Для меня (в моём понимании) идёт жуткая терминологическая путаница. А если “вынимается наименование” из базы в момент сортировки, то конечно дело в “СУБДе” (моём изменении DBEng32).
“тест на выполнение в цикле запросов к базе для получение наименований справочника”
Если вынимается наименование запросом, то действительно, надо размышлять о включении транзакции.
“второй вопрос был потому”
Еще раз уточню. В “DBEng32 Share” таблицы всегда открываются в разделенном режиме. Не зависимо от монопольного или разделенного режима запуска сессии 1Са. Т.к. методы Begin/EndReadSequence() дают значительное ускорение именно в разделенном режиме открытия файлов, то при использовании “DBEng32 Share” с запуском 1С в монопольном режиме можно увидеть значительное падение производительности на запросах 1SQLite по сравнению со штатным движком. Т.е. охват запроса транзакцией становиться актуальным.
19. Вячеслав (slavapil) 27.08.08 13:33
Странно на тесте Михаила, у меня в разд. режиме между
родным без транзакции:
Время выполнения запроса: 29542
Элементов в базе (тест): 100000
Итерация 1: 2676
Итерация 2: 2659
Итерация 3: 2672

и с dbeng32 8.0.0.2 с транзакцией:
Время выполнения запроса: 28680
Элементов в базе (тест): 100000
Итерация 1: 2684
Итерация 2: 2684
Итерация 3: 2669

время практически совпадает.

dbeng32 8.0.0.2 без транзакции:
Время выполнения запроса: 28868
Элементов в базе (тест): 100000
Итерация 1: 3537
Итерация 2: 3550
Итерация 3: 3553

Что интересно на 1С Запрос никоим боком не влияет, значит есть надежда на решение проблемы замедления в циклах, обращения к базе считывания реквизитов справочника через ссылку на объект !?
20. Владимир (hogik) 27.08.08 15:49
(19)(slavapil)
При написании теста имеет смысл учитывать следующую информацию:
1) Все мои разработки с названием “DBEng32…” увеличивают количество выполняемых машинных команд.
2) Эти разработки меняют алгоритм выполнения операций ввода/ввода с целью повышение надежности и скорости работы 1С. На первом месте – надежность!
3) На тестирование этих разработок для маленьких БД в локальном режиме оказывает сильное влияние системный и аппаратный кэш. Например, в тесте от Михаила чтение информации из БД (обращение к методам DBEng32) осуществляется только в первой итерации. А скорость выполнения итераций одинаково в рамках одного запуска теста.
4) Штатные запросы 1Са используют рабочие файлы. В моих разработках доступ к этим файлам не модифицируется (кроме DBEng32 Share). Т.е. значительная часть времени уходит на работу с рабочим файлом и оценить разницу времён, на которые влияют мои разработки - становится сложней.
5) Использовать 1SQLite следует с “DBEng32 SEQ”, а при использовании “OLE DB Provider for Visual FoxPro” – “DBEng32 Share”, т.к. в этой (Share) разработке выполняется модификация операций ввода/вывода, которая снижает скорость штатных методов доступа к данным при монопольном запуске 1Са. А эта модификация не требуется для 1SQLite.
21. Владимир (hogik) 27.08.08 23:37
+(20)
Для выяснения влияния системного и аппаратного кэша на выполнение операций ввода/вывода в 1С DBFной версии можно запустить тест на маленькой базе данных в локальном режиме. Тест выложен в “Ответ #351” по ссылке http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/345#345
Т.к. тест выполнялся на маленькой базе то ниже представлено только время выполнения “штатного” запроса в миллисекундах. Порядок запуска теста соответствует порядку представленных ниже строк. Серия данных тестов выполнялась после перезагрузки системы.
DBEng32 8.0.0.2 Запрос.Выполнить(ТекстЗапроса): 40
DBEng32 Native Запрос.Выполнить(ТекстЗапроса): 12
DBEng32 8.0.0.2 Запрос.Выполнить(ТекстЗапроса): 13
22. Владимир (hogik) 28.08.08 04:21
Внеочередное обновление разработки для завершения разговора с kms ;-)
23. Вячеслав (slavapil) 28.08.08 10:49
(19)+
dbeng32 8.0.0.3 без транзакции:
Время выполнения запроса: 28518
Элементов в базе (тест): 100000
Итерация 1: 2671
Итерация 2: 2685
Итерация 3: 2668

dbeng32 8.0.0.3 с транзакцией:
Время выполнения запроса: 27637
Элементов в базе (тест): 100000
Итерация 1: 1856
Итерация 2: 1856
Итерация 3: 1853

+++++ :)
24. Владимир (hogik) 28.08.08 15:05
(23)(slavapil)
Еще раз прошу обратить внимание на условия проведения тестирования. Ниже приведены замеры для выборки из БД (http://infostart.ru/profile/2905/blogs/482/), но в локальном режиме и без второго пользователя. Выборка (получение суммы) производилась штатным запросом. Перед каждым тестом производилась перезагрузка компьютера. Время в секундах.
8.0.0.2
189
132
132
Native
150
88
87
8.0.0.3
139
73
72
Но если данный запрос выполнять по методике описанной в ссылке (см. выше), то расхождения будут значительно меньше. Как между тестами, так и между замерами в рамках каждого теста.
25. Вячеслав (slavapil) 28.08.08 16:48
(24)
Я понимаю так, по запросам DBF всё было хорошо и раньше!

Но версия 8.0.0.2 тормозила процедуры написанные на языке 1С (например получить реквизит из обекта Справочник "Элемент.Наименование", не запросы к базе),
в версии 8.0.0.3 вы это исправили, за это Вам еще раз огромное спасибо!


26. Вячеслав (slavapil) 28.08.08 16:55
Исходники сего чуда, будут доступны?
27. Владимир (hogik) 28.08.08 19:26
(25-26)(slavapil)
“Я понимаю так, по запросам DBF всё было хорошо и раньше!”
Нет. В сообщении (24) приведены замеры выполнения штатного запроса. И числа там разные.
Тормозили ВСЕ вызовы библиотеки DBEng32 из-за того, что у меня остались отладочные операторы от базовых разработок “DBEng32 CodeBase/Advantage”. С помощью этих операторов мне проще отслеживать и контролировать корректность перехвата функций этой библиотеки. Они не оказывали никакого влияния на снижение скорость выполнения операций ввода/вывода, но увеличивали количество команд процессора при КАЖДОМ обращении к ЛЮБОЙ функции этой библиотеки, но с разными накладными расходами. Я планировал разобраться с этими операторами в окончательной версии разработки. Но т.к. пользователи начали тестировать мою разработку, на мой взгляд, “не с того конца” – я решил это сделать досрочно, чтобы не вносить путаницу в анализ проведенных замеров. На мой взгляд, прежде всего, надо проводить сравнение производительности в том, что написал orefkov в “Ответ #353” на http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/345#345 и принимать решение – использовать или не использовать прямые запросы в, например, модуле проведения документов. А эксплуатацию организовать так, чтобы для монопольных (регламентных) работ можно было бы переключится на родную библиотеку DBEng32.
“Исходники сего чуда, будут доступны?”
Я пока не принял решения по данному вопросу.
28. vip (vip) 28.08.08 19:52
Ув. hogik!
Ссылку на конкретный пост на форуме 1cpp.ru удобнее давать в таком виде
http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/360#360
или для вашего случая
http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/353#353
И тогда не надо листать ветку для поиска ответа #353.
29. Владимир (hogik) 29.08.08 01:36
В дополнение к замерам из сообщения (24), привожу замеры при той же тестовой платформе, но в монопольном режиме. Первого замера (сразу после загрузки компьютера) - не делал. Но от перемены порядка запуска тестов – числа не меняются.
8.0.0.4 set DBEng32_NoShare=1
?? - не делал.
59
60
8.0.0.4 set DBEng32_NoShare=0
?? - не делал.
74
74
30. Владимир (hogik) 30.08.08 16:23
Добавлен в описание раздел “ Что делает данная разработка?” и обновлена версия.
31. Евгений Мартыненков (JohnyDeath) 30.08.08 21:46
Я так понимаю, что теперь разработка "DBEng32 (7.0.0.3, SEQ)" не нужна. Аналогично будет использовать эту разработку со следующими параметрами:
SET DBEng32_NoSEQ=0
SET DBEng32_NoShare=1
?
32. Владимир (hogik) 30.08.08 22:37
33. Епрст (Ёпрст) 15.04.09 13:32
Забавная штука обнаружилась при сохранении большой конфы, если установлена
8.0.0.5 :
http://s57.radikal.ru/i158/0904/08/275194064ef8.jpg

Это всё на голой 1с-ине 25 релиза (без опенконф и т.д)
При добавлении любого реквизита в шапку - болт, аналогично при удалении любых реквизитов шапки (или общих реквизитов, в общем всего, что с документами связано)

Ежели убираем патч - всё работает
:)



34. Епрст (Ёпрст) 15.04.09 13:33
+33 Соответственно реструктуризация мд-ника не выполняется :(
35. Владимир (hogik) 15.04.09 22:16
(33)(Ёпрст)
:-) Да. Очень "забавная штука".
Ошибка исправлена в версии 8.0.0.6.
Спасибо...
Ёпрст; +1 Ответить
36. Епрст (Ёпрст) 04.05.09 16:56
Очередной "подарок" при изменении кодовой страницы в Висте:
http://i019.radikal.ru/0905/39/accbf75d145a.jpg

и соответственно вылет из пофигуратора
:(
37. Pilokarpios Pilokarpios (Pilokarpios) 19.10.11 12:42
Если взять типовую бухгалтерию и использовать её с этими прибамбасами, быстрее будет работать, или все равно нужно переписывать на "прямые" запросы?
38. Владимир (hogik) 19.10.11 17:13
(37)
1) "быстрее будет работать,"(с) - Нет.
2) "или все равно нужно переписывать на "прямые" запросы?"(с) - Да.
3) "использовать её с этими прибамбасами,"(с) - :-)
39. PaulS (PaulS) 21.10.11 16:13
Давненько искал - СПАСИБО автору
40. Юрий Осипов (yuraos) 20.11.11 10:03
Спасибо! Качнулс. Проверимс.
41. Юрий Осипов (yuraos) 20.11.11 10:06
yuraos пишет:

Спасибо! Качнулс. Проверимс.


Из каких соображений выложены три версии
библиотеки, а не последняя из них? :))))

Чем они отличаются между собой??
42. Юрий Осипов (yuraos) 20.11.11 10:09
А как насчет лицензионного соглашения с нуралиевым ?

Ведь тут его драааа-аценйший файлик
переименовали и подменили другим! ;))))))

yuraos пишет:

Спасибо! Качнулс. Проверимс.
43. Юрий Осипов (yuraos) 20.11.11 10:11
Наверное также, как в случае с опенконфом... -))))

yuraos пишет:

А как насчет лицензионного соглашения с нуралиевым ?

Ведь тут его драааа-аценйший файлик
переименовали и подменили другим! ;))))))

44. Юрий Осипов (yuraos) 20.11.11 12:03
Клёво! Работает!!!
Жалко что 1CV-7.7 скоро "must die". |((((
yuraos пишет:

Спасибо! Качнулс. Проверимс.
45. Юрий Осипов (yuraos) 20.11.11 12:11
Еще раз спасибо!!!
Учел в своей версии известной обработки 1CQA - Консоль1CQA (консоль прямых запросов 1C++)
yuraos пишет:

Клёво! Работает!!!
Жалко что 1CV-7.7 скоро "must die". |((((
46. Владимир (hogik) 20.11.11 20:00
(41)
"Чем они отличаются между собой??"(с)
Добавлен функционал не относящийся к изначальной задаче (цели) разработки.
(42)
"А как насчет лицензионного соглашения с нуралиевым ?"(с)
ПоФиг. ;-)
Я не заключал с ним никаких "соглашений".
Разработка не нарушает законодательство РФ.
47. 62chma 19.12.11 10:17
Интересно попробывать. Подскажите где найти документацию/примеры по использованию данной библиотеки.
48. Владимир (hogik) 19.12.11 17:57
49. qwe qwe (black_monk) 21.12.11 15:40
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа