Стать «1С: Экспертом» — значит научиться мыслить несколько другими категориями, понять и «прочувствовать» работу системных механизмов платформы 1C. Что для этого понадобится, постараемся разобраться.
Рабочее место
Правильно настроенное рабочее место — 50% успеха. Используя только печатные (и электронные, конечно) источники, можно подготовиться к экзамену «1С: Эксперт» и даже сдать его, особенно если есть доступ к базе знаний по технологическим вопросам [2]. Но при этом в действительности вы не будете обладать той квалификацией, которую подразумевает под собой данный сертификат.
Эксперт по технологическим вопросам — это прежде всего человек, способный изнутри анализировать сложные ситуации, возникающие в процессе эксплуатации высоконагруженных систем, обеспечивать их бесперебойную работу и соответствие требованиям производительности. Без практического опыта эти задачи решить просто невозможно.
Достаточно несложно ознакомиться с механизмом блокировок, изоляцией транзакций, основами SQL, но, чтобы понять, как все это работает в совокупности, нужно практиковаться. Рабочее место себе придется обеспечить.
Для этого потребуются:
> Достаточно высокопроизводительный компьютер — не менее 4 Гб RAM и 2 ядер. Желательно 8 Гб и 4 ядра
> VMware Workstation (или аналоги).
> Windows 2008 Server и MS SQL Server 2008 и выше.
> Сервер «1С: Предприятия» и ключ защиты к нему.
> Корпоративный инструментальный пакет (1С: КИП) [3].
> Некоторые типовые конфигурации 1C. К примеру, «1С: Управление торговлей 11» и «1С: Управление производственным предприятием 1.3».
Все это нужно установить на виртуальную машину и настроить для использования. Правильно организованное рабочее место понадобится не только для подготовки к экзамену, но и для проведения экспериментов в дальнейшем.
Эксперименты с сервером «1С: Предприятия»
Сервер «1С: Предприятия» — достаточно простое приложение. На его работу повлиять сложно. Но некоторые особенности его функционирования, тем не менее, нужно увидеть на практике. Почему? Потому что однозначный ответ на вопрос, что делать в той или иной ситуации, существует достаточно редко. Эксперту, как правило, приходится вмешиваться в ситуации, когда речь идет уже совсем не о типовой работе: не существует штатных средств 1C для анализа подобных проблем.
В первую очередь нужно научиться настраивать и использовать технологический журнал
Технологический журнал в 1C как раз предназначается для экспертов. Не скажу, чтобы его часто приходилось использовать в реальной практике. На рабочей базе включать технологический журнал все-таки не рекомендуется. Разве что при начале эксплуатации — на запись исключительных ситуаций.
Для расследования «падений» сервера 1C полезен полный журнал, но если ошибку удается воспроизвести в тестовой среде, то, как правило, уже удается ее локализовать и обнаружить, не прибегая к использованию журнала. Но как минимум для сдачи экзамена разобраться с ним нужно. Самое простое, что для этого можно сделать, — скачать с диска или сайта 1С: ИТС обработку «Настройка технологического журнала», которая позволяет генерировать разные файлы настройки технологического журнала (logcfg.xml). Их можно «подсовывать» (помещать в каталог conf) серверу 1C и смотреть, что пишется в итоговый файл. Сам файл настроек технологического журнала можно посмотреть в обычном текстовом редакторе. Думаю, в его структуре вы достаточно быстро разберетесь.
Очень полезно «уронить» сервер 1C каким-либо образом (к примеру, поставив в запросе отбор по вложенному запросу из перечислений) и понять по технологическому журналу, в каком модуле и где был выполнен код, который привел к «падению» сервера.
«Уронить» сервер 1C и посмотреть, что будет
Самый главный эксперимент с сервером «1С: Предприятия» — конечно, проверить, как он ведет себя в сложных ситуациях. Для этого как минимум нужно запустить несколько рабочих процессов (здесь и далее речь идет о сервере «1С: Предприятия 8.2», в 1C 8.3 сервер претерпел существенные изменения). В идеале для этого нужно запустить виртуальную машину, на которой расположен сервер «1С: Предприятия» второй раз и добавить его в кластер.
После этого можно начинать игры. Запускаете с 30-40 клиентов 1C на кластер. Наблюдаете, как они перераспределяются по рабочим процессам. Посредством диспетчера задач «убиваете» один рабочий процесс.
Смотрите, что произойдет с клиентами и какие процессы будут происходить в операционной системе (какой процесс начнет потреблять память и процессорное время как минимум). Чем больше запустите клиентских соединений, тем больше интересного можно узнать. Тут приходит понимание, что самый важный процесс сервера 1C — это rpmngr (менеджер кластера сервера 1C) и что от его работы зависит «наше счастье и благополучие». Я лично после всех подобных экспериментов пришел к твердому выводу, что рабочий процесс 1C (rphost) на сервере должен быть один, дабы исключить повышенную вероятность сбоев в работе процесса rpmngr. Вы, естественно, можете сделать свои собственные выводы.
Выполнять тесты рекомендую с различным количеством пользователей и с различными вариантами падения сервера. Запустить произвольное количество пользовательских сеансов можно, к примеру, применив «Стандартный нагрузочный тест» (СНТ), который входит в 1C: КИП. Также крайне желательно вызывать падение сервера от утечки памяти, чтобы понимать, как это происходит, как происходит замедление работы и как с этим бороться. Сделать это просто — достаточно в каком-нибудь документе добавить ссылку на него же и перезаписать эти документы много раз. При этом можно еще включить технологический журнал и посмотреть в нем событие LEAKS.
Эксперименты с MS SQL
Блокировки — это, пожалуй, самая нужная и важная часть, на экзамене ее однозначно спросят, а в реальной жизни от избыточных блокировок, как правило, бывает наибольшее число проблем в многопользовательской системе, и проблемы эти чаще всего не решаются увеличением мощности оборудования.
Перед тем, как приступать к экспериментам, обязательно нужно ознакомиться со статьей «Блокировки данных в «1С: Предприятии 8» [4], у кого есть доступ к базе знаний 1C по технологическим вопросам, или с [5] — альтернативным источником данной статьи. Еще рекомендую прочитать мою статью «Для чего нужны блокировки» [6] на сайте infostart.ru. поэтому о теории и предназначении блокировок писать не буду. Перейдем сразу к экспериментам.
Собственно, проверить нужно вот эту таблицу (см. таблицу 1).
Таблица 1. Блокировки данных
Isolation level -Read uncommitted
Dirty read Yes, Nonrepeatable read Yes, Phantom Yes
Isolation level -Read committed
Dirty read No, Nonrepeatable read Yes, Phantom Yes
Isolation level -Repeatable read
Dirty read No, Nonrepeatable read No, Phantom Yes
Isolation level -Snapshot
Dirty read No, Nonrepeatable read No, Phantom No
Isolation level -Serializable
Dirty read No, Nonrepeatable read No, Phantom No
Можно не проверять уровень изоляции Repeatable read, так как в «1С: Предприятии» данный уровень изоляции не используется. 1C использует уровень изоляции Read commited, а в 1C 8.3 уже наконец-то осуществлен переход на уровень изоляции Snapshot. Для начала создадим БД, в которой будут проводиться эксперименты, выполнив команду:
Create Database TestDB
Теперь создадим таблицу, которую будем блокировать:
CREATE TABLE TestTable (
ID int NOT NULL,
Value nvarchar (10))
В таблицу нужно добавить хотя бы одну строчку, которую мы будем блокировать и изменять: insert into TestTable values (1, ‘strl’)
Далее нужно открыть второй сеанс Management Studio (вы же его установили и скрипты выше выполняли именно из него, правда?)
Теперь в одном сеансе пишем примерно следующую конструкцию: use TestDB; set transaction isolation level Serializable begin transaction update TestTable set Value = ‘str2’ where ID = 1 commit в другом соответственно: use TestDB; set transaction isolation level Serializable begin transaction
Select * from TestTable Commit
После этого запускаете отладку (кнопка Debug) и в первом сеансе останавливаетесь на Commit, а во втором… он сам остановится. Что должно получиться, посмотрите на рис. 1.
На данном рисунке MS SQL-сервер находится в ожидании на блокировке.
В это время можно запустить третий сеанс MS SQL и выполнить в нем код: exec sp_lock
Значимый результат получается такой: spid dbid ObjId IndId Type Resource Mode Status
52 9 245575913 0 TAB IS WAIT
55 9 245575913 0 TAB X GRANT
В первой строчке показано, что транзакция ждет ресурс (IS — попытка установки разделяемой блокировки), во второй — то, что на этот ресурс уже установлена эксклюзивная (X)блокировка.
А теперь меняем одно слово в коде. Заменяем Serializable на Read uncommitted, и никакой остановки на блокировке уже не будет. Сложнее всего с уровнем изоляции Read commited и Snapshot. Но об этом можно отдельную статью написать, тем более что их поведение еще меняется от версии к версии MS SQL Server.
А где тут 1C, если пока мы говорили только об MS SQL Server? В 1C эксперименты нужно проводить по тому же сценарию:
> открываете два сеанса в одной базе 1C;
> подключаете к обоим отладчик;
> ставите точки останова где-нибудь в конце модуля проведения того документа, который хотите исследовать;
> проводите из обоих сеансов. «Зависание» будет, если не на блокировках, то на точках останова точно;
> используете sp_lock для получения названия заблокированной таблицы.
sp_lock возвращает object_id, как убедились выше. Чтобы получить название самой таблицы, нужно выполнить конструкцию Select OBJECT_NAME(objectid). Данную конструкцию необходимо вызывать, когда установлено использование (use DatabaseName) той БД, таблицы которой заблокированы.
Но это, конечно, будет имя таблицы в терминах MS SQL Server. Эксперт уже должен привыкнуть переводить названия таблиц в термины объектов метаданных. В 1С есть функция Получить Структуру Хранения Базы Данных, которая возвращает соответствие имен таблиц MS SQL (как и других СУБД) и объектов метаданных 1C. Для этой функции сообществом уже разработан интерфейс, и даже не единственный. Пример наиболее удачного из них можно посмотреть на сайте infostart.ru[7]. Ну и, конечно же, нужно пытаться угадывать, какие таблицы заблокированы без помощи данного интерфейса. Для этого просто запоминаем структуру хранения таблиц 1C в СУБД. Тем более что для успешной сдачи экзамена эта информация совсем не повредит. Описание можно найти, к примеру, здесь [8].
***
Это, конечно, не вся информация, которую нужно знать, чтобы решать действительно сложные технологические вопросы, но после проведения некоторых экспериментов, здесь описанных, вы будете чувствовать себя намного увереннее в этих вопросах. Лучше один раз попробовать, чем сто раз прочитать.
1. http://www.1c.ru/rus/partners/training/files/exDert.html — рекомендуемые материалы для подготовки к экзамену «1С: Эксперт» на сайте 1C.
2. http://kb.1c.ru — база знаний по технологическим вопросам крупных внедрений 1C.
3. http://v8.1c.ru/expert/etp.htm — 1С: КИП (Корпоративный инструментальный пакет).
4. http://kb.1c.ru/articleView.jsp?id=30 — блокировки данных в «1С: Предприятии 8».
5. http://1cexpo.ru/informacziya/27-blokirovki-dannyx-v-1spredpriyatii-8.html — альтернативный источник статьи про блокировки данных в «1С: Предприятии».
6. http://infostart.ru/public/91880 — статья «Для чего нужны блокировки».
7. http://infostart.ru/public/147147 — структура хранения 1C.
8. http://help1c.com/faQ/view/673.html— описание структуры хранения таблиц 1C.