Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Visual Basic Script. Основы программирования

Моховой Алексей
wanderfly@chat.ru

Все примеры скриптов действуют только в MSIE 3.0 и выше!

Предисловие

Я не ошибусь, если назову Бейсик (BASIC - Begginners Allpurpose Symbolic Instruction Code, т.е символический командный универсальный код для начинающего :) самым простым языком программирования. Даже при небольшом опыте, программы можно писать практически не задумываясь. Свою историю этот язык программирования высокого уровня начал в далеком 1963 году. Именно тогда небольшой группой студентов последнего курса Дортмутского колледжа под чутким руководством профессора Дж. Кемени и была разработана самая первая версия этого языка. В то время, помимо Бейсика, широко были распространены также Fortran, Cobol, Algol, PL/1, Focal и Pascal. Из них, до настоящего времени дожили, пожалуй лишь Паскаль и Бейсик, сильно изменившись при этом.

Как это не прискорбно для ярых противников Microsoft, но именно эта компания способствовала широкому распространению Бейсика (вспомним Quick Basic). По моему опыту писать на нем было удобнее, чем на Turbo Bacic компании Borland, которая более известна по языку C++. Повсеместная "Виндуализация" PC компьютеров, вынудила к разработке версии Бейсика для Windows приложений. Таким клоном в 1991 году стал Visual Basic, позволяющий визуально создавать прикладные программы, довольно приличного уровня. Но все же, по моему мнению, из за простоты Visual Basic сдает свои позиции тем же Си и Java. С появлением всемирной сети Internet, и языка HTML стало возможным создание активных приложений на веб страницах. Единственным языком для этих целей был Java Script. Да, именно был. Когда свет увидел Microsoft Internet Explorer 3.0, в нем, помимо поддержки Java script появилась и поддержка Visual Basic Scripting Edition, или просто VBscript. Как известно, JavaScript был разработан Netscape и поначалу стал известен как LiveScript. После шумихи вокруг Java, Netscape переименовала его в JavaScript, когда получила лицензию от Sun. Microsoft самостоятельно разработала JScript для своего броузера, за что правда тоже не избежала разбирательств с Sun.

Кроме Java, MSIE3.0 (и выше), может еще и исполнять программы на VBScript. Netscape Navigator не поддерживает пока (надеюсь, что пока) VBScript, поэтому этот язык не очень широко применяется, а многим даже не известен. А жаль, человеку умеющему писать на обычном QB достаточно месяца, а то и меньше, чтобы перейти на VBscript и создавать красивые активные веб страницы, ни чем не уступающие страницам с JavaScript и даже во многим превосходящие их. Поэтому, если с надеждой смотреть в будущее, то изучить VBScript можно уже сейчас. В этой статье я попытаюсь рассказать основы VBScript, не вдаваясь в тонкости. Моя цель, только заинтересовать рядового пользователя и начинающих WebДизайнеров. Вот и все из истории:) Начнем.

Cравнение VBScript и JavaScript

