«1С:Профессионал» по технологическим вопросам (Раздел 6)

Запросы и методы их оптимизации

Вопрос 6.1
При помощи каких инструментов возможно получить план запроса, формируемый SQL Server?

1. SQL Server Profiler.
2. Технологический журнал.
3. ЦУП.
4. ЦКК.
5. Верны варианты 1,2,3.
6. Верны варианты 1,2,4.

Вопрос 6.2
Какой элемент должен присутствовать в настройках технологического журнала для включения сбора планов запросов?

1. sql
2. plansql
3. sqlplan
4. plan
5. excp

Если элемент <plansql> присутствует, то будет включен сбор планов запросов, которые генерируют СУБД при выполнении запросов «1С:Предприятия».

Источники:
ИТС: Элемент plansql

Вопрос 6.3
Какая пара событий в SQL Server Profiler позволяет получить как графическое, так и текстовое представление плана запроса?

1. Performance\Showplan Statistics Profile и Performance\Showplan XML Statistics Profile
2. Locks\Lock:Acquired и Locks\Lock:Timeout
3. Performance\Plan Guide Successful и Performance\Plan Guide Unsuccessful
4. Performance\SQL:FullTextQuery и Performance\Auto Stats
5. Performance\Showplan Query Profile и Performance\Showplan XML Query Profile

Вопрос 6.4
Что такое Index Scan?

1. Логический и физический оператор, который извлекает все строки из кластеризованного индекса, указанного в колонке Argument.
2. Физический оператор, который вставляет строки из своего ввода в некластеризованный индекс, указанный в колонке Argument.
3. Логический и физический оператор, который извлекает все строки из некластеризованного индекса, указанного в колонке Argument.
4. Физический оператор, который удаляет строки ввода из некластеризованного индекса, указанного в колонке Argument. Если есть указатель WHERE:(), то удаляются только те строки, которые соответствуют указателю.
5. Физический оператор, который является частью цепочки (группы) объединенных hash-операторов, отображающих общую hash- функцию и разделяющих общую стратегию.

Index Scan — оператор получает все записи некластерного индекса, указанного в столбце Argument. Index Scan является логическим и физическим оператором.

Ссылки:
Эксперт (стр. 101)

Вопрос 6.5
Что такое план запроса?

1. Последовательность физических и логических операций, необходимых для получения результата SQL-запроса.
2. Запрос, описанный в коде конфигурации 1С:Предприятия.
3. Предварительная структура итоговой таблицы запроса.
4. Запрос, формируемый платформой 1С:Предприятия для исполнения на сервере СУБД.

План запроса состоит из операторов. Фактически план запроса –это дерево физических операторов.
Операторы описывают, как SQL Server выполняет запрос. Оптимизатор запросов использует операторы для построения плана запроса, чтобы создать результат, заданный в запросе.

Ссылки:
Эксперт (стр. 98)

Вопрос 6.6
Что такое Index Seek?

1. Логический и физический оператор, который использует возможность поиска индексов с целью извлечения строк из некластеризованного индекса.
2. Физический оператор, обновляющий строки из его ввода в некластеризованном индексе, соответствующем колонке Argument.
3. Логический и физический оператор, который использует возможность поиска индексов с целью извлечения строк из кластеризованного индекса.
4. Логический и физический оператор, сканирующий журнал транзакций.
5. Логический оператор, который извлекает все строки из некластеризованного индекса, указанного в колонке Argument.

Index Seek — оператор использует возможности поиска по индексам для получения строк из некластерного индекса, указанного в столбце Argument. Index Seek является логическим и физическим оператором

Ссылки:
Эксперт (стр. 102)

Вопрос 6.7
Что такое Clustered Index Scan?

1. Физический оператор, который вставляет строки из ввода в кластеризованный индекс, соответствующий в колонке Argument.
2. Логический и физический оператор, который сканирует кластеризованный индекс, определенный в колонке Argument.
3. Логическая и физическая операция, использующая поисковую способность индексов извлекать хранимые строки из кластеризованного индекса.
4. Логический и физический оператор, сканирующий журнал транзакций.

Clustered Index Scan — оператор сканирует кластерный индекс, указанный в столбце Argument. Clustered Index Scan является логическим и физическим оператором.

Вопрос 6.8
Что такое Clustered Index Seek?

