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

Стандарты разработки

Вопрос 14.1
В общем случае, при объединении в запросе результатов нескольких запросов следует использовать конструкцию:

1. «ОБЪЕДИНИТЬ ВСЕ».
2. «ОБЪЕДИНИТЬ».


В общем случае при объединении в запросе результатов нескольких запросов следует использовать конструкцию «ОБЪЕДИНИТЬ ВСЕ», а не «ОБЪЕДИНИТЬ», поскольку во втором варианте при объединении запросов полностью одинаковые строки заменяются одной, на что затрачивается дополнительное время, даже в случаях, когда одинаковых строк в запросах заведомо быть не может.

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

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.292
ИТС: Использование ключевых слов «ОБЪЕДИНИТЬ» и «ОБЪЕДИНИТЬ ВСЕ» в запросах

Вопрос 14.2
Всегда ли можно переносить условие из секции ГДЕ в параметры фильтрации виртуальной таблицы?

1. Да, всегда.
2. Нет, никогда.
3. Не всегда можно в параметры таблиц СрезПервых и СрезПоследних.
4. Не всегда можно в параметры таблиц Обороты.
5. Верны ответы 3 и 4.

Вопрос 14.3
Вызов модальных окон в транзакциях:

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

Открытие модальных окон в транзакции – это почти всегда грубая ошибка. Исключением является, пожалуй, лишь случай, когда окно открывается намеренно для целей гарантированного воспроизведения ошибок (конфликтов блокировок).

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.266

Вопрос 14.4
Вынос в серверный общий модуль тысячекратно выполняемой процедуры, вычисляющей строковую переменную (это единственное, что она делает):

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

Вопрос 14.5
Если в запросе используется получение значения через точку от поля составного ссылочного типа, то при выполнении этого запроса:

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

Если в запросе используется получение значения через точку от поля составного ссылочного типа, то при выполнении этого запроса будет выполняться соединение со всеми таблицами объектов, входящими в этот составной тип. В результате текст запроса SQL чрезвычайно усложняется, и при его выполнении оптимизатор СУБД может выбрать неоптимальный план. Это может привести к серьезным проблемам производительности и даже к неработоспособности запроса в отдельных случаях.
В случае с MS SQL Server 2005 и ранее, то есть ограничение на количество таблиц в запросе — 256.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.230
Ограничение SQL 2005 на открытие 256 таблиц

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

1. Указывайте максимум возможных типов для данного поля. Следует использовать типы «любая ссылка» или «ссылка на любой документ» и т.п.
2. Если в запросе вам понадобилось значение, полученное через ссылку, то, возможно, это значение можно хранить непосредственно в данном объекте
3. Ограничивать количество возможных типов при помощи метода ВЫРАЗИТЬ
4. Верны все ответы

Как правило, для выполнения конкретного запроса в данных условиях не нужны все возможные типы данной ссылки. В этом случае следует ограничить количество возможных типов при помощи функции ВЫРАЗИТЬ. Если данный запрос является универсальным и используется в нескольких разных ситуациях (где типы ссылки могут быть разными), то можно формировать запрос динамически, подставляя в функцию ВЫРАЗИТЬ тот тип, который необходим при данных условиях. Это увеличит объем исходного кода и, возможно, сделает его менее универсальным, но может существенно повысить производительность и стабильность работы запроса.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.230

Вопрос 14.7
Если в регистре измерение указано ведущим, то при удалении объекта удаляется и запись в регистре. Если такое происходит параллельно в нескольких сеансах:

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

Вопрос 14.8
Если запрос содержит соединения с подзапросами, то это может привести к следующим негативным последствиям:

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

Если запрос содержит соединения с подзапросами, то это может привести к следующим негативным последствиям:

  • крайне медленное выполнение запроса при слабой загрузке серверного оборудования. Замедление запроса может быть очень значительным (до нескольких порядков);
  • нестабильная работа запроса. При некоторых условиях запрос может работать достаточно быстро, при других – очень медленно;
  • значительная разница по времени выполнения запроса на разных СУБД;
  • повышенная чувствительность запроса к актуальности и полноте статистик. Сразу после полного обновления статистик запрос может работать быстро, но через некоторое время опять замедлиться.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.222

Вопрос 14.9
Если пользователь включен в состав трех ролей, использующих полностью одинаковые ограничения RLS на определенный справочник, сколько соединений допишет механизм RLS к запросу к этому справочнику для этого пользователя?

