Домашняя страница Undo Do Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Подставить значения с одной таблицы в другую - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: _Boroda_, китин  
Мир MS Excel » Вопросы и решения » Excel и другие приложения » Access » Подставить значения с одной таблицы в другую
Подставить значения с одной таблицы в другую
DJ_Marker_MC Дата: Пятница, 16.01.2015, 12:10 | Сообщение № 1
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Всем добрый день.
Коллеги, прошу помочь с решением проблемы.
Имею таблицу акцесс по продажам и время от времени приходится в ней править отдельные наименования. Когда нужно исправить 1-2 наименования - это не проблема ручками, а когда нужно исправить 70 наименований в базе весом 1-2гига то понял, что без какого нибудь sql запроса никак.
Простыми словами нужен ВПР для акцесс)))
Есть столбец с наименованием зафиксированной базы и есть таблица с которой нужно выдернуть по коду имена.
В аттаче мини файл с двумя таблицам для поля действия.
Заранее благодарен за помощь.
К сообщению приложен файл: base.rar (19.7 Kb)
 
Ответить
СообщениеВсем добрый день.
Коллеги, прошу помочь с решением проблемы.
Имею таблицу акцесс по продажам и время от времени приходится в ней править отдельные наименования. Когда нужно исправить 1-2 наименования - это не проблема ручками, а когда нужно исправить 70 наименований в базе весом 1-2гига то понял, что без какого нибудь sql запроса никак.
Простыми словами нужен ВПР для акцесс)))
Есть столбец с наименованием зафиксированной базы и есть таблица с которой нужно выдернуть по коду имена.
В аттаче мини файл с двумя таблицам для поля действия.
Заранее благодарен за помощь.

Автор - DJ_Marker_MC
Дата добавления - 16.01.2015 в 12:10
Serge_007 Дата: Пятница, 16.01.2015, 12:27 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
ВПР для акцесс
Женя, здесь не смотрел?


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
ВПР для акцесс
Женя, здесь не смотрел?

Автор - Serge_007
Дата добавления - 16.01.2015 в 12:27
Pelena Дата: Пятница, 16.01.2015, 12:34 | Сообщение № 3
Группа: Админы
Ранг: Местный житель
Сообщений: 19187
Репутация: 4421 ±
Замечаний: ±

Excel 365 & Mac Excel
Как-то так
[vba]
Код
UPDATE база INNER JOIN подставить ON база.кодТ = подставить.кодТ SET база.имя = подставить.имя;
[/vba]
К сообщению приложен файл: base-1-.rar (23.1 Kb)


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеКак-то так
[vba]
Код
UPDATE база INNER JOIN подставить ON база.кодТ = подставить.кодТ SET база.имя = подставить.имя;
[/vba]

Автор - Pelena
Дата добавления - 16.01.2015 в 12:34
Gustav Дата: Пятница, 16.01.2015, 12:41 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1137 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Если таблица, в которой надо заменить значения ("база") не очень большая (несколько сотен или тысяч записей), то можно одним запросом обновления:
[vba]
Код
UPDATE база INNER JOIN подставить   
ON база.кодТ = подставить.кодТ AND база.Код = подставить.Код   
SET база.имя = подставить.имя
[/vba]
Этот текст нужно ввести в запрос в конструкторе.

Если же таблица "база" имеет размер 2 гига, то такой подход чреват долгим выполнением и большим отжором памяти запросом под свои нужды. В этом случае лучше писать цикл обновления по одной записи, используя DAO или ADO.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Пятница, 16.01.2015, 12:42
 
Ответить
СообщениеЕсли таблица, в которой надо заменить значения ("база") не очень большая (несколько сотен или тысяч записей), то можно одним запросом обновления:
[vba]
Код
UPDATE база INNER JOIN подставить   
ON база.кодТ = подставить.кодТ AND база.Код = подставить.Код   
SET база.имя = подставить.имя
[/vba]
Этот текст нужно ввести в запрос в конструкторе.

Если же таблица "база" имеет размер 2 гига, то такой подход чреват долгим выполнением и большим отжором памяти запросом под свои нужды. В этом случае лучше писать цикл обновления по одной записи, используя DAO или ADO.

