Шаблон обработки (1.0 / 29.05.12 / CaSH)


Один из кирпичиков при помощи которого можно быстро улучшить свою обработку: стандартизировать, добавить ссылки на страничку разработки и свою собственную, добавить поддержку версий с автоматическим уведомлением о более новой версии

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

Также буду благодарен всем кто предложит удобные фишки для реализации в шаблоне (пока на уме только переоткрытие)

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

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

1. всем удобно знать что в машинах руль слева и впереди, а дороги правосторонние

2. многие поголовно утверждают что все разработки "Apple" очень удобны и соответственно бешенно популярны (сам я лично не пробовал т.к. не испытывал такой потребности)

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

Итак, начнемс-с-с-с... со структуры, предопределенныых полей в обработках/отчетах очень мало всего 3: Имя, Синоним, Комментарий. Попробуем обойтись ими.

Имя и Синоним должны как-то соответствовать друг другу. В идеале Имя это Синоним без пробелов с заглавнми буквами в каждом слове если их несколько. Так повелось в 1С издревна и это очень удобно, хотя мне иногда встречались в типовой 1С Справочники которые не соответствуют этим принципам. Рассмотрим какие последствия из-за нарушения этого принципа: при выводе таблиц баз (справочников, документов и прочее) приходиться всегда предусматривать вывод как Имени так и Синонима чтобы легко найти объект, что очень обременительно.

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

Чтобы не писать постоянно ее в заголовке окна как и само название обработки можно упростить так:

Процедура ПриОткрытии()
   
Форма.Заголовок = Форма.Метаданные().Синоним + " (" + Форма.Метаданные().Комментарий + ")";
КонецПРоцедуры

Далее я подглядел у alexk-is что очень удобно когда можно прямо из обработки перейти на ее страничку или страничку автора ведь часто забываеш где взял обработку и для чего она. У milkers взял то что прямо из обработки можно за нее плюсануть, т.к. не всегда есть время заходить и плючовать когда много обработок. Вобщем решил я все это сложить в один механизм. И тут есть интересный способ которым я начал пользоваться после того как в модуле формы у меня стала каша из того что множество обработчиков кнопок. И решил я это упростить вот так: предположим у нас есть команданая панель с кучей кнопок, команды у них схожи, а вот процеду рнаплодилось много, тогда мы просто пишем одну процедуру где прописываем все команды но только выполяем их в зависимости от того какая кнопка была нажата. Причем вызывать эту процедуру можно даже без указания кнопки, а просто передав действие строкой - просто и изящно!

Процедура КоманднаяПанельУниверсальноеДействие(Кнопка)
   
Задача = ?(ТипЗнч(Кнопка) = Тип("Строка"), Кнопка, Кнопка.Имя); // универсально получаем Задачу и выполняем ее
   
Если Задача = "ОткрытьСайт" Тогда
       
ЗапуститьПриложение("http://www.avprog.ru/");
    ИначеЕсли
Задача = "ОткрытьСтраницуАвтора" Тогда
       
ЗапуститьПриложение("http://avprog.ru/profile/55562/public/");
    КонецЕсли;
КонецПроцедуры

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

Хотя я и выкладываю обработку - шаблон, все же у кого сложности со скачиванием тут привожу текст модулей. Все что можно я выкидываю с модуля формы в модуль обработки при этом не сильно награмождая новые процедуры (против кого мы и боремся), так что сначала привожу модуль. Для каждой процедуры есть описание для чего она нужна, так что читаем!

//==================================================================================================
// Описание:
//      Предназначена для выведение переданных значений в кавычках, позволяющих определить начало и конец
//      значения и выделения его на фоне общего текста сообщения
Функция Кавычки(Значение, Сокращать=Ложь) Экспорт // Версия 1.1 / 20.02.10 / CaSH
   
Возврат "["+?(Сокращать,СокрЛП(Значение),Значение)+"]";
КонецФункции   
// Кавычки()

//==================================================================================================
// Описание:
//      Устанавливает заголовок вормы обработок по единому образцу из методанных обработки
Процедура УстановитьЗаголовокФормы(Форма) Экспорт // Версия 1.1 / 09.12.09 / CaSH
   
Форма.Заголовок = Форма.Метаданные().Синоним + " (" + Форма.Метаданные().Комментарий + ")";
КонецПроцедуры 
// ОформитьЗаголовокФормы()

//==================================================================================================
// Описание:
//      Возвращает из версии представления "1.2.3.4" число "001002003004" для возможности сравнния версий между собой
// Параметры:
//      [КоличествоРазрядов] - количество групп из которых состоит версия, для большей универсальности
Функция ПолучитьВерсию(Знач СтрокаВерсии, КоличествоРазрядов = 2)

   
// хитрый вариант преобразования строки с разделителями в массив строк
   
НовыйМассив = ЗначениеИзСтрокиВнутр("{""#"",51e7a0d2-530b-11d4-b98a-008048da3034,{0,{""S"",""" + СтрЗаменить(СтрЗаменить(СтрокаВерсии, """", """"""), ".", """},{""S"",""") + """}}}");
   
