DLL позволяет подключить к 1-му ПК до 10 сканеров штрихкодов (по USB сканер должен эмулировать COM порт и нужен соответствующий драйвер сканера , пример Dataligic Griphon,Heron)
Генерирует внешнее событие с номером СОМ-порта и собственно штрихкодом.
Сканирует порты 10 раз в секунду.
Описание: В Delphi 7 отсутствует компонент NMUDP, поэтому я написал компонент UDPSwich и выкладываю его исходник здесь. Компонент работает с протоколом UDP и отличается от NMUDP событием OnDataRecevied, отсутствием свойства ReportLevel и новым свойством ActiveServer. Я надеюсь Вы разберетесь с ним.
В Windows основной элемент пользовательского интерфейса - форма. В Delphi каждый проект имеет по крайней мере одно окно - главное окно приложения. Все окна в Delphi основаны на объекте TForm. В данной статье мы рассмотрим основные события учавствующие в "жизни формы".
Форма
Формы имеют свои свойства, события и методы, при помощи которых Вы можете управлять видом и поведением формы. Форма, это обычный компонент Delphi, но в отличие от других, её нет на панели компонентов. Обычно форма создаётся при создании нового проекта (File -> New Application). Вновь созданная форма будет главной формой приложения.
Дополнительные формы в проекте создаются через File -> New Form. Так же существуют и другие способы создания форм, но здесь мы не будем рассматривать их...
Как и любой другой компонент (объект) форма имеет свои методы и реагирует на события. Давайте рассмотрим некоторые из этих событий...
Событие OnCreate возникает при создании TForm и только один раз. При создании формы (у каторой свойство Visible установлено в True), события произойдут в следующем порядке: OnCreate, OnShow, OnActivate, OnPaint.
В обработчике события OnCreate можно сделать какие-либо инициализационные действия, однако, любые объекты созданные в OnCreate будут уничтожены в событии OnDestroy.
OnShow
Это событие генерируется, когда форма станет видимой. OnShow вызывается сразу перед тем, как форма станет видимой. Это событие случается, если установить свойство формы Visible в True, либо при вызове методов Show или ShowModal.
OnActivate
Это событие генерируется, когда форма становится активной, тоесть когда форма получает фокус ввода. Это событие можно использовать для того, чтобы сменить элемент формы который должен получить фокус.
OnPaint, OnResize
Эти события вызываются каждый раз, когда форма изначально создаётся. При этом OnPaint вызывается каждый раз, когда какому-нибудь элементу формы необходимо перерисоваться (это событие можно использовать, если необходимо при этом рисовать на форме что-то особенное).
Уничтожение
При уничтожении формы, события генерируются в следующем порядке:
Если мы попытаемся закрыть форму при помощи метода Close либо другим доступным способом (Alt+F4 либо через системное меню), то сгенерируется событие OnCloseQuery. Таким образом, это событие можно использовать, чтобы предотвратить закрытие формы. Обычно, событие OnCloseQuery используется для того, чтобы спросить пользователя - уверен ли он (возможно в приложении остались несохранённые данные).
Обработчик события OnCloseQuery содержит переменную CanClose, которая определяет, можно ли форме закрыться. Изначальное значение этой переменной True. Однако в обработчике OnCloseQuery можно установить возвращаемое значение CloseQuery в False, чтобы прервать выполнение метода Close.
OnClose
Если OnCloseQuery вернул CanClose=True (что указывает на то, что форма должна быть закрыта), то будет будет сгенерировано событие OnClose.
Событие OnClose даёт последний шанс, чтобы предотвратить закрытие формы. Обработчик OnClose имеет параметр Action со следующими четырьмя возможными значениями:
caNone. Форме не разрешено закрыться. Всё равно, что мы установим CanClose в False в OnCloseQuery.
caHide. Вместо закрытия, форма будет скрыта.
caFree. Форма будет закрыта, и занятые ей ресурсы будут освобождены.
caMinimize. Вместо закрытия, форма будет минимизирована. Это значение устанавливается поумолчанию у дочерних форм MDI.
Замечание: Когда пользователь шутдаунит Windows, то будет вызвано OnCloseQuery, а не OnClose. Если Вы не хотите, чтобы Windows завершила свою работу, то поместите свой код в обработчик события OnCloseQuery, хотя CanClose=False не сделает, того, что сделано здесь.
OnDestroy
После того, как метод OnClose будет обработан и форма будет закрыта, то будет вызвано событие OnDestroy. В OnDestroy обычно делаются действия, противоположные тем, которые проделывались в OnCreate, то есть уничтожение созданных объектов и освобождение выделенной памяти.
Естевственно, что когда главная форма проекта будет закрыто, то приложение будет завершено.
Увы, жесткий диск компьютера почему-то всегда оказывается забит под завязку “самыми нужными” программами и данными, а цифровой аппарат всенепременно сообщит о том, что память переполнена, в тот момент, когда фотограф, вскинув фотокамеру, уже готов нажать кнопку спуска, чтобы сделать “главный кадр всей жизни”. Столкнувшись с подобным, поневоле приходится признать за информацией уникальную особенность, присущую кроме нее разве что только газам – обе эти субстанции (и газ, и информация) способны нацело заполнять весь предоставленный им объем, сколь бы велик он ни был…
Однако ученые и изобретатели постоянно ищут возможности сохранения все больших объемов информации и думают над тем, как можно расширить уже имеющиеся хранилища данных в существующих цифровых устройствах. Что касается настольных систем, то тут все понятно: жесткие диски становятся объемистее, а количество микросхем оперативной памяти, втискиваемых в корпус компьютера, постепенно стремится к бесконечности. Труднее обстоит дело с наладонными устройствами. В данном случае габариты имеют не последнее значение, так что подцепить, к примеру, к цифровому фотоаппарату винчестер не так-то просто (хотя видеокамеры со встроенным жестким диском уже выпускаются серийно). Приходится довольствоваться твердотельными устройствами хранения данных на основе микросхем flash-памяти, которые, впрочем, по объемам вполне могут сравниться с жесткими дисками 5-7-летней давности.
И не ОЗУ, и не ПЗУ
flash-память ведет свою родословную от постоянного запоминающего устройства (ПЗУ) компьютера, но при этом может работать как оперативное запоминающее устройство (ОЗУ). Для тех, кто подзабыл, наверное, стоит напомнить, в чем же собственно состоит разница между ПЗУ и ОЗУ. Так вот, главное преимущество постоянного запоминающего устройства – возможность хранить данные даже при отключении питания компьютера (от того-то в термине и присутствует слово “постоянное”). Правда, чтобы записать информацию в недра микросхемы flash-памяти, требуется специальный программатор, а сами данные записываются один раз и навсегда – возможности перезаписи данных в “классическом” ПЗУ нет (еще говорят, что микросхема “прожигается”, что в общем-то верно отражает физическую суть записи в ПЗУ). Что касается оперативной памяти, ОЗУ то есть, то этот тип накопителя данных, наоборот, не в состоянии хранить информацию при отключении питания, зато позволяет мгновенно записывать и считывать данные в процессе текущей работы компьютера. Flash-микросхема объединяет в себе качества обоих типов памяти: она позволяет сравнительно быстро записывать и считывать данные, да еще плюс к тому “не забывает” записанное после выключения питания. Именно эта способность к “долговременной памяти” и позволяет использовать flash-микросхемы в качестве альтернативы дискетам, компакт-дискам и жестким дискам, то есть устройствам хранения данных, которые могут годами, если не столетиями, сохранять информацию без какого-либо изменения и без всяких потерь.
Появилась же flash-память благодаря усилиям японских ученых. В 1984 г. компания Toshiba объявила о создании нового типа запоминающих устройств, а годом позже начала производство микросхем емкостью 256 Кbit. Правда, событие это, вероятно в силу малой востребованности в то время подобной памяти, не всколыхнуло мировую общественность. Второе рождение flash-микросхем произошло уже под брэндом Intel в 1988 г., когда мировой гигант радиоэлектронной промышленности разработал собственный вариант flash-памяти. Однако в течение почти целого десятилетия новинка оставалась вещью, широко известной лишь в узких кругах инженеров-компьютерщиков. И только появление малогабаритных цифровых устройств, требовавших для своей работы значительных объемов памяти, стало началом роста популярности flash-устройств. Начиная с 1997 г. flash-накопители стали использоваться в цифровых фотоаппаратах, потом “ареал обитания” твердотельной памяти с возможностью хранения и многократной перезаписи данных стал охватывать MP3-плейеры, наладонные компьютеры, цифровые видеокамеры и прочие миниатюрные “игрушки” для взрослых любителей цифрового мира.
Такое странное слово flash
Кстати сказать, как до сих пор идут споры о том, какой же все-таки год, 1984 или 1988-й, нужно считать временем появления “настоящей” flash-памяти, точно так же споры вызывает и происхождение самого термина flash, применяемого для обозначения этого класса устройств. Если обратиться к толковому словарю, то выяснится многозначность слова flash. Оно может обозначать короткий кадр фильма, вспышку, мелькание или отжиг стекла.
Согласно основной версии, термин flash появился в лабораториях компании Toshiba как характеристика скорости стирания и записи микросхемы флэш-памяти “in a flash”, то есть в мгновение ока. С другой стороны, причиной появления термина может быть слово, используемое для обозначения процесса “прожигания” памяти ПЗУ, который достался новинке в наследство от предшественников. В английском языке “засвечивание” или “прожигание” микросхемы постоянного запоминающего устройства обозначается словом flashing.
По третьей версии слово flash отражает особенность процесса записи данных в микросхемах этого типа. Дело в том, что, в отличие от прежнего ПЗУ, запись и стирание данных во flash-памяти производится блоками-кадрами, а термин flash как раз и имеет в качестве одного из значений – короткий кадр фильма.
В этой статье описываются полезные функции и процедуры, помогающие эффективно работать с различными типами данных в системе "1С:Предприятие 7.7".
* Обработка значений
* Форматирование
* Список значений
* Таблица значений
* Таблица
* Период и дата
* Календари и праздники
* Справочники
* Документы
* Предопределённые функции
* Налоговый учёт
Обработка значений в 1С
Форматирование данных в 1С
Список значений в 1С
Таблица значений в 1С
Таблица или печатная форма в 1С
Периоды и даты в 1С
Календари и праздники в 1С
Справочники в 1С
Документы в 1С
Предопределённые функции и процедуры в 1С
Налоговый учёт и первое событие в 1С
Резюме
В статье описаны функции и процедуры, используемые в программе "1С:Предприятие 7.7" для работы со справочниками, документами, списками значений, таблицами значений и с прочими агрегатными типами данных. Образцы практического применения описанных средств Вы сможете найти в статьях "Отчёты для 1С" и "Обработки для 1С".
Событие - это какое-либо действие, осуществляемое пользователем либо браузером. Например, когда мы щелкаем (кликаем) на ссылке - осуществляется событие, его перехватывает специальный обработчик и перенаправляет нас на нужную страницу; при наведении курсора (указателя мыши) на ссылку в строке состояния (обычно находится в нижней части окна браузера) отображается адрес, так как обработчик "наведения курсора на объект (в данном случае на ссылку)" помещает туда этот адрес и так далее...
а). onmouseout и onmouseover
Для начала наведем курсор на кнопку "Сброс" или "Отправить" и обратим внимание на строку состояния. Вы должны увидеть там надпись с объяснением значения кнопки. Теперь отведите курсор и строка состояния очистится.
Содержимое строки состояния хранится в переменной window.status. Переменная это некоторый объект (можно представить себе ящик), значение которого (содержимое которого) можно изменять. Изменение значения осуществляется операцией присваивания (=), а выглядит она следующим образом:
имя_переменной = "значение"; (какие использовать кавычки: одинарные или двойные значения не имеет)
Поэтому для того, чтобы изменить надпись в строке состояния, нам нужно присвоить переменной window.status нужное нам значение (подсказку к кнопке), а когда курсор будет убран - присвоить пустую строку("").
Вся задача сводится к тому, чтобы определить когда пользователь наводит курсор на кнопку, а когда убирает его. Для этого нужно "сказать" обработчикам этих событий выполнить нужное нам действие. Обработчик события "наведение курсора" - onmouseover, а "отведение курсора" - onmouseout.
Очень многие тэги имеют атрибуты, начинающиеся с on (onclick, onmouseout, onfocus и т. д.). Значение этих атрибутов и есть, задача которую необходимо выполнить соответствующему обработчику. То есть для обработчика onmouseout есть атрибут onmouseout, для onmouseover - onmouseover. И в итоге мы получаем следующее определение кнопок:
Как Вы видите, атрибут onmouseover имеет в качестве значения JavaScript-код: window.status='Щелкните для отправки данных', как только курсор достигает кнопки, обработчик события mouseover - onmouseover, смотрит, что хранится в атрибуте onmouseover и выполняет необходимое действие(присвоение значения переменной window.status). Аналогично действует и обработчик события onmouseout: как только курсор уводиться от кнопки (то есть выполняется событие mouseout), то обработчик события - onmouseout выполняет код, содержащийся в атрибуте onmouseout.
То же самое и со второй кнопкой.
б). <a href="Java Scriptfunction()">Function</a>
Теперь щелкните на ссылке и откроется окошко с подсказкой. Но заметьте, что окно небольших размеров и у него нет панели инструментов - такого силами html не сделаешь! В данном примере мы имеем окно размером 300x200, без панелей инструментов, содержащее документ help.html.
Для того чтобы создать такое окошко существует следующий JavaScript-код:
где:
1. helpWindow - это имя переменной (как window.status, только в данном случае имя выбирается произвольно). Эта переменная нужна для последующей работы с окном (например, закрыть его нестандартным способом - с помощью JavaScript-сценария).
- Зачем? Не проще ли указывать просто имя открывающейся страницы, например help.html?
- А если у нас две копии одной и той же страницы? Или две страницы с одинаковым именем(например, в разных папках)? Вот для того, чтобы не перепутать страницы и свободно работать именно с тем окном с которым предполагаешь и сделанно, так чтобы "окно" присваивалось переменной, так как имя переменной можно выбрать любое.
2. window.open(что-то) - это функция. Функции выполняют определенную задачу, в данном случае window.open() открывает новое окно.
3. help.html - это страница, которую нужно открыть.
4. "" - В кавычках должно быть имя окна, но оно нам не пригодится, поэтому там нулевая строка. В следующих кавычках указываются "параметры открываемого окна": оно не должно содержать панели инструментов (toolbar=0) и должно быть шириной 300 пикселей, а высотой - 200 (width=300,height=200, соответственно).
Теперь все, что нужно это по событию "щелчка" выполнить этот код, однако есть два "но". Во-первых строка очень длинная, чтобы присвоить ее какому-либо атрибуту - будет некрасиво смотреться, да и вызывать неудобства при чтении кода страницы. Во-вторых, первоначальное предназначение ссылки - это переход на другую страницу, но нам переходить никуда не нужно, нам нужно выполнить вместо этого JavaScript-код.
Первое решается написанием функции. Как я уже говорил функция выполняет некоторую задача, причем для использования функции достаточно указать ее имя. Можно не только использовать предопределенные(функции, которые имеется в языке и без нас), но и писать их самому. Обычно функции определяются(пишутся) в разделе HEAD документа, в котором используются:
"function" значит, что дальше будет написана наша функция; help() - это имя функции (оно будет указываться вместо тела функции (между { и })).
Вторая проблема решается тоже довольно просто. Адрес страницы указывается в атрибуте href, а нам надо выполнить JavaScript код вместо перехода по ссылке:
"Java Script" означает, что дальше должен идти JavaScript-код, и что он должен выполняться вместо стандартного перехода по ссылке. В данном случае наш JavaScript-код - это созданная нами функция help().
в). onclick
Нам не остается ничего более, как закрыть окно со справкой. Для этого воспользуемся кнопкой "Закрыть". Но нас интересует то, как работает эта кнопка, а имеет она следующий вид:
Дабы закрыть окно мы сделали щелчок(Click) на кнопке "Закрыть", а щелчок это нажатие и отпускание кнопки мыши, причем и то и другое должно быть произведено на одном и том же элементе (например, на кнопке). Кликая, на кнопке мы активируем обработчик события onClick, который выполняет для нас JavaScript-код, прописанный в атрибуте onclick нашей кнопки. Помните мы открывали окно? Мы писали window.open(), а здесь тоже самое только window.close(). window - это текущее окно, а close() - закрыть.
Это одно из наиболее частоупотребляемых событий.
г). onfocus и onblur
Ну что ж будем ближе подбираться к вводу требуемой от нас информации.
Как я уже говорил: элемент получает фокус когда на нем происходит нажатие кнопки мыши, или на него осуществляется переход посредством клавиши табуляции (Tab), а теряет, когда фокус получает другой элемент. Наше поле для ввода получит фокус тогда, когда пользователь решиться ввести информацию. При этом было бы удобно, чтобы текст с подсказкой ("Введите Ваше имя") автоматически выделялся и посетитель мог его удалить одним нажатием на del, а не удалять по одному символу, или выделять текст вручную. Удобство пользователя свято. Итак, для этого мы воспользуемся событием focus. Для выделения текста используется метод select(). То есть атрибутом к полю надо прописать: onfocus="this.select();", this обозначает, что выделение должно происходить именно в этом текстовом поле (а можно прописать путь и к другому, но это не целесообразно).
А теперь попробуйте ничего не изменяя (или все удалив) убрать фокус (например, щелкнув в любом месте окна, или нажав Tab). Это событие blur, я прописал в нем выполнение функции: onblur="check();". Сама же функция имеет следующий вид (в разделе head страницы с формой между <script> и </script>):
document.forms[0].name.value - это то, что введено в текстовое поле. document - это текущий документ, forms[0] - первая форма на нашей страницы (отсчет с нуля), name = имя поля (задается атрибутом name (<input name="name">)), а value это и есть нужное нам значение (то, что введенно в текстовое поле, к которому м ы и написали путь). Введенное в поле мы присваиваем переменной val (var значит, что дальше идет имя переменной), чтобы в дальнейшем каждый раз не писать весь путь целиком.
Следующее это оператор if(если). Он выглядит следующим образом:
Мы сравниваем содержание переменной val с пустой строкой ('') и с начальной строкой ('Введите Ваше имя'). Обратите внимание, что сравнение не как в математике(с одним =), а сравниваются двума ==. || - или. Функция alert выводит окно с ошибкой (то, что в скобках - это текст ошибки). То есть:
И на всякий случай приведу целиком строку с кодом поля input:
д). onreset и onsubmit
Допустим, что пользователь заполнил форму неправильно, и он хочет очистить все поля формы одновременно: для этого он воспользуется стандартной кнопкой reset. Но что если пользователь щелкнет на ней по случайности (рука дрогнет, или в суете спутает с кнопкой submit), а форма была огромная, и он долго мучился ее заполнять..., ему будет грустно, и еще он будет долго материться. Поэтому хорошо бы у него дополнительно спросить: действительно ли он хочет очистить форму.
Вообще событие reset обрабатывается до очистки формы. А чтобы отменить очистку вообще, нам просто напросто надо вернуть обработчику события значение false, то есть прописать в соответствующем атрибуте: "return false;", а чтобы продолжить очистку: "return true;". А теперь вспомним функцию, которая выдает вопрос пользователю на подтверждение чего-либо, эта функция: "confirm('Вопрос?');". При нажатии "Ok", эта функция заменяется на true, а при нажатии "Cancel" на false. То есть все что от нас требуется, это прописать в теге <form> атрибут: onreset="return confirm('Вы действительно хотите сбросить форму?');". Тогда при нажатии "Ok" там на самом деле будет "return true;", и форма будет очищена, а если "Cancel", то "return false;" и очистка формы будет отменена.
Подобным образом действует событие submit, которое возникает при попытке отправить форму. Поскольку в нашем случае форму отправлять никуда не надо, то у меня просто написано: onsubmit="return false;". И сколько бы Вы не щелкали ничего не изменится (разве что Вы JavaScript отключите).
Обычно же обработчик onsubmit используется для верификации формы (то есть проверки на заполнение всех необходимых полей, правильность их заполнения, скажем, проверка по определенному шаблону и т. п.), для этого создается функция, которая выполняет все действия. Функция должна содержать операторы "return true" и "return false", которые позволяют, заменить функцию на true или false, соответственно, в зависимости от результатов проверки (если успешно, то true, если нет false). Но верификация данных это обширная тема, которая не может быть рассмотрена здесь. Один из примеров базовой верификации я привел, когда объяснял событие blur - подобную функцию можно использовать и здесь. Тогда <form> будет содержать атрибут: onsubmit="return function();".
Но не забывайте, что нельзя ограничиваться одной лишь проверкой языком JavaScript, ибо его поддержка может быть отключена у посетителя, и тогда все Ваши труды по защите...
е). onmousedown и onmouseup
Еще одна пара событий не нашла достойного места на странице, но я ее реализовал в виде кнопки "Button". Причем это не обычная html-кнопка, она реализована в виде двух картинок. Исходная кнопка хранится в файле с именем npressed.jpg, а нажатая - pressed.jpg. Чтобы достичь эффекта нажатия кнопки нам необходимо, чтобы при при щелчке на ней(this) значение атрибута src (путь к картинке) тега <img> менялось на pressed.jpg, а при отпускании обратно на npressed.jpg. Нажатие кнопки обрабатывает onmousedown, а отпускание - onmouseup, то есть здесь все просто:
ж). onload, onunload и onabort
Обработчик события onload активируется, когда начинает загружаться графическая часть страницы (все тексты, графика и т.п.). onload является атрибутом тега <body>. Если честно я не вижу сколько бы реального применения этому событию, зато я нашел, что можно сделать с onunload. onunload это тоже атрибут тега <body>. Событие unload происходит когда мы пытаемся покинуть данную страницу (переходим по ссылке на другую, закрываем окно браузера, обновляем страницу и т. д.). Откройте еще раз окошко справки. Допустим, что пользователь прочитал справку, и хочет отправить форму, или уйдет с нашего сайта, но при этом он забыл закрыть это маленькое окошко с подсказкой, мы на выходе закроем его сами. А для этого тег <body> (у начального документа) у нас будет выглядеть следующим образом:
Вы должны бы помнить, что helpWindow это имя нашего окна (ведь именно этой переменной мы присваивали его открытие: helpWindow = window.open("help.html", "", "toolbar=0,width=300,height=200")), а метод close() закрывает это окно. Некоторые нехорошие люди используют это событие, чтобы когда посетители уходили с его страницы, появлялись какие-либо окна, так называемые pop-up.
onabort - атрибут тега <img>. Когда пользователь отменяет загрузку изображения происходит событие abort. Но отмена загрузки изображения может не входить в наши плане. И в качестве предупреждения у нас может быть написано нечто похожее на
ЗАКЛЮЧЕНИЕ
Есть некоторые события о которых я здесь нарочно не упомянул, потому что не нашел им достойного применения, но Вам они возможно пригодятся, поэтому я уделю им немного внимания.
onchange - обработчик события, который активируется, когда Вы изменяете содержимое текстового элемента или текстовой области (<TEXTAREA>) (например, когда Вы вводите или удаляете очередную букву какого-либо текстового поля).
onselect - обработчик события выбора текста. То есть это событие происходит, когда пользователь пытается выделить текст в текстовом элементе или текстовой области.
onerror - обработчик события error, которое возникает при ошибке загрузки документа или изображения (то есть onerror это атрибут тегов <body> и <img>). Оно возникает при синтаксической ошибке JavaScript-кода (но Вы ведь не будете специально делать в нем ошибки), либо ошибкой времени выполнения (например, если Ваш скрипт выполняет какие-либо вычисления и у Вас по ошибке получится так, что некое число будет делиться на ноль, а это недопустимо - это и есть одна из ошибок времени выполнения).
Так же не забывайте, что я привел лишь по одному примеру из десятков возможных на каждое событие. Здесь главное Ваша фантазия и навыки. Например, события mouseout, mouseover, mouseup, mousedown часто используются для создания выпадающих меню и других визуальных эффектов, но это весьма трудный материал, который требует более глубоких знаний, причем не одного JavaScript.
В статье продемонстрированы программные методы экспортирования данных из программы "1С:Предприятие 7.7".
Экспорт данных из 1С в Текстовой файл TXT, CSV
Экспорт данных из 1С в файл dBase формата DBF
Экспорт данных из 1С на лист MS Excel
Управление MS Word из 1С
Методы работы с MS Word через OLE активно использованы в конфигурации "Договоры". Для определения числового кода текстовых констант MS Word использована обработка "Константы VBA".
В этой статье описываются полезные функции и процедуры, помогающие эффективно работать с различными типами данных в системе "1С:Предприятие 7.7".
Форматирование данных в 1С
Список значений в 1С
Таблица значений в 1С
Таблица или печатная форма в 1С
Периоды и даты в 1С
Календари и праздники в 1С
[pagebreak]
Справочники в 1С
Документы в 1С
Предопределённые функции и процедуры в 1С
Налоговый учёт и первое событие в 1С
Резюме
В статье описаны функции и процедуры, используемые в программе "1С:Предприятие 7.7" для работы со справочниками, документами, списками значений, таблицами значений и с прочими агрегатными типами данных. Образцы практического применения описанных средств Вы сможете найти в статьях "Отчёты для 1С" и "Обработки для 1С".
Какие жесткие диски лучше установить на компьютере с windows 2000/XP: ata (иначе ide) или scsi? Спор о сравнительных достоинствах и недостатках дисков ata и scsi – один из самых давних в отрасли. В одной из статей я уже сравнивал технические характеристики различных вариантов этих технологий и рассказывал, как их использовать в системах на базе windows nt.
За последнее время появились новые реализации интерфейсов ata и scsi. Сфера scsi расширилась и теперь охватывает ultra2 scsi, волоконно-оптический канал, ultra160 scsi и новейший стандарт – ultra320 scsi. Максимальная пропускная способность этих устройств составляет 80, 100, 160 и 320 Мбайт/с, соответственно. Однако высокая скорость всегда была достоинством scsi, поэтому более важным событием стало сокращение ценового разрыва между технологией scsi и ее конкурентами.
ATA догоняет
Последние стандарты ata 66 (или ultra dma/66, или udma/66) и ata 100 (или ultra dma/100, или udma/100) обеспечивают быструю передачу данных в пакетном и непрерывном режимах (66 и 100 Мбайт/с, соответственно). Планка производительности ata поднимется еще выше с появлением в 2002 г. стандарта se-rialata (первые устройства будут обеспечивать скорость передачи данных 150 Мбайт/с, а в дальнейшем – до 300 и даже 600 Мбайт/с). Таким образом, ata уже годится не только для пользовательских систем и корпоративных настольных компьютеров начального уровня, но и для машин, к дисковой подсистеме которых предъявляются повышенные требования.
Реально на офисных однодисковых системах обычно не удается достигнуть максимального быстродействия. Системные ограничения (например, возможности микросхем ata, архитектура системной шины, физические ограничения диска) часто снижают скорость пересылки данных. Тем не менее, в основном из-за дороговизны scsi (которая объясняется высокой стоимостью контроллера и диска), ata преобладает везде, кроме настольных рабочих станций самого высокого уровня. Однако, чтобы добиться максимальной производительности дисков ata на компьютерах win-dows 2000, недостаточно просто установить новые накопители и подключить кабели.
Стараясь идти в ногу с технологией ata, разработчики microsoft дополнили windows 2000 новыми возможностями и уделяют ata больше внимания при подготовке различных пакетов исправления и программных заплаток. Чтобы эффективно использовать устройства ata на компьютерах windows 2000, требуется иметь базовые знания об интерфейсе ata, необходимых аппаратных средствах и программном обеспечении (например, пакетах исправления и заплатках windows 2000, встроенных драйверах и драйверах независимых поставщиков).
Аппаратные средства
Во-первых, в системе должен быть установлен контроллер, который поддерживает скоростные режимы ata. Самые распространенные стандарты современных дисков – ata/33 (ultra dma/33 или udma/33), ata/66 и ata/100. Практически все контроллеры ata обратно совместимы с дисками прежних стандартов. Например, контроллер ata/100 обычно совместим с дисками ata/33 и даже старыми стандартами ide и eide.
В большинстве систем контроллер реализован в микросхемах ata на системной плате (львиная доля рынка микросхем ata принадлежит компании intel, но есть и другие поставщики, такие, как viahardware.com). Однако в некоторых случаях контроллер может быть размещен на плате расширения pci, например в raid-контроллере ata.
От набора микросхем (важнейшего компонента системной конфигурации ata) и его драйверов зависят функциональные возможности дисков и других устройств, подключенных к контроллеру. Поэтому в первую очередь необходимо тщательно изучить набор микросхем на системной или вспомогательной плате и определить его возможности. Эту информацию можно получить у поставщика ком-пьютера, с системной платы или платы контроллера.
Если микросхемы ata расположены на системной плате, необходимо убедиться, что bios системы поддерживает нужные режимы ata. По всей вероятности, конкретный режим ata реализован в наборе микросхем, но он может отсутствовать в редакции bios, регулярно обновляемой поставщиками ПК и системных микросхем. В этом случае новую версию bios можно получить на web-сайте изготовителя системной платы или компьютера.
Затем следует убедиться, что аппаратные средства обеспечивают нужный режим ata и настроены на оптимальную производительность. Во-первых, все жесткие диски должны поддерживать необходимые режимы ata (например, ata/66, ata/100). Во-вторых, важно распределить диски по отдельным каналам, так как по умолчанию канал ata работает со скоростью самого медленного диска. Если диски ata/33 и ata/100 установлены в одном канале, то скорость передачи данных будет определяться быстродействием ata/33. Поэтому следует разместить медленные устройства ata (например, устройства cd-rom, cd-r, cd-rw, zip, старые жесткие диски) на одном канале, а скоростные жесткие диски – на другом.
Кроме того, необходимо верно выбрать кабели. В спецификациях ata/33, ata/66 и ata/100 указывается, что устройства следует подключать через специальный 80-жильный ленточный кабель, а не 40-жильные кабели, применявшиеся в прежних дисках ata. Дополнительные жилы кабеля нужны для заземления и увеличивают соотношение сигнал/шум при передаче данных. И наконец, накопители следует подключать к 80-жильному кабелю иначе, чем к прежним 40-жильным кабелям. Главное устройство (drive 0) необходимо разместить на конце 80-жильного кабеля, а вторичный накопитель (drive 1) нужно подключить к среднему разъему. Синий разъем на одном конце предназначен для системной платы или платы контроллера, серый разъем в середине – для вторичного устройства, а черный разъем на другом конце – для главного устройства.
Событие OncalcFields генерится ОЧЕНЬ часто и может быть необязательным и занимать большое количество времени, например, у вас есть таблица с неким вычисляемым полем, и при каждом редактировании таблицы вызывается следующий код:
Теперь, если Вы решили пройти последовательно каждую запись огромной таблицы, вы можете представить, какое количество таких событий будет сгенерировано! Они будут необязательны в случае, если вы сделаете обработку полей в отдельной процедуре.
Мой совет следующий: выключите генерацию события OnCalcFields, обработайте все поля и снова включите генерацию данного события, к примеру так:
.
.
.
.
.
.
.
.
.
.
.
Поля не вычисляются в течение времени обработки, которое может быть достаточно велико, но при наличие громоздких вычислений специфического поля (или даже нескольких полей), все вычисляется за один проход!
Данный метод позволяет исключить необязательный код и может быть использован повсюду, где применяются большие таблицы или сложный алгоритм калькуляции поля. Разница в скорости обработки таблицы довольно ощутима.