Стабильность превыше всего

15 апреля 2013

Предисловие

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

Но вернемся с небес на землю! Во многих компаниях разработка/доработка конфигураций ведется в таком ритме, что бумага просто не поспевает за ними. Когда в неделю выполняются десятки доработок и изменений - технические задания отпадают сами собой. Их конечно могут писать и в таких ситуациях, но в основном это делают только для "разведения бюрократии", а также чтобы передать всю старую кипу бумаг новому программисту в будущем. Вникать в курс дела, так сказать. Но сами понимаете, что если ТЗ писались только потому что "так надо", никакой практической пользы они не принесут.

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

Мы не будем рассказывать о специфике работы таких компаний и о причинах происходящего. Рассмотрим другую сторону вопроса. Что нужно сделать программисту/разработчику, чтобы сохранить стабильность работы системы при таком наплыве непротестированных на 100% доработок. Что необходимо сделать нам, разработчикам, чтобы снизить риски при высоких темпах разработки. Вот об этом и пойдет речь далее.

Коллапс

Вывод сообщения о рассчитанной сумме в чекеРассмотрим простой пример, с которым сталкивался некоторое время назад. Торговая организация, все работают в единой базе. Самым используемым по частоте записи/проведения документом является "Чек ККМ". Оно и понятно, в день по всем филиалам происходит много продаж. Кассиры трудятся в поте лица.

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

Плевое дело! В начале процедуры-обработчика команды "ПробитьЧек", связанной с одноименной кнопкой на форме, нам всего навсего нужно выводить сообщение с привязкой к текущему объекту документа и полю реквизита "СуммаДокумента" на форме. Что может быть проще!

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

Опечатка в команде "Пробить" чека ККМ

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

Всего одна опечатка создала чрезвычайную ситуацию. Конечно, вмешательство программиста позволило решить проблему в считанные минуты. Было проведено динамическое обновление и все, что оставалось пользователям - перезапустить программу.

Как же мы, разработчики, можем застраховать себя от подобных сюрпризов? Конечно, конечно! Вы можете сказать, что нужны прямые руки или тестировщики. Или и то и другое. Но что, если у нас есть только прямые руки, а руководство скупится на зарплаты тестировщика в штате? Вариант просыпаться в 8 утра, когда начинают работать магазины и исправлять баги - не для нас. А уж тем более по выходным!

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

Вся ответственность на разработчике

И так, Вы программист/разработчик или группа программистов/разработчиков. Не важно. Главное, что ответственность за стабильность работы информационной системы, и в частотности за ошибки, баги в большей степени лежит на Вас, при этом интенсивность внесения доработок очень высокая. В таких случаях для подстраховки можно использовать следующие подходы в работе.

Скажи эксепшенам нет!

Начнем с самого простого. Мы могли бы поставить новый программный код в обработку исключений "Попытка...Исключение...". Тогда новый функционал конечно не работал бы, но нам бы удалось избежать шквала звонков и полной остановки работоспособности касс организации. Пользователи и дальше бы пробивали чеки, а программист позже бы заметил ошибку и поправил ее в нормальном режиме работы.

Помещаем "сомнительный код" в попытку

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

"Выключатели"

Справочник "Разработки" в дереве метаданныхЕще один способ сохранения относительной стабильности - "выключатели". Покажу на примере.

В конфигурации создаем справочник "Разработка" с реквизитом "Флаг" булевого типа. Для всех пользователей добавим право на чтение/изменение этого справочника.

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

Для нашего примера добавим предопределенный элемент с именем "СообщитьОСуммеЧекаПриПробитии".

Предопределенный элемент для доработки конфигурации из нашего примера выше

В соответствии с этим необходимо изменить программный код в обработчике команды "ПробитьЧек" и добавить кэширование значение реквизита "Флаг" для добавленного предопределенного элемента. Первым делом добавим реквизит формы "СообщитьОСуммеЧекаПриПробитии" с типом "булево", а в обработчике формы "ПриСозданииНаСервере" запишем в этот реквизит соответствующее значение.

Кэшируем значение в реквизите формы. Значение получаем при создании формы на сервере

Примечание: кэширование значения реквизита "Флаг" выполняем для того, чтобы исключить повторные обращения к серверу по команде "ПробитьЧек".

В соответствии с описанными изменениями программный код процедуры-обработчика команды "ПробитьЧек" примет следующий вид:

"Выключатель" в действии

Таким образом, если будет обнаружена ошибка, то разработчик с легкостью уберет флаг в предопределенном элементе "СообщитьОСуммеЧекаПриПробитии" справочника "Разработки" и ветка с программным кодом вообще перестанет выполняться.

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

Уже не плохо. Для временного исправления ситуации уже не нужно обновлять информационную базу, но вставать в 8 утра все же пришлось бы! Но у нас есть еще интересный вариант в копилке!

Полная автоматизация

Доработав предыдущий вариант мы можем полностью автоматически отправлять сообщение о возникшей ошибке программисту, а также отключить добавленный программный код автоматически. Для этого доработаем программный код процедуры-обработчика команды "ПробитьЧек" следующим образом:

Автоматическое отключение нового программного кода при возникновении ошибки

Теперь при возникновении ошибки флаг включения нового программного кода будет сброшен в ЛОЖЬ автоматически и при последующих вызовах команды "ПробитьЧек" ошибка вообще не будет воспроизводится.

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

А что, если ...

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

Ошибки, опечатки и прочееА если ошибка будет не синтаксическая, а логическая! Да, тогда автоматически алгоритм не отключится. Нужно будет руками отключить флаг использования разработки. Но никто не обещал создать на платформе 1С:Предприятие искусственный интеллект! Зачем же тогда мы нужны были бы!

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

А каков Ваш идеальных подход в такой ситуации?


comments powered by Disqus