СтрокаВерсии = ""; Счетчик = 0;
    Для каждого
ЭлементМассива Из НовыйМассив Цикл
        Попытка
           
Значение = Число(ЭлементМассива);
        Исключение
           
Значение = 0;
        КонецПопытки;
       
СтрокаВерсии = СтрокаВерсии + Формат(Значение, "ЧЦ=3; ЧН=; ЧВН=");
       
Счетчик = Счетчик + 1;
    КонецЦикла;

    Пока
Счетчик < КоличествоРазрядов Цикл
       
СтрокаВерсии = СтрокаВерсии + "000";
       
Счетчик = Счетчик + 1;
    КонецЦикла;

    Возврат
Число(СтрокаВерсии);
КонецФункции
// ПолучитьВерсию()

Далее привожу сам модуль формы. Имейти ввиду что создав форму я сразу же переименовываю элемент "КоманднаяПанель1" в более понятное "КоманднаяПанельФормы". В добавок у вас должна быть в конфигурации "БиблиотекаКартинок.Информация32", если ее нет поставьте заменитель в метод "ПоказатьОповещениеПользователя()" или вообще удалите упоминание о картинке - все и так заработает 

Перем IE, АдресСтраницыРазработки, ПроверятьОбновлениеРазработкиПриОткрытии; // БЛОК: ОБНОВЛЕНИЕ ВЕРСИИ РАЗРАБОТКИ

// БЛОК: ОБНОВЛЕНИЕ ВЕРСИИ РАЗРАБОТКИ
////////////////////////////////////////////////////////////////////////////////////////////////////


//==================================================================================================
// Описание:
//      Т.к. IE не дает сразу ответа то ожидаем его вызывая процедуру и смотря статус IE а потом выполняем
//      обработку полученного заголовка с указанной страницы
Процедура ПродолжитьПроверкуВерсийРазработки()

    Если
IE.ReadyState < 4 Тогда
       
ПодключитьОбработчикОжидания("ПродолжитьПроверкуВерсийРазработки", 0.1, Истина);
        Возврат;
    КонецЕсли;
   
ВерсияНовая = IE.Document.Title;
   
IE.Quit();
   
IE = Неопределено;
   
ЗаголовокСообщения = "Проверка обновления разработки на avprog.ru";
   
Разработка = Метаданные().Представление();
    Если Не
Найти(ВерсияНовая, Разработка) Тогда
       
ПоказатьОповещениеПользователя(ЗаголовокСообщения, , "Тема " + Кавычки(ВерсияНовая) + " страницы " + Кавычки(АдресСтраницыРазработки) + " не соответствует разработке " Кавычки(Разработка), БиблиотекаКартинок.Важно);
    КонецЕсли;
   
НомПоз = Найти(ВерсияНовая, "(");
    Если
НомПоз = 0 Тогда
       
Сообщить("Ошибка разбора заголовка " + Кавычки(ВерсияНовая) + " страницы разработки " + Кавычки(АдресСтраницыРазработки) + ". Проверка обновления прервана.
        |   Ошибка: Нет скобок для версии
        |   Причины: либо неправильная страница либо она недоступнадля получения версии разработки"
, СтатусСообщения.Важное);
        Возврат;
    КонецЕсли;
   
ВерсияНовая = Сред(ВерсияНовая, НомПоз + 1);
   
ВерсияНовая = Лев(ВерсияНовая, Найти(ВерсияНовая, "/") - 1);

   
ВерсияСтарая = Метаданные().Комментарий;
    Если
ЗначениеЗаполнено(ВерсияСтарая) Тогда
        ВерсияСтарая = Лев(ВерсияСтарая, Найти(ВерсияСтарая, "/") - 1);
    КонецЕсли;

    Если
ПолучитьВерсию(ВерсияНовая) > ПолучитьВерсию(ВерсияСтарая) Тогда
        Если
Вопрос("Разработка " + Кавычки(Разработка) + " имеет версию " + ВерсияСтарая + "
            |На avprog.ru опубликована более новая версия "
+ ВерсияНовая + "
            |
            |Открыть страницу разработки?"
, РежимДиалогаВопрос.ДаНет, 90, КодВозвратаДиалога.Да, ЗаголовокСообщения, КодВозвратаДиалога.Да) = КодВозвратаДиалога.Да Тогда
           
РаботаССайтом("ОткрытьСтраницуРазработки");
        КонецЕсли;
    Иначе
       
ПоказатьОповещениеПользователя(ЗаголовокСообщения, , "Обновлений для разработки " + Кавычки(Разработка) + " нет", БиблиотекаКартинок.Важно);
    КонецЕсли;

КонецПроцедуры
// ПродолжитьПроверкуВерсийРазработки()

//==================================================================================================
// Описание:
//      Из-за использование процедуры ПодключитьОбработчикОжидания() которая не принимает параетров
//      пришлось вынести отдельно
Процедура ПроверитьОбновлениеРазработки()
   
РаботаССайтом("НачатьПроверкуВерсий");
КонецПроцедуры
// ПроверитьОбновлениеРазработки()