Автор - Gustav
Дата добавления - 16.01.2015 в 12:41
DJ_Marker_MC Дата: Пятница, 16.01.2015, 12:50 | Сообщение № 5
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Сережа, по ссылке что то не совсем то, формы используются и вопрос как я понял именно к формам.
Лена, кажется именно то что нужно, пошел тестить на большом файле)))
 
Ответить
СообщениеСережа, по ссылке что то не совсем то, формы используются и вопрос как я понял именно к формам.
Лена, кажется именно то что нужно, пошел тестить на большом файле)))

Автор - DJ_Marker_MC
Дата добавления - 16.01.2015 в 12:50
DJ_Marker_MC Дата: Пятница, 16.01.2015, 12:53 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Gustav, два файла, в одном 1.8млн строк, во втором пока что 1.1
Так что таблица большая((
В этом случае лучше писать цикл обновления по одной записи, используя DAO или ADO.

мало того что я практически не знаком с SQL-запросами, вы мне решили контрольный в голову? ))))) :D
 
Ответить
СообщениеGustav, два файла, в одном 1.8млн строк, во втором пока что 1.1
Так что таблица большая((
В этом случае лучше писать цикл обновления по одной записи, используя DAO или ADO.

мало того что я практически не знаком с SQL-запросами, вы мне решили контрольный в голову? ))))) :D

Автор - DJ_Marker_MC
Дата добавления - 16.01.2015 в 12:53
TimSha Дата: Пятница, 16.01.2015, 12:59 | Сообщение № 7
Группа: Проверенные
Ранг: Ветеран
Сообщений: 627
Репутация: 94 ±
Замечаний: 0% ±

Excel 2013 Pro +
Как вариант для тренировки.
Запрос (Запрос1) на создание таблицы.
Таблица "Obnova" строится при совпадении первых двух полей обеих таблиц - добавляются данные третьего поля.
По образу и подобию можно построить запрос на обновление.
К сообщению приложен файл: ZXC_base.rar (22.4 Kb)


"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Ответить
СообщениеКак вариант для тренировки.
Запрос (Запрос1) на создание таблицы.
Таблица "Obnova" строится при совпадении первых двух полей обеих таблиц - добавляются данные третьего поля.
По образу и подобию можно построить запрос на обновление.

Автор - TimSha
Дата добавления - 16.01.2015 в 12:59
Gustav Дата: Пятница, 16.01.2015, 13:06 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1137 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
мало того что я практически не знаком с SQL-запросами, вы мне решили контрольный в голову?

Ничего страшного! Цикл выглядит гораздо проще, чем можно было бы предположить:
[vba]
Код
Sub upd()
     Dim rst As DAO.Recordset
     Set rst = CurrentDb.OpenRecordset("база")
     Do While Not rst.EOF
         rst.Edit
         rst("имя") = DLookup("имя", "подставить", "[код] = " & rst("код") & " And [кодТ] = " & rst("кодТ"))
         rst.Update
         rst.MoveNext
     Loop
End Sub
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
мало того что я практически не знаком с SQL-запросами, вы мне решили контрольный в голову?

Ничего страшного! Цикл выглядит гораздо проще, чем можно было бы предположить:
[vba]
Код
Sub upd()
     Dim rst As DAO.Recordset
     Set rst = CurrentDb.OpenRecordset("база")
     Do While Not rst.EOF
         rst.Edit
         rst("имя") = DLookup("имя", "подставить", "[код] = " & rst("код") & " And [кодТ] = " & rst("кодТ"))
         rst.Update
         rst.MoveNext
     Loop
End Sub
[/vba]

Автор - Gustav
Дата добавления - 16.01.2015 в 13:06
DJ_Marker_MC Дата: Пятница, 16.01.2015, 13:31 | Сообщение № 9
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Gustav, это ж его в модуль (макрос?).
Если да, то на маленьком примере все отлично сработало.
Сейчас запустил на большой таблице 1.8 млн, пошла уже десятая минута как обрабатывает
Кстати, а если в таблице подставить не будет какого то кода что есть в базе, оно пропустит и оставит то что есть?