Прежде чем начинать познавать VBScript, давайте сравним две одинаковые, простые программы на JS и VBS. Это будет полезным для тех, кто знает JavaScript (к коим я не отношусь:(.
Суть программы: вводим текст в верхнее поле, нажимаем кнопку "Скопировать" и текст копируется в нижнее поле.

Java Script VB Script




<FORM NAME=forma>
<INPUT TYPE="text" NAME="text1"><BR>
<INPUT TYPE="text" NAME="text2"><BR>
<INPUT TYPE="button" NAME="knopka"
VALUE="Скопировать" OnClick=copyfun()>
</FORM>

<SCRIPT LANGUAGE="JavaScript">
function copyfun() {
  var copytext;
  copytext=document.forma.text1.value;
  document.forma.text2.value=copytext;
}
</SCRIPT>
<FORM NAME=forma>
<INPUT TYPE="text" NAME="text1"><BR>
<INPUT TYPE="text" NAME="text2"><BR>
<INPUT TYPE="button" NAME="knopka"
VALUE="Скопировать" OnClick=copyfun()>
</FORM>

<SCRIPT LANGUAGE="VBScript">
sub copyfun
  dim copytext
  copytext=document.forma.text1.value
  document.forma.text2.value=copytext
end sub
</SCRIPT>

Да, как видно, различий практически нет. JS поддерживает только функции, VBS и функции и процедуры (подпрограммы). Так же следует отметить, что VBS отличие от JS не чувствителен к регистру символов, т.е. для него что copyfun(), что CoPYfuN() - один пес:). Так что можете сделать выводы, тем, кто знает ява скрипт, будет легко освоить VBS, а тем кто не знает пока ни того не другого будет еще легче, поскольку переучиваться не придется. Учиться лучше на примерах, поэтому постараюсь их здесь приводить побольше. Я надеюсь, что Вы хотя бы умеете писать программы на обыкновенном Бейсике (QB или TB)? Тогда эта статья именно для Вас.

От QuickBasic до VBscript - один шаг

Начнем изучение не стандартным подходом. Обычно сначала все пишут программу, выводящую на экран строку "ПРИВЕТ ПИПЛЫ :)" Мы же попробуем перевести обычную "Бейсиковскую" программу - на VBscript, чтобы показать - как между ними много общего.

Поставим задачу, написать программу, которая бы случайным образом загадывала число от 1 до 100, и предлагала Вам его угадать. При неправильном предположении, программа должна выводить сообщение о том, больше загаданное число или меньше. Ведется подсчет попыток. В случае победы выводится поздравление.

Программа на обычном Бейсике:

10 CLS : RANDOMIZE
20 a = INT ( RND(1)*100+1 ) : p = 1
30 PRINT "Загадано число от 1 до 100, угадайте его:)"
40 PRINT "Ваш вариант";
50 INPUT v

60 IF a > v THEN PRINT "Загаданное число больше" :

      p = p + 1 : GOTO 40

70 IF a < v THEN PRINT "Загаданное число меньше" :

      p = p + 1 : GOTO 40

80 IF a = v THEN PRINT "Ура! Вы победили за";p;"ходов"

90 END

Как видите, такая программа пошла бы даже на БК0010:) Я даже оставил ненавистные операторы GOTO (интересно, об них еще помнят?). Для тех кто не понимает, опишу алгоритм:

10 очистка экрана и включение генератора случайных чисел.
20 переменной "a" присваивается целое случайное значение
  от 1 до 100, счетчику числа попыток присваивается 
  значение=1.
30, 40 выводится сообщение.
50 ввод Вашего варианта "v".
60 если загаданное число больше Вашего варианта, то
   выводится сообщение, на единицу увеличивается счетчик
   попыток и программа отправляется на строку 40.
70 если загаданное число меньше Вашего варианта, то 
   выводится сообщение, на единицу увеличивается счетчик
   попыток и программа отправляется на строку 40.
80 Если числа совпадут то выводится поздравление, кстати,
   по идее, проверку этого условия можно и опустить.
90 THE END

Код типичной страницы со скрипт программой будет выглядеть примерно так:

<html>
<head>
<title>Угадай число</title>
</head>
<body bgcolor="white" text="black">
< ... html код формы взаимодействия с VB программой ... >
<script language="VBscript">

... код программы ...

</script>
</body>
</html>

Итак, напишем программу реализующую заданные условия с помощью VBscript

Нажмите на кнопку "Загадать число" и угадайте его:)



Ваш вариант:

КОД ПРОГРАММЫ:

<FORM NAME=ugadai>
<INPUT TYPE="button" NAME="begin"
VALUE="Загадать число"><BR><BR>
Ваш вариант:<BR>
<INPUT TYPE="text" NAME="chislo">
<BR>
<INPUT TYPE="button" NAME="but"
VALUE="Enter">
</FORM>