1. Физический оператор, обновляющий исходные строки, указанные в колонке Argument, в кластеризованном индексе.
2. Логический и физический оператор, который использует возможность поиска индексов с целью извлечения строк из некластеризованного индекса.
3. Логический и физический оператор, который отсканирует дистанционный объект, используя кластер.
4. Логический и физическая оператор, использующий поисковую способность индексов извлекать хранимые строки из кластеризованного индекса.

Clustered Index Seek — оператор использует поисковые возможности индексов для получения строк из кластерного индекса, указанного в столбце Argument. Clustered Index Seek – это логический и физический оператор.

Ссылки:
Эксперт (стр. 102)

Вопрос 6.9
Что такое Table Scan?

1. Физический оператор, опционально группирующий набор колонок и высчитывающий один или несколько агрегирующих выражений, возвращенных запросом.
2. Физический оператор, вставляющий строки из своего ввода в таблицу по колонке Argument.
3. Логический и физический оператор, сканирующий журнал транзакций.
4. Логический и физический оператор, возвращающий все строки из таблицы, указанной в колонке Argument.
5. Логический и физический оператор, сканирующий строки из таблицы, указанной в колонке Argument, в объеме, указанном в условии WHERE.

Вопрос 6.10
В чем отличие Clustered Index Scan от Table Scan?

1. Clustered Index Scan сканирует кластерный индекс, а Table Scan возвращает все строки из таблицы, указанной в колонке Argument
2. Clustered Index Scan может сканировать часть таблицы, а Table Scan — только таблицу полностью.
3. Clustered Index Scan используется для сканирования сортированных таблиц целиком, а Table Scan — несортированных.
4. Верны ответы 1 и 2.
5. Верны ответы 1 и 3.

Вопрос 6.11
В чем отличие Clustered Index Scan от Index Scan?

1. Clustered Index Scan сканирует таблицу целиком, а Index Scan может сканировать часть таблицы.
2. Clustered Index Scan используется для сканирования сортированных и несортированных таблиц, а Index Scan — только для несортированных.
3. Отличия связаны с версией SQL Server.
4. Clustered Index Scan — операция, выполняемая над кластерным индексом, а Index Scan — операция, выполняющая сканирование некластерного индекса

Вопрос 6.12
Чтобы найти длительный запрос MS SQL Server, получение какого события следует прописать в файле настроек технологического журнала?

1. DBMSSQL с фильтром по полю Lock:Acquired.
2. DBMSSQL с фильтром по полю Durations.
3. VRSREQUEST с фильтром по полю Duration.
4. EXCP с фильтром по полю Duration.
5. Нет верного ответа.

Вопрос 6.13
Будет ли событие записано в технологический журнал в момент своего начала (например, при начале выполнения запроса)?

1. Да, если в настройках технологического журнала, указать событие CALL и SCALL.
2. Нет.
3. Да.
4. Да, но только в файловом варианте.

Вопрос 6.14
Выберите верное утверждение.

1. В автоматическом режиме управления блокировками необходимо всегда использовать в запросе конструкцию ДЛЯ ИЗМЕНЕНИЯ.
2. Конструкция ДЛЯ ИЗМЕНЕНИЯ используется, чтобы вместо разделяемой блокировки установить блокировку обновления.
3. Конструкция ДЛЯ ИЗМЕНЕНИЯ используется, чтобы вместо разделяемой блокировки установить блокировку исключительную в управляемом режиме блокировок.
4. В управляемом режиме управления блокировками конструкция ДЛЯ ИЗМЕНЕНИЯ в запросе используется для защиты от взаимоблокировки, которая возникает при повышении уровня изоляции транзакции.

Вопрос 6.15
Конструкция ДЛЯ ИЗМЕНЕНИЯ в запросах используется для защиты от взаимоблокировки, которая возникает при повышении уровня блокировки в транзакциях с уровнем изоляции:

1. Repeatable Read.
2. Read Committed.
3. Serializable.
4. Верны варианты 1 и 2.
5. Верны варианты 1 и 3
6. Верны варианты 2 и 3.

Вопрос 6.16
Что такое DDL?

1. Язык манипулирования данными, предназначенный для поддержки базы данных.
2. Язык запросов к данным, предназначенный для построения запросов к базе данных.
3. Язык управления данными, предназначенный для обеспечения защиты базы данных.
4. Язык определения данных, предназначенный для создания, удаления и модификации таблиц базы данных.