1. 1
2. 2 разных.
3. 3 разных.
4. 2 одинаковых.
5. 3 одинаковых.

«Если в конфигурации описано несколько ролей с условиями RLS, то не следует назначать одному пользователю более одной такой роли. Если один пользователь будет включен, например, в две роли с RLS – бухгалтер и кадровик, то при выполнении всех его запросов к их условиям будут добавляться условия обоих RLS с использованием логического ИЛИ. Таким образом, даже если в исходном запросе нет условия ИЛИ, оно появится там после добавления условий RLS. Такой запрос также может выполняться неоптимально – медленно и с избыточными блокировками.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.231

Вопрос 14.10
Запись других объектов (других элементов справочиков и документов) внутри транзакции:

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

Вопрос 14.11
Запрос ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = «001» ИЛИ Артикул = «002» следует заменить на запрос:

1. ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = «001» ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = «002»
2. заменять не следует.
3. ВЫБРАТЬ ВЫБОР КОГДА Артикул = «001» ТОГДА Товар.Наименование КОГДА Артикул = «002» ТОГДА Товар.Наименование ИНАЧЕ «нет названия» КАК Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Товар.Наименование <> «нет названия»

Запрос:

«ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = «001» ИЛИ Артикул = «002»»

следует заменить на запрос:

«ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = «001»
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = «002»»

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.227

Вопрос 14.12
Использование конструкций Попытка…Исключение…КонецПопытки внутри транзакций:

1. Не имеет смысла, транзакция при возникновении любой исключительной ситуации все равно откатывается.
2. Не всегда оправданно, транзакция откатывается, если исключительная ситуация определена как невосстановимая.
3. Иногда оправданно, транзакция не откатывается, если исключительная ситуация определена как восстановимая.
4. Мешает понять, что на самом деле происходит, если исключение не логируется.
5. Верны ответы 1 и 4.
6. Верны ответы 2, 3 и 4.

Исключительные ситуации бывают восстановимыми (после которых можно продолжить работу и завершить транзакцию) и невосстановимыми (после которых нельзя продолжить работу и завершить транзакцию, например, ошибка базы данных). Внешне это может выглядеть как зависимость от того, как код, вызвавший исключение, и скобки Попытка… Исключение… КонецПопытки расположены относительно ближайшей к ним транзакции.

Если таких ошибок много и они начинают создавать проблемы пользователям, то без модификации кода, удаления этих скобок очень трудно найти, где они произошли и почему.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.48

Вопрос 14.13
Как гарантированно избежать блокировок на «пустых таблицах» в MS SQL Server?

1. Искусственно сделать таблицы не пустыми.
2. Отказаться от записи заведомо пустых движений в заведомо пустую таблицу регистра.
3. Перевести конфигурацию в управляемый режим управления блокировками.
4. Верны ответы 2 и 3.
5. Верны ответы 1, 2 и 3.

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

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

Вопрос 14.15
К каким проблема может привести наличие OR в условии?

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

Не следует использовать ИЛИ в секции ГДЕ запроса. Это может привести к тому, что СУБД не сможет использовать индексы таблиц и будет выполнять сканирование, что увеличит время работы запроса и вероятность возникновения блокировок.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.227
База знаний 1С: Типичные причины неоптимальной работы запросов и методы оптимизации

Вопрос 14.16
Как можно избавиться от запроса в цикле?

1. Это делать не обязательно.
2. Поместить коллекцию, или другую совокупность, по которой строится цикл, во временную таблицу СУБД, а затем соединить эту таблицу с таблицами основного запроса.
3. Поместить коллекцию, или другую совокупность, по которой строится цикл, в параметры запроса, а затем один раз выполнить запрос с новыми параметрами.
4. Поместить коллекцию, или другую совокупность, по которой строится цикл, во вспомогательный регистр сведений, а затем соединить эту таблицу с таблицами основного запроса.
5. Верны ответы 2 и 3.
6. Верны ответы 3 и 4.

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

Источники:
ИТС: Многократное выполнение однотипных запросов

Вопрос 14.17
Как ограничить размер выборки в запросе?

1. Использованием параметров виртуальных таблиц.
2. Переносом условий из ГДЕ в параметры виртуальных таблиц.
3. Переносом условий из ГДЕ в ПО.
4. Верны ответы 1 и 2.
5. Верны ответы 1, 2, 3.