<!--******************* угадай число ************************-->
<script language="vbscript"><!--
dim a		' определяем переменные
dim p
dim v

sub begin_onclick 	' процедура срабатывающая при нажатии
			  (событие onclick)
			' кнопки с именем begin
 randomize		' включение генератора случайных чисел
 a=int(rnd(1)*100+1)	' присваивание переменной (a) случайного
			  значения
 p = 1			' обнуление счетчика
 alert "число загадано" ' вывод сообщения в отдельном окне 
end sub			' конец процедуры

sub but_onclick		' процедура срабатывающая при нажатии
			 (событие onclick) кнопки с именем but

 v = document.ugadai.chislo.value 

' переменной (v) присваивается значение 
' содержащееся в поле ввода формы
' путь: документ (просто эта html страница).форма с именем ugadai.
' объект- поле для ввода с именем chislo. свойство value

 v=cint(v)	' поскольку поле для ввода содержит текстовую
		' информацию, то переменную (v) надо преобра-
 		' зовать в целочисленный тип (функция cint)

 if a > v then
   alert "загаданное число больше, попробуйте еще"
   p = p + 1
 end if

 if a < v then
   alert "загаданное число меньше, попробуйте еще"
   p = p + 1
 end if 
   
 if a = v then		  
   document.write"<center>Победа за "&p&" ходов.</center>"
 end if
		' оператор document.write выводит содержащуюся
		' в кавычках информацию в новое окно броузера
		' как html код.
				
end sub
--></script>

Если вдуматься и внимательно изучить приведенный код, то думается многое станет ясным. Ответим на некоторые вопросы, которые могут возникнуть по ходу осмысления программы:
1. Что бы произошло, если бы мы в начале скрипта не объявили переменные? Тогда бы значение переменной "a" заданной в процедуре "sub begin_onclick" не было "видно" в других процедурах (например "sub but_onclick" ). Это упущение приведет или к ошибке, или к тому, что значению "a" не будет ничего присвоено. Можно также воспользоваться оператором "public a" вместо "dim a" тогда значение "a" станет видным во всех открытых на данный момент документах, это актуально при фреймовой структуре. Если написать "dim a(100)" то будет задан массив из сотни переменных "a", в точности как в обычном Бейсике. Во многих случаях переменные можно и не объявлять, если тело программы находится в одной процедуре.
2. Что такое эти процедуры? Процедура это общее название функций или подпрограмм. Имеет синтаксис:
sub name_событие ....... end sub.
name - это имя процедуры, например мы написали, что кнопка "загадать число" называется "chislo", значит подпрограмма sub chislo_onclick выполнится при нажатии на эту кнопку.
событие - то, что может "случиться" в окне броузера. Например "onclick" означает, что процедура выполнится, при нажатии на кнопку, предварительно заданную в форме (как в нашем случае). Существует несколько видов событий. Из самых распространенных можно отметить: window_onload - запускается при полной загрузке документа:

<Script language="VBscript"><!--
Sub window_onload
Alert "Добро пожаловать на мою домашнюю страницу!"
end sub
--></Script>

При загрузке документа появится окошко с данной надписью и кнопкой ОК

Событие onmouseover - возникает при наведении указателя мыши на гипер ссылку.

Наведите на эту ссылку указатель мыши

Пример:

<a href="http://wanderfly.da.ru/" name="link">
Наведите на эту ссылку указатель мыши</a>
<script language="vbscript"><!--
sub link_onmouseover
alert "ссылка"
end sub
--></script>

Разумеется, данный пример Вы можете использовать только как шутку на ссылку "xxx", потому что нажать на нее невозможно:) Но если поменять alert "ссылка" на status="Моя домашняя страница", то это сообщение появится в строке статуса.

Каков полный синтаксис операторов указывающих как "добраться" до данных в поле ввода?

x = top.имя_фрейма.document.имя_формы.имя_объекта_text_box.value
Таким образом, можно добраться до любых данных в окне броузера, даже если они расположены в другом фрейме.

