среда, 11 ноября 2015 г.

ЦУП. Коротко о главном.

В этой статье я хочу познакомить вас с самым мощным инструментом из КИПа( Корпортивный инструментальный пакет). Речь пойдет о ЦУПе (Центре управления производительностью). Со слов самой фирмы 1С «Центр управления производительностью» (ЦУП) — инструмент мониторинга и анализа производительности клиент-серверных информационных систем на платформе «1С:Предприятие 8». ЦУП предназначен для оценки производительности системы, сбора подробной технической информации об
имеющихся «узких местах» и анализа этой информации с целью дальнейшей оптимизации.
В отличие от "Тест-центра" ЦУП не встраивается в исследуемую базу, а представляет собой самостоятельную конфигурацию которую нужно развернуть как отдельную информационную базу. И, само собой, с помощью ЦУПа можно мониторить и анализировать неограниченное число баз. Сразу упомяну и о минусах ЦУПа: кроме немалой стоимости продукта могут быть сложности с его настройкой. Как правило сложности связаны с отсутствием необходимых прав. И в некоторых тяжелых случаях согласование назначения необходимых прав может растянутся на длительное время. Вообще редких ошибок при работе с ЦУП довольно много подробнее тут (они даже собраны в отдельную методичку), но зато в ЦУПе есть отличная инструкция по настройке  и пошаговый мастер настройки. И если на каком-то этапе мастера возникла ошибка, то необходимо внимательно прочитать соответсвующий пункт инструкции и внести необходимые изменения.

Как уже говорилось ЦУП -это инструмент для мониторинга и анализа производительности, но естественно сам ЦУП ни коим образом не исправляет выявленные ошибки.

По умолчанию в ЦУП созданы 3 сценария работы
Мониторинг
Просмотр
Регламентный мониторинг (не пользуется популярностью).
Но пользователь может создать свой сценарий с нуля или копированием одного из имеющихся.

Показатели, с которыми работает ЦУП, можно разделить на 2 группы:
  • Оперативные и
  • Аналитические
Оперативные показатели можно анализировать в режиме онлайн. К ним относятся например (Количество выполняемых запросов, Суммарное время выполняемых запросов, Максимальное время выполнения запросов, Суммарное время ожидания на блокировках СУБД и 1С, Количество взаимоблокировок, количество таймаутов и т.д).
Аналитических показателей всего 3 (Анализ запросов, анализ взаимоблокировок и анализ ожиданий на блокировках). Для анализа аналитических показателей предназначен сценарий "Просмотр".
Если Вы еще не знакомы со статьей из сайта 1С, то предлагаю ознакомится по ссылке.
В этой статье я познакомлю Вас с тем,чего в статье недосказано.
1) Полноценная работа с ЦУП возможна только с MS SQL в других случаях он будет бесполезен. Учтите это при покупке).
2) ЦУП не расследует взаимоблокировки на уровне 1С. 
3) Если конфигурация исследуемая конфигурация работает в автоматическом режиме, то ЦУП не всегда может определить гранулярность и режим блокировки.
4) Оперативные показатели ЦУП собирает путем опрашивания консоли кластера с заданным промежутком времени(по умолчанию раз в 15 сек) и это не оказывает существенной нагрузки на сервер, поэтому включенными они могут быть сколь угодно. Иначе дело обстоит с аналитическими показателями. Информация получается считыванием логов технологического журнала и оказывает серьезную нагрузку на сервер, поэтому рекомендуется включать сбор информации примерно на 15 минут в период пиковой нагрузки.Чем дольше данные собираются тем дольше они затем будут анализироваться. Одна из ошибок почему аналитические данные не анализируются это то что в папке conf уже находится файл logcfg.xml. Решение элементарное -удалить или перенести файл в другое место.
5) При анализе аналитических показателей ЦУП не всегда может точно определить виновника блокировки, в таком случае будет надпись "Предположение", если ЦУП уверен то надпись "Точные данные".
6) ЦУП не показывает контекст вызванный из стандартных команд. 
7) Показатели  "Количество таймаутов" и количество взаимоблокировок" распространяются не на исследуемую базу а на весь SQL сервер. Таким образом если у Вас на сервере несколько работающих баз, то обнаружив что показатель "Количество таймаутов" стал >0 не считайте что это 100% таймаут исследуемой базы.
Если у Вас остались вопросы задавайте их в комментариях или группе в контакте.


