Хочу рассмотреть вопросы и подготовку к сертификации. Учить правильные ответы плохой путь, а вот понимать ответы и применять их, вы тем самым становитесь на путь к уровню «1С:Эксперт». По сути это цикл записей с расширенными ответами на несколько вопросов из тестов.
В общем случае при объединении в запросе результатов нескольких запросов следует использовать конструкцию «ОБЪЕДИНИТЬ ВСЕ», а не «ОБЪЕДИНИТЬ», поскольку во втором варианте при объединении запросов полностью одинаковые строки заменяются одной, на что затрачивается дополнительное время, даже в случаях, когда одинаковых строк в запросах заведомо быть не может.Исключением являются ситуации, когда выполнение замены нескольких одинаковых строк одной является необходимым условием выполнения запроса.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 272.
• ИТС: Использование ключевых слов «ОБЪЕДИНИТЬ» и «ОБЪЕДИНИТЬ ВСЕ» в запросах
При использовании виртуальных таблиц в запросах, следует передавать в параметры таблиц все условия, относящиеся к данной виртуальной таблице. Не рекомендуется обращаться к виртуальным таблицам при помощи условий в секции ГДЕ и т.п.
Источники:
• ИТС: Обращения к виртуальным таблицам
Открытие модальных окон в транзакции — это всегда грубая ошибка. Исключением является, пожалуй, лишь случай, когда окно открывается намеренно для целей гарантированного воспроизведения ошибок (конфликтов блокировок).
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 266-267.
Разработку управляемого приложения необходимо вести с контролем количества вызовов серверных процедур и функций из клиентского кода (серверных вызовов), а в некоторых случаях – также объем передаваемых данных между клиентом и сервером (трафик).Общее количество серверных вызовов складывается из
-
обращений на сервер, которые выполняет платформа 1С:Предприятие,
-
и вызовов, которые выполняются из клиентского кода конфигурации – отклонение, привносимое конфигурацией по отношению к платформе.
В общем виде, при проектировании клиент-серверного взаимодействия в конфигурации следует руководствоваться тем, что на каждое действие пользователя в клиентском коде конфигурации не должно выполняться дополнительных вызовов на сервер. Любые исключения из этого правила требуют дополнительного обоснования.
1.2. Отдельно для режима с низкой скоростью соединения следует оптимизировать не только количество вызовов, но и объем передаваемых данных между клиентом и сервером (трафик). Отладку клиент-серверного взаимодействия в этом режиме работы рекомендуется проводить в режиме имитации задержек серверных вызовов.
Источники:
• ИТС: Минимизация количества серверных вызовов
В языке запросов возможно обращаться не только к полям исходных таблиц запроса, перечисленных в предложении ИЗ, но и к полям таблицы, на которую ссылается поле исходной таблицы запроса, если это поле имеет ссылочный тип. Имена полей при этом пишутся «через точку». Применение такой конструкции приводит к неявному соединению с дополнительными таблицами для получения значений полей «через точку». В результате SQL текст запроса чрезвычайно усложняется, и при его выполнении оптимизатор СУБД может выбрать неоптимальный план, а при использовании с MS SQL Server 2005 и ранее, то есть ограничение на количество таблиц в запросе — 256.
Большое число исходных таблиц запроса приводит к его усложнению и может значительно увеличивать время его выполнения. Особенно это важно помнить в тех случаях, когда поле таблицы ссылочного типа имеет составной тип и может содержать ссылки на несколько таблиц. В таком случае, получение полей других таблиц «через точку» от такого поля составного типа приведет к соединению со всеми таблицами, ссылки на которые могут оказаться в данном поле и в RLS к этим таблицам.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 230-232.
• ИТС: Разыменование ссылочных полей составного типа в языке запросов
Если в запросе используется получение значения через точку от поля составного ссылочного типа следует ограничивать количество возможных типов при помощи метода «ВЫРАЗИТЬ».
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 230.
• ИТС: Разыменование ссылочных полей составного типа в языке запросов
Если в регистре измерение указано ведущим, то при удалении объекта удаляется и запись в регистре. Если такое происходит параллельно в нескольких сеансах возникают конфликты блокировок. Для исключения данной проблемы требуется отказаться от непосредственного интерактивного удаления объектов в транзакциях и при интерактивных действиях пользователей, ставить только пометку на удаление.
Если запрос содержит соединения с подзапросами, то это может привести к следующим негативным последствиям:
- крайне медленное выполнение запроса при слабой загрузке серверного оборудования. Замедление запроса может быть очень значительным (до нескольких порядков);
- нестабильная работа запроса. При некоторых условиях запрос может работать достаточно быстро, при других — очень медленно;
- значительная разница по времени выполнения запроса на разных СУБД;
- повышенная чувствительность запроса к актуальности и полноте статистик. Сразу после полного обновления статистик запрос может работать быстро, но через некоторое время опять замедлиться.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 222.
Если в конфигурации описано несколько ролей с условиями RLS, то не следует назначать одному пользователю более одной такой роли. Если один пользователь будет включен, например, в две роли с RLS — бухгалтер и кадровик, то при выполнении всех его запросов к их условиям будут добавляться условия обоих RLS с использованием логического ИЛИ. Таким образом, даже если в исходном запросе нет условия ИЛИ, оно появится там после добавления условий RLS. Такой запрос также может выполняться неоптимально – медленно и с избыточными блокировками.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 231.
Запись объектов в транзакции — способ обеспечить согласованное внесение всех нужных изменений с гарантией выполнения (все или ничего). Необходимо понимать, чем больше объектов в транзакции — тем длиннее транзакция и как результат: могут возникать конфликты блокировок.
См. пункт 1
Исключительные ситуации бывают восстановимыми (после которых можно продолжить работу и завершить транзакцию) и невосстановимыми (после которых нельзя продолжить работу и завершить транзакцию, например, ошибка базы данных). Внешне это может выглядеть как зависимость от того, как код, вызвавший исключение, и скобки Попытка… Исключение… КонецПопытки расположены относительно ближайшей к ним транзакции.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 48-49.
Гарантированно избежать блокировок на «пустых таблицах» в MS SQL Server можно переводом конфигурации в управляемый режим управления блокировками или отказом от записи заведомо пустых движений в заведомо пустую таблицу регистра.
Исправление очень плохо написанного, медленно выполняющегося неоптимального кода в рамках работ по оптимизации производительности необходимо проводить, если он себя проявляет в рамках проблем производительности, в порядке согласованной очередности приоритетов и выявленной степени влияния на производительность.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 12-14.
Не следует использовать ИЛИ в секции ГДЕ запроса. Это может привести к тому, что СУБД не сможет использовать индексы таблиц и будет выполнять сканирование, что увеличит время работы запроса и вероятность возникновения блокировок. Вместо этого следует разбить один запрос на несколько и объединить результаты.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 227.
• ИТС: Эффективные условия запросов
Рекомендуется получать все необходимые однотипные данные одним запросом, вместо выполнения серии запросов.
Источники:
• ИТС: Общие требования по разработке оптимальных запросов
• ИТС: Многократное выполнение однотипных запросов
При работе с виртуальными таблицами нужно использовать параметры виртуальных таблиц, а не выносить условия в секцию ГДЕ.При соединении таблиц все условия и параметры, относящиеся к полям этих таблиц, ставить в условия соединения или пользоваться временными таблицами, а не оставлять их до секции ГДЕ. При этом, конечно, не должна страдать логика.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 216-217.
• ИТС: Общие требования по разработке оптимальных запросов
• ИТС: Несоответствие индексов и условий запроса
• ИТС: Обращения к виртуальным таблицам
Узнать, выполняется чтение с транзакции или нет, можно в profiler MS SQL Server. Настроив трассировку, необходимо с помощью отладчика, выполнить подозрительную строку. Если транзакция имеет место, в трассировке появятся BEGIN TRANSACTION и COMMIT TRANSACTION.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 48.
Получить время проведения документов из динамического списка при многопользовательской работе можно используя подсистему «Оценка производительности» из «Библиотеки стандартных подсистем» (БСП).
• В языке запросов возможно обращаться не только к полям исходных таблиц запроса, перечисленных в предложении ИЗ, но и к полям таблицы, на которую ссылается поле исходной таблицы запроса, если это поле имеет ссылочный тип. Имена полей при этом пишутся «через точку». Применение такой конструкции приводит к неявному соединению с дополнительными таблицами для получения значений полей «через точку»;
• Большое число исходных таблиц запроса приводит к его усложнению и может значительно увеличивать время его выполнения. Особенно это важно помнить в тех случаях, когда поле таблицы ссылочного типа имеет составной тип и может содержать ссылки на несколько таблиц. В таком случае, получение полей других таблиц «через точку» от такого поля составного типа приведет к соединению со всеми таблицами, ссылки на которые могут оказаться в данном поле и в RLS к этим таблицам.
• Каждая объектная таблица в информационной базе имеет виртуальное поле — «Представление». Это поле содержит текстовое представление объекта. В запросе возможно получать данное поле точно также как и другие поля таблиц, однако никакие операции с данным полем выполнять нельзя. Данная особенность связана с тем, что это поле является виртуальным, и, на самом деле, при получении данного поля из базы данных, запрос получает несколько полей, а при получении значения поля из результата запроса преобразовывает полученные значения в строку. Таким образом, единственное, что можно сделать с полем «Представление», это получить его в результат запроса.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 48.
• ИТС: Разыменование ссылочных полей составного типа в языке запросов
• ИТС: Особенности работы с полем Представление и функцией Представление() языка запросов
В запросе можно использовать не более 256 таблиц (для версий Microsoft SQL Server 2000 и Microsoft SQL Server 2005).
Источники:
• ИТС: Особенности работы с различными СУБД
На практике можно считать, что при использовании MS SQL Server документ «1С:Предприятие», имеющий свыше 1000 строк в табличной части либо делающий свыше 1000 движений по одному регистру, теоретически может при своем проведении вызывать эскалацию блокировок, поэтому при прочих равных условиях наличие больших документов — это потенциальная проблема параллельности работы. Это не значит, что такие документы нельзя провести. Просто нужно делать это не средствами платформы, а своим кодом — в нескольких относительно небольших транзакциях, обеспечив неделимость (атомарность) операции внешними средствами.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 67.
Конструкция Ссылка.Ссылка всегда является ошибкой и в коде на встроенном языке, и в запросах на языке запросов.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 216-217.
При написании запросов не следует использовать соединения с вложенными запросами. Следует соединять друг с другом только объекты метаданных или временные таблицы. Если запрос использует соединения с вложенными запросами, то его следует переписать с использованием временных таблиц.
Источники:
• ИТС: Ограничения на соединения с вложенными запросами и виртуальными таблицами
Конфликт блокировок на «пустых таблицах» в MS SQL Server происходит в автоматическом режиме управления блокировками при записи пустых наборов в пустую таблицу. При режиме автоматического управления блокировками платформой «1С:Предприятие» будет использован уровень изоляции Serializable, будет заблокирован диапазон ключа индекса (и пустая таблица при таком подходе окажется заблокированной целиком), и даже разделяемая блокировка будет сохраняться до конца транзакции, не говоря уже об исключительной.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 227.
Ликвидация запросов в цикле — это нечастый случай, когда оптимизация реально снижает нагрузку на оборудование сервера приложений «1С:Предприятие».
Порядок перечисления логических выражений в составном логическом выражении влияет на то, все ли их придется проверять на встроенном языке и в коде на языке запросов.
Обращение к реквизитам регистратора регистра всегда влияет на производительность.
Ошибки блокировок в форме списка (обычные формы) возможны, если в событиях ПриПолученииДанных() и в ПриВыводеСтроки() есть запросы через объектную модель.
Ошибки блокировок при формировании отчета возможны, например, при использовании построителя отчета, если отчету требуется получать согласованные данные (например по неделям), он будет выполняться в транзакции.
Получение метаданных объекта конфигурации следует выполнять с помощью метода Метаданные() этого объекта ( СправочникОбъект.Метаданные()), это существенно быстрее.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 293.
При использовании конструкции Попытка… Исключение… КонецПопытки внутри вложенной транзакции, если внутри этой конструкции возникла восстановимая исключительная ситуация на уровне общей транзакции исключительная ситуация также будет расценена как восстановимая.
При использовании конструкции Попытка… Исключение… КонецПопытки снаружи вложенной транзакции, если внутри этой транзакции возникла восстановимая исключительная ситуация при возврате в транзакцию верхнего уровня исключительная ситуация будет представлена как откат вложенной транзакции, что будет расценено как невосстановимая ошибка.
При использовании конструкций Попытка… Исключение… КонецПопытки внутри транзакций ошибка по причине «В данной транзакции уже происходили ошибки!» появляется при первом чтении после исключительной ситуации.
При копировании строк между различными таблицами значений (табличными частями и т.п.) со схожим составом колонок следует использовать метод глобального контекста ЗаполнитьЗначенияСвойств().
При необходимости поиска большого числа элементов одной таблицы значений в другой большой таблице значений в качестве одного из путей оптимизации можно использовать помещение таблиц-источников во временные таблицы СУБД, а затем получение целевой таблицы запросом, соединяющим временные таблицы.
При нескольких чтениях через объектную модель реквизитов одного и того же объекта внутри одной процедуры долго выполняется первое обращение.
При формировании табличного документа в качестве параметров ячеек с типом заполнения «Параметр» указывать ссылочные значения запрещено, но могут быть исключения.
При обращении в коде программы через объектную модель к объекту содержащего реквизит с типом ХранилищеЗначения, содержащий файл, этот реквизит будет прочитан из базы данных, даже если к этому реквизиту не обращались.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 107.
Применение ДЛЯ ИЗМЕНЕНИЯ без указания таблиц в тексте запроса приводит к тому, что блокировка обновления (U) будет установлена на все таблицы, перечисленные в запросе, даже на те, в которые дальше не будет записи. Это будет мешать другим пользователям работать с ними.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 64.
Проверку того, что результат выполнения запроса не содержит строк, следует выполнять с помощью метода Пустой(). Поскольку на получение выборки из результата запроса (или выгрузку его в таблицу значений) будет затрачиваться дополнительное время.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 292.
Работа с регистром бухгалтерии — это почти всегда работа с пересекающимися данными (работа с одним и тем же счетом).
Таблиц регистраций изменений в конфигурации по одной у каждого объекта метаданных, включенного хотя бы в один план обмена, у остальных они отсутствуют.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 79.
Соединять виртуальные таблицы с реальными, а также виртуальные с виртуальными не следует. Правильно сначала результат получения данных из виртуальной таблицы записывать во временную таблицу, индексировать эту временную таблицу по полям соединения, а затем уже соединять.
Источники:
• ИТС: Ограничения на соединения с вложенными запросами и виртуальными таблицами
Соединять подзапросы с реальными таблицами, а также подзапросы с подзапросами не является ошибкой, но может негативно влиять на производительность.
Процедура УстановитьЗначение (Знач Имя, Знач Значение) Экспорт УстановитьПривилегированныйРежим(Истина); Константы[Имя].Установить(Значение); УстановитьПривилегированныйРежим(Ложь); КонецПроцедуры
Приведенная процедура позволяет изменить значение любой константы в независимости от прав пользователя.
Что бы понять как изменится производительность при переводе базы с СУБД MS SQL Server на СУБД PostgreSQL, нужно выполнить проверку именно на той информационной базе, производительность которой требуется оценить, например, провести нагрузочное тестирование.
Подстрока SDBL_DUMMY указывает на то, что при формировании текста запроса участвовал механизм RLS.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 74.
Выгрузка изменений по плану обмена блокирует таблицу регистрации изменений разделяемой блокировкой.
Для исключения конфликтов блокировок при выгрузке изменений по плану обмена рекомендуется осуществлять массивные выгрузки данных в моменты минимальной загрузки системы, например, в ночное время или делать выгрузки достаточно часто.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 71.
Объект РегистрСведений.МенеджерЗаписи следует применять только тогда, когда выполнение операций с регистром сведений требует использования отбора одновременно по всем измерениям.
При необходимости получения данных из базы в событиях формы:
• ОбновлениеОтображения();
• ПриВыводеСтроки();
• ПриАктивацииСтроки().
Следует минимизировать обращение к данным информационной базы в обработчиках этих событий. Как обход части проблем — перенести код в обработчики других событий, и получать данные запросами на языке запросов, а не через объектную модель.
Чтобы реквизит динамического списка не оказывал постоянного негативного влияния на время открытия формы, для него надо в настройках управляемой формы в режиме «1С:Предприятия» отключить вывод.
Не знаю ведется ли сейчас блог, но не могу не выразить благодарность за эту серию с ответами. Статьи очень помогли, большое спасибо.