Подведем первые итоги. VBscript перенял от обычного Бейсика большинство операторов и функций (математических, преобразования данных и т.д.). Отличие выражается в специфических операторах ввода-вывода информации из окна броузера и возможных событиях, которые могут "случиться" при взаимодействии пользователя и страницы.

Справочная информация. Некоторые операторы и функции

Чтобы Вам было легче экспериментировать в написании скриптов, приведем основные операторы и функции VBscript. А то начнете писать PRINT "привет" или пытаться закончить цикл For оператором Next x :)

СИНТАКСИС ПРИМЕР ОПИСАНИЕ

Операторы работы с массивами.

Dim имя_массива (индексы) dim a(10),b(20,30) Объявление массива
Erase имя_массива erase a Очистка содержимого массива

Операторы присваивания.

переменная = значение a=137 a=b c="привет" Присваивание
Set переменная = объект set a=document.forma1 Присваивание переменной значени ссылки на объект.

Комментарии.

' комментарии ' текст  
Rem комментарии rem текст  

Константы Boolean.

переменная = False if a=false then ... Значение типа boolean равное 0
переменная = True if a=true then ... Значение типа boolean равное -1

Функции.

Abs (число) a = abs(-1.34) ... a=1.34 Абсолютное значение числа
Asc (символ) a = asc("s") ... a=115 ANSI код символа
Chr (число) a = chr(115) ... a="s" Символ соответствующий коду
Fix (число) a = fix(-1.5) ... a=-1 Целое число, округление
Int (число) a = int(-1.5) ... a=-2 Целое число, округление
Hex (число) a = hex(543) ... a="21F" Шестнадцатиричное представление
Oct (число) a = oct(543) ... a="1037" Восьмеричное представление
Sgn (число) a = sgn(-1.3) ... a=-1 Знак числа
Date a = date ... a=
Текущая дата
Day(выражение) a = day(date) ... a=
День
Time a = time ... a=
Время
Timer a = timer ... a=
Количество секунд истекших после полуночи
Now a = now ... a=
Дата и время
Hour(выражение),
Minute(выражение),
Month(выражение),
Second(выражение),
Year(выражение),
Weekday(выражение)
a = hour(now) ... и т.д. Час
Минута
Месяц
Секунда
Год
День недели (вск=1)
Atn (число) a = atn(0.37) Арктангенс
Tan (число) a = tan(0.37) Тангенс
Cos (число) a = cos(0.37) Косинус
Sin (число) a = sin(0.37) Синус
Exp (число) a = exp(0.37) Экспонента
Log (число) a = log(0.37) Логарифм
Sqr (число) a = sqr(0.37) Квадратный корень
Rnd (число) a = rnd(1) Случайное число 0..1
Randomize Randomize Установка генератора случайных чисел в исходное состояние

Операторы используемые в выражениях

Привожу просто список, надеюсь все и так ясно:
+ And / = Eqv ^ > <= Imp <> \ < => Mod * - Or & Xor

Текстовые Функции

Instr (начало, строка, искомая подстрока) If Instr(1,mail,@) then ... Возвращает номер символа в строке с которого начинается исходная подстрока
Lcase (строка) a=Lcase("ПРивЕТ") ... a="привет" Преобразование символов строки в строчные буквы
Ucase (строка) a=Ucase("ПРивЕТ") ... a="ПРИВЕТ" Преобразование символов строки в заглавные буквы
Left (строка,N символов) a=Left("Привет",3) ... a="При" Левая часть строки длинной N символов
Right (строка,N символов) a=Right("Привет",3) ... a="вет" Правая часть строки длинной N символов
Len (строка) a=Len("Привет") ... a=6 Длина строки
Ltrim (строка) a=Ltrim(" Привет ",) a="Привет " Удаляет начальные пробелы
Rtrim (строка) a=Rtrim(" Привет ",) a=" Привет" Удаляет конечные пробелы
Trim (строка) a=Ttrim(" Привет ",) a="Привет" Удаляет начальные и конечные пробелы
Mid (строка, начало, N символов) a=Mid("Привет",3,2) a="ве" Часть строки с позиции "начало" и длиной N символов
Left(строка,N символов) a=Left("Привет",3) a="При" Левая часть строки длинной N символов
Space (N) a=Space(5) Строка из N пробелов
String (N символов, символ) a=String(5,"A") a="AAAAA" Строка из N символов
Ltrim (строка) a=Ltrim(" Привет ",) a="Привет " Удаляет начальные пробелы

