Системы Windows XP имеют в своем составе простейший брандмауэр подключения к Интернету (Internet Connection Firewall, ICF) — программу, позволяющую фильтровать информацию, поступающую из Интернета. Она пропускает только разрешенные ТСР/IР-пакеты и отбрасывает все осталь-ные. Это позволяет оградить компьютер от несанкционированного доступа или атак из Интернета, сохраняя при этом возможность работы с электрон-ной почтой, сетью Веб и т. п.
Брандмауэр должен устанавливаться на подключении, которое непосредственно связано с Интернетом. Например, его рекомендуется ставить на компьютер, имеющий общее подключение к Интернету (Internet Connection Sharing, ICS). (Этого делать не нужно, если в локальной сети уже имеется прокси-сервер или корпоративный брандмауэр.) Включение локального брандмауэра (никакой установки по сути-то и нет) выполняется на вкладке Дополнительно (Advanced) в окне, свойств выбранного подключения (обычно коммутируемого). Достаточно установить флажок Защитить мое подключение к Интернету (Protect my computer and network), и бранд-мауэр начнет работать.
Теперь нужно указать, к каким службам локального компьютера или сети можно обращаться из Интернета. Если подключение используется только для доступа к веб-ресурсам и электронной почте, то после включения брандмауэр уже готов к работе. Однако, если на компьютере разрешены входящие или VPN-подключения, настройка служб необходима. В этом случае система предлагает по умолчанию установки брандмауэра; в данном примере используется обычное коммутируемое подключение через аналоговый модем. Кроме того, при работе программы Windows Messenger в приведенном списке служб автоматически появляются порты TCP и UDP, нужные для ее работы.
Понятно, что если на компьютере или в локальной сети имеется FTP- или WWW-сервер, то нужно отметить эти службы на вкладке Службы (Services), чтобы с ними можно было работать. Выбрав службу и нажав кнопку Изме-нить (Edit), можно попасть в окно настройки ее параметров, где указывается адрес компьютера, на котором служба развернута, и номера используемых портов TCP/IP.
Не рекомендуется ставить брандмауэр на локальных и VPN-подключениях, поскольку это нарушит доступ к общим ресурсам. Особого внимания заслуживает трафик, передающийся по протоколу Internet Control Message Protocol (ICMP). По умолчанию он весь блокируется брандмауэром. Это означает, что, например, ping-запросы к вашему ком-пьютеру будут безрезультатными. Иногда блокировка ICMP может привести к разрыву связи с интернет-провайдером. При необходимости на вкладке ICMP можно разрешить некоторые виды ICMP-сообщений; информацию об используемых запросах следует получить у провайдера, В крайнем случае, можно разрешить все запросы и посмотреть, повлияло ли это на устойчивость связи.
Вся работа брандмауэра регистрируется в журнале, параметры которого задаются на вкладке Ведение журнала безопасности (Security Logging).
Часто программисту приходится сталкиваться с задачей написания приложения, работающего в фоновом режиме и не нуждающегося в месте на Панели задач. Если вы посмотрите на правый нижний угол рабочего стола windows, то наверняка найдете там приложения, для которых эта проблема решена: часы, переключатель раскладок клавиатуры, регулятор громкости и т. п. Ясно, что, как бы вы не увеличивали и не уменьшали формы своего приложения, попасть туда обычным путем не удастся. Способ для этого предоставляет shell api.
Те картинки, которые находятся на system tray — это действительно просто картинки, а не свернутые окна. Они управляются и располагаются панелью system tray. Она же берет на себя еще две функции: показ подсказки для каждого из значков и оповещение приложения, создавшего значок, обо всех перемещениях мыши над ним.
Весь api system tray состоит из 1 (одной) функции:
Код:
Параметр dwmessage определяет одну из операций: nim_add означает добавление значка в область, nim_delete — удаление, nim_modify — изменение.
Ход операции зависит от того, какие поля структуры tnotifyicondata будут заполнены.
Обязательным для заполнения является поле cbsize — там содержится размер структуры. Поле wnd должно содержать дескриптор окна, которое будет оповещаться о событиях, связанных со значком.
Идентификатор сообщения windows, которое вы хотите получать от системы о перемещениях мыши над значком, запишите в поле ucallbackmessage. Если вы хотите, чтобы при этих перемещениях над вашим значком показывалась подсказка, то задайте ее текст в поле sztip. В поле uid задается номер значка — каждое приложение может поместить на system tray сколько угодно значков. Дальнейшие операции вы будете производить, задавая этот номер. Дескриптор помещаемого значка должен быть задан в поле hicon. Здесь вы можете задать значок, связанный с вашим приложением, или загрузить свой — из ресурсов.
Примечание
Изменить главный значок приложения можно в диалоговом окне project/ options на странице application. Он будет доступен через свойство application.icon. Тут же можно отредактировать и строку для подсказки — свойство application.title.
Наконец, в поле uflags вы должны сообщить системе, что именно вы от нее хотите, или, другими словами, какие из полей hicon, ucallbackmessage и sztip вы на самом деле заполнили. В этом поле предусмотрена комбинация трех флагов: nif_icon, nif_message и nif_tip. Вы можете заполнить, скажем, поле sztip, но если вы при этом не установили флаг nif_tip, созданный вами значок не будет иметь строки с подсказкой.
Два приведенных ниже метода иллюстрируют сказанное. Первый из них создает значок на system tray, а второй — уничтожает его.
Код:
Примечание
he забывайте уничтожать созданные вами значки на system tray. Это не делается автоматически даже при закрытии приложения. Значок будет удален только после перезагрузки системы.
Сообщение, задаваемое в поле ucallbackmessage, по сути дела является единственной ниточкой, связывающей вас со значком после его создания. Оно объединяет в себе несколько сообщений. Когда к вам пришло такое сообщение (в примере, рассмотренном выше, оно имеет идентификатор wm_mytraynotify), поля в переданной в обработчик структуре типа tmessage распределены так. Параметр wparam содержит номер значка (тот самый, что задавался в поле uid при его создании), а параметр lparam — идентификатор сообщения от мыши, вроде wm_mousemove, wm_lbuttondown и т. п. К сожалению, остальная информация из этих сообщений теряется.
Координаты мыши в момент события придется узнать, вызвав функцию api getcursorpos:
Код:
Обратите внимание, что при показе всплывающего меню недостаточно просто вызвать метод popup. При этом нужно вынести главную форму приложения на передний план, в противном случае она не получит сообщений от меню.
Теперь решим еще две задачи. Во-первых, как сделать, чтобы приложение минимизировалось не на Панель задач (taskbar), а на system tray? И более того — как сразу запустить его в минимизированном виде, а показывать главную форму только по наступлении определенного события (приходу почты, наступлению определенного времени и т. п.).
Ответ на первый вопрос очевиден. Если минимизировать не только окно главной формы приложения (application.mainform.handle), но и окно приложения (application.handle), то приложение полностью исчезнет "с экранов радаров". В этот самый момент нужно создать значок на панели system tray. В его всплывающем меню должен быть пункт, при выборе которого оба окна восстанавливаются, а значок удаляется.
Чтобы приложение запустилось сразу в минимизированном виде и без главной формы, следует к вышесказанному добавить установку свойства application.showmainform в значение false. Здесь возникает одна сложность — если главная форма создавалась в невидимом состоянии, ее компоненты будут также созданы невидимыми. Поэтому при первом ее показе установим их свойство visible в значение true. Чтобы не повторять это дважды, установим флаг — глобальную переменную shownonce:
Код:
Теперь у вас в руках полноценный набор средств для работы с панелью system tray.
В заключение необходимо добавить, что все описанное реализуется не в операционной системе, а в оболочке ОС — Проводнике (explorer). В принципе, и windows nt 4/2000, и windows 95/98 допускают замену оболочки ОС на другие, например dashboard или lightstep. Там функции панели system tray могут быть не реализованы или реализованы через другие api. Впрочем, случаи замены оболочки достаточно редки.
Для отправки электронного письма, без использования почтового клиента, мы будем использовать компонент TNSMTP, который находится на вкладке FastNet.
Компонент TNSMTP позволяет отправлять электронную почту через почтовый сервер или выполнять другие команды, описанные в стандарте RFC 821. Данный компонент работает по протоколу SMTP (Simple Mail Transfer Protocol). По стандарту RFC 821 протокол SMTP использует порт 25. При подключении к почтовому серверу необходимо знать учетную запись (login) своего почтового ящика. Чаще всего, имя пользователя - это начальная часть вашего почтового адреса – до символа «@». Так же для подключения к SMTP серверу необходимо знать его адрес. Адрес своего почтового сервера указывается при создании на нем почтового ящика. Стоит заметить, что адрес почтового ящика и адрес сервера – это совершенно разные вещи.
Создадим небольшой пример. Добавим на форму стандартную кнопку и компонент TNSMTP.
Собственно, Вы можете и не добавлять на форму данный компонент, а просто прописать его в строках Uses. Такой вариант очень полезен, если Вы пишете программу в «консольном» режиме.
Код:
Но этого мы делать не будем. В обработчик кнопки поместим код расположенный ниже.
Код:
Для корректной работы компонента необходимо заполнить свойства Host и Port. Для того чтобы подключиться к серверу, необходимо вызывать метод Connect, а для отключения - Disconnect. Главное свойство компонента TNSMTP - PostMessage. Это свойство содержит в себе информацию об отправляемом письме: ToAddress (адрес получателя), FromAddress (адрес отправителя), Body (текст письма), Subject (тема письма) и FromName (имя отправителя). После отправки письма необходимо отключиться от сервера, используя метод Disconnect.
режде, чем применять Flash на сайте, нужно семь раз отмерить. Оказывается, не все знают, что это такое. Одни применяют Flash от необходимости, другие — от незнания. Дело в том, что Flash — это не обычная растровая (gif, jpg, bmp и т.п.) картинка и не html. А мультемидийная технология. Как у любой технологии, у этой есть свои преимущества и недостатки.
Рассматривать Flash-технологию стоит с нескольких позиций:
С точки зрения внешнего оформления и культуры сайта;
C функционально-технической стороны;
C практической стороны.
Оформление и культура сайта.
Сайт — это как книга. Вы покупаете книгу, потому что ее сюжет вам интересен или информация из нее вам полезна. Но не потому, что у нее красивая обложка или известный автор. То время, когда изумленный прогрессом интернетчик приходил на сайт, чтобы посмотреть, как там что-то прыгает-летает-плавает прошло. Теперь людей заботит информация.
Flash препятствует восприятию информации. Сайт, построенный на Flash больше напоминает игру для новомодной приставки или телевизионную рекламу, когда сидишь и ждешь, когда она закончится. В большинстве случаев это связано с изменением привычного для пользователя хода вещей, например, вмешательством в интерфейс, навязыванием анимации и даже звука. Сайт — не самоцель, он существует для посетителя (кроме домашних страничек, которые их авторы для себя же делают).
Функционально-техническая сторона.
Flash использует plug-in модули, мультемидийные функции, на сегодняшний день не интегрированные в браузеры. В силу присущих Flash-технологии свойств она имеет функциональные недостатки:
Наличие этих недостатков совсем не означает, что надо вовсе отказаться от Flash . Просто с одной стороны на весы нужно положить необходимость использования Flash -элемента, с другой стороны — его недостатки
Обесцениваются функции браузера:
Регулировка размера шрифта. Изменять шрифт средствами стандартных функций браузера нельзя. Поэтому шрифт у посетителя будет таким, каким его задал дизайнер (для справки: все дизайнеры обладают прекрасным зрением, делая шрифты мелкими и очень мелкими);
Кнопка «назад». Она перемещает не к началу сценария анимации, как ожидается, а на предыдущую страницу сайта, где Flash-элемент еще/уже отсутствует;
Поиск по странице.
Гиперссылки лишаются важного качества — изменяемости цвета в зависимости от движения по сайту посетителя. Вспоминаешь, был ли ты на этой странице или нет. Таким образом, затрудняется навигация по сайту в целом;
Вес страниц увеличивается в разы;
Навигация во Flash-сайтах часто неудобна;
Сайты, построенные на Flash в большинстве случаев некорректно работают в офлайне (т.е. когда страницы сайта скачаны на компьютер пользователя и просматриваются в автономном режиме).
По отношению к крупным информационным сайтам Flash обладает еще большим недостатком — невозможностью индексирования текстов во flash -элементах. У сайтов, полностью построенных на Flash , всегда низкая степень релевантности.
Практическая сторона.
Кроме технических тонкостей, которые увидит не каждый, Flash обладает рядом весомых практических недостатков:
Flash-элементы имеют большой размер. Мультимедийные возможности Flash широки, поэтому дизайнер просто не удерживается, чтобы не поэксплуатировать их;
Flash-ролики создаются раз и навсегда. Вместо этого можно уделить внимание более частому обновлению содержания сайта;
Скачанные на компьютер Flash-сайты отображаются некорректно. Информация, находящаяся во Flash-формате недоступна (для закачки Flash-элементов требуется программное обеспечение, которое обычно отсутствует у пользователя).
Прежде, чем применять Flash на сайте, надо поставить себя на место пользователя: нужна информация; мало времени; модемная скорость; трафик заканчивается.
Выводы:
Flash противопоказан крупным информационным сайтам (главная цель которых — погоня за посетителями);
Flash применим для малого сайта узкой специализации (например, для сайта, чей адрес узнается с визитки его представителя и только);
Использование Flash хорошо подходит для рекламы и развлечений (баннеры, промо-сайты, игры);
Если можно обойтись без Flash, лучше обойтись без Flash.
Бурное развитие телекоммуникаций застало приход нового тысячелетия в новом витке технологических преобразований. Не остался в стороне и Web-Hosting как одна из профилирующих услуг интернет-сервиса. И если стремительное развитие IT характеризовалось, прежде всего, широко представленным предложением виртуального (в т.ч. бесплатного) хостинга, то новое десятилетие отмечает возросший интерес к разного рода технологиям выделенных серверов (dedicated servers) и co-location.
Что такое co-location? Co-location (colocation, collocation) дословно - это размещение физической машины клиента в специально оборудованном помещении провайдера на его технической площадке (в дата-центре). Помимо собственно размещения в базовый набор услуг по co-location входит:
Предоставление определенного объема предоплаченного трафика (входящего или исходящего, в зависимости от провайдера) или полосы пропускания;
Подключение к внешним каналам с высокой пропускной способностью (от 100 Мбит/c), наличие резервных каналов;
Повышенный уровень безопасности (система бесперебойного электропитания, климат-контроль, backup, охрана от физического проникновения посторонних на техническую площадку и т.д.);
Круглосуточная поддержка;
Оперативное устранение неисправностей непосредственно "на месте" (on-site).
Смежной с co-location является услуга аренды выделенного сервера (сервер не принадлежит клиенту, а взят в аренду у провайдера). В базовый набор услуг при аренде выделенного сервера обычно входит в дополнение к выше перечисленному :
Программное обеспечение для управления функциями сервера;
Услуга аренды сервера интересна в большей степени клиентам, территориально удаленным от коммуникационных центров (в России это Москва и Санкт-Петербург), а также тем, кто не хочет вкладывать деньги в покупку сервера, и тем у кого нет возможности инсталировать сервер своими силами, т.к. для этого нужно обладать знаниями системного администратора.
Co-location и dedicated существенно расширяют возможности веб-узла и являются единственно возможным решением для некоторых интернет-проектов. Как правило, к услугам аренды и размещения сервера прибегают при высоких требованиях к безопасности, потреблении большого объема трафика, высокой нагрузке на вычислительные мощности. Ведь при виртуальном хостинге ресурсы сервера делятся на всех клиентов размещенных на нем, и в случае появления высоко загруженного ресурса на сервере, вероятен отказ в обслуживании. Кроме того, безопасность виртуального хостинга вызывает большие сомнения: в 80% случаев взломы таких серверов производятся самими же клиентами. Немаловажным фактором при выборе выделенного сервера является возможность использования различного программного обеспечения и полный контроль над сервером. Последнее обстоятельство позволяет реализовать проект любой сложности с гарантированной защищенностью данных; для высоко загруженных проектов возможна реализация распределения вычислительной и сетевой нагрузки по нескольким серверам.
Среди проектов, решение которых в сети Интернет требует услуги co-location или выделенного сервера, следует назвать:
поисковые системы (www.yandex.ru)
фото-галереи (www.alenmax.ru)
виртуальные магазины (www.ozon.ru)
хостинг-провайдеры (www.alexhost.ru)
on-line базы данных (www.integrum.ru)
крупные проекты (www.uptime.ru)
интернет-версии оффлайновых СМИ (www.comprice.ru)
сайты с большим трафиком (www.mail.ru)
особо важные проекты (www.government.ru)
порталы (www.interpress.ru)
Несмотря на непространственную природу Интернет, широкое распространение спроса на услуги co-location в последнее время является своеобразной реакцией на распространение виртуального хостинга. Можно сказать, что в случае заключения контракта на co-location абонент покупает прежде всего определенное географическое место. Это место может характеризоваться особым географическим положением провайдера, включенностью в оптимальную телекоммуникационную инфраструктуру или, что тоже важно, хотя бы как психологический фактор, относительной близостью к главному офису заказчика.
Учитывая все эти факторы можно уверенно прогнозировать стремительное развитие данного вида web-услуг в Санкт-Петербурге. Данный регион - являющийся важнейшим телекоммуникационным центром России, местом, где пересекаются основные магистральные линии, связывающие страну с мировыми коммуникациями, - является вторым по экономической значимости регионом РФ. Более низкая по отношению к Москве затратная часть IT-бизнеса, высокий профессиональный уровень кадров, быстрое экономическое развитие региона в целом позволяют прогнозировать развитие спроса на услуги co-location и dedicated на петербургском рынке.
Ваш сайт доходчиво объясняет посетителям, что заказывать нужно именно у вас, а не у ваших конкурентов? На нем хорошо видны контакты, а сделать заказ легко? Есть ли у вас возможность отслеживания активности посетителей и коэффициента конверсии? И последнее: вы знаете, сколько стоит ваш посетитель? Если вы смело можете ответить "да" на эти воспросы - ваш сайт готов к приему посетителей. Если нет - проработайте их, иначе много денег будут уходить впустую.
Все хотят "бесплатный" (поисковый) трафик, но находиться в топе поисковых систем - очень трудоемкое занятие. Однако, если вы создадите богатый контентом сайт и последуете советам из этого списка, ваш трафик будет увеличиваться сам собой и PR будет расти.
*Pay-Per-Click (PPC) - оплата за клики. Трафик с PPC-систем можно получить почти мгновенно! Google и Overture (теперь еще и Yahoo) - вот основные источники PPC-трафика, но можно попробовать и FindWhat.com. На что следует обратить внимание: Держите в голове цену своего посетителя, ставьте объявления по сотням неконкурентным ключевым словам и фразам, и отслеживайте статистику по каждому слову или фразе отдельно.
*Распространяйте свой контент в сети - пишите полезные статьи, интересные целевой аудитории. Распространяйте их среди веб-мастеров, разрешите им перепечатывать ваши тексты в обмен на размещение ссылки на ваш ресурс вида "источник: " или "по материалам сайта: ". Распространяйте ваши статьи и через каталоги статей, электронные журналы и ваш блог. На что следует обратить внимание: полезное, по возможности уникальное, содержание статей.
*Публикуйте свои пресс-релизы - периодически публикуйте пресс-релизы с новостями, которые будут интересны вашей целевой аудитории и вашим потенциальным покупателям. Поскольку пресс релизы это, фактически, новости, они публикуются быстро, и вы можете так же быстро заполучить сотни ссылок на свой сайт. На что следует обратить внимание: желательно писать пресс-релиз из 300-500 слов, и включить в него ссылку на свой ресурс. Желательно доверить распространение релизов профессионалам, которые смогут оптимизировать их по ключевым словам.
*Сделайте блог с RSS - чтобы приносить пользу, блог должен часто пополняться новыми материалами. Пусть ваш блог содержит информацию, полезную для ваших покупателей, но не заостренную на продажах и специальных предложениях. Последнее нужно делать очень аккуратно, мы советуем вообще заострять на продажах внимание, если не можете посвятить этому достаточное количество времени. Seth Godin говорит, что составляющие успешного блога это: (1) Беспристрастность, (2) Мгновенное реагирование, (3) Своевременность, (4) Тематичность - коротко и "в кассу", и (5) Дискуссия, полемика. На что следует обратить внимание: блог должен быть интересен посетителям, добавьте его во все каталоги блогов, проверяйте ваши блоговые посты в поисковиках, распространяйте свой контент через RSS.
*Набирайте односторонние входящие ссылки - все вышеперечисленное создаст хорошие входящие односторонние ссылки на ваш сайт, хотя Вы можете дополнительно покупать ссылки на других сайтах, напрямую и через биржи ссылок. Не занимайтесь обменом ссылками - от этого уже никакого толка. Убедитесь, что ссылки на ваш сайт ведут со страниц, PR которых выше 0. Если у страницы PR0, возможно Google пессимизировал ее по каким-либо причинам, в результате ссылка может нести в себе отрицательную силу. На что следует обратить внимание: удостоверьтесь, что в текстах входящих ссылок есть ключевые слова, и что ссылки текстовые. Ссылки должны быть с тематических и околотематических сайтов, а не с линкопомоек или немодерируемых каталогов. Лучшие ссылки - со страниц, количество ссылок на которых невелико.
*Разрешите другим сайтам использовать ваши материалы. Разрешайте им делать это до тех пор, пока они будут ссылаться на вас. Это позволит вам получить одностороннюю ссылку с сайтов, который бы не согласились поставить ее в других случаях. На что следует обратить внимание: старайтесь вести диалог с вебмастерами кратко, и по делу.
*Реклама через E-mail - Рекламируйтесь в электронных журналах, размещайте рекламу в почтовых рассылках, если среди получателей есть ваша целевая аудитория. На что следует обратить внимание: внимательно отслеживайте эффективность рассылок.
*Используйте возможности партнеров по бизнесу. Рекламируйтесь, используя базу клиентов ваших партнеров. John Reese продал информационный товара на $1 млн. за 24 часа, используя только базу клиентов своих партнеров, рассылая им свои предложения. Он платил партнерам 50% с продаж. На что обратить внимание: нужно знать цену своего посетителя, и хорошо проверить в действии точку продаж перед тем, как обращаться к партнерам с предложениями.
*Заведите партнерскую программу. Если Вы продаете что-нибудь, предложите партнерам комиссию за каждого привлеченного покупателя. Ссылки с сайтов партнеров будут приводить на сайт посетителей, а также увеличивать вес сайта в глазах поисковиков. На что следует обратить внимание: предложение должно быть привлекательным, обеспечьте партнеров всеми рекламными и сопуствующими материалами, дайте им доступ к статистике, чтобы они могли отслеживать переходы и активность посетителей самостоятельно, сделайте регистрацию в партнерской программе легкой. Дайте им проверенные баннеры, рекламные письма и другой инструментарий, облегчающий их задачу.
*Покупайте готовые, хорошо раскрученные сайты. Найдите сайты, которые занимают высокие позиции по вашим запросам в поисковиках, проверьте качество трафика через владельцев этих сайтов и принимайте решение о покупке. Позаботьтесь о том, чтобы права собственности на домен полностью принадлежали Вам. Вы можете разрешить бывшим владельцам использовать контент сайта, если хотите. Проверьте deleteddomains.com на предмет доменов, брошенных владельцами, которые можно зарегистрировать всего за несколько долларов. На что обратить внимание: проверьте Google PR, Alexa rank, и бэклинки сайтов до их покупки. (Я знал одного продавца, который поспорил с профессиональными оптимизаторами на предмет того, кто займет самое высокое место в поисковике за 24 часа. Он выиграл спор, просто купив сайт, который занимал первое место).
И напоследок то, с чего начинается большинство статей...
*Поисковая оптимизация (SEO). Здесь есть много технических моментов, которые следует изучить, если Вы собираетесь оптимизировать сайт самостоятельно, поэтому я советую нанять профессионала, который все сделает за вас. Не доверяйте тем, кто гарантирует вам первые места, потому что нельзя гарантировать высокие позиции в Google или Yahoo, потому что алгоритмы постоянно меняются. (Они могут гарантировать места в топе по словосочетаниям типа названия вашей компании, но это не конкурентная фраза, и она не принесет особого толка). Дизайн и структура вашего сайта - также обратите на это внимание.
3 кита поисковой оптимизации это:
*Контент
*Тематические внешние ссылки с хорошим PR
*Правильный дизайн сайта
Все перечисленное в этих 10 пунктах помогает и с контентом, и с односторонними входящими ссылками, поэтому остается только хороший дизайн. На что следует обратить внимание: не думайте о сайте как об одной странице, думайте о сайте как о сотне оптимизированных страниц, с определенной тематикой и интересных целевой аудитории.
Как вы знаете, большинство скриптов, представленных в Web, ориентированы на работу с пользователем. Но для того, чтобы её начать, нужно, как правило, заполнить форму (в Интернете они встречаются повсеместно). Наивно полагать, что искушенный юзер с первого раза выдаст правильную, а главное корректную, информацию о себе. Конечно, правильность его имени и реальность земного адреса проверить мы не сможем, но вот то, как они введены, пожалуйста.
Представим, нам нужно создать программу, спрашивающую у посетителя его имя, e-mail. А также попросим придумать пароль и ввести по желанию комментарий. Если вы знакомы с HTML, то должны знать, что каждое поле в форме должно иметь имя. Итак, имена: name (Имя), mail (E-mail), password (Пароль), rpassword (Повторный пароль), comment (Комментарий). Для тех, кто ничего не понял, приведу исходный код нашей формы (кстати, его мы будем вставлять прямо в код PHP):
Фрагмент form.php
Непонятная с первого взгляда строка <input type = hidden name = seenform value = yes> поможет нам узнать, заполнялась ли форма данным пользователем или ещё нет. А вот значение $form = "…" объясняется тем, что мы собираемся интегрировать форму напрямую с PHP.
Теперь, когда готова основа, можем начинать её наполнение. Вспомним про поле с именем "seenform". Итак, вот зачем оно было нужно:
Если значение формы не равно ‘yes’, отобразить форму. В обратном случае работает код, следующий за словлм else. Форма заполнена, можно начинать проверку. Но для начала условимся, что
1. Кол-во символов в поле «Имя» и «E-mail» не больше, чем 40;
2. Кол-во символов в поле «Пароль» не меньше, чем 3;
3. Кол-во символов в поле «Комментарий» не больше, чем 450;
4. «Пароль» должен состоять только из латинских букв или цифр;
5. Все поля, кроме «Комментарий» должны быть заполнены!
Проверка на заполнение полей:
Переменная $er = 1 значит, что была ошибка. В конце проверки мы это учтём.
Графический интерфейс операционной системы Windows поддерживает копирование (перенос) файлов при помощи мыши. Это реализуется технологией Drag and Drop. Если ваша программа много работает с файлами, то можно облегчить процесс открытия файлов. Метод Drag and Drop позволяет отказаться от стандартной схемы открытия файлов при помощи диалогов открытия файлов.
Используя Drag'n'Drop вы можете перенести мышью объект рабочего стола (проводника) на форму программы и этот объект будет найден и обработан. Технология Drag and Drop поддерживает следующие объекты: файлы, папки, ярлыки, ссылки интернет и др. Функция Drag'n'Drop является родной функцией проводника (Windows Explorer),
то есть она поддерживается не операционной системой, оболочкой. Поэтому, если вы пользуетесь другой оболочкой (напр. DesqView), то поддержка Drag and Drop не гарантируется.
Реализация
Для того, чтобы реализовать этот метод на Delphi, необходимо:
1) Подключить модуль ShellApi в секции Uses в Unit1 формы. 2) Затем в Unit1, найти оператор private и выше него добавить следующие строки:
3) Добавить в Unit1 процедуру WMDropFiles и ввести её тело:
4) Чтобы форма могла принимать объекты, необходимо в обработчик события OnCreate, записать:
Заключение
Технология Drag and Drop очень облегчает работу с такими программами, как кодировщики музыки, интернет-качалки, файловые утилиты и архиваторы.
Убрать значки с "Рабочего стола" и создать ОЧЕНЬ быструю панель можно нажав на "трэе" (там, где часы) правую кнопку мыши. В меню выбрать "Панели инструментов" - поставить галочку "Рабочий стол" (если там такового нет - нажать "создать" и там выбрать "Рабочий стол"). При этом слева от трэя появится оная перемещаемая панелька со стрелкой, разворачивающей всё содержимое "Стола". После этого зайти в свойства экрана, вкладка "Эффекты" и там установить галку "Прятать содержимое стола, если...".
Всё! Вся фишка в том, что:
1. не захламляются ваши обои и
2. (самое главное!) через эту менюшку можно практически мгновенно добраться до ЛЮБОЙ точки вашего компа НЕ ЗАПУСКАЯ ПРИ ЭТОМ ВСЯКИХ "ПРОВОДНИКОВ", "КОММАНДЕРОВ" и т.д., (заодно и ресурсы экономятся!) Попробуйте, не пожалеете!
З.Ы. Для 98 Выньды. Для остальных - не знаю, есть ли там такое... ;)
Если вам надо постоянно обращаться к какому-то элементу Панели управления, то можно создать ярлык на "Рабочем столе" с такой командной строкой: "CONTROL.EXE desk.cpl,,3". Desk.cpl указывает вызываемую функцию "Панели управления". Например, appwiz.cpl откроет окно "Установка и удаления программ", а цифра следующая после двух запятых - номер нужной вкладки, начиная с нуля.
Отключение Error Reporting - навязчивого желания ХР постоянно отсылать сообщения разработчикам по случаю возникновения каждой ошибки (например, зависания того или иного приложения). Эти желания режутся на корню просто, но со вкусом:
В Контрольной Панели выбирается Система (System).
Закладка Advanced, далее - Error Reporting.
Включается опция Disable Error Reporting. Опцию But Notify me When critical errors occur (уведомлять меня о возникновении критических ошибок) я оставил, чтобы не пребывать в неведении по поводу неожиданных сбоев (пока бог миловал).
Для того, чтобы вставить любое слово рядом с часами нужно сделать следующее:
1. Зайти на "Панель управления", затем "Язык и стандарты"
2. Перейти на вкладку "Время"
3. В поле "Формат времени" измените формат на "ЧЧ:мм:сс оо" (оо набирать русскими), в полях обозначения времени до и после полудня введите ваше слово.
После установки Windows можно переместить системную папку "Мои документы" на рабочий диск, предназначенный для хранения всего содеянного пользователем (я обычно присваиваю ему метку тома Documents). Все необходимые изменения в реестре Windows сделает самостоятельно.
Вы пользуетесь пунктом контекстного (всплывающего) меню файла или папки "Отправить"? Если нет, то вы много теряете! Когда вы кликаете правой кнопкой на файле или папке выбираете пункт "Отправить" и там выбираете, куда хотите отправить, то выбранный вами файл копируется (перемещается) в ту папку, которую вы выбрали. Здорово, правда?
Так вот ярлычки для пунктов назначения (папок) хранятся в X:\%windir%\SendTo, т.е. если у вас Windows установлена на диске C, то путь к папке SendTo будет выглядеть так: C:\windows\SendTo. Очень удобно!
Так вот суть этого совета:
1) Вы создаёте ярлык для папки SendTo.
2) Извращаетесь над ним (меняете иконку, переименовываете).
3) Копируете этот ярлык в папку SendTo.
Теперь, когда вы много всего копируете(перемещаете) в определённую папку, то создаёте для неё ярлык и отправляете в Отправить! Очень удобно! Сам испытал!
По сути не совет, а прикол для тех кому понравился вариант использования функции "Послать".
Если вы работаете в Инете, то слово "Послать" у вас ассоциируется с отправкой письма, а если вы к тому же и гражданин бывшего СССР, то и ещё кое с чем 8). Берём, создаём ярлык ссылающийся на корзину и переименовываем его в "На...*". Потом переносим этот ярлык в папку ..windows/SendTo/
Пользуйтесь на здоровье.
---
Сноска * - зависит только от вашей фантазии :)
Примечание - большая часть написанного здесь текста с примерами взята по памяти (пару лет назад изучал достаточно подробно, поэтому может что-то в алгоритмах не работать - я ведь их не копировал откуда-то, а прямо тут же и писал, так что за синтаксические ошибки не пинайте) - на данный момент я активно OLE не пользуюсь (не из-за каких-то проблем с самим OLE, а из-за отсутствия надобности в его использовании в текущий момент).
Основные преимущества, благодаря которым OLE активно используется:
* Для вызывающей базы "по барабану" - какой тип вызываемой базы (DBF или SQL)
* Объектами вызываемой базы можно управлять всеми известными методами работы с объектами в 1С (т.е. со справочниками работают методы ВыбратьЭлементы(), ИспользоватьДату() и т.п., с документами - ВыбратьДокументы() и т.п.), соответственно, можно напрямую решить - стоит отрабатывать конкретные объекты базы OLE или пропустить их.
Пример 1. Присоединение к базе 1С через OLE.
БазаОле=СоздатьОбъект("V77.Application"); // Получаем доступ к OLE объекту 1С
Локальная версия (на одного пользователя): V77L.Application
Сетевая версия: V77.Application
Версия SQL: V77S.Application
Далее вместо термина "вызываемая база" будет написано просто "база OLE", а вместо термина "вызывающая база" - "местная база"
Теперь, мы должны знать несколько параметров для запуска базы OLE: Каталог базы, имя пользователя и пароль. Ну, наверное, еще и желание запустить 1С в монопольном режиме :)
Комментарий: функции СокрЛП() стоят в примере на случай, если пользователь захочет указанные выше переменные сделать в форме диалога, а проблема при этом состоит в том, что в алгоритм программа передаст полное значение реквизита (т.е. допишет в конце значения то количество пробелов, которое необходимо для получения полной длины строки (указана в свойствах реквизита диалога)).
Пример 2. Доступ к объектам базы OLE.
Запомните на будущее как непреложный факт:
1. Из местной базы в базу OLE (и, соответственно, наоборот) напрямую методом присвоения можно перенести только числовые значения, даты и строки ограниченной длины!!! Т.е. местная база поймет прекрасно без дополнительных алгоритмов преобразования полученного значения только указанные типы значений. Кроме того, под ограничением строк подразумевается проблемы с пониманием в местной базе реквизитов объектов базы OLE типа "Строка неограниченной длины". К этому же еще надо добавить и периодические реквизиты. Естественно, под методом присвоения подразумеваются и попытки сравнить объекты разных баз в одном условии (например, в алгоритмах "Если" или "Пока" и т.п.).
2. Есть проблемы при попытке перенести "пустую" дату - OLE может ее конвертировать, например, в 31.12.1899 года и т.п. Поэтому вам лучше заранее выяснить те значения, которые могут появится в местной базе при переносе "пустых" дат, чтобы предусмотреть условия преобразования их в местной базе.
A) Доступ к константам базы OLE:
Б) Доступ к справочникам и документам базы OLE (через функцию "CreateObject"):
После создания объекта справочника или документа к ним применимы все методы, касающиеся таких объектов в 1С:
Заметьте, что если вместо "Сообщить(Спр.Наименование)" вы укажете "Сообщить(Спр.ТекущийЭлемент())", то вместо строкового/числового представления этого элемента программа выдаст вам в окошке сообщение "OLE". Именно это я и имел в виду, когда говорил, что напрямую мало что можно перенести. Т.е. не будут работать следующие методы (ошибки 1С не будет, но и результат работы будет нулевой). Рассмотрим следующий пример:
Однако, сработает следующий метод:
Отсюда вывод: возможность доступа к объектам базы 1С через OLE требуется, в основном, только для определенной задачи - получить доступ к реквизитам определенного элемента справочника или документа. Однако, не забываем, что объекты базы OLE поддерживают все методы работы с ними, в т.ч. и "Новый()", т.е. приведем пример противоположный предыдущему:
В) Доступ к регистрам базы OLE (Не сложнее справочников и документов):
Г) Доступ к перечислениям базы OLE (аналогичен константе):
ЗначениеПеречисленияOLE = БазаОле.Перечисление.Булево.НеЗнаю; // :)
Заметьте, что пользы для местной базы от переменной "ЗначениеПеречисленияOLE" особо-то и нет, ведь подобно справочнику и документу перечисление также напрямую недоступно для местной базы. Пожалуй, пример работы с ними может быть следующим (в качестве параметра условия):
По аналогии со справочниками и документами работает объект "Периодический", план счетов работает по аналогии с ВидомСубконто, ну и далее в том же духе… Отдельную главу посвятим запросу, а сейчас… стоп. Еще пункт забыл!
Ж) Доступ к функциям и процедурам глобального модуля базы OLE!
Как же я про это забыл-то, а? Поскольку при запуске базы автоматически компилируется глобальный модуль, то нам становятся доступны функции и процедуры глобального модуля (поправлюсь - только те, у которых стоит признак "Экспорт"). Плюс к ним еще и различные системные функции 1С. А доступны они нам через функцию 1С OLE - EvalExpr(). Приведем примеры работы с базой OLE:
На самом деле, в последней строке примера я исхитрился и забежал немного вперед. Дело в том, что как и запрос (см. отдельную главу), так и EvalExpr() выполняются внутри базы OLE, причем команды передавается им обычной строкой, и поэтому надо долго думать, как передать необходимые ссылки на объекты базы OLE в строке текста местной базы. Так что, всегда есть возможность поломать голову над этим…
Алгоритмы преобразования объектов в "удобоваримый вид" между базами.
Ясно, что алгоритмы преобразования нужны не только для переноса объектов между и базами, но и для такой простой задачи, как попытки сравнить их между собой.
И еще раз обращу внимание: ОБЪЕКТЫ ОДНОЙ БАЗЫ ПРЕКРАСНО ПОНИМАЮТ ДРУГ ДРУГА, ПРОБЛЕМЫ ВОЗНИКАЮТ ТОЛЬКО ТОГДА, КОГДА ВЫ НАЧИНАЕТЕ СВЯЗЫВАТЬ МЕЖДУ СОБОЙ ОБЪЕКТЫ РАЗНЫХ БАЗ, т.е. команда
будет прекрасно работать без ошибок. Не забывайте это, чтобы не перемудрить с алгоритмами!
Итак, повторяюсь, что напрямую перенести, да и просто сравнить можно только даты (причем не "пустые"), числа и строки ограниченной длины. Итак, как же нам сравнить объекты разных баз (не числа, не даты, не строки), т.е. как их преобразовать в эту самую строку/число/дату.
А) Преобразование справочников/документов базы OLE (если есть аналогичные справочники/документы в местной базе). В принципе, преобразование их было уже рассмотрено в примерах выше и сводится к поиску их аналогов в местной базе. Могу еще раз привести пример, заодно с использованием регистров:
Б) Преобразование перечислений и видов субконто (подразумевается, что в обоих базах есть аналогичные перечисления и виды субконто). Вся задача сводится к получению строкового или числового представления перечисления или вида субконто.
Не поймите это как прямую команду воспользоваться функцией Строка() или Число() :)) Нет. Для этого у нас есть обращение к уникальному представлению перечисления и вида субконто - метод Идентификатор() или ЗначениеПоНомеру(). Второй вариант не очень подходит, так как зачастую в разных базах даже перечисления бывают расположены в другом порядке, а вот идентификаторы стараются держать одинаковыми в разных базах. Отсюда вывод, пользуйтесь методом Идентификатор(). Кстати, не путайте вид субконто с самим субконто! Привожу пример преобразования:
То же самое относится и к плану счетов - принцип у него тот же, что и у вида субконто…
В) Преобразование счетов:
Во многом объект "Счет" аналогичен объекту "Справочник". Отсюда и пляшем:
Работа с запросами и EvalExpr().
Наконец-то добрались и до запросов. Надо пояснить несколько вещей, касаемых запросов (да и EvalExpr() тоже). Самое главное - компиляция текста OLE-запроса (т.е. разбор всех переменных внутри запроса), как и сами OLE-запросы выполняются внутри базы OLE и поэтому ни одна переменная, ни один реквизит местной базы там недоступны, да и запрос даже не подозревает, что его запускают по OLE из другой базы!!! Поэтому, чтобы правильно составить текст, иногда требуется не только обдумать, как передать параметры запроса в базу OLE, но и обдумать, что нужно добавить в глобальный модуль той самой OLE-базы, чтобы как-то собрать для запросы переменные!
1. Поскольку сам текст запроса и функции EvalExpr() является по сути текстом, а не набором параметров, то напрямую передать ему ссылку на элемент справочника, документ, счет и т.п. нельзя. Исключение может быть составлено для конкретных значений перечислений, видов субконто, констант, планов счетов и т.п.
2. Хоть и многим и так понятно, что я скажу дальше, но я все-таки уточню: при описании переменных в тексте запроса не забывайте, что объекты базы надо указывать напрямую, без всяких префиксов типа "БазаОле".
3. Отрабатывать запрос сложно тем, что ошибки, например, при компиляции напрямую не увидеть. Поэтому начинаем пошагово готовится к отработке запроса в базе OLE.
Вначале допишем в глобальном модуле базы OLE немного строк, которые нам помогут в работе:
Теперь начинаем потихоньку писать сам запрос. Что мы имеем:
В форме диалога местной базы несколько реквизитов диалога (либо местные переменные):
* Даты периода (НачДата и КонДата)
* Элементы справочников для фильтрации (ВыбТовар, ВыбФирма, ВыбКлиент, и т.д.)
* Какие-либо флажки (ТолькоЗамерзающийЗимойТовар , ..)
Мы начинаем писать запрос и сразу попадаем в такую ловушку:
ТекстЗапроса = " Период с НачДата по КонДата; ";
Вроде все в порядке, но такой запрос не выполнится в базе OLE, так как там понятия не имеют, что такое НачДата и КонДата :)) Ведь эти переменные действительны только для местной базы! Переписываем запрос заново:
Казалось бы все очень просто. По аналогии - если уникальность для товаров ведется по наименованию, то простой заменой слова "код" на "наименование" мы решаем вопрос и здесь. Теперь рассмотрим, когда мы выбрали группу, т.е. текст условия должен будет выглядеть так:
И здесь, правда можно проблему решить "двумями путями" :)) Первый пусть - когда мы имеем дело с двухуровне вымсправочником. Тогда проблема группы решается также просто, как и в 1-м варианте:
А если справочник очень даже многоуровневый? Вот для этого мы и используем написанную ранее функцию. Предположим, что список значений запроса с индексом массива " 1 " мы будем использовать для хранения подобных значений (например, хранить в нем группы товаров, клиентов) для хитрых условий. Итак, например, в ВыбТовар у нас указана группа товаров, а в ВыбКлиент - группа клиентов, которым мы товары группы ВыбТовар продавали. Кроме того, мы должны пропустить накладные возвратов поставщикам, и не забыть, что товары надо еще отбирать по флажку ТолькоЗамерзающийЗимойТовар:
Ну, а с реквизитами запроса разбираемся так же, как указано было выше в предыдущих разделах… И не забываем, что кроме хранения конкретных значений, можно использовать другие списки значений запроса. Например, можно заполнить какой-либо список значений запроса списком клиентов и использовать его в запросе:
I. Вступление
II. Таблицы 1С и Excel.
III. Получение данных из Excel.
IV. Вывод данных в Excel.
V. Часто используемые методы для чтения/установки значений в Excel.
Вступление.
Многие знают, что Excel гораздо старше 1С. На мой взгляд, это очень успешный продукт, и нареканий о нем я не слышал. Excel прост и универсален. Он способен выполнять не только простые арифметические операции, но и сложные вычисления, построение графиков и т.п. Знаю примеры, когда организации до перехода на 1С вели часть бухгалтерии в Excel. Многие и сейчас параллельно используют две программы. В этой статье рассмотрим способы обмена данными между 1С и Excel.
Таблицы 1С и Excel.
Многие пользователи для удобства работы сохраняют таблицы 1С (печатные формы) в формате Excel (*.xls). После чего в полученном файле делают различные группировки, сортировки, вычисления и т.п. Связано это с тем, что в таблицах 1С нет такого огромного функционала как в таблицах Excel. Но в версии 1С 8.0 есть нововведения, делающих работу с таблицами более комфортной.
На сайте 1С (www.1C.ru) есть полезная программка, которая дает возможность открывать таблицы 1С в Excel и сохранять лист Excel как таблицу 1С. Это пригодится в том случае, если таблицу 1С не сохранили в формате Excel, а на том компьютере, где нужно открыть эту таблицу не установлена 1С. Да и постоянно помнить о том, что сохранить таблицу 1С нужно в формате Excel, не будет необходимости.
Полная информация о программе находится здесь.
Скачать программу можно здесь (архив zip 682 739 байт).
Замечание: В Excel разделителем дробной части считается символ ",". Поэтому перед сохранением таблицы 1С в формате Excel замените в ней другой разделитель (например ".") на ",". Иначе в Excel с этими числами не удастся произвести вычисления, или они вообще не будут отображаться как числа. Например, в таблице 1С "15.2" отобразится в Excel как "15.фев".
Получение данных из Excel.
Доступ из 1С к Excel производится посредством OLE. Например, код
позволит нам получить доступ через переменную "Эксель" к запущенному приложению Excel. А далее уже можно получить доступ к книге (файлу), листу и ячейке с данными. Далее примеры кода.
Открытие книги (файла):
ПутьКФайлу - полный путь к файлу книги Excel.
Выбор листа книги для работы с ним:
НомерЛиста - номер листа в книге, ИмяЛиста - имя листа в книге.
Получение значения ячейки листа:
НомерСтроки, НомерКолонки - номер строки и номер колонки, на пересечении которых находится ячейка.
Важно: не забывайте поле выполнения нужных действий добавлять код Эксель.Quit(); , иначе запущенный процесс останется незавершенным и будет занимать память и процессор компьютера.
Вывод данных в Excel.
Для вывода (выгрузки) данных в Excel необходимо либо открыть существующую книгу, либо создать новую, и выбрать рабочий лист для вывода данных. Открытие существующей книги описано выше, а для создания новой книги нужно использовать следующий код:
Так как при создании книги в Excel автоматически создаются листы (Сервис->Параметры->Общие->Листов в новой книге), то нужно лишь произвести выбор листа, с которым будет вестись работа:
либо добавить в книгу новый лист, если необходимо:
Следующим шагом будет установка значения ячейки:
НомерСтроки, НомерКолонки - номер строки и номер колонки, на пересечении которых находится ячейка.
И в конце нужно произвести запись созданной книги:
П
ПутьКФайлу - полный путь к файлу книги Excel (включая имя).
Важно: не забывайте, что в имени файлов не должно содержаться символов \ / : * ? " > < |.
Часто используемые методы для чтения/установки значений в Excel.
Эксель = СоздатьОбъект("Excel.Application");
Получение доступа к приложению Excel.
В этой статье описываются полезные функции и процедуры, помогающие эффективно работать с различными типами данных в системе "1С:Предприятие 7.7".
* Обработка значений
* Форматирование
* Список значений
* Таблица значений
* Таблица
* Период и дата
* Календари и праздники
* Справочники
* Документы
* Предопределённые функции
* Налоговый учёт
Обработка значений в 1С
Форматирование данных в 1С
Список значений в 1С
Таблица значений в 1С
Таблица или печатная форма в 1С
Периоды и даты в 1С
Календари и праздники в 1С
Справочники в 1С
Документы в 1С
Предопределённые функции и процедуры в 1С
Налоговый учёт и первое событие в 1С
Резюме
В статье описаны функции и процедуры, используемые в программе "1С:Предприятие 7.7" для работы со справочниками, документами, списками значений, таблицами значений и с прочими агрегатными типами данных. Образцы практического применения описанных средств Вы сможете найти в статьях "Отчёты для 1С" и "Обработки для 1С".
Мне приходится часто менять клиентов, потому что работаю удаленно. Сделал одному – иди к другому. А еще я продаю свои программы через Интернет. При имеющейся специфике работы, заметил одну странность: примерно в двадцати пяти процентов случаев, предприятие, оплатившее работу программиста и принявшее его работу, не пользуется ею.
Начну с примеров
Фирма, продающая компьютеры, купили внушительный комплект программного обеспечения, все своевременно оплатили, купили необходимое торговое оборудование... Мы, соответственно, все им установили и приготовились запускать. Остановились на этапе, когда сотрудники фирмы, ответственные за ввод в эксплуатацию нового программного комплекса, должны внести в информацию по имеющимся в отделах остаткам. Для справки – это примерно пара сотен наименований. Но на этом все работы по проекту остановились, потому что остатки не были внесены к намеченному сроку, ни через неделю после срока, ни через месяц. Не внесены они и до сих пор, хотя прошло уже пол года. Официально мы договорились, что клиент нам позвонит, когда сотрудники освободятся и найдут время внести остатки. Сами понимаете, на небольших фирмах менеджеры – по совместительству еще и продавцы, еще и грузчики, и кассиры…
Еще пример
Достаточно крупный комбинат решил автоматизировать учет обедов собственным сотрудникам в счет зарплаты. Систему подготовили, протестировали, поставили. Обучили их специалиста. Все как обычно. Недавно узнал, что конечный пользователь нашу систему не использует. Оказывается, по весьма банальной причине: на приобретение нового компьютера руководство не выделяет средств, а на имеющемся оказалось недостаточно мощности. В свое время мы указывали им на необходимость более мощного компьютера, но в силу не совсем понятных мне внутренних интриг, этот вопрос был замят на уровне IT-отдела. В результате, автоматизация стала не эффективной, и от использования новой программы решено было отказаться.
Третий пример
Производственная фирма заказала автоматизацию учета. От фирмы был назначен специалист – постановщик ТЗ и в будущем - внедренец. Работу сделали, сдали, провели обучение внедренца (на углубленное внедрение и обучение нами всех сотрудников не выделили бюджет). Я перезвонил клиенту через пол года, чтобы узнать, не было ли замечено каких-либо багов в работе системы. С удивлением услышал, что учет по-прежнему ведется в Excel-е, потому что на глубокое, самостоятельное освоение новой системы у сотрудников нет времени, а специалист, которого мы обучали, уволился…
Хотелось бы обобщить имеющийся, скромный опыт по таким случаям, и порассуждать на тему, когда автоматизация учета становится не эффективной по вине заказчика.
Уже из приведенных примеров можно сделать одно важное заключение: во всех трех случаях явно, что администрация не была заинтересована в результате. В первом – директор не захотел останавливать продажи даже не день, чтобы довести начатое до конца, во втором и третьем был урезан бюджет, и решили сэкономить там, где этого делать было нельзя.
1. Незаинтересованность руководства в результатах
Для меня всегда было загадкой, зачем руководство той или иной фирмы вообще тратится на автоматизацию, если отчетов в excel-е достаточно, и нет желания доводить начатое до конца? Чего дирекция хочет добиться? Дань моде? Надоел ноющий главбух? Решили, что что-то пора менять, но что менять – не выяснили? Стоит напомнить, что грамотно поставленная автоматизация учета в торгово-производственных фирмах способна увеличить прибыль и уменьшить затраты. Хорошая автоматизация окупается достаточно быстро, и уже скоро начинает приносить прибыль и экономию. Но если руководство не оценило перспектив автоматизации или, что еще хуже, считает, что новый стол из красного дерева топ-менеджеру важнее нового сервера сисадмину, то вряд ли на такой фирме автоматизация будет успешной.
2. Ограниченный бюджет
Как правило, из первого следует второе. Когда руководство не совсем отдает себе отчет в том, чего они ждут от автоматизации, тогда возникают идеи, наподобие: «а давайте пригласим студента, и он все сделает, как надо», или «давайте посадим главбуха на сервер»... Я, конечно, не против подработки студентов и не сомневаюсь в потенциале российского студенчества, но хочу лишь сказать о том, что для внедрения серьезной системы учета простого умения программировать очень мало. Хороший внедренец должен уметь просчитать возможные последствия выбора той или иной стратегии автоматизации. Это достаточно кропотливая работа, требующая, прежде всего, большого практического опыта, понимание не только специфики учета предприятия, но и его неочевидных нюансов. В конце концов, такая работа требует настойчивости, потому что часто решения внедренцев могут встретить сопротивление со стороны заказчика, и нужно уметь отстоять свои предложения, основываясь, опять же, на собственном опыте, защищая интересы сопротивляющегося клиента. Вряд ли какой-либо студент, понимающий, что занимается временным, не свойственным ему делом, способен на такое. Поэтому, считаю, что экономия на уровне исполнителя – это почти гарантия неудавшейся автоматизации.
Это же относится и к неоправданной экономии на оборудовании. Как правило, сбой системы происходит в самом слабом ее звене и в самый неподходящий момент… Помню, как у одного моего клиента, смотрящего «сквозь пальцы» на предложение обновить сервер, этот сервер вдруг однажды сгорел, когда бухгалтерия делала годовой отчет. Печально было то, что архивирование данных не велось должным образом, опять же, не смотря на рекомендации: директор считал покупку пишущего cd-room (в то время) – не особенно необходимыми затратами. Систему, конечно, восстановили. Но я помню, как бухгалтерии пришлось две недели работать чуть ли не по ночам, чтобы восстановить потерянные за год данные по первичным документам. Кстати, после этого случая руководство все-таки купило в то время жутко дорогой сервер с райд-массивом…
3. Тендер на откатах
Где-то встречал в сети примерную статистику, какой процент тендеров на IT услуги в России выигрывается за счет откатов ответственному лицу. Статистика – не утешительна. Печально, что на откаты попадают в основном крупные заказчики, где сумма договора внушительна, и руководство напрямую не занимается подбором исполнителя, а поручает это собственному специалисту, который не всегда бывает доволен уровнем своей заработной платы. Практика показывает, что при таком раскладе, все работы бывают выполнены в срок, все документы подписаны, но сотрудники фирмы остаются недовольны результатами и не могут использовать внедренную систему в планируемом объеме по разным причинам. Соответственно, руководство не имеет требуемой аналитической базы и начинает выяснять, в чем причина. Такие разбирательства затягиваются надолго, часто сопровождаются кадровыми движениями и, в конечном итоге, поисками того, кто бы систему довел до ума…
4. К вопросу о лидерах отрасли
Хотел бы привести еще один пример, достаточно типичный. Фирма готова тратить деньги на автоматизацию, но не сориентировалась на рынке IT-услуг и обратилась к кому-то очень известному. В результате затраты превысили все разумные пределы, а итог оказался не совсем ожидаемым, хотя, возможно, приемлемым с натяжкой.
К сожалению, это только при покупке автомобиля можно руководствоваться рекламными буклетами, и, если позволяют средства, выбирать самое последнее из модельного ряда. В сфере IT-услуг, как показывает практика, все далеко не так, особенно в сфере автоматизации на базе продуктов фирмы «1С» фирмами-франчайзи. Если исполнитель – не на уровне масштабов компании «Intel Corporation», то его раскрученность совсем может не соответствовать качеству предлагаемых им услуг, а объемы клиентской сети, требующей постоянного сопровождения, могут не позволить заниматься новым клиентом на должном уровне. На фоне этого, стоило бы вспомнить о небольших фирмах, менее раскрученных, а потому не выигравших тендер, которые были бы просто счастливы получить крупного заказчика IT-услуг, даже с меньшей суммой договора, и были готовы отдать все силы на то, чтобы клиент остался доволен. Амбиции небольших коллективов, уровень их специалистов и заинтересованность в результатах работы часто оказываются выше, чем у раскрученных, больших компаний. Небольшие фирмы не могут допустить в работе того, что позволят себе монополии, потому что любая неудача может грозить такой фирме банкротством.
Я назвал лишь четыре, пожалуй, основных фактора, когда автоматизация не достигает результатов, и присходит это, отчасти, по вине заказчика. Наверняка, имеются и другие причины, но корень проблем, на мой взгляд, следует искать, прежде всего, в неправильной позиции руководства компании, которая выражается или в непонимании, зачем нужна автоматизация, или в неправильно выбранной стратегии решения этого вопроса. Там, где решения принимаются трезво и взвешенно, где оценивается уровень специалиста, а не его раскрученность на рынке, где руководство четко понимает, чего оно ждет от автоматизации в итоге – там все будет нормально, чего всем и желаю…
Представляю на Ваш суд утилиту быстрого поиска по базе данных. Данная технология производит поиск по полям, преобразуя их значения в строки (все значения преобразуются в верхний регистр, включая действительные числа).
Данное решение может быть не самым быстрым, однако на поверку оно оказывается быстрее остальных, обнаруженных мною в Интернете (может вам повезет больше). Более того, представьте, что действительное значение какого-либо поля равно 4.509375354, а значение поиска равно 7, в этом случае утилита засчитает "попадание". Утилита удобна также тем, что она за один проход производит поиск более, чем в одном поле.
Это удобно, если у Вас имеются, к примеру, два поля с адресами. Это моя первая "серьезная" разработка, так как первое, с чем я столкнулся, изучая Delphi, стала необходимость включения процедуры поиска в любое приложение, работающее с базой данных. А так как поиск - вещь тоже сугубо специфическая, как и любое приложение, то мне пришлось побороть свой страх перед "крутым программированием" и попробовать написать свой поисковый механизм, удовлетворивший меня (и, надеюсь, других) своей скоростью и возможностью "мульти"-поиска по нескольким полям.
Я надеюсь, что он поможет тем программистам, кто часто сталкивается с подобными задачами. Технология довольно легка для понимания, но если у Вас возникли какие-либо вопросы, пошлите мне письмо электронной почтой, я буду рад Вам помочь. Посмотрев код, можно легко узнать поддерживаемые типы полей (добавить новые не составит проблем).
В этой статье мы рассмотрим технику создания инифайлов их назначение и применение. Начнем с ответа на вопрос зачем же нужны эти инифайлы?! Предположим, что вы создали приложение, в котором пользователь может настраивать цвет фона, шрифт надписей и так далее. Когда он повторно включит вашу программу он очень сильно разочаруется, так как всего его старания по настройке интерфейса вашей программы пропали даром - программа будет иметь такой вид, который сделали вы при проектировании программы. Так вот чтобы эти настройки сохранять, лучше всего пользоваться инифайлами.
Одно из главных преимуществ инифайлов заключается в том, что эти файлы подерживают переменные разных типов (String, Integer, Boolean). В этих файлах очень удобно хранить различные настройки, например параметры шрифта, цвет фона, какие checkbox'ы выбрал пользователь и многое другое.
Теперь начнем разбираться с этими инифайлами. Для начала создайте новое приложение. Добавьте в секцию uses слово inifiles. Сохраните и откомпилируйте ваше приложение. Теперь сделаем, чтобы при каждом открытии программы форма имела такие размеры, какие установил пользователь последний раз. Для начала нам надо создать объект типа Inifile. Создается он методом Create(Filename:string); причем если в переменной Filename не указан путь к фалу, то он создаться в директории Windows, что не очень-то удобно. Поэтому мы создадим этот файл в директории нашей программы. Напишем это в обработчик события OnDestroy для формы:
Если файл с таким именем существует, то он откроется для чтения, а если нет - то он будет создан. Это очень удобно, так как не надо обрабатывать возможные исключительные ситуации, которые могут возникнуть при обращении к файлу.
Вот файл MyIni.ini после завершения работы программы (у вас естественно значения будут другими):
Теперь подробно разберемся как записывать информацию в инифайлы:
После того, как вы создали инифайл, в него можно записывать три вида переменных: Integer, String, Boolean, это осуществляется соответствующими процедурами: WriteInteger, WriteString, WriteBool. У всех этих процедур одинаковые параметры. В общем объявление этих процедур выглядит так:
Здесь Section -это имя секции, куда будут помещены параметры и значения. В файле имена секций заключены в квадратные скобки. Обычно в секции объединяют схожие параметры.
Ident - это название параметра, которому будет присваиваться какое-нибудь значение.
Value - это собственно значение, которое будет присвоено параметру. В файле оно стоит после знака равно.
Теперь напишем обработчик события OnCreate для формы, в котором будем считывать значения из файла и изменять размеры формы в соответствии с полученными значениями. Код должен иметь такой вид:
В этом коде все просто: открыли файл, прочитали из соответствующих секций необходимые параметры и присвоили их форме. Чтение значений из инифайла по сути ничем не отличается от записи в них. Указываете секцию, где хранится необходимый параметр, указываете параметр и читаете его значение. Как вы видите все просто!
Теперь я отвечу еще на один вопрос, который может появиться - почему не обычные текстовые файлы и не реестр? Отвечаю: из текстового файла очень сложно получить и обработать необходимую информацию. Многие рекомендуют для Win95/98/2000/Me, короче для всех 32-разрядных ОС использовать именно реестр, но лично я считаю, что инифайлы удобнее, так как при при переносе программы на другой компьютер, нужно перенести только один инифайл, а во-вторых, если вы что-нибудь в реестре случайно удалите, то может случиться каюк.