//==================================================================================================
// Описание:
//      Сводная процедура содержащая все возможные команды чтобы их не держать в разных местах
Процедура РаботаССайтом(Кнопка)

   
Задача = ?(ТипЗнч(Кнопка) = Тип("Строка"), Кнопка, Кнопка.Имя); // универсально получаем Задачу и выполняем ее

   
Если Задача = "ОткрытьСайт" Тогда

       
ЗапуститьПриложение("http://www.avprog.ru/");

    ИначеЕсли
Задача = "ОткрытьСтраницуАвтора" Тогда

       
ЗапуститьПриложение("http://avprog.ru/profile/55562/public/");

    ИначеЕсли
Задача = "ОткрытьСтраницуРазработки" Тогда

       
ЗапуститьПриложение(АдресСтраницыРазработки);

    ИначеЕсли
Задача = "РекомендаватьРазработку" Тогда

       
ЗапуститьПриложение(АдресСтраницыРазработки + "?rate=1");

    ИначеЕсли
Задача = "ПроверитьОбновлениеРазработки" Тогда

       
ПроверитьОбновлениеРазработки(); // небольшая зацикленность но для порядка нужна

   
ИначеЕсли Задача = "НачатьПроверкуВерсий" Тогда

       
Состояние("Подключение к Internet Explorer...");
       
ПоказатьОповещениеПользователя("Запрос номеров версий...", , "Для разработки " + Кавычки(Метаданные().Представление()) + " выполняеться запрос на последнюю версию на сайт www.avprog.ru через браузер Internet Explorer", БиблиотекаКартинок.Информация32);
       
СтрокаОбъекта = "InternetExplorer.Application";
        Попытка
           
IE = Новый COMОбъект(СтрокаОбъекта);
        Исключение
           
Сообщить("Не удалось создать COM-объект: " + Кавычки(СтрокаОбъекта) + "
            |   Ошибка: "
+ ОписаниеОшибки(), СтатусСообщения.Внимание);
            Возврат;
        КонецПопытки;
       
IE.Visible = 0;
       
IE.Silent = -1;
       
IE.Navigate(АдресСтраницыРазработки);
       
ПродолжитьПроверкуВерсийРазработки();

    ИначеЕсли
Задача = "ПроверятьОбновлениеРазработкиПриОткрытии" Тогда

       
ПроверятьОбновлениеРазработкиПриОткрытии = Не ПроверятьОбновлениеРазработкиПриОткрытии;
       
ЭлементыФормы.КоманднаяПанельФормы.Кнопки.ПоддержкаРазработки.Кнопки.ПроверятьОбновлениеРазработкиПриОткрытии.Пометка = ПроверятьОбновлениеРазработкиПриОткрытии;
       
СохранитьЗначение(Метаданные().ПолноеИмя() + "_" + Задача, ПроверятьОбновлениеРазработкиПриОткрытии);
        Если Не
ПроверятьОбновлениеРазработкиПриОткрытии Тогда
           
ОтключитьОбработчикОжидания("ПроверитьОбновлениеРазработки");
        КонецЕсли;

    КонецЕсли;

КонецПроцедуры
// РаботаССайтом()

//==================================================================================================
Процедура ПриОткрытии()

   
УстановитьЗаголовокФормы(ЭтаФорма); //$+ CaSH Универсальный механизм

    // БЛОК: ОБНОВЛЕНИЕ ВЕРСИИ РАЗРАБОТКИ
   
ПроверятьОбновлениеРазработкиПриОткрытии = ВосстановитьЗначение("ПроверятьОбновлениеРазработкиПриОткрытии");
   
ПроверятьОбновлениеРазработкиПриОткрытии = ?(ПроверятьОбновлениеРазработкиПриОткрытии = Неопределено, Истина, ПроверятьОбновлениеРазработкиПриОткрытии);
   
ЭлементыФормы.КоманднаяПанельФормы.Кнопки.ПоддержкаРазработки.Кнопки.ПроверятьОбновлениеРазработкиПриОткрытии.Пометка = ПроверятьОбновлениеРазработкиПриОткрытии;
    Если
ПроверятьОбновлениеРазработкиПриОткрытии Тогда
       
ПодключитьОбработчикОжидания("ПроверитьОбновлениеРазработки", 10, Истина);
    КонецЕсли;

КонецПроцедуры
// ПриОткрытии()

АдресСтраницыРазработки = "http://avprog.ru/public/86911/"; // должно заканчиваться на "/" // БЛОК: ОБНОВЛЕНИЕ ВЕРСИИ РАЗРАБОТКИ

Еще одна важная фишка которая у вас добавиться - при запуске обработки автоматически будет проверена версия указанная вами в переменной "АдресСтраницыРазработки". Только нужно придерживаться правила что заголовок на страничке будет выглядеть аналогично этой разработке.

Кстати нумерация версий должна быть такой: 1.001.102 (3 разряда по 3 цифры), т.е. версия 1.1 это = 1.001, а не 1.100, собственно мне хватает 2 разряда, поэтому я указываю в функции ПолучитьВерсию() КоличествоРазрядов = 2, а количество цифр в разряде не более 3-х!

 

Файлы обработки:

-