Ветвление и циклы

Call имя_событие Call but_onclick Вызов подпрограммы
Do
...
Loop Until условие
Do
a=a+1
Loop Until a>=5
Выполняет код хотя бы один раз, пока условие не будет истинным
Do
...
Loop While условие
Do
a=a+1
Loop While a<5
Выполняет код хотя бы один раз, пока условие справедливо
Do Until условие
...
Loop
Do Until a>=5
a=a+1
Loop
Повторяет выполнение кода, пока условие не станет истинным
Do While условие
...
Loop
Do While a<5
a=a+1
Loop
Повторяет выполнение кода, пока условие справедливо
For счетчик=начало To конец Step шаг
...
next
For i=1 to 5
a=a+1
next
Цикл (заметьте: пишется "next" а не "next i")
IF условие Then
действие1
Else
действие2
End if
IF a>1 Then alert"больше" Выполнение кода при выполнении условия
Select Case X
Case значение1
действие
Case значение2
действие2
...
End select
Select Case X
Case 10
alert"x=10"
Case 20
alert"x=20"
End select
Выборочное выполнение кода при совпадении значения
While условие
действие
Wend
While a<5
a=a+1
Wend
Выполнение кода пока условие истинно

Oбъявление функций и процедур

Dim переменная Dim a Объявление переменной
Sub имя_событие
код
End sub
Sub but_onclick
Alert x
End sub
Подпрограмма
Function имя(параметры)
код
End function
Function(x,y)
x=x*y
End function
Функция
Exit ... Exit Do (For, Function, Sub) Досрочный выход

Как вызвать сценарий в VBscript

Веб страница с активным содержимым, всегда делится как бы на две части: Первая, это html код самой страницы содержащий необходимые элементы управления (ссылки, кнопки, формы для ввода информации и т.д.), и Вторая, сценарии на скрипте, которые начинают работать при различных событиях происходящих с элементами управления. Это можно назвать главной отличительной особенностью программ для веб страниц, от обычных исполняемых приложений.

Рассмотрим основные приемы вызова сценариев, или процедур.

Сценарий вызываемый неявно:

<html>
 <head>
   <script language="VBScript">
	Sub but_onclick
	 Alert "Привет пиплы:)"
	End sub
   </script>
 </head>

 <body>
   <form>
	<input type="button" name="but">
   </form>
 </body>
</html>

Такой способ, по моему мнению, самый простой. Указываем имя оператором name="имя" в теге характерризующим элемент управления, это же "имя" пишем в вызываемой процедуре и через знак подчеркивания пишем событие, которое должно произойти для исполнения сценария.

Вызов сценария определяемый в элементе управления:

<html>

 <head>
   <script language="VBScript">
	Sub scenariy
	 Alert "Привет пиплы:)"
	End sub
   </script>
 </head>

 <body>
   <form>
	<input type="button" name="but" _
      onclick="scenariy" language="VBScript">
   </form>
 </body>
</html>

Такой способ обрадует приверженцев Java Script. Среди его преимуществ, перед первым методом можно отметить то, что один и тот же сценарий можно вызывать из разных элементов управления.

Автоматический вызов сценария:

<html>
 <body>
   <script language="VBScript">
	Alert "Привет пиплы"
   </script>
</body>
</html>

Код программы в этом случае выполнится сразу после загрузки документа.

Вызов из другой процедуры:

<html>
 
 <head>
   <script language="VBScript">
	Sub but_onclick
	  Call butalert("Привет пиплы")
	End Sub

	Sub butalert(a)
	  Alert a
	End Sub
    </script>
 </head>

<body>
   <form>
	<input type="button" name="but" _
      onclick="scenariy" language="VBScript">
   </form>
 </body>
</html>

Все способы, кроме автоматического вызова сценария, чисто визуально будут выглядеть так:

Основные типы данных VBscript

Наверное, те кто знаком со "старым" бейсиком, еще помнят, что для обозначения символьной переменной надо было писать знак бакса или солнышка (a$="привет"). В VBscript этого делать не следует, он имеет только один тип данных, называемый VARIANT. Он может содержать как символы так и числа разной точности. Поэтому для того, чтобы точно определить тип данных, желательно использовать функции преобразования. К примеру, текст вводимый в поле формы имеет текстовый формат, и попытка сложить цифру "3" с цифрой "2" приведет к результату "32":



<Script language="VBscript">
sub summa
 	  summatext1=document.formasum.summa1.value
	  summatext2=document.formasum.summa2.value
	  alert summatext1+summatext2
end sub
</Script>

Поэтому надо сделать так, чтобы переменные summatext1 и summatext2 были преобразованы в целые числа функцией Cint(переменная):



<Script language="VBscript">
sub summa
 	  summatext1=Cint(document.formasum.summa1.value)
	  summatext2=Cint(document.formasum.summa2.value)
	  alert summatext1+summatext2
end sub
</Script>

Подтипы данных VARIANT.

ПОДТИП ФУНКЦИЯ ПРЕОБРАЗОВАНИЯ ОПИСАНИЕ

Epty - Автоматически присваивается новым переменным, когда им еще не присвоено явное значение.
Null - Указывает на то, что переменная не содержит допустимых данных.
Boolean CBool(x) Используется для обозначения логических переменных, принимающих два допустимых значения True или False
Byte CByte(x) Самый короткий тип данных принимающий значение 0..255
Integer CInt(x) Целый тип в пределах -32768 .. 32768
Long CLng(x) Длинный тип целой переменной в пределах -2147483648 .. 2147483647
Single CSngl(x) Тип чисел с плавающей точкой одинарной точности
Double CDbl(x) Тип чисел с плавающей точкой двойной точности
Date/Time CDate(x) Число в формате отображающее время и дату от 1 января 100 года до 31 декабря 9999 года
Currency CCur(x) Специальный числовой формат для денежных величин
String CStr(x) Символьные тип данных
Object - Ссылка на объекты ole, html, ActiveX
Error - Тип данных предназначенный для хранения номеров ошибок

Некоторые правила VBscript

В заключении следует упомянуть некоторые основные приемы при написании кода скрипта.

Если код не умещается в одной строке, то можно использовать символ продолжения строки:

if a=1 and b=2 or c=3 then alert a
  можно написать как
if    a=1 _
  and b=2 _
   or c=3 _
then alert a

Для "склеивания" двух численных переменных лучше использовать знак "&" чем "+", т.е. a="при" b="вет" тогда a&b="привет"

Код сценария желательно, на всякий случай, заключать в теги комментария <Script language="Vbscript><!-- код --></script>

Заключение

Я уже говорил, что моей задачей не было рассказать все и вся про VBscript, в статье были приведены только справочные данные и основные методы, пригодные для написания простейших сценариев, без применения ActiveX технологии. Тем, кого заинтересовал этот язык программирования, можно порекомендовать книгу (из бумаги :) "Изучаем VBscript" автор Пол Ломакс. Некоторые справочные данные я брал именно из нее.

При большой фантазии, на VBscript можно создать и полноценные приложения, как, к примеру Перекодировщик Rus-Translit или HTML редактор. Так что дерзайте!

Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...