четверг, 29 октября 2015 г.

1С: Эксперт. Решение билета №11

Вопрос 11.1
В конфигурации определены следующие объекты метаданных:
Справочник «Контрагенты». Структура:
ДоговорСКонтрагентом (тип Документы.ДоговораСКонтрагентами.Ссылка)
ДоговорАннулирован (тип Булево)
ФотокопияДоговора (тип ХранилищеЗначений)
Регистр накопления «ВзаиморасчетыСКонтрагентом». Структура:
Сделка (составной тип из 28 видов документов). 
Проанализируйте  следующий код из вложенного файла и укажите на неоптимальные решения.
Предложите более оптимальный способ решить эту задачу.

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|     Взаиморасчеты.Сделка КАК Сделка
|ИЗ
|     РегистрНакопления.ВзаиморасчетыСКонтрагентом КАК Взаиморасчеты
|ГДЕ
|     Взаиморасчеты.Сделка ССЫЛКА Документ.СчетНаОплатуПокупателю";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
     Сделка = Выборка.Сделка;
     Контрагент = Сделка.Контрагент;
     Если (Контрагент.ДоговорАнулирован) Тогда
          Сообщить("Договор с " + Контрагент.Наименование + " анулирован!");
     КонецЕсли;

КонецЦикла;

Ответ:
1) Так как поле «Сделка» составного типа, то нужно использовать  функцию «Выразить».
2) В запросе отбираются лишние данные, нужно отбирать  в запросе сразу задать условие где «ДоговорАнулирован = Истина».
3) В цикле идет обращение через точку, следовательно, получаются запросы в цикле. Необходимо получать наименование контрагента сразу в запросе.

Вопрос 11.2
Что такое блокировка и для чего она нужна? Кто и когда устанавливает блокировку? Кто и когда снимает блокировку? Что такое ожидание на блокировке и когда оно происходит.

Ответ:
1) Что такое блокировка и для чего она нужна? Блокировка это информация о том, что некоторый ресурс заблокирован.
2) Кто и когда устанавливает блокировку? Блокировка устанавливается явно и неявно.
Явно устанавливает разработчик с помощью конструктора встроенного  языка Новый БлокировкаДанных.
Неявно блокировка устанавливается платформой при записи(удалении) объектов, в обработке проведения и др.
3) Ожидание на блокировке это ситуация когда транзакция не может установить свою блокировку так как ресурс уже заблокирован другой транзакцией.


Вопрос 11.3
Конфигурация системы содержит документ, имеющий сложную функциональность. При проведении документа выполняется большое количество строк кода из различных модулей, выполняющихся как на клиенте так и на сервере 1С: Предприятия. По результатам тестирования производительность документа в однопользовательском режиме признана неудовлетворительной. Перед Вами поставлена задача повысить скорость проведения документа. Предложите план конкретных действий, направленных на решение этой задачи.

Ответ:
1)Если даже в однопользовательском режиме операция выполняется медленно значит есть неоптимальные запросы.
С помощью замера производительности в отладчике определить самые "тяжелые" запросы и их оптимизировать.
2) "Разгрузить" обработку проведения. Возможно некоторую  часть функционала  можно вынести из обработки проведения и вызывать их отдельными командами.

1С: Эксперт. Решение билета №10.

Вопрос 10.1
Регистр накопления имеет следующую структуру:Измерения: СкладРесурсы: Товар, ОстатокДокумент имеет следующую структуру:Реквизиты: Организация, КонтрагентТабличная часть «Товары»: Товар, Склад, КоличествоДокумент проводится по регистру и реквизиты табличной части переносятся в измерения и ресурсы регистра по следующей схеме:




Возможно ли реализовать такую структуру данных?
Если да, то оптимальна ли такая структура?


Ответ:
Возможно ли реализовать такую структуру данных? Нет так ресурс может быть только числом.

Если да, то оптимальна ли такая структура? Скорее всего нет, так как обычно склад один и то же поэтому его следует перенести в шапку.

Вопрос 10.2. Что такое уровень изоляции. Какие УИ поддерживает 1С Предпритие 8. Чем они отличаются с практической точки зрения?