При работе с виртуальными таблицами нужно использовать параметры виртуальных таблиц, а не выносить условия в секцию ГДЕ.

При соединении таблиц все условия и параметры, относящиеся к полям этих таблиц, ставить в условия соединения или пользоваться временными таблицами, а не оставлять их до секции ГДЕ. При этом, конечно, не должна страдать логика.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.216

Вопрос 14.18
Как определить, выполнялся отчет в транзакции или нет?

1. По событиям BEGIN TRANSACTION и COMMIT TRANSACTION в SQL Server Profiler.
2. Отчет не может выполняться в транзакции.
3. По тексту запроса.
4. С помощью ЦУП.

Узнать, выполняется чтение с транзакции или нет, можно в профайлере SQL Server. Настроив трассировку, нужно с помощью отладчика, выполнить подозрительную строку. Если транзакция имеет место, в трассировке появятся BEGIN TRANSACTION и COMMIT TRANSACTION.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.48

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

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

Вопрос 14.20
Каким образом можно, не добавляя намеренно таблиц в запрос, превысить ограничение на 256 таблиц в запросе при использовани SQL Server?

1. Разыменованием через точку полей составного типа.
2. Получением представлений для полей непосредственно в самом запросе (через поле Представление) для полей составного типа.
3. Получением представлений для полей непосредственно в самом запросе (функцией Представление(<Имя поля>)) для полей составного типа.
4. Верны ответы 1 и 2.
5. Верны ответы 1, 2 и 3.

Если в запросе используется получение значения через точку от поля составного ссылочного типа, то при выполнении этого запроса будет выполняться соединение со всеми таблицами объектов, входящими в этот составной тип. В результате SQL текст запроса чрезвычайно усложняется, и при его выполнении оптимизатор СУБД может выбрать неоптимальный план. Это может привести к серьезным проблемам производительности и даже к неработоспособности запроса в отдельных случаях.

При получении представлений для полей непосредственно в самом запросе (через поле «Представление» или функцией Представление(<Имя поля>)) выполняется неявное соединение с таблицей объекта, для которого получаются представления. Для полей составного типа – несколько соединений, для каждого из типов, входящих в состав. Это может приводить к увеличению времени выполнения запроса (и как следствие общего времени формирования итогового документа), а при большом количестве типов – к невозможности его выполнения в клиент-серверной версии из-за ограничения Microsoft SQL Server, по которому в запросе не может участвовать больше 256 таблиц.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.229, 294
База знаний 1С: Типичные причины неоптимальной работы запросов и методы оптимизации

Вопрос 14.21
Какое максимальное количество таблиц может участвовать в запросе при использовании Microsoft SQL Server?

1. 128
2. 256
3. 1024
4. Ограничения нет и не было.
5. При работе с 8.3 ограничение не действует.
6. Верны ответы 1 и 5.

На самом деле ограничение в 256 таблиц было в MS SQL Server 2005. Начиная с версии 2008 эти ограничения убрали.

Источники:
Ограничение SQL 2005 на открытие 256 таблиц

Вопрос 14.22
Кардинально снижено влияние проведения документов в десятки тысяч строк на параллельность работы пользователей в системе (использовалась СУБД MS SQL Server). Что было сделано?

1. Документы на десятки тысяч строк разбиты на нужное количество документов по 1000 строк.
2. Документы объединены в документы по 10000 строк.
3. Перешли на платформу 8.3 без использования режима совместимости.
4. Вернулись на автоматический режим управления блокировками данных.
5. Верны ответы 1 и 2.

На практике можно считать, что при использовании MS SQL Server документ «1С», имеющий свыше 1 000 строк в табличной части либо делающий свыше 1 000 движений по одному регистру, теоретически может при своем проведении вызывать эскалацию блокировок, поэтому при прочих равных условиях наличие больших документов –это потенциальная проблема параллельности работы. Это не значит, что такие документы нельзя провести. Просто нужно делать это не средствами платформы, а своим кодом –в нескольких относительно небольших транзакциях, обеспечив неделимость (атомарность) операции внешними средствами

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.67

Вопрос 14.23
Конструкция Ссылка.Ссылка:

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

Никогда не использовать конструкцию Ссылка.Ссылка. Это всегда ошибка.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.217

Вопрос 14.24
Когда не следует использовать подзапросы?

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

Вопрос 14.25
Конфликт блокировок на «пустых таблицах» в MS SQL Server происходит:

1. В автоматическом режиме управления блокировками при записи пустых наборов в пустую таблицу.
2. В автоматическом режиме управления блокировками при записи пустых наборов в непустую таблицу.
3. В управляемом режиме управления блокировками при записи пустых наборов в пустую таблицу.

Такие запросы могут быть связаны с особенностями документооборота в конкретной базе. При режиме автоматического управления блокировками «1С» будет использован уровень изоляции Serializable, будет заблокирован диапазон ключа индекса (и пустая таблица при таком подходе окажется заблокированной целиком), и даже разделяемая блокировка будет сохраняться до конца транзакции, не говоря уже об исключительной.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.227

Вопрос 14.26
Ликвидация запросов в цикле:

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

Вопрос 14.27
Может ли порядок перечисления логических выражений в составном логическом выражении влиять на то, все ли их придется проверять?

1. Да, только в коде на встроенном языке.
2. Да, только в коде на языке запросов.
3. Нет.
4. Да, и в коде на встроенном языке, и в коде на языке запросов.

Вопрос 14.28
Обращение к реквизитам регистратора регистра (например, ТоварыНаСкладах.Регистратор.Дата):

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

Вопрос 14.29
Ошибки блокировок в форме списка (обычные формы):

1. невозможны.
2. возможны, т.к. получение динамических списков при использовании обычных форм выполняется в транзакциях.
3. возможны, если в событиях ПриПолученииДанных() и в ПриВыводеСтроки() есть запросы через объектную модель.
4. возможны, если в событиях ПриПолученииДанных() и в ПриВыводеСтроки() есть запросы на языке запросов

Вопрос 14.30
Ошибки блокировок при формировании отчета:

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

Вопрос 14.31
Получение метаданных объекта конфигурации следует выполнять с помощью:

1. метода Метаданные() этого объекта ( СправочникОбъект.Метаданные() ), это существенно быстрее.
2. путем обращения к свойству глобального контекста «Метаданные» ( Метаданные.Справочники[ИмяСправочника] ), это существенно быстрее.
3. любого известного способа, т.к. ошибок не возникнет.
4. не следует выполнять, это в любом случае очень длительная операция.

Получение метаданных объекта конфигурации следует выполнять с помощью метода Метаданные() этого объекта, а не путем обращения к свойству глобального контекста «Метаданные», так как второй способ существенно более медленный.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.293

Вопрос 14.32
При использовании конструкции Попытка…Исключение… КонецПопытки внутри вложенной транзакции, если внутри этой конструкции возникла восстановимая исключительная ситуация:

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

Вопрос 14.33
При использовании конструкции Попытка…Исключение… КонецПопытки снаружи вложенной транзакции, если внутри этой транзакции возникла восстановимая исключительная ситуация:

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

Вопрос 14.34
При использовании конструкций Попытка… Исключение… КонецПопытки внутри транзакций ошибка по причине «В данной транзакции уже происходили ошибки!» появляется:

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

Вопрос 14.35
При копировании строк между различными таблицами значений (табличными частями и т.п.) со схожим составом колонок следует использовать:

1. усовершенствованные алгоритмы многократного перебора колонок таблицы значений, выполняемого для получения их состава.
2. метод глобального контекста ЗаполнитьЗначенияСвойств().
3. помещение таблицы-источника во временную таблицу СУБД, а затем получение целевой таблицы запросом.

Вопрос 14.36
При необходимости поиска большого числа элементов одной таблицы значений в другой большой таблице значений в качестве одного из путей оптимизации можно использовать:

1. помещение таблиц-источников во временные таблицы СУБД, а затем получение целевой таблицы запросом, соединяющим временные таблицы.
2. помещение одной таблицы-источника во временную таблицу СУБД, а затем получение целевой таблицы циклическим запросом с параметрами из строк второй таблицы.
3. НайтиСтроки() вместо Найти().

Вопрос 14.37
При нескольких чтениях через объектную модель реквизитов одного и того же объекта внутри одной процедуры долго выполняется:

1. первое обращение.
2. каждое чтение.
3. это самый быстрый способ чтения.