up: похоже что нет((( те которых нет в таблице подстановки просто пусто стало

[offtop]блин, какой он замороченный этот акцес[/offtop]
 
Ответить
СообщениеGustav, это ж его в модуль (макрос?).
Если да, то на маленьком примере все отлично сработало.
Сейчас запустил на большой таблице 1.8 млн, пошла уже десятая минута как обрабатывает
Кстати, а если в таблице подставить не будет какого то кода что есть в базе, оно пропустит и оставит то что есть?

up: похоже что нет((( те которых нет в таблице подстановки просто пусто стало

[offtop]блин, какой он замороченный этот акцес[/offtop]

Автор - DJ_Marker_MC
Дата добавления - 16.01.2015 в 13:31
DJ_Marker_MC Дата: Пятница, 16.01.2015, 13:51 | Сообщение № 10
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Gustav, поскольку это макрос то, проверку условия добавить смог)))

[vba]
Код
Sub upd()
     Dim rst As DAO.Recordset
     Set rst = CurrentDb.OpenRecordset("база")
     Do While Not rst.EOF
         rst.Edit
         rst("имя") = DLookup("имя", "подставить", "[кодТ] = " & rst("кодТ"))
             If rst("имя") <> "" Then
              rst.Update
              rst.MoveNext
             End If
     Loop
End Sub
[/vba]
 
Ответить
СообщениеGustav, поскольку это макрос то, проверку условия добавить смог)))

[vba]
Код
Sub upd()
     Dim rst As DAO.Recordset
     Set rst = CurrentDb.OpenRecordset("база")
     Do While Not rst.EOF
         rst.Edit
         rst("имя") = DLookup("имя", "подставить", "[кодТ] = " & rst("кодТ"))
             If rst("имя") <> "" Then
              rst.Update
              rst.MoveNext
             End If
     Loop
End Sub
[/vba]

Автор - DJ_Marker_MC
Дата добавления - 16.01.2015 в 13:51
Gustav Дата: Пятница, 16.01.2015, 14:01 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1137 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
а если в таблице подставить не будет какого то кода что есть в базе, оно пропустит и оставит то что есть?

В этом случае, если не позаботиться If'ами, DLookup вернет пустое значение и, соответственно, оно же и пропишется, что и получилось. Точнее, DLookup вернет значение Null и чтобы преобразовать его к пустой строке, надо будет обернуть вызов функцией Nz: = Nz(DLookup(...))

Теперь про проверку. Если rst.Edit отработал, то хорошая практика состоит в том, чтобы rst.Update тоже отработал. Ну и конечно rst.MoveNext должен всегда отрабатывать, иначе можно зависнуть на очередной записи и никогда не дойти до конца таблицы. Надо просто результат DLookup брать в промежуточную переменную и уже ее анализировать и присваивать или не присваивать rst("имя").

[vba]
Код
Sub upd()
      Dim rst As DAO.Recordset
      Dim tmp as String

      Set rst = CurrentDb.OpenRecordset("база")
      Do While Not rst.EOF
          tmp = Nz(DLookup("имя", "подставить", "[кодТ] = " & rst("кодТ")))
              If tmp <> "" Then
                  rst.Edit
                  rst("имя") = tmp
                  rst.Update
              End If
          rst.MoveNext
      Loop
End Sub
[/vba]


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Пятница, 16.01.2015, 14:14
 
Ответить
Сообщение
а если в таблице подставить не будет какого то кода что есть в базе, оно пропустит и оставит то что есть?

В этом случае, если не позаботиться If'ами, DLookup вернет пустое значение и, соответственно, оно же и пропишется, что и получилось. Точнее, DLookup вернет значение Null и чтобы преобразовать его к пустой строке, надо будет обернуть вызов функцией Nz: = Nz(DLookup(...))

Теперь про проверку. Если rst.Edit отработал, то хорошая практика состоит в том, чтобы rst.Update тоже отработал. Ну и конечно rst.MoveNext должен всегда отрабатывать, иначе можно зависнуть на очередной записи и никогда не дойти до конца таблицы. Надо просто результат DLookup брать в промежуточную переменную и уже ее анализировать и присваивать или не присваивать rst("имя").

[vba]
Код
Sub upd()
      Dim rst As DAO.Recordset
      Dim tmp as String

      Set rst = CurrentDb.OpenRecordset("база")
      Do While Not rst.EOF
          tmp = Nz(DLookup("имя", "подставить", "[кодТ] = " & rst("кодТ")))
              If tmp <> "" Then
                  rst.Edit
                  rst("имя") = tmp
                  rst.Update
              End If
          rst.MoveNext
      Loop
End Sub
[/vba]