Ответ:
Как говорит википедия " Уровень изолированности транзакций — значение, определяющее уровень, при котором в транзакции допускаются несогласованные данные, то есть степень изолированности одной транзакции от другой. Более высокий уровень изолированности повышает точность данных, но при этом может снижаться количество параллельно выполняемых транзакций. С другой стороны, более низкий уровень изолированности позволяет выполнять больше параллельных транзакций, но снижает точность данных."
В 1С поддерживаются следующие уровни изоляции:
  • Read uncommitted 
  • Read committed 
  • READ COMMITTED SNAPSHOT 
  • Repeatable read 
  • Serializable
Вопрос 10.3
В результате анализа проблемы взаимоблокировки в реально работающей системе на платформе 1с 8 была обнаружена ее причина: Запрос в транзакции без опции "Для изменения" и затем запись прочитанных данных. Почему в этом случае возникает взаимоблокировка? Как и почему изменится ситуация, если использовать опцию "для изменения".
Ответ:
Причина описанной взаимоблокировки называется "повышение уровня изоляции транзакции". В автоматическом режиме при чтении запросом  без опции "для изменения" устанавливается S блокировка до конца транзакции.
При записи данных устанавливается X блокировка также до конца транзакции.
Если 2 параллельные транзакции выполняют эти действия параллельно, то возможна следующая ситуация: Обе смогут выполнить запрос, так как S блокировки совместимы. Дальше первая транзакция не сможет наложить свою X блокировку так как на ресурс наложена S блокировка второй транзакции, и вторая транзакция не сможет наложить свою X блокировку так как на ресурс наложена S блокировка первой транзакции, что и приведет к дедлоку.
Если же запрос выполнять с опцией "для изменения", то будет наложена U блокировка, а U блокировки между собой не совместимы и одна из транзакций станет в очередь и будет дожидаться завершения первой транзакции .

среда, 28 октября 2015 г.

1С: Эксперт. Решение билета №9

Вопрос 09.1
В конфигурации определен регистр накопления «ОстаткиТоваровНаСкладах», который имеет следующий набор измерений:
·        Склад
·        Товар

Измерения регистра не проиндексированы.

Пользователь А выполняет в транзакции запрос следующего вида:

Запрос.Текст = “ВЫБРАТЬ
| Остатки.Склад КАК Склад,
| Остатки.Товар КАК Товар,
| Остатки. КоличествоОстаток КАК Остаток
| ИЗ
|  РегистрНакопления.ТоварыНаСкладах.Остатки(,Товар=&Товар) КАК Остатки”;
Запрос.УстановитьПараметр(“Товар”, Справочники.Товары.НайтиПоКоду(“00001”));

Пользователь Б выполняет в запись следующего набора записей  регистра ТоварыНаСкладах:

Склад
Товар
ОсновнойСклад
Телевизор SHARP
ОптовыйСклад
Телевизор SHARP

Смогут ли два этих действия выполнится параллельно? Обоснуйте свой ответ. Как измениться ситуация, если Пользователь А укажет условие по складу «Резервный склад». Почему?


Ответ:
В первом случае скорее всего будет выполнен запрос со сканированием и на весь регистр во время выполнения запроса будет наложена S блокировка.
Соответственно вторая транзакция не сможет наложить свою X блокировку при записи.
Если Пользователь А укажет условие по складу «Резервный склад» то сможет использоваться поиск по кластерному индексу при выполнении запроса и транзакции смогут выполнится параллельно.


Вопрос 09.2
Код конфигурации содержит следующий фрагмент:

НачатьТранзакцию();
            Процедура1();
            НачатьТранзакцию();
                        Процедура2();
                        НачатьТранзакцию();
                        Процедура3();
                        ОтменитьТранзакцию();

Какие действия будут отменены в результате выполнения функции ОтменитьТранзакцию() в 7 строке.

Ответ:
Будут отменены все действия, так как вложенные транзакции не поддерживаются.

Вопрос 09.3
Для работы системы используется сетевой ключ на 50 пользователей, который установлен на сервере предприятия. Во время работы системы у различных пользователей периодически возникает ошибка «Не обнаружен ключ защиты программы». Укажите возможные причины возникновения ошибки и предложите способы их устранения.
Ответ:
1) Скорее всего сервер не успевает выдавать лицензии, поэтому требуется настроить  файл nethasp.ini.
2) Проверить используемый протокол. Если используется ipv6, то  следует перейти на протокол ipv4 так как HASP License Manager работает только с IPv4.
3) Установка HASP License Manager на терминальный сервер
4) Возможно сам ключ поврежден.