Вопрос 14.38
При формировании табличного документа в качестве параметров ячеек с типом заполнения «Параметр» указывать ссылочные значения:

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

Вопрос 14.39
При использовании в коде программы через объектную модель объекта, содержащего реквизит с типом Хранилище значения, содержащий файл Word объемом 50 MБ:

1. этот реквизит будет считан из базы, даже если к этому реквизиту не обращались.
2. этот реквизит не будет считан из базы, если к нему не обращаются.
3. этот реквизит будет считан из базы только в том случае, если используется ПолучитьОбъект().

Если реквизит имеет тип ХранилищеЗначения и в конкретном документе хранится файл размером 500 МБ, то при первом чтении в объектной модели любого реквизита этого документа будет происходить считывание этого файла со всеми сопутствующими затратами времени;

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.107

Вопрос 14.40
Применение ДЛЯ ИЗМЕНЕНИЯ без указания таблиц в тексте запроса приводит к тому, что:

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

Уровень U (Update) совместим только с разделяемыми блокировками S, но сам с собой уже нет. Чтобы его задействовать, в запрос на языке запросов «1С» необходимо добавить опцию ДЛЯ ИЗМЕНЕНИЯ, при этом не забыв указать, какие таблицы блокировать, иначе запрос поставит эту блокировку на все таблицы, задействованные в нем.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.64

Вопрос 14.41
Проверку того, что результат выполнения запроса не содержит строк, следует выполнять:

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

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

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.292

Вопрос 14.42
Работа с регистром бухгалтерии — это почти всегда:

1. работа с пересекающимися данными (работа с одним и тем же счетом).
2. работа с непересекающимися данными (разные разрезы аналитики).
3. пересекающиеся данные или нет — зависит от детализации по субконто.

Вопрос 14.43
Сколько таблиц регистраций изменений в конфигурации?

1. По одной у каждого объекта метаданных.
2. По одной у каждого объекта метаданных, включенного хотя бы в один план обмена, у остальных — отсутствуют.
3. По количеству планов обмена у каждого объекта метаданных, в которое этот план включен, у остальных — отсутствуют.

Ровно по одной таблице с назначением «РегистрацияИзменений» и подстрокой «ChngR» в имени будет создано для каждого из объектов метаданных, зарегистрированных хотя бы в одном плане обмена.

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.79

Вопрос 14.44
Соединять виртуальные таблицы с реальными, а также виртуальные с виртуальными:

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

Вопрос 14.45
Соединять подзапросы с реальными таблицами, а также подзапросы с подзапросами:

1. не ошибка.
2. не следует. Правильно сначала результат подзапроса записывать во временную таблицу, индексировать эту временную таблицу по полям соединения, а затем уже соединять.
3. не следует. Правильно сначала результат подзапроса записывать в виртуальную таблицу, индексировать эту виртуальную таблицу по полям соединения, а затем уже соединять.
4. верны ответы 2 и 3.

Вопрос 14.46
Укажите, в чем может быть проблема в следующей процедуре из общего модуля с включенными свойствами: «Сервер» и «Вызов сервера»

Процедура УстановитьЗначение(Знач Имя, Знач Значение) Экспорт
УстановитьПривилегированныйРежим(Истина);
Константы[Имя].Установить(Значение);
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры

1. Никакой проблемы нет. Очень удобная процедура
2. Устанавливать привилегированный режим не требуется. Он и так всегда устанавливается в серверных модулях
3. Неправильно указывается имя константы. Должно быть Константы.Имя.УстановитьЗначение(Значение);
4. Неправильно устанавливается имя константы. Должно быть Вычислить(«Константы.» + Имя + «.Установить(Значение);»);
5. Процедура позволяет изменить значение любой константы в независимости от прав пользователя

Вопрос 14.47
Как изменится производительность тестовой информационной базы при переводе тестовой информационной базы с СУБД MS SQL Server на СУБД PostgreSQL?

1. Приоритеты по использованию СУБД размещены на сайте 1С. Производительность будет изменяться в соответствие с указанными приоритетами.
2. Это точно улучшит производительность, но такие изменения нужно выполнять в режиме совместимости.
3. Необходимо выполнить проверку производительности в СНТ на СУБД PostgreSQL, производительность реальной тестовой базы изменится точно также.
4. Надо проверять именно на той информационной базе, производительность которой требуется оценить, например, провести нагрузочное тестирование. Все СУБД, с которыми может работать 1С:Предприятие, имеют бесплатные редакции.

Вопрос 14.48
Что в тексте запроса, полученного в помощью профайлера, однозначно говорит о том, что в формировании текста запроса участвовал механизм RLS?

1. Подстрока SDBL_DUMMY.
2. Обращение к таблице справочника Организации.
3. Обращение к таблице справочника ГруппыПользователей.
4. Подстрока USE_RLS.
5. Подстрока WITH RLS.

На текущий момент работу механизма RLS можно отследить в профайлере по наличию характерных конструкций в тексте запроса, в частности, по наличию «SDBL_DUMMY»

Источники:
«Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.74

Вопрос 14.49
Что и какой блокировкой блокирует выгрузка изменений по плану обмена?

1. Таблицу регистра целиком исключительной блокировкой.
2. Ничего, т.к. это внетранзакционное чтение.
3. Таблицу регистрации изменений разделяемой блокировкой.
4. Таблицу регистрации изменений исключительной блокировкой.
5. Таблицу регистра целиком блокировкой обновления.

Вопрос 14.50
Что рекомендуется для исключения конфликтов блокировок при выгрузке изменений по плану обмена?

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

Вопрос 14.51
Что рекомендуется при использовании объекта РегистрСведений.МенеджерЗаписи?

1. Объект РегистрСведенийМенеджерЗаписи следует применять только тогда, когда выполнение операций с регистром сведений требует использования отбора одновременно по всем измерениям.
2. Особых рекомендаций нет.
3. Чтение записи(набора записей) из регистра сведений без последующей модификации нужно выполнять не через РегистрСведенийМенеджерЗаписи, а через РегистрСведенийНаборЗаписей.
4. С точки зрения производительности использование менеджера записей в некоторых случаях будет столь же эффективным, как и использование набора записей, а в некоторых – более эффективным, так как не будут выполняться лишние действия.

Вопрос 14.52
Что рекомендуется при необходимости получения данных из базы в событиях формы:
• ОбновлениеОтображения().
и событиях табличного поля:
• ПриВыводеСтроки(),
• ПриАктивацииСтроки().

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

Вопрос 14.53
Чтобы реквизит динамического списка не оказывал постоянного негативного влияния на время открытия формы, для него надо:
1. в настройках управляемой формы в режиме 1С:Предприятия отключить вывод.
2. в конфигураторе в настройках динамического списка снять флажок «Использовать всегда».
3. выполнить оба перечисленных выше действия.

Комментарии

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

    Вопрос 14.29
    Ошибки блокировок в форме списка (обычные формы):

    Комментарий:

    Получение метаданных объекта конфигурации следует выполнять с помощью метода Метаданные() этого объекта, а не путем обращения к свойству глобального контекста «Метаданные», так как второй способ существенно более медленный.
    Источники:
    «Настольная книга 1С:Эксперта по технологическим вопросам» (ред.2), стр.293

    При чем тут метаданные?

  2. Александр:

    4.12 Противоречит статье http://its.1c.ru/db/metod8dev#content:2313:hdoc «Казалось бы, все понятно. Но есть тонкость. Если восстановимая ошибка базы данных произошла в процессе выполнения транзакции, то, вне зависимости от того, было исключение, вызванное этой ошибкой, перехвачено и обработано или нет, транзакция уже не может быть продолжена или зафиксирована. Единственная операция с базой данных, которую можно произвести в такой ситуации — это отмена транзакции.»

    • Вы описываете ошибку базы данных. В этой же статье чуть ниже:

      «Следует заметить, что не всякая ошибка приводит к невозможности продолжения выполнения и фиксации транзакции, а именно ошибка базы данных. Исключения, не имеющие отношения к ошибкам базы данных, никакого влияния на возможность продолжения выполнения транзакции не оказывают.»

      В вопросе же не указано, какие именно ошибки обрабатываются.

  3. Дмитрий:

    В 14.45 должен быть ответ 2.
    https://its.1c.ru/db/metod8dev#content:5842:hdoc

  4. Влад:

    Огромное спасибо за материал.

  5. Влад:

    14.17 точно 5, что значит в ПО?

    • ПО — это условия соединения.

      ИЗ Таблица1
      ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2
      ПО Таблица1.Поле = Таблица2.Поле

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

Top