Data Definition Language (DDL) (язык описания данных) — это семейство компьютерных языков, используемых в компьютерных программах для описания структуры баз данных.

Ссылки:
Wikipedia: Data Definition Language

Вопрос 6.17
Что такое DCL?

1. Язык определения данных, предназначенный для создания, модификации и удаления таблицы или базы данных.
2. Язык управления данными, предназначенный для обеспечения защиты базы данных.
3. Язык манипулирования данными, предназначенный для поддержки базы данных.
4. Язык запросов к данным, предназначенный для построения запросов к базе данных.

Data Control Language (DCL) — подмножество языка управления базами данных SQL, предназначенное для осуществления административных операций, присваивающих или отменяющих право (привилегию) использовать базу данных, таблицы и другие объекты базы данных, а также выполнять те или иные операторы SQL.

Ссылки:
Wikipedia: Data Control Language

Вопрос 6.18
Что такое DML?

1. Семейство компьютерных языков, используемых в компьютерных программах или пользователями баз данных для получения, вставки, удаления или изменения данных в базах данных.
2. Семейство компьютерных языков, предназначенных для построения запросов к базе данных.
3. Семейство компьютерных языков, предназначенных для создания, удаления и модификации таблиц базы данных.
4. Семейство компьютерных языков, предназначенных для обеспечения защиты базы данных.

Data Manipulation Language (DML) (язык управления (манипулирования) данными) — это семейство компьютерных языков, используемых в компьютерных программах или пользователями баз данных для получения, вставки, удаления или изменения данных в базах данных.

Ссылки:
Wikipedia: Data Manipulation Language

Вопрос 6.19
План запроса нужен для:

1. передачи запроса с сервера приложений 1С на сервер СУБД.
2. выбора, каким способом будет выполняться запрос 1С на СУБД.
3. анализа статистики, актуальности и количества данных в СУБД для формирования запроса.
4. формирования последовательности операций, необходимых для получения результата запроса в СУБД.

Вопрос 6.20
Информацию о каких событиях рекомендуется получить в трассировке SQL Profiler для того, чтобы получить текстовый и графический план запроса, текст запроса, длительность выполнения?

1. SQL:BatchCompleted, RPC:Completed, Showplan Statistic Profile, Showplan XML.
2. SQL:StmtCompleted, RPC:Starting, Showplan Statistic Profile, Showplan XML
3. SQL:BatchCompleted, RPC:Completed, Showplan Statistic Profile, Showplan XML Statistic Profile.
4. SQL:BatchCompleted, RPC:Completed, SQL:FullTextQuery.

Вопрос 6.21
Чем отличаются события Showplan XML и Showplan XML Statistic Profile?

1. Showplan XML не содержит важной для нас информации о фактическом количестве строк и количестве выполнений операторов.
2. Showplan XML — скомпилированный план запроса, полученный до выполнения по этому плану, Showplan XML Statistic Profile — план, включающий реальную статистику после выполнения запроса по этому плану.
3. Showplan XML Statistic Profile — скомпилированный план запроса, полученный до выполнения по этому плану, Showplan XML — план, включающий реальную статистику после выполнения запроса по этому плану.
4. Showplan XML Statistic Profile и Showplan XML эквивалентны
5. Верны ответы 1 и 3.

Вопрос 6.22
Чем отличаются события Showplan XML и Showplan XML for Query Compile?

1. Showplan XML — показывается перед каждым выполнением запроса, Showplan XML for Query Compile — показывается после выполнения запроса
2. Showplan XML — показывается перед каждым выполнением запроса, Showplan XML for Query Compile — не показывается при повторном исполнении, т.к. план берется из кэша.
3. Showplan XML — показывает ожидаемую информацию, Showplan XML for Query Compile — фактическую.
4. Showplan XML и Showplan XML for Query Compile эквивалентны
5. Верны ответы 1 и 3.

Вопрос 6.23
Чем отличается Nested loops от Hash join?

1. Nested loops соединяет таблицы вложенным циклами, Hash join соединяет таблицы хешированием неотсортированных таблиц.
2. Nested loops соединяет таблицы слиянием, Hash join вложенными циклами.
3. Nested loops всегда менее предпочтителен, чем Hash join.
4. Nested loops соединяет таблицы вложенными циклами, Hash join слиянием больших хешированных таблиц.