Как установить заголовок приложения(системы)

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

Функция    ПолучитьСиноним() Экспорт;
ТекСиноним = Метаданные.Синоним;
Возврат ТекСиноним;
КонецФункции

2) В модуле управляемого приложения вставляем код
Процедура ПриНачалеРаботыСистемы()
    ТекЗаголовок = "learning1c.blogspot.com " ;
    ТекСиноним= ОбщийМодуль1.ПолучитьСиноним();
    НовЗаголовок =    ТекЗаголовок+ТекСиноним+ИмяПользователя() ;
    УстановитьЗаголовокКлиентскогоПриложения(НовЗаголовок);  
КонецПроцедуры

3) Устанавливаем сам заголовок в свойствах конфигурации.

Получаем требуемую картину

вторник, 27 октября 2015 г.

1С: Эксперт. Решение билета №8

Вопрос 08.1
В метаданных конфигурации определена последовательность «ПартионныйУчет» с измерением «Организация». Обработчик проведения документа содержит следующий код:

Отбор = Новый Структура;
Отбор.Вставить(«Организация», Организация);
Последовательности.ПартионныйУчет.УстановитьГраницу(ТекущаяДата(), Отбор);

В каком случае документы этого вида смогут проводится параллельно разными пользователя, а в каком нет? Обоснуйте свой ответ. Как можно повысить параллельность работы в этом случае?

Ответ: 
Смогут проводится документы разными пользователями только если организации различаются.
Параллельность можно повысить двумя способами:
1) Убрать смещение границы последовательности из обработки проведения. Делать это оптимальнее с помощью фоновых заданий в нерабочее время.
2) Добавить в последовательность еще один реквизит (например контрагент или договор) в этом случае параллельность также повысится.



Вопрос 08.2
Что такое транзакция? Для чего она нужна? В каком случае открывается транзакция? Поддерживаются ли вложенные транзакции?

Ответ:
В качестве ответа приведу фрагмент книги "Настольная книга эксперта по технологическим вопросам".
Транзакция в информатике это группа логически объединенных последовательных операций по работе с данными, обрабатываемая или отменяемая целиком. 
Все Транзакции могут быть явными и неявными. Средствами языка «1С» явные транзакции начинаются процедурой глобального контекста НачатьТранзакцию() , завершаются процедурой глобального контекста ЗафиксироватьТранзакцию() , отменяются процедурой ОтменитьТранзакцию() .
Неявные транзакции начинаются, завершаются и отменяются средствами
платформы. Любые операции, изменяющие данные (например — проведение и отмена проведения документов) выполняются только в транзакции. В неявной транзакции выполняются обработчики следующих событий прикладных объектов конфигурации (но не форм!), вызываемые как через модули этих прикладных объектов, так и через подписки на события:
ПередЗаписью() ;
ПриЗаписи() ;
ОбработкаПроведения() ;
ОбработкаУдаленияПроведения() ;
ПередУдалением() ;
ПередВыполнением() .

Вложенные транзакции не поддерживаются.



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

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




В чем может быть причина уменьшения общей пропускной способности при количестве одновременно работающих пользователей более 150?

Ответ:
Причина скорее всего в сильной загруженности оборудования.  В  этом  случае  необходимо  настроить  мониторинг  загруженности оборудования.
Так  же  узким  местом  здесь  может  выступать  рабочий  процесс.  Если  рабочий  процесс создан  1,  то  он  может  являться  причиной  медленной  работы  системы.  В  этом  случае необходимо  добавить  еще один или несколько  рабочих  процессов  в  кластере.


понедельник, 26 октября 2015 г.

1С: Эксперт. Решение билета №6


Вопрос 6.1. Документ РеализацияТоваров осуществляет движения по регистру ОстаткиНаСкладах, а именно списывает реализованное количество товаров со склада. В обработчике проведения документа выполняется проверка превышения лимитов - минимального допустимого остатка товара на складе и максимально допустимого размера отгрузки со склада. Запрос выглядит следующим образом:

Ответ:
Запрос.Текст = "ВЫБРАТЬ
|     Товары.Номенклатура КАК Номенклатура,
|     Товары.КоличествоНаСписание КАК Количество,
|     Остатки.КоличествоОстаток КАК Остаток
|ИЗ
|     (ВЫБРАТЬ
|          Товары.Номенклатура КАК Номенклатура,
|          СУММА(Товары.Количество) КАК Количество
|     ИЗ  Документ.Реализация.Товары КАК Товары
|     ГДЕ Товары.Ссылка = &ДокументСсылка
|     СГРУППИРОВАТЬ ПО
|          Товары.Номенклатура) КАК Товары
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК Остатки
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЛимитыОстатков КАК ЛимитыОстатков
|     ПО ЛимитыОстатков.Номенклатура=Остатки.Номенклатура И ЛимитыОстатков.Склад = &Склад
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЛимитыОтгрузкиСоСкладов КАК ЛимитыОтгрузки
|     ПО ЛимитыОтгрузки.Номенклатура = Остатки.Номенклатура И ЛимитыОтгрузки.Склад = &Склад
|ПО Остатки.Номенклатура = Товары.Номенклатура
| ДЛЯ ИЗМЕНЕНИЯ";


1) После ДЛЯ ИЗМЕНЕНИЯ не указаны таблицы.  В случае если после предложения ДЛЯ ИЗМЕНЕНИЯ отсутствуют имена таблиц, блокироваться будут данные из всех таблиц, задействованных в запросе. Что приведет к избыточным блокировкам.
Следует блокировать для изменения только таблицу остатков товара.
2) Проверку лимитов нужно делать в самом запросе.

3) Подзапрос следует заменить на ВТ.

Вопрос 6.2. Имеется реально работающая многопользовательская система.  Необходимо решить следующие задачи:
1) Определить пользователей, которые в данный момент выполняют длительные запросы к базе данных.
2) Определить пользователей, которые заблокировали других пользователей.
Ответ:
На оба вопроса можно ответить с помощью консоли кластера.
В колонке "захвачено СУБД" отображается время выполнения запроса.
В колонке "заблокировано упр." отображается номер сеанса которым заблокирован текущий сеанс. Номер сеанса можно увидеть и
через монитор активности.

Вопрос 6.3. В метаданных конфигурации описан  регистр накопления (остатков) ОстаткиНаСкладах, имеющий измерения "Склад" и "Товар". Информационная база работает в режиме клиент-сервер с использованием СУБД PostgreSQL. 
Будут ли перечисленные пары операций выполнятся параллельно из разных сессий? Все операции выполняются при проведении документа.

Параллельность      Операция 1 Операция 2

Запись набора записей со следующими условиями: 
Склад= «Основной»
Товар =«Телефон»

Запись набора записей со следующими условиями
Склад= «Основной»
Товар =«Телевизор»

Чтение с опцией "ДЛЯ ИЗМЕНЕНИЯ" регистра остатков по условию: 
Склад= «Основной»
Товар =«Телефон»

Чтение без опции "ДЛЯ ИЗМЕНЕНИЯ" регистра остатков по условию
Склад= «Основной»
Товар =«Телефон»

Чтение без опции "ДЛЯ ИЗМЕНЕНИЯ" регистра остатков по условию
Склад= «Основной»
Товар =«Телефон»
Запись набора записей со следующими условиями
Склад= «Основной»
Товар =«Телефон»

Ответ:
Так как используется запрос с опцией "ДЛЯ ИЗМЕНЕНИЯ", то логично сделать вывод о том, что используется автоматический режим управления блокировками. Стоит помнить о том, что в автоматическом режиме  для версионных СУБД (коим и является PostgreSQL) минимальным уровнем гранулярности является таблица, поэтому с параллельностью тут дела будут хуже. Важно  помнить о том, что в СУБД версионниках  S и U блокировки не совместимы.
Поэтому решение будет следующим:

Параллельность      Операция 1 Операция 2
              +
Запись набора записей со следующими условиями: 
Склад= «Основной»
Товар =«Телефон»

Запись набора записей со следующими условиями
Склад= «Основной»
Товар =«Телевизор»
              -
Чтение с опцией "ДЛЯ ИЗМЕНЕНИЯ" регистра остатков по условию: 
Склад= «Основной»
Товар =«Телефон»

Чтение без опции "ДЛЯ ИЗМЕНЕНИЯ" регистра остатков по условию
Склад= «Основной»
Товар =«Телефон»
              -Чтение без опции "ДЛЯ ИЗМЕНЕНИЯ" регистра остатков по условию
Склад= «Основной»
Товар =«Телефон»
Запись набора записей со следующими условиями
Склад= «Основной»
Товар =«Телефон»