Автор - Gustav
Дата добавления - 16.01.2015 в 14:01
DJ_Marker_MC Дата: Пятница, 16.01.2015, 14:14 | Сообщение № 12
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Gustav, я правильно понял Вашу корректировку?
[vba]
Код
Sub upd()
      Dim rst As DAO.Recordset
      Set rst = CurrentDb.OpenRecordset("база")
      Do While Not rst.EOF
          rst.Edit
          NewName = DLookup("имя", "подставить", "[кодТ] = " & rst("кодТ"))
          If NewName <> "" Then
              rst("имя") = NewName
          End If
          rst.Update
          rst.MoveNext
      Loop
End Sub
[/vba]

up: пока писал, вы успели добавить и код.
 
Ответить
СообщениеGustav, я правильно понял Вашу корректировку?
[vba]
Код
Sub upd()
      Dim rst As DAO.Recordset
      Set rst = CurrentDb.OpenRecordset("база")
      Do While Not rst.EOF
          rst.Edit
          NewName = DLookup("имя", "подставить", "[кодТ] = " & rst("кодТ"))
          If NewName <> "" Then
              rst("имя") = NewName
          End If
          rst.Update
          rst.MoveNext
      Loop
End Sub
[/vba]

up: пока писал, вы успели добавить и код.

Автор - DJ_Marker_MC
Дата добавления - 16.01.2015 в 14:14
Gustav Дата: Пятница, 16.01.2015, 14:16 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1137 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
я правильно понял Вашу корректировку?

Почти. См. выше :) также я там добавил важное замечание про Nz. И если не собираемся обновлять запись, то и Edit/Update лишний раз делать не надо, поэтому их надо внутрь If


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Пятница, 16.01.2015, 14:17
 
Ответить
Сообщение
я правильно понял Вашу корректировку?

Почти. См. выше :) также я там добавил важное замечание про Nz. И если не собираемся обновлять запись, то и Edit/Update лишний раз делать не надо, поэтому их надо внутрь If

Автор - Gustav
Дата добавления - 16.01.2015 в 14:16
DJ_Marker_MC Дата: Пятница, 16.01.2015, 14:22 | Сообщение № 14
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Gustav, уже заметил и понял что так будет быстрее, поскольку лишний раз не будет отрабатывать Edit/Update
Но не совсем понял с Nz, у меня и без Nz смотрю проходит проверку отсутствующие строки
тоесть когда
[vba]
Код
NewName = DLookup("имя", "подставить", "[кодТ] = " & rst("кодТ"))
[/vba]
показывает NULL,
то NewName <> "" ровняется как и положено Ложь, а значит что NULL все же равен "" или я не правильно понял роль Nz она все же необходима?
 
Ответить
СообщениеGustav, уже заметил и понял что так будет быстрее, поскольку лишний раз не будет отрабатывать Edit/Update
Но не совсем понял с Nz, у меня и без Nz смотрю проходит проверку отсутствующие строки
тоесть когда
[vba]
Код
NewName = DLookup("имя", "подставить", "[кодТ] = " & rst("кодТ"))
[/vba]
показывает NULL,
то NewName <> "" ровняется как и положено Ложь, а значит что NULL все же равен "" или я не правильно понял роль Nz она все же необходима?

Автор - DJ_Marker_MC
Дата добавления - 16.01.2015 в 14:22
Gustav Дата: Пятница, 16.01.2015, 14:52 | Сообщение № 15
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1137 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
то NewName <> "" ровняется как и положено Ложь, а значит что NULL все же равен ""

Не совсем. Результатом выражений Null <> "" или Null = "" будет не Ложь, а Null в обоих случаях. И поскольку Null это НЕ Истина, то мы и не заходим в If. Т.е. в принципе нужное нам поведение соблюдается. Но для уверенности контроля я бы поставил Nz (как и делал в подобных случаях раньше, когда довольно много прогил на Акцесе).


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
то NewName <> "" ровняется как и положено Ложь, а значит что NULL все же равен ""

Не совсем. Результатом выражений Null <> "" или Null = "" будет не Ложь, а Null в обоих случаях. И поскольку Null это НЕ Истина, то мы и не заходим в If. Т.е. в принципе нужное нам поведение соблюдается. Но для уверенности контроля я бы поставил Nz (как и делал в подобных случаях раньше, когда довольно много прогил на Акцесе).

Автор - Gustav
Дата добавления - 16.01.2015 в 14:52
DJ_Marker_MC Дата: Пятница, 16.01.2015, 14:56 | Сообщение № 16
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Отчитываюсь.
Макрос Константина в файле весом 1.2Гб в котором содержится 1 864 670 строк и 28 столбцов провел замену по одному столбцу не больше не меньше РОВНО за 10 мин.

Большое спасибо за помощь.
 
Ответить
СообщениеОтчитываюсь.
Макрос Константина в файле весом 1.2Гб в котором содержится 1 864 670 строк и 28 столбцов провел замену по одному столбцу не больше не меньше РОВНО за 10 мин.

Большое спасибо за помощь.

Автор - DJ_Marker_MC
Дата добавления - 16.01.2015 в 14:56
Gustav Дата: Пятница, 16.01.2015, 14:58 | Сообщение № 17
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1137 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
это ж его в модуль (макрос?).
Кстати! Хотел заостриться. С понятием "макрос" в Access надо аккуратнее. Дело в том, что в нём как объекты приложения есть и Модули, и Макросы. Модули - это VBA, а Макросы - это процедуры на специфическом встроенном языке команд. Ну, а мы конечно по традиции по-эксельному говорим о макросах, имея в виду процедуры VBA - и прекрасно понимаем друг друга! ))


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Пятница, 16.01.2015, 14:59
 
Ответить
Сообщение
это ж его в модуль (макрос?).
Кстати! Хотел заостриться. С понятием "макрос" в Access надо аккуратнее. Дело в том, что в нём как объекты приложения есть и Модули, и Макросы. Модули - это VBA, а Макросы - это процедуры на специфическом встроенном языке команд. Ну, а мы конечно по традиции по-эксельному говорим о макросах, имея в виду процедуры VBA - и прекрасно понимаем друг друга! ))

Автор - Gustav
Дата добавления - 16.01.2015 в 14:58
Pelena Дата: Пятница, 16.01.2015, 14:59 | Сообщение № 18
Группа: Админы
Ранг: Местный житель
Сообщений: 19187
Репутация: 4421 ±
Замечаний: ±

Excel 365 & Mac Excel
А мой запрос? (Ну так, из любопытства)


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеА мой запрос? (Ну так, из любопытства)

Автор - Pelena
Дата добавления - 16.01.2015 в 14:59
DJ_Marker_MC Дата: Пятница, 16.01.2015, 15:07 | Сообщение № 19
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
Лена, Ваш запрос хорош но для маленьких файлов, как и писал выше Костя
Если же таблица "база" имеет размер 2 гига, то такой подход чреват долгим выполнением и большим отжором памяти запросом под свои нужды.

То в моем случае запрос вообще не выполнился поругавшись на недостаток оперативной памяти
на всякий случай)):


но при небольших объемах я бы отдал предпочтение запросу, так как уверен будет намного быстрее макроса.

Но все равно не могу понять, неужели в акцесс нет реально простой возможности через какие нибудь связи подставить значения легко и быстро в нужный столбец? ((
 
Ответить
СообщениеЛена, Ваш запрос хорош но для маленьких файлов, как и писал выше Костя
Если же таблица "база" имеет размер 2 гига, то такой подход чреват долгим выполнением и большим отжором памяти запросом под свои нужды.

То в моем случае запрос вообще не выполнился поругавшись на недостаток оперативной памяти
на всякий случай)):


но при небольших объемах я бы отдал предпочтение запросу, так как уверен будет намного быстрее макроса.

Но все равно не могу понять, неужели в акцесс нет реально простой возможности через какие нибудь связи подставить значения легко и быстро в нужный столбец? ((

Автор - DJ_Marker_MC
Дата добавления - 16.01.2015 в 15:07
Pelena Дата: Пятница, 16.01.2015, 15:12 | Сообщение № 20
Группа: Админы
Ранг: Местный житель
Сообщений: 19187
Репутация: 4421 ±
Замечаний: ±

Excel 365 & Mac Excel
Понятно, спасибо)


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеПонятно, спасибо)

Автор - Pelena
Дата добавления - 16.01.2015 в 15:12
Мир MS Excel » Вопросы и решения » Excel и другие приложения » Access » Подставить значения с одной таблицы в другую
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!