|
Сборщик мусора в 1с8 | ☑ | ||
---|---|---|---|---|
0
YFred
01.09.11
✎
17:59
|
Заметил что в 1с8 криво работает с оперативной памятью. Например в памяти ТаблицаЗначений на 20000 записей. ТабЗнач.Очистить() не приводит к освобождению памяти. И создание объекта заново ТабЗнач = Новый ТаблицаЗначений, тоже не освобождает память. Что делать?
|
|||
1
qeos
01.09.11
✎
17:59
|
а разве она сразу должна освободиться?
|
|||
2
qeos
01.09.11
✎
18:00
|
да и вообще, как ты увидишь что она занята?
|
|||
3
also
01.09.11
✎
18:00
|
ТабЗнач = неопределено;
|
|||
4
H A D G E H O G s
01.09.11
✎
18:01
|
Кто сказал, что в 1С есть сборщик мусора?
|
|||
5
Попытка1С
01.09.11
✎
18:02
|
Пля ну и название темы... Зашел только из-за этого )
|
|||
6
H A D G E H O G s
01.09.11
✎
18:03
|
Судя по тому, что 1С-ке монопенисуально наличия netframework - она не юзает мелкософтовский GC.
Может свой сборщик, а может тупо - убил - освободил. |
|||
7
YFred
01.09.11
✎
22:03
|
Сборщик по любому есть в 1с, память ведь должна как то освобождаться.
Не понял причем тут netframework на нем не программил. Вопрос в следующем как освободить память занимаемую таблицей значений? |
|||
8
YFred
01.09.11
✎
22:04
|
Я вижу что она занята в диспетчере задач windows.
|
|||
9
ДенисЧ
01.09.11
✎
22:06
|
(8) неправильный критерий
|
|||
10
Reaper_1c
01.09.11
✎
22:14
|
А правильный ответ был дан на первой минуте...
|
|||
11
YFred
01.09.11
✎
23:07
|
Всегда найдется десяток клоунов которые ответят не в тему. Если не хватает внимания общайтесь в чатах. Нечего создавать помойку из серьезных тем.
|
|||
12
Nexux
01.09.11
✎
23:08
|
ТаблицаЗначений = Неопределено ?
|
|||
13
Asmody
01.09.11
✎
23:13
|
(0) что в таблице?
|
|||
14
Reaper_1c
01.09.11
✎
23:15
|
(11) Дятел, присваивание значения "неопределено" - универсальный деструктор снеговика.
|
|||
15
cathode
01.09.11
✎
23:26
|
(11) Ответ на Ваш вопрос, мой твердолобый друг, был Вам любезно представлен в (4). Здесь собравшиеся наверняка оценили Ваши природную скромность и чувство такта, когда Вы благодарно назвали их клоунами в ответ.
В 1С нет сборщика мусора, уважаемый, там лишь счетчики ссылок на объекты. Достаточно, или будете стучать клювом дальше? |
|||
16
БалбесВ1с
01.09.11
✎
23:37
|
Пару раз в неделю сборщик мусора заглядывает в мой кабинет.Но он не из 1с точно.
|
|||
17
YFred
02.09.11
✎
09:05
|
ТаблизаЗначений = Неопределено не освобождает память. Во всяком случае в моем случае. В Таблице значений находятся остатки из регистра сведений (Пишу свертку базы с переносом остатков через COM/OLE).
Лирическое отступление для твердолобых: Уважаемый БалбесВ1с почитал темы созданные вами на форуме они мне показались тоже очень смешными, однако я не зашел в каждую и не поглумился над вами. Просто за... флудеры на форумах. Как я уже сказал выше не хватает общения общайтесь в чатах. Из 16 ответов в тему только 2-3. |
|||
18
YFred
02.09.11
✎
09:06
|
По всем регистрам остатки перенес, застрял на одном СкидкиИНаценкиНоменклатуры вот для него то и не хватает памяти
|
|||
19
milan
02.09.11
✎
09:12
|
(18) Делай частями, не ошибешься ;)
|
|||
20
Reaper_1c
02.09.11
✎
09:14
|
(17) Для оси - не освобождает, а вот для самой 1Сины еще как освобождает. Кстати OLE-какашка жрет памяти точно больше, чем ТЗ на 20000 записей.
|
|||
21
YFred
02.09.11
✎
09:15
|
Я и делаю частями.
|
|||
22
Jolly Roger
02.09.11
✎
09:20
|
(0) >Что делать?
для начала покурить "область видимости переменных"... |
|||
23
YFred
02.09.11
✎
09:20
|
Делаю так:
1.Запрос к оле базе 2.Выгружаю в ТабЗначOLE 3.Создаю ТабЗнач и конвертирую Олешную таблицу значение в ТабЗнач текущей базы. 4. Когда количество записей привышает 10000-20000 тыщ (устанавливается). Очищаю ТабЗнач (ТабЗнач = Неопределено типа чтобы освободить память) и продалжаю процесс. |
|||
24
YFred
02.09.11
✎
09:21
|
Насколько я понимаю 1с освобождает память объектов только после завершения процедуры в которой они созданы.
|
|||
25
Voronve
02.09.11
✎
09:22
|
(24) Покури в гугле аллокаторы. может просветление и наступит.
|
|||
26
hhhh
02.09.11
✎
09:25
|
(24) да не освобождает она память для WINDOWS. Она в своих внутренних таблицах освобождает. Так что в диспетчере задач смотреть глупо.
|
|||
27
БалбесВ1с
02.09.11
✎
09:28
|
(17)То что в (16)называется ап.И кстати твердолобым обозвали тебя в (15).
|
|||
28
Jolly Roger
02.09.11
✎
09:31
|
(26) освобождает...
|
|||
29
YFred
02.09.11
✎
09:35
|
Мне то не легче от того что 1с освобождает в своих внутренних таблицах. У меня оперативки не хватает.
|
|||
30
Escander
02.09.11
✎
09:35
|
(0) ну вроде как сборщик мусора не интерактивно работает а типа по расписанию, типа раз в 1 мин что-ли... нужно уточнить в первоисточниках...
|
|||
31
Escander
02.09.11
✎
09:37
|
(29) а сколько памяти-то?
|
|||
32
YFred
02.09.11
✎
09:42
|
У меня 4гб памяти, но это не важно ибо я делаю по частям.
|
|||
33
el-gamberro
02.09.11
✎
09:42
|
Автор олень. В 1С нет сборщика мусора. Память освобождать не нужно. Если руки чешутся заниматься сбором мусора нужно было выбирать себе другое направление работы.
|
|||
34
Ненавижу 1С
гуру
02.09.11
✎
09:45
|
сборщик мусора безусловно там есть, но как он устроен - подозреваю даже в 1С не скажут
|
|||
35
Ненавижу 1С
гуру
02.09.11
✎
09:45
|
(33) сам ты олень
|
|||
36
YFred
02.09.11
✎
09:46
|
Может память и не нужно освобождать в ручную, но я хочу понять как она освобождается автоматически 1ской. Т.к. без этого мне не реализовать задуманного а это не есть гуд.
|
|||
37
Voronve
02.09.11
✎
09:46
|
(32) хоть 32 гб. вынь проге выделяет 2гб, все остальное свап, и кривизна архитектуры.
|
|||
38
YFred
02.09.11
✎
09:49
|
Вот он зловредный код:
СчетчикСтрок = 0; Для каждого СтрТабДвиж из ТабДвижOLE Цикл СчетчикСтрок = СчетчикСтрок + 1; НоваяСтрока = ТабДвиж.Добавить(); Для каждого КолонкаТабДвижИз из ТабДвижOLE.Колонки Цикл ИмяТекКолонки = КолонкаТабДвижИз.Имя; ЗначПер = СтрТабДвиж[ИмяТекКолонки]; НоваяСтрока[ИмяТекКолонки] = НайтиОбъектCOMвБазе(ЗначПер); КонецЦикла; //ЗаполнитьСопоставитьТабДвижOLE(ТабДвижOLE, ТабДвиж); Если СчетчикСтрок >= МаксКолСтрок и МаксКолСтрок<>0 Тогда //Здесь создается документ ввода остатков ..... // //ТабДвиж.Очистить(); ТабДвиж = Неопределено; ТабДвиж = Новый ТаблицаЗначений; Для каждого КолонкаТабДвижOLE из ТабДвижOLE.Колонки Цикл ТабДвиж.Колонки.Добавить(КолонкаТабДвижOLE.Имя); КонецЦикла; СчетчикСтрок = 0; КонецЕсли; КонецЦикла; |
|||
39
ДенисЧ
02.09.11
✎
09:50
|
Как вариант...
Не просто ТЗ = Неопределено, а перебрать каждую строку и каждому объекту = Неопределено, потом удалить строки, потом и таблицу... Помнится, в 77 мне такой фокус помогал... |
|||
40
Zapal
02.09.11
✎
09:52
|
(23) рассматривал вариант не выгружать в тз, а использовать выборку?
я таким образом когда-то победил обработку выгрузки в битрикс, на больших объемах там тоже памяти не хватало |
|||
41
YFred
02.09.11
✎
10:02
|
(39) Проверил не помогло.
|
|||
42
dmpl
02.09.11
✎
10:21
|
(37) 1С может и 3 Гб слопать при соответствующем ключике в boot.ini
|
|||
43
Reaper_1c
02.09.11
✎
10:27
|
*Сидит и радуется, что не поленился изучить конвертацию данных*
|
|||
44
Jolly Roger
02.09.11
✎
10:28
|
(38) епта... намекаю последний раз: см. (22)...
|
|||
45
dmpl
02.09.11
✎
10:30
|
(43) Кто сидит? Впрочем, конвертация тоже падает из-за недостатка памяти.
|
|||
46
Torquader
02.09.11
✎
10:47
|
Про OLE надо говорить отдельно.
Умная система Windows для каждого OLE-объекта создаёт сервер, если, конечно, не сказано, что сервер может обслуживать несколько объектов сразу. Если у нас сервер живёт в своём процессе, как это происходит в 1С, то между процессами устанавливается взаимодействие, через которое передаются данные объектов. Точнее, передаются "указатели" по которым эти объекты можно найти, так как сами объекты остаются внутри своего процесса. За передачу отвечает интерфейс IMarshal, который определяет, как и что переносить. Далее, когда в клиентском приложении будет создано много объектов из сервера, находящегося в другом процессе, то создаются заглушки, которые живут какое-то время после того, как их освободят, так как всю информацию об освобождении объектов нужно доставить родному процессу. То есть в вашем случае вы создаёте таблицу с "заглушками". После освобождения таблицы эти заглушки переходят в состояние обнулённого счётчика ссылок и готовы умереть. Точнее, из-за оптимизации они попадают в "свободный пул", то есть будут выданы другому OLE-объекту. Далее, родной для объекта процесс получает уведомление о том, что его объекты другому процессу не нужны, и должен их разрушить, но, если они используются ещё и внутри его самого, то они останутся жить - вероятно, что по этой же причине могут остаться жить и "звглушки" в памяти нашего процесса, чтобы не выполнять "стыковку" ещё раз. И ещё, вся эта вещь общается через Remore Procedure Call и сообщение Windows WM_COPYDATA, причём большой объём данных может передаваться в одном сообщении, и когда ему просто нет места в адресном пространстве другого процесса (а для этого его не обязательно занимать всё, а можно только сильно фрагментировать), то получаем ошибку. Поэтому, лучше получать как можно меньше объектов OLE из другого процесса, а вместо них обмениваться строками и массивами малой размерности, чтобы им место находилось всегда. |
|||
47
YFred
02.09.11
✎
10:49
|
(44) епта а зачем намекать, мы что тут в загадки играем?
|
|||
48
Jolly Roger
02.09.11
✎
10:52
|
(47) ты можешь сказать какая область видимости ТабДвижOLE и ТабДвиж в (38)? я не могу...
|
|||
49
Jolly Roger
02.09.11
✎
10:52
|
+(48) и кто из нас загадки загадывает?
|
|||
50
YFred
02.09.11
✎
10:55
|
(46) Это не относится к моей проблеме как мне кажется. Т.к. у меня выполняется запрос к базе OLE Затем выгружается результат запроса в таблицу значений и эта таблица не жрет много памяти. Память начинает улетучиваться когда я заполняю таблицу значений в рабочей базе, объектами же рабочей базы. Но мне не понятно почему ТЗ с оле объектами не жрет память, а таблица с объектами рабочей базы полностью идентичная с тем же кол-вом строк и колоно жрет.
|
|||
51
YFred
02.09.11
✎
10:57
|
(48) Область видимости ТабДвижOLE и ТабДвиж в приделах процедуры кусок которой я привел в (38)
|
|||
52
YFred
02.09.11
✎
10:59
|
Может память занимает не ТабДвиж, а что то другое?
|
|||
53
Jolly Roger
02.09.11
✎
11:03
|
(51) ну тогда память, занятая ТабДвиж должна освобождаться при завершении этой процедуры...
|
|||
54
YFred
02.09.11
✎
11:16
|
(53) Проблема в том что память заканчивается раньше чем эта процедура :)
|
|||
55
Jolly Roger
02.09.11
✎
11:18
|
(54) ну дык дроби данные...
|
|||
56
H A D G E H O G s
02.09.11
✎
11:27
|
Код выполняешь с закомменченной
ЗаполнитьСопоставитьТабДвижOLE(ТабДвижOLE, ТабДвиж); ?? |
|||
57
Torquader
02.09.11
✎
11:32
|
Есть ещё подозрение, что вместо ссылок на объекты в таблицу складываются сами объекты - тогда память кушается только в путь.
|
|||
58
YFred
02.09.11
✎
11:35
|
(56) ДА
|
|||
59
H A D G E H O G s
02.09.11
✎
11:40
|
Тогда код процедуры
НайтиОбъектCOMвБазе() в студию! |
|||
60
НЕА123
02.09.11
✎
11:43
|
может ОФФ.
в 77 для обработок замечал, что память в диспетчере освобождается только при убиении обработки. использует ли сам 1С "высвобожденную" память - хз. |
|||
61
Fragster
гуру
02.09.11
✎
11:47
|
в запросе - освобождает, если УДАЛИТЬ ВременнаяТаблица; делать, в коде - кажись по окончанию процедуры и перед возвратом в интерактивный режим
|
|||
62
YFred
02.09.11
✎
12:00
|
(57) в таблице ссылки
|
|||
63
YFred
02.09.11
✎
12:00
|
Код функции НайтиОбъектCOMвБазе(ЗначComПер)
Функция НайтиОбъектCOMвБазе(ЗначComПер) //Определяем тип переменной ТипНашейПеременной = ОпределитьТипComОбъекта(ЗначComПер); ТипыСправочников = Справочники.ТипВсеСсылки(); ТипыДокументов = Документы.ТипВсеСсылки(); ТипыПеречисления = Перечисления.ТипВсеСсылки(); Если ТипНашейПеременной = ТипЗнч(Неопределено) Тогда //неопределенный тип Возврат Неопределено; ИначеЕсли ТипыПеречисления.СодержитТип(ТипНашейПеременной) Тогда //пречисление ИмяПер = ЗначComПер.Метаданные().Имя; ИмяЗначенияПер = OLEСоединение.XMLСтрока(ЗначComПер); //Сообщить(ИмяПер+":"+ИмяЗначенияПер); Если ИмяЗначенияПер<>"" Тогда Возврат Перечисления[ИмяПер][ИмяЗначенияПер]; Иначе Возврат Перечисления[ИмяПер].ПустаяСсылка(); КонецЕсли; ИначеЕсли ТипыСправочников.СодержитТип(ТипНашейПеременной) Тогда //Справочник УИД = Новый УникальныйИдентификатор(OLEСоединение.XMLСтрока(ЗначComПер.УникальныйИдентификатор())); Возврат Справочники[ЗначComПер.Метаданные().Имя].ПолучитьСсылку(УИД); ИначеЕсли ТипыДокументов.СодержитТип(ТипНашейПеременной) Тогда //Документ УИД = Новый УникальныйИдентификатор(OLEСоединение.XMLСтрока(ЗначComПер.УникальныйИдентификатор())); Возврат Документы[ЗначComПер.Метаданные().Имя].ПолучитьСсылку(УИД); Иначе //не ссылочный тип Возврат ЗначComПер; КонецЕсли; КонецФункции |
|||
64
H A D G E H O G s
02.09.11
✎
12:04
|
Иначе //не ссылочный тип
Возврат ЗначComПер; 100% уверенности что примитивное значение вернется? |
|||
65
eklmn
гуру
02.09.11
✎
12:29
|
//Здесь создается документ ввода остатков
..... // //ТабДвиж.Очистить(); ТабДвиж = Неопределено; ТабДвиж = Новый ТаблицаЗначений; ИМХО неопределено не поможет, переназови по другому ТабДжиж2 например :) Для каждого КолонкаТабДвижOLE из ТабДвижOLE.Колонки Цикл ТабДвиж.Колонки.Добавить(КолонкаТабДвижOLE.Имя); КонецЦикла; СчетчикСтрок = 0; КонецЕсли; КонецЦикла; |
|||
66
YFred
02.09.11
✎
12:32
|
(64) да, проверено
|
|||
67
YFred
02.09.11
✎
15:15
|
Проблема не решена... Есть умные мысли?
|
|||
68
Fragster
гуру
02.09.11
✎
15:21
|
(67) написать алгоритм так, чтобы он не жрал столько памяти
|
|||
69
YFred
02.09.11
✎
16:06
|
(68) Тоже об этом думаю. Только еще не придумал как.
|
|||
70
dmpl
03.09.11
✎
08:54
|
(67) Если не хватает чуть-чуть - то ключик /3GB в boot.ini поставить. Если не пройдет - то разбить выгрузку на части и грузить по частям, перезапуская 1С после загрузки каждой части.
(68) Увы, память жрет 1С, а не алгоритм. |
|||
71
DmitrO
03.09.11
✎
10:03
|
Вопрос: когда заканчивается память? На второй итерации по ограничению количества строк? Другими словами: сколько документов ввода остатков успевает оформиться до окончания памяти, соответственно сколько раз успевает отработать это место:
ТабДвиж = Неопределено; ТабДвиж = Новый ТаблицаЗначений; ? |
|||
72
Лефмихалыч
03.09.11
✎
10:26
|
(0) юзай КД, не изобретай волсопедов
|
|||
73
dmpl
03.09.11
✎
10:43
|
(72) КД также валится, причем на не самых больших базах.
|
|||
74
DmitrO
03.09.11
✎
10:56
|
я вообще не понимаю зачем люди так пишут..
надо же понимать что: - результат запроса хранит данные в памяти (для больших выборок вроде как может использовать врем файлы, хотя может быть это только сервер так делает) - ТЗ хранит данные в памяти. - документ объект хранит данные тоже в памяти. В результате обсуждаемого алгоритма по сути дела одни и те же данные хранятся в памяти 4х экземплярах - не эффективно. |
|||
75
Asmody
03.09.11
✎
11:16
|
(70) [память жрет 1С, а не алгоритм] — восхитительно! Напиши в рамочку и повесть на стенку, чтобы все видели твою неспособность думать
|
|||
76
YFred
04.09.11
✎
00:28
|
(71) В зависимости от ограничение которое я задаю, если 10000 то раз 5 успевает выполнится
|
|||
77
YFred
04.09.11
✎
00:35
|
(74) Какие данные хранятся в 4х экземплярах в моем алгоритме?
Что ТЗ хранит данные в памяти это и ежу понятно. Не понятно почему память не освобождается когда уничтожается объект ТЗ. Я не понимаю почему полная ОЛЕ ТЗ с сылками ОЛЕ умещается в памяти, а когда я ее преобразую в ТЗ текущей базы с ссылками на объекты текущей базы, она раздувается в памяти больше чем в 10 раз??? Где ошибка в алгоритме? |
|||
78
YFred
05.09.11
✎
14:25
|
"ААПП!!! и тигры у ног моих сели"
:) |
|||
79
Икогнито
05.09.11
✎
14:31
|
(0) заметил, что ты криво работаешь с возможностями платформы 1с8.
Скока кодю, ни разу не возникала ситуация, когда нужно было держать в оперативной памяти компа ТаблицаЗначений аж на 20000 строк |
|||
80
YFred
05.09.11
✎
14:42
|
(79) если знаток, по подскажи как надо.
|
|||
81
Икогнито
05.09.11
✎
14:43
|
(80) Батенька, надо запросами и времеными таблицами.
|
|||
82
Икогнито
05.09.11
✎
14:44
|
+(81) Запомни, основной способ получения выборки информации на платформе 8 - это запрос.
|
|||
83
Jaffar
05.09.11
✎
14:48
|
(82) посмотри еще раз (23).
|
|||
84
akaBrr
05.09.11
✎
14:56
|
Зачем вообще создавать таблицу в своей базе? Сразу нельзя писать документы, обрабатывая ОЛЕ таблицу?
|
|||
85
Икогнито
05.09.11
✎
14:57
|
(83) продалжай процесс
|
|||
86
Jaffar
05.09.11
✎
15:16
|
(85) ниумею.
|
|||
87
Serginio1
05.09.11
✎
17:37
|
Почитай про менеджеры памяти для нативного кода. Кроме того бывает зарезервированная и откомиченная память. А также память в нативных (да и в управляемых для LOH) подвергается фрагментации
|
|||
88
G-Tesse
05.09.11
✎
18:44
|
Попробуй убивать в отдельной процедуре. Как-то так:
Процедура УбитьОбъект(Объект) Объект = Неопределено; КонецПроцедуры А вообще настрой технологический журнал на утечки памяти. |
|||
89
YFred
06.09.11
✎
15:39
|
Переписал код без использования таблиц значений. Память не жрется, фсе формируется. Сначала переписал без использования промежуточной таблицы значений, все равно была утечка памяти. Сделал вывод что нельзя использовать ОЛЕ таблицы значений типа: ТабДвижOLE = OLEСоединение.NewObject("ТаблицаЗначений");
|
|||
90
YFred
06.09.11
✎
15:40
|
Всем спасибо!
|
|||
91
Fragster
гуру
06.09.11
✎
17:26
|
(89) не, там дело в том, что если есть результат запроса - то обходить его оптимальнее не через выгрузку в ТЗ, а через выборку из результата
|
|||
92
Сергей Д
06.09.11
✎
17:39
|
В Дельфях было так: освобождаемая память не сразу отдается ОС, а некоторое время держится собственным менеджером памяти. По принципу - а вдруг нужно будет сейчас еще кому-то, вот она уже есть, не надо клянчить у системы.
|
|||
93
Serginio1
06.09.11
✎
18:06
|
(89) Возможно проблема с подсчетом ссылок. Такая проблема была еще в семерке. Кстати а работаешь через V82.Application или v82.COMConnector
|
|||
94
Torquader
06.09.11
✎
23:04
|
(92) Так в Windows есть глобальная таблица дескрипторов, в которой выделяется память для всех процессов, локальная таблица дескрипторов, в которой выделяется память для процесса, то есть выделение происходит в виртуальной памяти процесса, а также куча, то есть набор памяти из которого выделяются куски, но у системы он запрошен единым целым, иногда только выполняется увеличение размера кучи.
Что касается OLE-конструкций, то они в процессе создания имеют один объём (уникальная ссылка на сам объект для интерфейса IMarshal), а в процессе работы с ними просто "обрастают подробностями", то есть добавляются ссылки для методов и параметров и т.п. - память теряется. То есть вполне вероятно, что когда ты создаёшь объекты, то они в память влазят, а когда каждый объект подключает свои методы (в 1С позднее связывание), то память кончается. |
|||
95
Jaffar
07.09.11
✎
14:53
|
вот еще по теме:
Глюк в 1С 8 с зависанием обработки в памяти (не обновляется код) http://infostart.ru/public/89283/ |
|||
96
Torquader
07.09.11
✎
18:20
|
Циклические ссылки - это бич любого языка, где нет явного управления памятью.
В том же VbScript если создать два объекта, которые внутри себя хранят ссылки друг на друга, то они остаются в памяти до завершения сценария. Видимо, в 1С есть что-то подобное. |
|||
97
YFred
14.09.11
✎
13:07
|
(93) У меня 8.1
|
|||
98
Serginio1
14.09.11
✎
13:17
|
Ну тогда V81.Application или v81.COMConnector
|
|||
99
AndreYAN
14.09.11
✎
13:32
|
(97) Была такая же проблема с нехваткой памяти при переходе на новую версию конфигурации.
Может не в тему, но интересно самому чем это закончится ! Какие вещи были замечены, что если сворачивать разворачивать 1Ску память в диспетчере как бы уменьшается, но это тоже не помогает, все равно валится. Было решение отправить в 1Ску базу на тестирование и исправление, т.к. тамошняя поддержка сказала что и/или в данных и/или в коде есть ошибки которые валят платформу. Был пример что такую базу отправили им и по возвращению конфигурация заработала нормально. |
|||
100
Grusswelle
14.09.11
✎
13:33
|
100!
|
|||
101
YFred
15.09.11
✎
14:23
|
(98) COMObject("V81.COMConnector");
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |