Аналитика
http://geosystema.net/forum/

Все про скрипти
http://geosystema.net/forum/viewtopic.php?f=1&t=2809
Страница 74 из 83

Автор:  fendak [ 24 ноя 2020 19:20 ]
Заголовок сообщения:  Re: Все про скрипти

fendak писал(а):
і уже знову працює функція @Map.GetPublicMapParcelInfo

Знову не працює. Взагалі вже нема можливості читати кадастрові номери ділянок. Що там сталося на ПКК? Знову щось змінили?

Автор:  Dmitry_Zolotar [ 25 ноя 2020 11:44 ]
Заголовок сообщения:  Re: Все про скрипти

Функція @Map.GetPublicMapParcelInfo працює, але ще не в усіх кварталах. За допомогою меню Реєстри-Земельна ділянка отримайте інформацію про одну з ділянок в кварталі, тоді за декілька хвилин можна буде отримати інформацію по кожній ділянці у цьому кварталі.
Функція @CheckPublicMapParcel працює за умови працездатності ПКК/е.-кабінету, останнім часом з цим часто виникали пролеми.

Автор:  voha [ 27 ноя 2020 09:07 ]
Заголовок сообщения:  Re: Все про скрипти

Доброго дня розробникам.
Маю до Вас невеличке питання: який збіг обставин впливає на роботу скриптової функції @Map.CalculateZ X Y [ParamIndex], що повертає результат інтерполяції висоти в точці X Y рівний 0?
Трапляється таке не часто - приблизно в одному з 20-ти запусків скрипта, в якому циклічно перебираються планові координати для визначення висот вказаною функцією. Тобто: раз на 20 запусків такого циклу, @Map.CalculateZ X Y [ParamIndex] повертає 0 в усіх ітераціях :!:
Лог-файл каже наступне
Код:
23:20:00.838   $Z2=MAP.CALCULATEZ 5347241,50128287 1349438,23848208
23:20:00.838   0
Не втямки мені - у чому причина? В карті всім об'єктам призначені висоти (крім растрових зображень, статус яких - лише відображення). Не хотілося би переписувати скрипт на ЦМР | Перепризначити висоти, то ж питання довіри до результатів функції або просто: я чогось не враховую :?

P.S. Я розумію, що питання "розмите", але може би Ви протестували.

Автор:  fendak [ 27 ноя 2020 20:59 ]
Заголовок сообщения:  Re: Все про скрипти

Dmitry_Zolotar писал(а):
Функція @Map.GetPublicMapParcelInfo працює, але ще не в усіх кварталах. За допомогою меню Реєстри-Земельна ділянка отримайте інформацію про одну з ділянок в кварталі, тоді за декілька хвилин можна буде отримати інформацію по кожній ділянці у цьому кварталі.

Дякую, але щось воно не працює так. Ввів в меню Реєстри пошук ділянки з кадастровим номером 4621288200:01:004:0328. А функція @Map.GetPublicMapParcelInfo і дальше не читає кадастровий номер даної, чи інших ділянок в цьому кварталі навіть через годину.
Але в деяких кварталах функція справді працює.

Автор:  voha [ 05 дек 2020 19:45 ]
Заголовок сообщения:  Re: Все про скрипти

Доброї пори доби розробникам.
Воюю далі з обробкою події зміни об'єктів - власне у скрипті треба виконати перепризначення висот точок змінених об'єктів.
Код:
%Events.OnChange
;Зняти маркування точок редагованого активного об'єкта
$N=@EventObject
$CountMark=@Map.Object[$N].GetMarkedPointsCount
@If $CountMark<>0 then @Map.Selected.MarkPoints CLEAR
;Позначити всі редаговані об'єкти
$ListChange=@EventObjectsList
$CntEventObj=@Text.Text $ListChange
@If $CntEventObj=1 then @Goto %EndSelect
$i=1
@While $i<=$CntEventObj %Loop
$NumObj=@Text.Line[$i]
@Map.SelectObject $NumObj
$i=$i+1
%Loop
;Перепризначити висоти позначеним об'єктам
%EndSelect
;Правка | Інвертувати
@ExecuteMenu EditInvert
;ЦМР | Перепризначити висоти
@ExecuteMenu AssignHeight1
;@Dialog.Message Виконано перепризначення висот
@ExecuteMenu EditInvert
Якщо перетягнути точку активного об'єкта, наведений скрипт обробки події відпрацьовує коректно, однак точка опиняється там, де був вказівник миші на момент завершення скрипта.

Якщо маркувати фрагмент і перетягнути одну з маркованих ліній, схопивши мишою центр лінії - треба щоб рука без тремору, інакше виникає помилка звертання програми до пам'яті як тільки вказівник змінить своє розташування до закінчення роботи скрипта. А якщо з цього ж таки скрипта запустити процедуру VBA (застосовую самописну функцію dll, яка поверне управління скрипту лише після її виконання), перетягнути маркований фрагмент без виникнення помилки звертання до пам'яті взагалі неможливо.

Переписав би замість ЦМР | Перепризначити висоти на @Map.CalculateZ X Y [ParamIndex], так у неї своя глюка. Здається - край як треба блокувати мишу на час виконання скрипта :oops: .

Порадьте, будь-ласка, який вихід? Чи варто дивитися в сторону SetWindowsHookEx?

P.S. Почекайте! А чому це подія %Events.OnChange обробляється до завершення редагування, а не після? Кнопку миші відпустили - значить закінчили редагування. Однаково ж, координати точки до редагування немає як у скрипті отримати (хіба відмінити редагування).

P.S. Знайшов тимчасове (ресурсно-залежне) рішення. Думаю що помилка звертання до пам'яті таки буде виникати на "повільних" комп'ютерах при перетягуванні точок об'єктів з великою кількістю точок:
Код:
%Events.OnChange
@Map.BeginUpdate
;Зняти маркування точок редагованого активного об'єкта
$N=@EventObject
$IDEventObj=@Map.Object[$N].ID
$CountMark=@Map.Object[$N].GetMarkedPointsCount
@If $CountMark<>0 then @Map.Selected.MarkPoints CLEAR
;Позначити всі редаговані об'єкти
$ListChange=@EventObjectsList
$CntEventObj=@Text.Text $ListChange
@If $CntEventObj=1 then @Goto %EndSelect
$i=1
@While $i<=$CntEventObj %Loop
$Obj=@Text.Line[$i]
@Map.SelectObject $Obj
$i=$i+1
%Loop
;Перепризначити висоти позначеним об'єктам
%EndSelect
;;Правка | Інвертувати
;@ExecuteMenu EditInvert
;;ЦМР | Перепризначити висоти
;@ExecuteMenu AssignHeight1
;;@Dialog.Message Виконано перепризначення висот
;@ExecuteMenu EditInvert
;
;Запис позначених об'єктів (не більше 63-ох) в Get-масиви
;;для кожного редагованого об'єкта
$i=1
@While $i<=$CntEventObj %LoopObjReed
$NumObj=@Text.Line[$i]
$Obj=@Map.GetObject $NumObj
@Text[$i].Text $Obj
$i=$i+1
%LoopObjReed
;
;Видалення позначених об'єктів для визначення висоти за їхніми плановими координатами
@Map.Selected.Delete
;
;Визначення висоти і створення об'єктів
;;для кожного Get-масиву
$i=1
@While $i<=$CntEventObj %LoopObjCreate
$CntPt=@Text[$i].Line[3]
$NumLinMax=$CntPt+4
;;;для кожної точки об'єкта
$j=4
@While $j<=$NumLinMax %LoopPoint
$Str=@Text[$i].Line[$j]
;;;;пропуск розриву комплексного об'єкта
@If "$Str"="" then @Goto %NextPoint
$Mask=@StringPart 1 $Str
$X=@StringPart 2 $Str
$Y=@StringPart 3 $Str
$Z=@Map.CalculateZ $X $Y
$Str=$Mask $X $Y $Z
@Text[$i].Line[$j]=$Str
;;;;наступна точка об'єкта
%NextPoint
$j=$j+1
%LoopPoint
;;;створення об'єкта з Get-масиву
$Obj=@Text[$i].Text
@Map.AddObject 0|$Obj
;;;наступний об'єкт
$i=$i+1
%LoopObjCreate
@Map.SelectByParameters 1|-6=$IDEventObj
@Map.EndUpdate RefreshAlways
Скрипт перепризначить висоти не більше як 63-ох об'єктів, що мають точку у перетягнутому вузлі, оскільки "В пределах одного скрипта можно, при необходимости, использовать до 63 разных списков адресуемых как Text[1], Text[2] … Text[63]".

Таке рішення задачі - не вирішення проблеми виникнення помилки звертання до пам'яті, якщо користувач не чекаючи "везяє мишою по екрану" :!: Шлях, як на мене, один: виправити обробку події %Events.OnChange таким чином, щоб після відпускання кнопки об'єкт не тягнувся далі за мишою. (Див. відео).

З нетерпінням чекатиму на відповідь. Наперед - велике дякую за розширення можливостей автоматизації в програмі.

Автор:  voha [ 08 дек 2020 16:40 ]
Заголовок сообщения:  Re: Все про скрипти

voha писал(а):
виправити обробку події %Events.OnChange таким чином, щоб після відпускання кнопки об'єкт не тягнувся далі за мишою
Виправлено. Чемно дякую.

Автор:  voha [ 09 дек 2020 11:45 ]
Заголовок сообщения:  Re: Все про скрипти

Час від часу переглядаю скриптові функції - розробники додали нові, за що їм велике дякую:
@Map.GPSLocation - повертає координати позиції GPS (build 44173), додана 8.12.20;
@TabletMode [1/0] - включає/виключає режим планшета - приховує/відображає панель інструментів, панель закладок, головне меню програми. Застосована без аргумента - повертає 1 або 0 (build 44169), додана 4.12.20.
Кнопка на панелі інструментів може містити скрипт для переключення режимів
Код:
;%Events.OnActivateMap
$TM=@TabletMode
@Goto $TM
%0
@TabletMode 1
@Break
%1
@TabletMode 0
@Text[N].Clip Char - видаляє в кожному елементі (рядку) текстового блоку Text[N] всі символи зліва (починаючи з першого) до останнього входження символу Char включно (build 44169), додана 4.12.20.
Залишає рядок без змін, якщо Char в рядку не знайдено.

Щодо функцій @Text[N].Delimiter та @Text[N].DelimitedText роз'яснення вже були, тому лишається одне питання:
@SingleClickDialogs [1/0] - включає/виключає режим відображення якого діалогового вікна? Такого, що містить атрибутику об'єкта, вибраного в режимі планшета?

Автор:  petrogeo [ 09 дек 2020 12:30 ]
Заголовок сообщения:  Re: Все про скрипти

Доброго дня.
Чи є можливість перевірити Буфер обміну (чи є в буфері значення) скриптовою функцією?
Суть питання наступна:
Є скрипт, в якому є функція @Run (відкрити зовнішню програму, яка в свою чергу відкриває Exsel-файл). Зовнішня програма копіює значення файлу в Буфер обміну.
Але після запуску зовнішньої програми, скрипт продовжує працювати далі, не чекаючи завершення відпрацювання зовнішньої програми.
Мені потрібно призупинити виконання скрипта, до того моменту поки зовнішня програма не скопіює дані в буфер (а це може бути від 1 рядка до 10 000 рядків в Exsel)
От як перевірити що зовнішня програма вже завершила свою роботу, і я можу продовжити виконання скрипту (тому що для подальшої роботи скрипту потрібні дані з Буфера)
Дякую!

Автор:  voha [ 09 дек 2020 13:01 ]
Заголовок сообщения:  Re: Все про скрипти

petrogeo писал(а):
...От як перевірити що зовнішня програма вже завершила свою роботу, і я можу продовжити виконання скрипту (тому що для подальшої роботи скрипту потрібні дані з Буфера)
А що, зовнішня програма лише для того, щоб відкрити файл Excel? Його ж можна відкрити функцією @Run, вказавши замість файла зовнішньої програми, файл Excel.
Інша справа - очікування скрипта, поки запуститься Excel! Можна застосувати функцію dll, яка чекає (максимум - протягом часу Param3 в мілісекундах) поки вікно з класом Param1 та/або назвою Param2 відобразиться на екрані. Повертає 1 - якщо форма відобразилася на екрані протягом Param3 мілісекунд, або 0 - якщо час закінчився а форми на екрані так і не було. Якщо Param1 або Param2 відсутній, то символ "/" повинний вказуватись, при цьому або Param1 або Param2 повинний вказуватись обов'язково.
Перед застосуванням функцій, файл Functions.dll (від 12.12.20) треба закинути в теку Digitals і перезапустити програму.
Код:
@DLLExec Functions.WaitFormForClassAndCaptionActivated [Param1]/[Param2]/Param3
(клас головного вікна Excel - XLMAIN).

Далі - функція, яка під'єднується до активної відкритої книги Excel і запускає процедуру VBA, записану в книзі. Вона чекає, поки виконається процедура.
Код:
@DLLExec Functions.ExecutProcVBA NameProc/Param
де NameProc - назва процедури VBA, записаної в активній відкритій книзі Excel; Param - аргумент процедури VBA. Якщо аргумента процедури немає, символ "/" однаково вказується.

Значення з нерозривного діапазону клітинок активного аркуша активної книги Excel, після виконання процедури VBA, можна в скрипті отримати як результат функції GetValueRangeExcel Row,Coll,ShiftRow,ShiftColl,StrSepar[[,LastRow][,LastCol]] в якій квадратні дужки означають необов'язковість аргументу; Row і Coll - номер рядка і номер стовпчика лівої верхньої комірки діапазону аркуша; ShiftRow і ShiftCol - зміщення рядка донизу і зміщення стовпчика вправо до правої нижньої комірки діапазону; StrSepar - один або декілька символів для розділення значень в рядку отримуваного масиву; LastRow (Const) - ознака звузити діапазон до останнього заповненого рядка в першому стовпчику діапазону; LastCol (Const) - ознака звузити діапазон до останнього заповненого стовпчика у першому рядку діапазону.
Приклад виклику зі скрипта:
Код:
$Str=@DLLExec Functions.GetValueRangeExcel 12,169,19,50, ,LastRow,LastCol
$CntText=@Text.Text $Str


petrogeo писал(а):
...Мені потрібно призупинити виконання скрипта, до того моменту поки зовнішня програма не скопіює дані в буфер (а це може бути від 1 рядка до 10 000 рядків в Exsel)
Інший варіант: знаючи клас форми вікна зовнішньої програми, після її виклику в скрипті застосувати функцію @Wait 0 ClassName - очікування скрипта, поки вікно з класом форми ClassName відображається на екрані. Клас форми вікна можна подивитись цією програмою.
petrogeo писал(а):
Чи є можливість перевірити Буфер обміну (чи є в буфері значення) скриптовою функцією?
@Text.Paste з аналізом вмісту текстового блоку.

12.12.20 Додано функцію OpenFileWithAsocProcAsinhron FullFileName, яка дозволяє відкрити зі скрипта файл в програмі, асоційованій з розширенням файлу (FullFileName - повна назва файла, включаючи шлях та розширення). Скрипт Digitals буде очікувати, поки запущена програма виконується. Функція повертає рядок: "1" - якщо програма для розширення файлу знайдена і мала би запуститися; "0" - якщо відповідної програми, в асоціації з роширенням файлу, не знайдено. Приклад виклику зі скрипта
Код:
$ProgFold=@ProgramFolder
;Повна назва файла, який необхідно відкрити
$Str=$ProgFold\Favorites\Площа за координатами.xls
$Rez=@DLLExec Functions.OpenFileWithAsocProcAsinhron $Str
@If $Rez=0 then @Break Не вдається запустити $Str||Відсутня асоціація програми з розширенням файлу.
@Dialog.Message Виконано $Str

Автор:  petrogeo [ 10 дек 2020 22:39 ]
Заголовок сообщения:  Re: Все про скрипти

voha писал(а):
Інший варіант: знаючи клас форми вікна зовнішньої програми, після її виклику в скрипті застосувати функцію @Wait 0 ClassName - очікування скрипта, поки вікно з класом форми ClassName відображається на екрані. Клас форми вікна можна подивитись цією програмою.

Пробував цей варіант, не пішло.
Працюю так, запускаю код написаний на Python:
Код:
;передаю назву Excel файла в зовнішню програму
@Text.Add $SR
@Text.Copy
$FC=@Text.Count
;запуск зовнішньої програми
@Run "D:\Експорт\ExcelToClipboard.py"

Чекаю щоб відпрацював код, і скопіював дані з Excel в буфер
Код:
$FC=@Text.Count
;@While $FC<2 %stop
%Loop
;чекаю 8 секунд
@Wait 8000
;-----------------------------------------------------------------
@Text[1].Clear
@Text[1].Paste
$FC=@Text[1].Count
@if FC=0 then @Goto %Loop

Працює, але завжди є ризик, що за 8 секунд зовнішня програма передасть не ввесь вміст Excel.
Або ще варіант, замість копіювання в буфер, приходиться потрібні дані з Excel зберігати в TXT-файл, а в скрипті завантажувати вже дані з TXT.

Автор:  voha [ 11 дек 2020 10:07 ]
Заголовок сообщения:  Re: Все про скрипти

petrogeo писал(а):
Працюю так, запускаю код написаний на Python:
Код:
;передаю назву Excel файла в зовнішню програму
;запуск зовнішньої програми
@Run "D:\Експорт\ExcelToClipboard.py"
;Чекаю щоб відпрацював код, і скопіював дані з Excel в буфер

Працює, але завжди є ризик, що за 8 секунд зовнішня програма передасть не ввесь вміст Excel.
Зовнішня програма має своє вікно? Зовнішня програма відпрацьовує і закривається? Вікно Excel активне? Excel після відпрацювання скрипта Digitals можна закривати?
Скиньте в ЛС.
petrogeo писал(а):
Або ще варіант, замість копіювання в буфер, приходиться потрібні дані з Excel зберігати в TXT-файл, а в скрипті завантажувати вже дані з TXT.
А що, отримати значення з нерозривного діапазону клітинок активного аркуша активної книги Excel, не підходить?

Наприклад:
Код:
$Char=@Calc Char(9)
$Char=@DequoteText $Char
$ProgFold=@ProgramFolder
@Run $ProgFold\Favorites\Functions.xls
$Rez=@DLLExec Functions.WaitFormForClassAndCaptionActivated XLMAIN//10000
@If $Rez=0 then @Break Книга $ProgFold\Favorites\Functions.xls не відкрилася за 10с.
$Rez=@DLLExec Functions.GetValueRangeExcel 2,1,500,2,$Char,LastRow,LastCol
@DLLExec Functions.CloseWindowWithClasOrAndCaption XLMAIN/
@Dialog.Message $Rez

Автор:  fendak [ 13 дек 2020 22:35 ]
Заголовок сообщения:  Re: Все про скрипти

Підкажіть, що означає ця опція в коді панелі інструментів? Чому вона не у всіх наявна? І як її відключити?

Вложения:
2020-12-13_222132.jpg
2020-12-13_222132.jpg [ 29.67 Кб | Просмотров: 5361 ]

Автор:  voha [ 14 дек 2020 11:29 ]
Заголовок сообщения:  Re: Все про скрипти

fendak писал(а):
Підкажіть, що означає ця опція в коді панелі інструментів? Чому вона не у всіх наявна? І як її відключити?
Доброго дня.
Як відключити фоновий колір панелі інструментів? Думаю немає необхідності це робити. Просто наявність такого параметра вікна панелі інструментів - можливість його змінювати. Гадаю раніше цей колір змінювати не можна було, а тепер - можна.

Маю кілька питань до розробників:
voha писал(а):
...лишається питання: @SingleClickDialogs [1/0] - включає/виключає відображення якого діалогового вікна :?:

Ще помітив деяку особливість роботи скриптової функції @Map.CalculateZ X Y [ParamIndex]: вона повертає в різних ітераціях циклу різний результат при однакових значеннях аргументів! Прямо містика якась (на відео). Сантиметри - не суттєво, однак буває й пів-метра. В принципі і це - не біда, але сама причина в чому може бути :?:

Наперед дякую за відповідь.

P.S. Ось фрагмент скрипта
Код:
;;;;;;ВНРМ з карти для другої точки горизонтального прокладення, вирахуваного з верткута
%GetZNovWithHor
$Z2Nov=
@Map.CalculateRange
$Z2Nov=@Map.CalculateZ $X2Y2Nov
;$Z2Nov=@Calc Numeric("$Z2Nov")
@Dialog.WaitBox Визначатиметься висота точки $X2Y2Nov
;$Z2Nov=@RoundTo $Z2Nov 2
$A=@Dialog.WaitBox Висота точки $X2Y2Nov рівна $Z2Nov|Повторити?
@If $A=1 then @Goto %GetZNovWithHor

Автор:  fendak [ 14 дек 2020 18:12 ]
Заголовок сообщения:  Re: Все про скрипти

voha писал(а):
Як відключити фоновий колір панелі інструментів? Думаю немає необхідності це робити. Просто наявність такого параметра вікна панелі інструментів - можливість його змінювати. Гадаю раніше цей колір змінювати не можна було, а тепер - можна.


Проблема в тому, що наявність такої опції (колір фону - хоч насправді там ніякого кольору фону в панелі від цього немає) - це одиничний випадок. У всіх програмах навіть на найновіших версіях таке відсутнє. Підозрюю, що це десь в налаштуваннях програми є якась опція, яку користучач включив колись і вона постійно додає даний ряок. Але знайти таку не можу ніде. Суть проблеми в тому, що через додавання програмою цього рядка перестає працювати скрипт. Додається цей рядок тоді, коли панель інструментів перемістити в інше місце на екрані. Таким чином ця програма вносить свої зміни у файл tlb. Після цього скрипт уже не працює.
Найпростіший вихід тут, мабуть, перевстановити заново програму, адже за замовчуванням у всіх ця опція відключена.

Щодо функції @Map.CalculateZ, спробував в себе - в мене вона завжди видає одне значення. Але дана функція, якщо заповнений параметр Z у вхідних даних - тоді просто читає його значення. Можливо ви перед тим в коді змінній $X2Y2Nov присвоюєте окрім Х і У ще і Z якимось алгоритмом, який щось додає кожного разу до Z?

Автор:  voha [ 14 дек 2020 20:50 ]
Заголовок сообщения:  Re: Все про скрипти

fendak писал(а):
Проблема в тому, що наявність такої опції (колір фону - хоч насправді там ніякого кольору фону в панелі від цього немає) - це одиничний випадок. У всіх програмах навіть на найновіших версіях таке відсутнє.
Насправді там кольори фону в панелі є
Вложение:
Background.png
Background.png [ 20.52 Кб | Просмотров: 5339 ]
fendak писал(а):
Підозрюю, що це десь в налаштуваннях програми є якась опція, яку користучач включив колись і вона постійно додає даний ряок. Але знайти таку не можу ніде.
В константах дивилися? Хоча в константи пишуться в Ged.ini при закриванні програми. Скажу більше: зміна фонового кольору панелі інструментів не фіксується в Ged.ini ніяк. Тому цей атрибут панелі стосується кожної такої - окремо.
fendak писал(а):
Суть проблеми в тому, що через додавання програмою цього рядка перестає працювати скрипт. Додається цей рядок тоді, коли панель інструментів перемістити в інше місце на екрані. Таким чином ця програма вносить свої зміни у файл tlb. Після цього скрипт уже не працює.
Найпростіший вихід тут, мабуть, перевстановити заново програму, адже за замовчуванням у всіх ця опція відключена.
Скрипт у Вас читає текст іншого скрипта з певних рядків файла TLB, і тепер номера рядків не співпадають? Чи пропонуєте прибрати фоновий колір панелі із-за того, що у Вас скрипт перестав працювати?
fendak писал(а):
Щодо функції @Map.CalculateZ, спробував в себе - в мене вона завжди видає одне значення. Але дана функція, якщо заповнений параметр Z у вхідних даних - тоді просто читає його значення. Можливо ви перед тим в коді змінній $X2Y2Nov присвоюєте окрім Х і У ще і Z якимось алгоритмом, який щось додає кожного разу до Z?
Дякую. Ви праві.
Якщо в точці з плановими координатами $X2Y2Nov=5347324,10 1349492,79 вже є точка іншого об'єкта, і вона має висоту Z=1235,50, то @Map.CalculateZ 5347324,10 1349492,79 поверне 1235,50 (це якщо "вхідні дані" - всі об'єкти, висоти точок яких беруть участь в інтерполяції висоти). Якщо ж Ви маєте на увазі необов'язковий аргумент [ParamIndex], то це ж - не висота. До наведеного мною скрипта, треба ще й відео дивитися: там же - повідомлення скрипта. На крайняк можу скинути повний лог-файл, який я розібрав "по-кісточкам" (там всього 1500 рядочків)...

Добро. Переконали. Попробую простенький скриптик написати, і перевірю на тій самій карті.
Ще раз дякую.

Страница 74 из 83 Часовой пояс: UTC + 2 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/