Вопрос 6.24
Как происходит соединение хешированием?

1. • Таблица table2 сканируется и размещается в хеш-таблице.
• Значения из таблицы table1 отбираются по хеш-таблице.

2. • Обе таблицы сканируются и размещаются в хеш-таблице.
• Происходит сортировка и усечение итоговой таблицы.
3. Одновременно считываются и сравниваются два отсортированных входных потока, по одной строке за шаг. На каждом из этих шагов происходит сравнение со следующей строкой входного потока по хеш-функции. Если хеши равны, выводится присоединяемая строка, и процесс продолжается дальше. Если строки не равны, исключается меньшее из двух входных значений, и процесс продолжается.

Вопрос 6.25
Как происходит соединение слиянием?

1. • Таблица table2 сканируется, строки размещаются в таблице слияний.
• Значения из таблицы table1 отбираются по таблице слияний.
2. • Обе таблицы сканируются и размещаются в таблице слияний.
• Происходит сортировка и усечение итоговой таблицы.
3. Одновременно считываются и сравниваются два отсортированных входных потока, по одной строке за шаг. На каждом из этих шагов происходит сравнение со следующей строкой входного потока. Если строки равны, выводится присоединяемая строка, и процесс продолжается дальше. Если строки не равны, исключается меньшее из двух входных значений, и процесс продолжается.

Вопрос 6.26
Как происходит соединение вложенными циклами?

1. Сравнивается каждая строка одной таблицы (называемой внешней таблицей) с каждой строкой другой таблицы (называемой внутренней таблицей), ищутся те строки, которые удовлетворяют предикату соединения.
2. • Таблица (называемая внешней таблицей) сканируется, строки размещаются в итоговой таблице.
• Значения из таблицы (называемой внутренней таблицей) отбираются циклом по итоговой таблице.
3. Таблицы (внутренняя и внешняя) сортируются, затем считываются и сравниваются два отсортированных входных потока, по одной строке за шаг. На каждом из этих шагов происходит сравнение со следующей строкой входного потока. Если строки равны, выводится присоединяемая строка, и цикл возвращается на начало внутренней таблицы. Если строки не равны, исключается меньшее из двух входных значений, и процесс продолжается.

Вопрос 6.27
Чем отличается Merge join от Nested loops?

1. Merge join соединяет отсортированные таблицы слиянием, а Nested loops соединяет таблицы вложенными циклами.
2. Merge join соединяет таблицы хешированием, а Nested loops соединяет виртуальные таблицы.
3. Merge join соединяет таблицы хешированием, а Nested loops соединяет таблицы вложенными циклами.
4. Merge join соединяет реальные таблицы, а Nested loops — виртуальные таблицы и вложенные запросы.

Вопрос 6.28
К каким негативным последствиям может привести запрос, который содержит соединения с подзапросами?

1. Запрос может выполняться крайне медленно.
2. При выполнении таких запросов могут возникнуть управляемые взаимоблокировки.
3. Негативных последствий нет. Запросы, содержащие соединения с подзапросами (особенно в динамических списках), использовать можно и нужно.
4. Верны варианты 1 и 2.

Вопрос 6.29
Почему не рекомендуется использовать соединения с подзапросами?

1. Оптимизатор сервера СУБД предполагает, что временная таблица не проиндексирована, и поэтому может ошибиться с выбором плана.
2. Оптимизатор сервера СУБД предполагает, что вернется большое количество записей.
3. Оптимизатор сервера СУБД не всегда может правильно оптимизировать такой запрос, ему может быть трудно понять какое количество записей может быть возвращено в подзапросе. В этом случае СУБД может ошибиться с планом запроса.
4. Верны варианты 1 и 3.

Вопрос 6.30
Если неоптимальный длительно выполняющийся запрос использует соединения с подзапросами, то его следует переписать с использованием:

1. виртуальных таблиц (заменив подзапросы виртуальными таблицами)
2. запросов в цикле (заменив подзапросы запросами в цикле)
3. временных таблиц (заменив подзапросы временными таблицами)
4. конструкции Объединить
5. конструкции Выразить()

Вопрос 6.31
Если в неоптимальном медленно выполняющемся запросе используется соединение с виртуальной таблицей, то следует вынести такое обращение к виртуальной таблице в отдельный запрос:

1. с соединением с подзапросом.
2. с условием «ГДЕ»
3. с использованием ВЫРАЗИТЬ
4. с записью результата во временную таблицу.
5. с группировкой по полям соединения.

Вопрос 6.32
Для оптимизации запроса с получением данных через точку от полей составного типа рекомендуется:

1. в запросе использовать условие «ИЛИ».
2. в запросе использовать условие «ОБЪЕДИНИТЬ».
3. в запросе использовать условие «ВЫБОР», а затем фильтр «ВЫРАЗИТЬ».
4. вынести такое получение в отдельный запрос с выводом результата во временную таблицу, в добавленном запросе использовать фильтр «ГДЕ».

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

1. с временными таблицами по индексами.
2. с таблицами объектов, входящих в составной тип.
3. со строками объектов, входящих в составной тип.
4. с подзапросами.
5. с проиндексированными таблицами объектов, входящими в составной тип.

Вопрос 6.34
Какие основные причины неоптимальных запросов?

1. Соединения с подзапросами, соединения с виртуальными таблицами, несоответствие индексов и условий запросов, использование подзапросов в условии соединения, получение данных через точку от полей составного типа, фильтрация виртуальных таблиц без использования параметров, условия, не предполагающие поиск по индексу («ИЛИ», «не равно» и пр.).
2. Соединение с подзапросами, соединения с виртуальными таблицами, использование подзапросов в условии соединения, получение данных через точку от полей составного типа, соединения с временными таблицами, не использующие индексы.
3. Соединение с подзапросами, соединения с временными таблицами, несоответствие индексов и условий запросов, использование подзапросов в условии соединения, получение данных через точку от полей составного типа , фильтрация виртуальных таблиц без использования параметров, условия, не предполагающие поиск по индексу («ИЛИ», «не равно» и пр.).
4. Соединение с подзапросами, соединения с условием в запросе «ГДЕ», несоответствие индексов и условий запросов, использование подзапросов в условии соединения, получение данных через точку от полей составного типа , фильтрация виртуальных таблиц без использования параметров.

Вопрос 6.35
Подходящим является индекс, удовлетворяющий следующим требованиям:

1. индекс содержит все поля перечисленные в условии.
2. индекс является кластерным или уникальным.
3. поля, перечисленные в условии, идут подряд, между ними не «вклиниваются» поля, не участвующие в условии запроса.
4. должны выполняться условия 1 и 3.
5. должны выполняться условия 2 и 3.
6. должны выполняться условия 1, 2 и 3.

Вопрос 6.36
Каковы критерии неоптимального запроса?

1. Медленное выполнение запроса при слабой нагрузке на оборудование.
2. Возникновение избыточных блокировок.
3. Значительная разница по времени выполнения запроса на разных СУБД.
4. Повышенная чувствительность запроса к актуальности и полноте статистик.
5. Нестабильная работа запроса. При некоторых условиях запрос может работать достаточно быстро, при других — очень медленно.
6. Все варианты верны.

Вопрос 6.37
Чем JOIN отличается от UNION?

1. JOIN добавляет столбцы в результирующую таблицу, а UNION добавляет таблицу с тем же составом столбцов.
2. При JOIN полностью одинаковые строки заменяются одной, на что затрачивается дополнительное время, даже в случаях, когда одинаковых строк в запросах заведомо быть не может. При UNION такого не происходит.
3. JOIN соединяет временные таблицы, а UNION персистентные таблицы.

Вопрос 6.38
Чем UNION отличается от UNION ALL?

1. при UNION ALL полностью одинаковые строки заменяются одной, на что затрачивается дополнительное время, даже в случаях, когда одинаковых строк в запросах заведомо быть не может.
2. при UNION полностью одинаковые строки заменяются одной, на что затрачивается дополнительное время, даже в случаях, когда одинаковых строк в запросах заведомо быть не может.
3. UNION добавляет столбцы в результирующую таблицу, а UNION ALL добавляет таблицу с тем же составом столбцов.

Вопрос 6.39
Выберите правильный вариант запроса с SELECT:

1. select * from dbo._document180 where _number like ‘ТД00%’ order by _number
2. select * from dbo._document180._VT15557 into #tt1 where _number like ‘ТД00%’ order by _number
3. select * from dbo._document180 having _number eq ‘ТД00%’ order by _number

Вопрос 6.40
Выберите правильный вариант запроса с DELETE:

1. delete * from dbo._document180 where _number = ‘ТД00-000003’
2. delete from dbo._document180 where _number = ‘ТД00-000003’ order by _number
3. delete from dbo._document180 where _number = ‘ТД00-000003’

Вопрос 6.41
Выберите правильный вариант запроса с UPDATE:

1. update dbo._document180 set _number = ‘ТД00-000003’ where _number= ‘ТД00-000002’
2. update * dbo._document180 set _number = ‘ТД00-000003’ where _number= ‘ТД00-000002’ order by _number
3. update dbo._document180 where _number= ‘ТД00-000002’

Вопрос 6.42
Выберите правильный вариант запроса с UNION:

1. select * from dbo._document180 where _number like ‘ТД00%’ order by _number union all select * from dbo._document182 where _number like ‘ТД00%’ order by _number
2. select _number, posted from dbo._document180 where _number like ‘ТД00%’ union all select _number, posted from dbo._document182 order by _number
3. select _number, posted, _date_time from dbo._document180 where _number like ‘ТД00%’ union all select _number, posted from dbo._document182 where _number like ‘ТД00%’ order by _number

Вопрос 6.43
Выберите правильный вариант запроса с JOIN:

1. select * from dbo.document180 inner join dbo.document180_vt4131 on dbo.document180._idrref = dbo.document180_vt4131._idrref where dbo.document180._number like ‘ТД00%’
2. select * from dbo.document180 where dbo.document180._number like ‘ТД00%’ inner join dbo.document180_vt4131 on dbo.document180._idrref = dbo.document180_vt4131._idrref
3. select * from dbo.document180 outer join dbo.document180_vt4131 on dbo.document180._idrref = dbo.document180_vt4131._idrref where dbo.document180._number like ‘ТД00%’
4. верны варианты 1 и 3.

Вопрос 6.44
Чтобы найти длительный запрос Oracle, получение какого события следует прописать в файле настроек технологического журнала?

1. DBMSSQL с фильтром по полю Duration.
2. EXCP.
3. DBORACLE.
4. VRSREQUEST с фильтром по полю Duration.

Вопрос 6.45
Чтобы найти длительный запрос DB2, получение какого события следует прописать в файле настроек технологического журнала?

1. DBMSSQL с фильтром по полю Duration
2. EXCP
3. DB2
4. DBIBMDB2

Вопрос 6.46
Чтобы найти длительный запрос PostgreSQL, получение какого события следует прописать в файле настроек технологического журнала?

1. DBMSSQL с фильтром по полю Duration.
2. EXCP.
3. DBPOSTGRS.
4. DBV8DBEng с фильтром по полю Duration.

Вопрос 6.47
Чтобы найти длительный запрос к файловой базе, получение какого события следует прописать в файле настроек технологического журнала?

1. DBMSSQL с фильтром по полю Duration.
2. EXCP.
3. VRSREQUEST с фильтром по полю Duration.
4. DBV8DBEng.

Вопрос 6.48
Чтобы найти длительный запрос к внешнему источнику данных, получение какого события следует прописать в файле настроек технологического журнала?

1. DBMSSQL с фильтром по полю Duration.
2. EDS.
3. EXCP.
4. VRSREQUEST с фильтром по полю Duration.
5. DBV8DBEng.

Комментарии

5 комментариев к “«1С:Профессионал» по технологическим вопросам (Раздел 6)”
  1. safer:

    6.12 Не пойму это вопрос на внимательность или просто опечатка в сборнике =). Не такого свойства у событий «DurationUS».

  2. Евгений:

    Вопрос 6.43
    Чем вариант с «outer join» плох? Ну соглсен postgree не понимает его, но MS SQL то понимает…

    • Скажем так — а чем он хорош?

    • Metalex:

      Он не то что плох — если присмотреться — в запросе используется соединение таблицы документа с его же табличной частью. Здесь нет смысла использоваться внешнее соединение — не будет записей с NULL ни в одной таблице. Соединение по ссылке. Смысл только во внутреннем соединении.

Оставьте комментарий

Top