СОПРОВОЖДЕНИЕ СИСТЕМЫ. ОБНОВЛЕНИЕ КОНФИГУРАЦИИ
Задачами сопровождения системы являются поддержание ее работоспособности и повышение эффективности ее функционирования.
В комплексе мероприятий по сопровождению можно выделить два вида работ: регламентные и инициативные.
8.6.1. РЕГЛАМЕНТНЫЕ РАБОТЫ
Регламентные работы состоят в администрировании данных и системы. Цель администрирования данных - обеспечение сохранности данных, их проверка и в случае обнаружения ошибок принятие необходимых для их устранения мер. Это большая работа, требующая высокой квалификации.
При администрировании системы решаются задачи организации рабочих мест и обновления системы по мере поступления новых версий.
Перечень названных и иных работ, направленных на поддержание работоспособности системы, определяется, как известно, особым документом - регламентом. В нем же содержатся указания о периодичности работ и о порядке их регистрации, а также упоминание об инстанции, контролирующей выполнение регламента. ,
В число регламентных работ входит регистрация произведенных изменений конфигурации и внешних отчетов и обработок. Сведения об изменениях разместим в табл. 8.2.
Таблица 8.2
Изменения, произведенные в системе |
Изменение |
Описание |
Внешние отчеты и обработки |
Создана внешняя обработка Проба |
Файл Ilpo6a.ert. Предназначена для запуска произвольных обработок, например процедур удаления записей ЖЗ, мягкой смены расчетного периода (разд. 7.4.5), отчета по константам (разд. 1.9 и 6.1), по справочнику Сотрудники_2 (разд. 5.11), начальному сальдо (разд. 7.4.7), программной обработки удаляемых записей (разд. 5.14), загрузки начального сальдо из DBF-файла (разд. 7.4.6) и т. д. |
Изменения конфигурации системы |
Константы (файл 1SC0NST.DBF) |
Добавлена периодическая константа к5 |
Коэффициент, используемый в ВР Премия_1234, равной (Оклад_2 + ПремияКоэф_2 + ПремияСум_2) * к5 |
Добавлена периодическая константа СтавкаНалога |
Используется при вычислении результата ВР НДФЛ_2 |
Обработки |
Удалено две обработки |
РасчетЗарплаты и РасчетЗарплаты! |
Отчеты |
Удален один отчет |
ПеречисленияВБанки |
Виды расчетов (хранятся в конфигурации, файл ICV7.MD) |
Добавлено 7 ВР |
НачСальдо_2, Оклад_2, ПремияКоэф_2, ПремияСум_2,
Премия 1234_2, НДФЛ_2, ВБанк_2. Описание ВР см.
в разд. 7.3.2 (табл. 7.2) и 7.11 (табл. 7.15) |
Удалено два ВР |
АвторскиеЗаСк и ОплатаБЛ_Северн. Порядок удаления ВР см. в разд. 8.2 |
Правила перерасчетов (хранятся в конфигурации, файл 1CV7.MD) |
Добавлено 3 правила перерасчета |
Премия 1234_2, НДФЛ_2, ВБанк_2. Описание правил см. в разд. 7.7 (табл. 7.12) |
Группы расчетов (хранятся в конфигурации, файл 1CV7.MD) |
Добавлено две группы расчетов |
ВсеУдержания 2 (разд. 7.3.6.2) и ВсеНачисления 2 (разд. 7.8.1) |
Справочники |
Добавлено 5 справочников |
Сотрудники_2 (разд. 5.1 и 5.2, файл SC4194.DBF),
Образование 2 (разд. 5.7, файл SC4214.DBF), Дети (разд.
5.10.1, файл SC4233.DBF), ХозОпДляВР (разд. 7.3.7, файл SC4326.DBF), ПраваРасчетчика (разд. 8.5.2, файл SC4355.DBF) |
Документы |
Добавлено 5 документов. Для документа, если он имеет и заголовок и табличную часть, создаются 2 DBF-файла, или 1 - в противном случае |
ПриказОПриеме (разд. 5.8.2, файл DH4216.DBF), ИзменениеОклада (разд. 5.8.4, файлы DH4226.DBF и DT4226.DBF), Табель (разд. 7.6, файлы DH4244.DBF и DT4244.DBF), Премия (разд. 7.9, файлы DH4293.DBF и DT4293.DBF), НачПериода 2 (разд. 7.3.6.3, файл DT4321.DBF) |
|
Изменение |
Описание |
Удален один документ |
ВводОтработанногоВремени (файлы DH3061.DBF HDT3061.DBF) |
Журналы документов |
Добавлено два журнала документов |
Табель (разд. 7.6.5), Расчеты (разд. 7.9.5). Все журналы документов хранятся в файле 1 SJOURN.DBF |
Журнал расчетов |
Добавлен один ЖЗ |
Зарплата_2 (разд. 7.4.2, файл CJ4287.DBF) |
Удален один ЖЗ |
Зарплата (файл CJ209.DBF) |
Календари |
Добавлено два календаря |
Служащие_2, Рабочие_2 (разд. 7.5.1, файл CL.DBF) |
Перечисления |
Добавлено два перечисления |
Скидки (разд. 4.2), ВР_2 (разд. 7.3.3). Хранятся в конфигурации, файл 1CV7.MD |
Замечания:
1. Подобную таблицу следует иметь каждому лицу, сопровождающему систему.
2. При попытке удалении документа 1С может возникнуть предупреждение (рис. 8.13)
 |
Рис. 8.13. Предупреждение при попытке удаления документа ВводОтработанногоВремени. |
и поясняющее его сообщение
Данный объект использован в:
ГрафаОтбора. Сотрудник
Чтобы это препятствие преодолеть, следует в конфигурации открыть указанные на рис. 8.14 пункты меню, а затем дважды ударить мышью по подпункту Сотрудник.
в М Журналы документов В = Г рафы отбора — Сотрудник — Подразделение
Рис. 8.14. Графы отбора журнала документов
В появившемся диалоге (рис. 8.15) перенести вправо элемент левого списка Доку-мент.ВводОтработанногоВремени.
Теперь документ ВводОтработанногоВремени может быть удален.
3. При удалении документа система удаляет CDX- и DBF-файлы, созданные ей для документа.
4. На самом деле с целью ускорения работы системы из конфигурации удалены все, кроме созданных нами и используемых в работе, ВР, правила перерасчето в, группы ВР, перечисления, документы, справочники, перечисления, отчеты и обработки. В результате таких манипуляций файл конфигурации 1CV7.MD уменьшился почти в 6 раз до 1,3 Мбайт.
5. Получить список введенных в конфигурацию изменений можно, загрузив прежде копию неизмененной конфигурации, а затем, имитируя попытку объединения ее с модифицированной (разд. 8.6.4), выпустить отчет об изменениях. В нашем случае он будет содержать следующий текст:
Задача
 |
Рис. 8.15. Устраняем препятствие для удаления документа ВводОтработанногоВремени |
- Объект изменен
- Объект изменен
- Объект добавлен
- Объект добавлен
- Объект добавлен
- Объект добавлен
- Объект добавлен
- Объект добавлен
- Объект добавлен
- Объект добавлен
- Объект добавлен
- Объект добавлен
- Объект добавлен
Библиотека Картинок Глобальный модуль Справочник. Сотрудники_2 Справочник. Образование_2 Справочник.Дети Справочник.ХозОпДляВР Справочник. ПраваРасчетчика Документ. ПриказОПриеме Документ. ИзменениеОклада Документ.Табель Документ. Премия Документ. НачПериода_2 Перечисление. Скидки
Перечисление. ВР_2 |
- Объект добавлен |
ГрафаОтбора. Сотрудник |
- Объект изменен |
ГрафаОтбора.Подразделение |
- Объект изменен |
Журнал. ПриказыКадровые |
- Объект изменен |
Журнал.Табель |
- Объект добавлен |
Журнал. Расчеты |
- Объект добавлен |
ЖурналРасчетов.Зарплата_2 |
- Объект добавлен |
ПравилоПерерасчета. НДФЛ_2 |
- Объект добавлен |
ПравилоПерерасчета.ВБанк_2 |
- Объект добавлен |
ПравилоПерерасчета. Премия1234_2 |
- Объект добавлен |
ВидРасчета. НачСальдо_2 |
- Объект добавлен |
ВидРасчета. Оклад_2 |
- Объект добавлен |
ВидРасчета.ПремияКоэф_2 |
- Объект добавлен |
ВидРасчета. ПремияСум_2 |
- Объект добавлен |
ВидРасчета. Премия1234_2 |
- Объект добавлен |
ВидРасчета.ВБанк_2 |
- Объект добавлен |
ВидРасчета. НДФЛ_2 |
- Объект добавлен |
ГруппаРасчетов.ВсеУдержания_2 |
- Объект добавлен |
ГруппаРасчетов. ВсеНачисления_2 |
- Объект добавлен |
Календарь. Служащие_2 |
- Объект добавлен |
Календарь. Рабочие_2 |
- Объект добавлен |
Права |
|
ПолныеПрава |
- Объект изменен |
РасчетЗП |
- Объект добавлен |
Кадры |
- Объект добавлен |
Ученик |
- Объект добавлен |
Интерфейсы |
|
РасчетЗП |
- Объект добавлен |
Кадры |
- Объект добавлен |
Ученик |
- Объект добавлен |
8.6.2. ИНИЦИАТИВНЫЕ РАБОТЫ
Инициативные работы направлены на повышение качества системы, то есть на оптимизацию системы по перечисленным в разд. 8.1 критериям.
Часть оптимизирующих мероприятий мы уже упомянули. Здесь же остановимся на еще одной стороне вопроса - скорости получения результата, которым в нашей задаче является расчет зарплаты всем сотрудникам и выпуск сопровождающих этот расчет документов. В этом плане лицо, сопровождающее систему, будучи осведомленным об особенностях ее работы, может дать полезные рекомендации и при необходимости произвести необходимые модификации программы с целью практической реализации принятых рекомендаций.
К примеру, полезно минимизировать число вводимых документов. Это повысит быстродействие системы и снизит время ввода и редактирования данных. Эта задача, с одной стороны, решается организационными мероприятиями, например по каждому ВР для цеха оформляется один документ. С другой стороны, некоторые меры по снижению числа документов может предпринять и программист.
Так, после незначительных преобразований мы научились вводить начало расчетного периода на основе одного документа для всего предприятия. Причем каждый расчетный период вводится одним и тем же документом НачПериода_2 под номером 1, в который при начале нового периода добавляется одна строка табличной части (см. рис. 7.82).
Этот документ удалять нельзя. Защиту от удаления мы поставим в предопределенной процедуре глобального модуля ПриУдаленииДокументд, добавив в нее следующий код:
если док.Вид() = "НачПериода_2" тогда
СтатусВозврата(0);
Предупреждение("Нельзя удалять документ Начало расчетного периода.");
возврат;
конецЕсли;
Еще один шаг в направлении снижения числа документов мы сделали, создав д о-кументы Табель и Премия, вводящие по несколько ВР каждый. Таким образом, чтобы ввести все расчеты с приведенными в табл. 7.2 ВР предприятия (разд. 7.3.2), мы можем обойтись всего двумя документами на цех (Табель и Премия). Схожие решения могут быть приняты и для других ВР, даже таких, как оплата больничных или расчет отпуска. Программная реализация таких подходов, как мы убедились, не представляет ос о-бых затруднений.
Другая оптимизационная ниша - это исключение повторных операций по вводу данных и их обработке. Известно, что на предприятиях многие виды оплат начисляются в подразделениях, например премиальные, простои, всевозможные доплаты (за р а-боту в ночь, в праздник и др.). Там же ведется учет отработанного времени. Поэтому логично разработать и поставить в подразделения облегченные конфигурации 1С, позволяющие выполнять присущие им расчеты. Тогда задачи расчетного отдела предпр и-ятия существенно упростятся и будут состоять в импорте подготовленных в подразделениях документов, выполнении сложных расчетов, например отпускных, бухгалтерском учете заработной платы и выпуске необходимых отчетов, в том числе и для внешних организаций, налоговых, пенсионных и др.
Третья сфера инициативных работ - это выработка предложений по оптимизация производственных процессов и согласование их с моделями, реализуемыми средствами 1С.
Словом, пространство для инициативных работ велико. Будут ли выполняться эти работы или нет, от 1С не зависит, и поэтому этот вопрос здесь не обсуждается. В то же время все необходимые для реализации подобных мероприятий средства в 1С имеются, в чем читатель мог убедиться, просматривая предшествующие разделы пособия.
8.6.3. ОПТИМИЗАЦИЯ КОНФИГУРАЦИИ И ИНФОРМАЦИОННОЙ БАЗЫ
Оптимизация достигается за счет удаления из конфигурации и базы данных неиспользуемых объектов и файлов. Для этого прежде составляется свод применяемых объектов (табл. 8.3).
Используемые объекты конфигурации
Таблица 8.3 |
Объект |
Описание |
Константы |
НазваниеОрганизации |
Используется в расчетном листке и в ведомости перечислений в банк (процедура ВедомостьБанк формы списка ЖЗ Зарплата_2) |
БанкОрганизации |
Используется в ведомости перечислений в банк |
ГлБухгалтер |
” |
СтавкаНалога |
Используется в ВР НДФЛ_2 |
к5 |
Используется в ВР Премия_1234 |
Справочники |
Банки |
Используется в объекте Константа.БанкОрганизации |
Счета |
Используется в объекте Справочник.ХозяйственнаяОперация |
ХозяйственнаяОпера- |
Используется в объектах Справочник.ХозОпДляВР, |
ция |
ЖурналРасчетов.Зарплата_2 |
ВидыАналитики |
Используется в объекте Справочник.Счета |
Сотрудники_2 |
Используется в объектах Константа. ГлБухгалтер, Справочник.Дети, Справочник.ПраваРасчетчика, Документ.ПриказОПриеме, Документ.ИзменениеОклада, Документ.Табель, Документ.Премия, ЖурналРасчетов.Зарплата_2 |
Образование_2 |
Используется в объектах Справочник.Сотрудники_2, Документ. ПриказОПриеме |
Дети |
Хранит сведения о детях сотрудников |
ХозОпДляВР |
Хранит связанные с ВР хозяйственные операции |
ПраваРасчетчика |
Содержит перечень доступных расчетчику подразделений |
Документы |
ПриказОПриеме |
Используется в объекте Журнал.ПриказыКадровые |
ИзменениеОклада |
Используется в объекте Документ.ПриказОПриеме |
Табель |
Создает ВР Оклад_2, НДФЛ_2, ВБанк_2 |
Премия |
Создает ВР ПремияКоэф_2, ПремияСум_2, Премия_1234 |
НачПериода_2 |
Фиксирует смену расчетного периода |
Журналы документов |
ПриказыКадровые |
Содержит документы ПриказОПриеме и ИзменениеОклада |
Расчеты |
Содержит документы НачПериода_2 и Премия |
Табель |
Содержит документ Табель |
|
Объект |
Описание |
|
Перечисления |
ДаНет |
Используется в объекте Документ.Премия.Премия1234 |
ВР_2 |
Используется в модуле формы списка ЖЗ Зарплата_2
Журналы расчетов |
Зарплата_2 |
Содержит расчеты зарплаты сотрудников из справочника Сотрудники_2
Правила перерасчета |
НДФЛ_2 |
При вводе расчетов с ВР Оклад_2, ПремияКоэф_2, ПремияСум_2 и Премия_1234 нужно пересчитать расчеты с ВР НДФЛ_2 |
ВБанк_2 |
При вводе расчетов с ВР НачСальдо_2, Оклад_2, ПремияКоэф_2, ПремияСум_2, Премия_1234 и НДФЛ_2 нужно пересчитать расчеты с ВР ВБанк_2 |
Премия_1234 |
При вводе расчетов с ВР Оклад_2, ПремияКоэф_2 и ПремияСум_2 нужно пересчитать расчеты с ВР Премия_1234
Виды расчетов (см. табл. 7.2 и 7.11)
Группы видов расчетов |
ВсеУдержания_2 |
Включает ВР НДФЛ_2 |
ВсеНачисления_2 |
Включает ВР Оклад_2, ПремияКоэф_2, ПремияСум_2 и
Премйя_1234
Календари |
Служащие_2 |
Календарь для служащих |
Рабочие_2 |
Календарь для рабочих
Процедуры и функции глобального модуля |
ПриНачале
РаботыСистемы |
Предопределенная процедура глобального модуля. Выполняет инициализацию переменных и проверку, можно ли создать ЖР Зарплата_2 |
глДействия |
Вызывается в документе Табель |
ПриСмене
РасчетногоПериода |
Предопределенная процедура глобального модуля. Вызывает процедуру ФиксироватьСменуРП |
Фиксировать
СменуРП |
Заносит данные о смене расчетного периода в документ НачПериода_2 |
ЕстьЛиРучная
Правка |
Функция вернет 0, если хотя бы один расчет удаляемого документа имеет ручную правку |
ПриУдалении
Документа |
Предопределенная процедура глобального модуля. Вызывает функцию ЕстьЛиРучнаяПравка и не позволяет удалять документ с ручной правкой. Не позволяет также удалять документ НачПериода_2 |
ЕстьЛиРасчетчик |
Функция вернет 1, если в систему вошел расчетчик, или 0 -в противном случае. Используется в ЖЗ Зарплата_2 и в справочнике Сотрудники_2 для ограничения прав доступа |
Все остальные объекты из конфигурации можно удалить, сохранив предварительно копию исходного файла. А в глобальном модуле облегченного варианта системы, предназначенного, скажем, для подразделений предприятия, следует оставить ограниченное число процедур и функций, например приведенных на рис. 8.16.
 |
Рис. 8.16. Сохраняемые процедуры и функции глобального модуля |
В оставшемся коде глобального модуля нужно не забыть убрать ссылки на удаленные из конфигурации объекты.
Удаление ненужных объектов, таких, как справочники, документы и журналы, повлечет удаление соответствующих им DBF- и CDX-файлов. Тогда, запуская облегченную систему, мы снизим и число открываемых файлов (система открывает все файлы в момент ее загрузки), и число операций на поиск нужных объектов, например групп ВР или перечислений.
Чтобы сохранить работоспособность модифицированной конфигурации без журнала Зарплата, в предопределенной процедуре глобального модуля ПриНачалеРаботы-Системы в операторе
ЖЗ = СоздатьОбъект("ЖурналРасчетов.Зарплата");
объект Зарплата нужно заменить на объект Зарплата_2:
ЖЗ = СоздатьОбъект("ЖурналРасчеюв.Зарплата_2");
Аналогичные изменения следует сделать и в других оставляемых процедурах глобального модуля. Впрочем, можно от имени ЖЗ Зарплата_2 вернуться к имени Зарплата.
Перед удалением документов из конфигурации можно, находясь в 1С:Предприятии, употреблять следующую процедуру (на примере документа НачалоМесящ):
процедура Выполнить()
док = СоздатьОбъект("Документ.НачалоМесяца");
док.ВыбратьДокументы( );
пока док.ПолучитьДокумент( ) = 1 цикл
// Проставляем 1 С-пометку удаления
// Затем придется выполнить удаление помеченных объектов док.Удалить(0);
конецЦикла; // пока
ОткрытьФормуС'Журнал.Общий"); // Контрольный просмотр результата
конецПроцедуры // Выполнить
Удаленные из конфигурации объекты всегда можно добавить из ее сохраненной копии (файл 1 CV7.MD), если воспользоваться режимом Объединение конфигураций.
8.6.4. ОБНОВЛЕНИЕ КОНФИГУРАЦИИ
Время от времени 1С поставляет новые версии конфигураций, содержащие свежие наработки фирмы. Ваша задача - добавить из обновленной конфигурации в рабочую нужные фрагменты и при этом сохранить все привнесенные модификации (см. табл. 8.2).
Задача решается следующим образом. Находясь в конфигураторе, выберем пункт Объединение конфигураций колонки Конфигурация. Далее откроем файл с новой конфигурацией. Его имя скорее всего будет совпадать с именем файла текущей конфигурации (1CV7.MD), а расположение, естественно, - нет.
После сравнения текущей и новой конфигураций 1С откроет диалог, представленный на рис. 8.17.
 |
Рис. 8.17. Результаты сравнения конфигураций |
В диалоге выберем в группе Приоритет конфигурации переключатель Текущая конфигурация и нажмем на кнопку Выкл. все. Последнее действие погасит все флажки в столбце Объект. То есть, если нажать ОК, никаких изменений произведено не будет.
Выбор метода объединения зависит от объединяемых объектов. Если он не может быть задан одинаковым для всех объектов, то объединение конфигураций придется выполнить дважды. Впрочем, число производимых объединений может быть и большим, если использовать разные приоритеты конфигураций.
Теперь, употребляя элементы диалога Открыть, Сравнить и Отчет, следует принять решение в отношении каждого объекта, после чего нажать ОК.
Процесс изменения будет сопровождаться сообщениями следующего вида:
Начало процесса объединения конфигураций
- Режим замещения ведущих объектов
- Текущая конфигурация является приоритетной
- Добавление Объекта: "’Константа.НашБанк"
Окончание процесса объединения конфигураций
После объединения выполняется сохранение полученной конфигурации.
Замечание. Обновляя конфигурацию, не забываете вносить соответствующие изменения в глобальный модуль, добавляя в него вновь появившиеся переменные и программные компоненты, удаляя или модифицируя устаревшие.
8.7. ВЫВОДЫ
1. Настройку 1С следует выполнять на основе комплексной программы, ориентированной на повышение эффективности функционирования системы.
2. Критериями эффективности являются время ввода и редактирования данных, время вычислений, качество пользовательского интерфейса, надежность вычислений и степень защищенности данных.
3. При многопользовательском доступе возможные конфликты преодолеваются при помощи конструкции Попытка или процедур для транзакций. Там, где возможно, транзакции нужно замещать конструкцией Попытка.
4. По умолчанию предопределенные процедуры модуля документа ОбработкаПрове-дения и ОбработкаУдаленияПроведения выполняются с применением транзакции.
5. После введения справочника ПраваРасчетчика ограничение доступа данных становится легко решаемой задачей.
6. Специалист, сопровождающий систему, должен выполнять не только регламентные, но и инициативные работы, направленные на оптимизацию программы и процессов, модели которых программа реализует.
7. Быстродействие системы повысится, а задачи ее сопровождения существенно упростятся, если перейти от полного к облегченному варианту системы, удалив из нее неиспользуемые объекты.
8. Удалению объектов должно предшествовать детальное описание используемых в работе объектов, процедур и функций.
9. Для подразделений предприятия, выполняющих частичный расчет зарплаты своих сотрудников, создаются максимально легкие версии программы.
10. Удаленные объекты всегда можно добавить в текущую конфигурацию из ранее сохраненной копии.
9. ОБМЕН ДАННЫМИ
С другими системами 1С обменивается данными преимущественно посредством текстовых и DBF-файлов. В этой главе мы рассмотрим вторую возможность, предварительно сообщив базовые сведения об алгоритмах сортировки и поиска данных.
9.1. МЕТОДЫ СОРТИРОВКИ ДАННЫХ
Основное назначение сортировки - обеспечить быстрый поиск данных. Помимо этого в отсортированном файле или массиве гораздо быстрее выполнять многие вычисления. Например, существенно быстрее подсчитывается число элементов, равных заданному значению. Также во многих случаях отсортированный файл более удобен для просмотра и визуального анализа данных.
9.1.1. ВНЕШНЯЯ И ВНУТРЕННЯЯ СОРТИРОВКА
Данные в файле можно отсортировать, применяя следующий порядок действий: а) ввести данные в массив; б) выполнить его сортировку; в) переместиться в начало файла; г) перенести данные из отсортированного массива в файл. Такая сортировка файла называется внутренней - все данные файла одновременно находятся в выделенной под процесс памяти.
Сортировка, при которой часть данных находится в принадлежащей программе памяти, а часть во внешней памяти, называется внешней. Крайним проявлением внешней сортировки является непосредственная сортировка DBF-файла, в котором, как известно, можно редактировать отдельные записи.
9.1.2. ПОНЯТИЕ КЛЮЧА
Пусть файл данных содержит некоторую последовательность из п элементов: г,, г,..., г. Каждый элемент файла будем называть записью. Как правило, записи файла состоят из одинакового числа компонентов, называемых полями записи. В общем случае компоненты записи могут быть разного типа.
Пример. В табл. 9.1 приводится фрагмент DBF-файла, содержащего данные о сотрудниках предприятия; строка таблиц является записью, а отдельная ячейка -ее полем.
Таблица 9.1
Фрагмевт файла SC4194.DBF |
Группа |
СсылкаНа
Группу |
Код |
Наименование |
Флаг
Папки |
Другие
поля |
6 |
2 |
201 |
Абрамова Лариса Сергеевна |
2 |
|
7 |
2 |
202 |
Куприкова Людмила Сергеевна |
2 |
|
8 |
2 |
203 |
Митина Ольга Владимировна |
2 |
|
|
Группа |
СсылкаНа
Группу |
Код |
Наименование |
Флаг
Папки |
Другие
поля |
9 |
3 |
111 |
Агальцов Юрий Алексеевич |
2 |
|
10 |
3 |
112 |
Добрецов Борис Юрьевич |
2 |
|
11 |
4 |
121 |
Волосков Михаил Андреевич |
2 |
|
12 |
4 |
122 |
Кузьмина Раиса Николаевна |
2 |
|
13 |
5 |
131 |
Васильева Елена Ивановна |
2 |
|
15 |
5 |
132 |
Смирнова Нина Федоровна |
2 |
|
16 |
5 |
133 |
Хохлов Евгений Николаевич |
2 |
|
Свяжем с. каждой записью файлов г ключ к, понимая под ключом одно из полей записи. Правда, такое понятие ключа является узким: в общем случае ключом записи r
t является некоторое выражение, среди операндов которого присутствует одно или несколько полей записи. Так, в приведенной таблице данные упорядочены по выражению СсылкаНаГруппу + Наименование (знак сложения в выражении уместен, поскольку поле СсылкаНаГруппу имеет символьный тип).
Выбор ключа диктуется практическими целями поиска и представления данных. Так, в приведенной таблице естественно для просмотра упорядочить данные по номеру цеха (группы), а в пределах каждого цеха разместить фамилии сотрудников в алфавитном порядке.
Файл отсортирован по ключу, если для любых k
t < к запись г. всегда предшествует г, где t и j - номера записей в файле до выполнения сортировки. (Первая запись файла имеет номер 1.)
Вполне возможно, что две записи имеют в некотором файле одинаковый ключ. Метод сортировки называется устойчивым, если для всех записей г, и г, таких, что к. = к,, выполняется условие: в отсортированном файле г, предшествует г , если г,-предшествует г, в первоначальном файле.
9.1.3. СОРТИРОВКА ТАБЛИЦЫ УКАЗАТЕЛЕЙ
Сортировать можно или сами записи файла, или указатели некоторой вспомогательной таблицы. Пример первого случая приведен на рис. 9.1.
Номер
записи |
Ключ |
Другие поля |
1 |
8 |
|
2 |
20 |
|
3 |
15 |
|
4 |
4 |
|
5 |
10 |
|
|
а |
Ключ |
Другие
поля |
4 |
|
8 |
|
10 |
|
15 |
|
20 |
|
|
б |
Рис. 9.1. Сортировка записей: а - исходный файл; б - отсортированный файл
Если объем данных в каждой записи файла велик, то сортировка самих записей является нецелесообразной, в частности по причине больших временных затрат на перемещение записей в процессе сортировки. Кроме того, часто файл имеет не один, а несколько ключей. В этом случае можно ввести вспомогательную таблицу указателей или несколько таких таблиц и перемещать при сортировке не записи, а указатели на записи (рис. 9.2). Такая сортировка называется сортировкой таблицы адресов (указателей). В базах данных таблица указателей может размещаться в отдельном индексном файле.
Таблица указателей может содержать два поля: ключ и номер соответствующей записи исходного файла.
Отсортированная таблица указателей
Номер
записи
Файл
Ключ
Другие
поля
Ключ
Номер
записи
Рис. 9.2. Отсортированная таблица указателей
При работе с таблицами указателей задача поиска записи решается в два этапа: 1) в таблице указателей ищется ключ; 2) в файле данных ищется запись (по ее номеру), с которой связан найденный в таблице указателей ключ.
Рассмотрим теперь алгоритмы внутренней пузырьковой и быстрой сортировки ключей. Расширение этих методов для сортировки записей файла или таблицы указателей представляется очевидным.
9.1.4. СОРТИРОВКА МАССИВА МЕТОДОМ ПУЗЫРЬКА
Сортировка методом пузырька наиболее проста для реализации, но имеет незначительную вычислительную эффективность.
Не теряя общности, будем для простоты изложения в дальнейшем рассматривать задачу сортировки массива х целых чисел, в котором первые п чисел должны быть отсортированы так, чтобы х,- < Xj для 1 < i ^ п.
Идея сортировки методом пузырька в том, чтобы просмотреть массив последовательно несколько раз. Один просмотр состоит из сравнения каждого элемента массива со следующим за ним элементом (x сравнивается с x+) и обмена этих двух элементов, если они располагаются не в нужном порядке (если x> х+).
Рассмотрим массив: 25 57 48 37 12 92 86 33.
Результат сортировки: 12 25 33 37 48 57 86 92.
Проанализируем процесс сортировки.
На первом просмотре делаются сравнения: |
Xj c x2 |
|
(25 с 57) |
Нет обмена |
х2 с X, |
|
(57 с 48) |
Обмен |
х3 с |
х4 |
(57 с 37) |
Обмен |
х4 с |
х5 |
(57 с 12) |
Обмен |
Xj с |
х6 |
(57 с 92) |
Нет обмена |
х с |
х7 |
(92 с 86) |
Обмен |
х7 с |
х* |
(92 с 33) |
Обмен |
|
После первого просмотра в результате обменов элементы массива расположатся в таком порядке:
25 48 37 12 57 86 33 92
Отметим, что наибольший элемент (в данном случае 92) находится после первого просмотра в нужной позиции. В общем случае элемент x
npass+I результирующего массива будет находиться в нужной позиции после итерации pass. Отсюда и идет название метода: каждое число медленно "всплывает", как пузырек, вверх на свою конечную позицию.
После второго просмотра в результате обменов элементы массива расположатся так:
25 37 12 48 57 33 86 92
Как и ожидалось, в нужной позиции оказалось второе по величине число, 86. Поскольку каждая итерация помещает в нужную позицию очередной элемент, для сортировки массива из и чисел потребуется не более п - 1 итераций.
Полный набор итераций при сортировке методом пузырька таков:
Массив до начала сортировки
Итерация 1
Итерация 2
Итерация 3
Итерация 4
Итерация 5
Итерация 6
Итерация 7
В каждой строчке приведенного списка итераций подчеркнуты элементы массива, находящиеся в нужной позиции.
Анализ полного набора итераций подсказывает два очевидных улучшения метода.
Во-первых, поскольку все элементы в позициях к> п - pass + 1 уже находятся после итерации pass на нужных местах, их рассмотрение на последующих итерациях избыточно. Следовательно, на каждой итерации число необходимых сравнений уменьшается на единицу. Так, при первом просмотре нужно сделать п - 1 сравнений, на втором - и - 2, на просмотре с номером pass - только п - pass. To есть данный процесс ускоряется с каждым просмотром.
Во-вторых, не всегда следует выполнять все и - 1 просмотров. В частности, приведенный массив был отсортирован после пяти итераций (вместо семи). Для исключения холостых проходов нужно иметь возможность обнаружения факта завершения сортировки массива и прекращать итерации при его обнаружении. Признаком того, что массив отсортирован, является отсутствие перестановок на очередном проходе. Применительно к нашему примеру это означает, что факт завершения сортировки будет установлен только на шестом проходе.
Проанализируем вычислительную эффективность метода. Всего алгоритм (без усовершенствований) предусматривает выполнение п -1 просмотров и и -1 сравнений на каждом просмотре. Таким образом, общее число сравнений на всех возможных проходах равно (n - 1)*(n -1) = п
2 - 2n + 1, что составляет 0(п
2).
Введенные усовершенствования метода хотя и сокращают общее число сравнений, но не изменяют порядка вычислительной сложности. В самом деле, число сравнений на итерации pass равно n - pass. При наличии к итераций общее число сравнений равно (n -1) + (n - 2) + ... + (n - k) - (2к*п - к
2 - k)/2. Можно показать, что среднее число итераций к представляет собой 0(п), так что общая формула имеет по-прежнему порядок 0{п
2), хотя постоянный сомножитель теперь меньше, чем ранее.
Если массив полностью отсортирован, то вычислительная сложность метода составляет 0(п) - необходимо л - 1 сравнений, чтобы в этом убедиться.
Для улучшения метода имеются и иные способы. Один из них таков: сортировка методом пузырька может быть ускорена при помощи выполнения следующих один за другим просмотров в противоположных направлениях, так что небольшие по величине элементы быстро перемещаются в начало массива таким же способом, как большие элементы перемещаются в его конец. Это приводит к уменьшению необходимого числа просмотров.
9.1.5. БЫСТРАЯ СОРТИРОВКА
Современные процедуры сортировки используют одну из модификаций алгоритма быстрой сортировки, к изложению которого мы переходим.
Рассмотрим массив х:
25 37 12 33 48 57 92 86
В нем число 48 характеризуется тем, что, во-первых, все расположенные левее него числа меньше 48 и, во-вторых, числа, расположенные правее него, больше 48. Назовем такое число разделителем массива. Нетрудно понять, что теперь мы можем отдельно решать задачу сортировки для чисел до разделителя и для чисел после него. Кроме того, сам разделитель находится в нужной позиции, то есть в дальнейшей сортировке он уже не рассматривается.
Рассмотрим теперь массив, в котором нет разделителя:
37 25 57 48 12 92 86 33
Чтобы воспользоваться только что приведенной идеей уменьшения размерности задачи сортировки, нам надо научиться выполнять такие перестановки в массиве, после которых один из его элементов станет разделителем. Выберем для будущего разделителя первый элемент массива, то есть число 37. Разделитель окажется в нужной позиции, если разместить числа 25, 12 и 33 слева от 37. Выполним это так: будем просматривать последовательно элементы массива начиная с его первой позиции до тех пор, пока не встретим число, большее разделителя. Присвоим этой позиции имя L1. Далее просмотрим элементы массива начиная с последней позиции, останавливаясь при обнаружении числа, меньшего 37. Дадим такой позиции имя R1. В нашем случае после выполнения этих двух просмотров возникнет следующая ситуация:
37 25 57 48 12 92 86 33
L1 R1
Нетрудно предугадать следующий шаг алгоритма - числа 57 и 33 должны быть переставлены местами, тогда получится массив
37 25 33 48 12 92 86 57
L1 R1
Продолжим теперь поиск элемента, большего 37, перемещаясь вправо, начиная с позиции L1, и элемента, меньшего 37, перемещаясь влево, начиная с позиции R1. Такой поиск даст следующий результат:
37 25 33 |
48 |
12 |
92 |
86 |
57 |
|
L1 |
R1 |
|
|
|
Выполним и перестановку: |
|
|
|
|
|
37 25 33 |
12 |
48 |
92 |
86 |
57 |
|
L1 |
R1 |
|
|
|
Еще одна пара перемещений не изменит картины, но даст нам основание для прекращения левых и правых перемещений вдоль массива (критерий прекращения перемещений - истинность выражения L1 >= R1) и перестановки разделителя (числа 37) в его окончательную позицию. После выполнения перемещений, предшествующих перестановке разделителя, имена R1 и L1 расположатся так:
37 25 33 12 48 92 86 57
Rl L1
Сам же разделитель должен быть размещен в позиции R1, что выполняется в результате обмена элементов х[1] и х [R1], то есть чисел 12 и 37. Приведем и результат:
12 25 33 37 48 92 86 57
Итак, массив разбит на две части (до и после разделителя), которые можно сортировать отдельно, применяя к каждой из частей только что приведенную схему. Завершим же сортировку, когда длина каждой из полученных в результате разбиения частей будет равна единице.
Замечание. Выбор в качестве будущего разделителя первого элемента массива (или последующего фрагмента) необязателен и в ряде случаев неудовлетворителен. Так, в случае почти отсортированного массива будущий разделитель лучше выбирать ближе к середине рассматриваемого фрагмента.
Вычислительная сложность быстрой сортировки оценивается как 0(nlogn). Так, если сортируется массив из 1024 элементов, то пузырьковая сортировка будет в среднем выполняться в
п
г / . . 1024 ,
ТГ 1о
8,„) = —= SU
раза медленнее.
9.2. ПОИСК ДАННЫХ
Поиск данных в векторе и файле выполняется по ключу. Как и при сортировке, выделяют два метода поиска: внутренний и внешний. В первом случае весь файл находится в отведенной под программу памяти ЭВМ. В случае внешнего поиска большая часть данных находится во внешней памяти, например на жестком диске.
Рассмотрим внутренний поиск применительно к одномерному массиву.
Предположим, что х - это вектор, содержащий п ключей. Пусть key является аргументом поиска, то есть искомым значением ключа. Сформулируем задачу поиска: установить в переменную search наименьшее целое число i такое, что x[i] = key, если такое i существует, и нуль - в противном случае. (При такой постановке задачи нижняя граница массива х должна быть больше нуля.)
9.2.1. ПОСЛЕДОВАТЕЛЬНЫЙ ПОИСК
Последовательный поиск является простейшей формой поиска. В представленной формулировке запись фрагмента поиска тривиальна:
перем х[20], нашел, ключ, ин, п;
<здание значений вектора х и переменной ключ > n = 20; нашел = 0; ин= 1;
пока (ин <= п) и (нашел = 0) цикл
если х[ин] = ключ тогда нашел = ин;
конецЕсли;
ин = ин+1; конецЦикла // пока; если нашел = 0 тогда
Сообщить("Ключ не найден."); иначе
Сообщить(''Искомый элемент имеет в векторе x номер " + Строка(нашел)); конецЕсли;
Эффективность последовательного поиска оценим из предположения, что аргумент поиска может равновероятно располагаться в любой позиции массива. Подсчитаем среднее число сравнений вида х[ин] = ключ, необходимых для завершения поиска. Если аргумент является первым элементом массива, то необходимо одно сравнение; если последним, то необходимо и сравнений. То есть среднее число сравнений для успешного поиска составит (n + 1)/2. А в случае неуспешного - п. В любом случае вычислительная сложность алгоритма последовательного поиска равна 0(п).
Область применения последовательного поиска - поиск в неупорядоченных массивах (файлах). Если же данные упорядочены, то следует применять бинарный поиск, имеющий и иное название - дихотомия.
9.2.2. БИНАРНЫЙ ПОИСК
Методы поиска в отсортированных таблицах указателей основаны на алгоритме бинарного поиска.
Пусть упорядоченный массив х из п элементов содержит значения
5 7 11 18 26 32 44 57 81 90 94 97 107 116 129 147 179 и пусть задан аргумент поиска ключ, равный, например, 129.
Идея алгоритма бинарного поиска такова:
• сравнить аргумент поиска ключ со значением среднего элемента х[сред] массива х, где сред = [п/2], а [с] - целая часть числа с;
• если они равны, то поиск завершен, иначе, если ключ < х[сред], выполнить аналогичным образом поиск в позициях массива х, предшествующих позиции сред, в противном случае, если ключ > х[сред], выполнить аналогичным образом поиск в позициях массива х, следующих за позицией сред.
Исключить из дальнейшего рассмотрения часть массива позволяет тот факт, что массив упорядочен.
Проиллюстрируем процесс бинарного поиска. Число элементов массива п = 17, тогда [п/2] = 8. Поэтому первоначально выполняется сравнение сред с x
8 = 57. Так как сред > х, то зона поиска на следующем шаге ограничивается участком от 9-го элемента до 17-го. Этот участок состоит из девяти элементов и его серединой является элемент х
13 = 107 ([(9 + 17)/2] = 13). Поскольку сред >х
13, то зона поиска ограничивается участком от 14-го до 17-го элемента. Его серединой является элемент х
15. На этом процесс поиска завершен, так как х
15 = сред. Отобразим на рис. 9.3 процесс поиска элемента ключ = 129, выделяя посредством подчеркивания на каждом шаге зоны поиска.
Итерация 0 5 7 11 18 26 32 44 57 81 90 94 97 107 116 129 147 179
Итерация 0 5 7 11 18 26 32 44 57 81 90 94 97 107 116 129 147 179
Итерация 1 5 7 11 18 26 32 44 57 81 90 94 97 107 116 129 147 179
Итерация 3 5 7 11 18 26 32 44 57 81 90 94 97 107 116 129 147 179
Рис. 9.3. Пример дихотомии
Каждое сравнение уменьшает число возможных кандидатов в 2 раза. Максимальное число шагов поиска будет в том случае, когда аргумент поиска находится в начале или в конце массива. В этом случае потребуется log
2n + 1 итераций. Действительно, если число элементов в массиве равно п = Т, ключ будет найден, когда нерассмотренным останется только один элемент, то есть через т шагов. В свою очередь, при заданном п имеем т = log
2n. После анализа последнего элемента получаем общее число итераций log
2n + 1. Поэтому вычислительная сложность бинарного поиска составляет O(logn).
Однако приведенный алгоритм не позволяет в общем случае точно решить задачу поиска, когда файл или массив содержат повторяющиеся значения ключей. Рассмотрим, например, массив
5 7 11 18 26 32 44 57 81 90 94 97 107 129 129 147 179 в котором элемент (ключ) 129 содержится 2 раза. Тогда, если аргумент поиска будет равен 129, алгоритм, как и прежде, укажет, что ключ находится в 15-й позиции, то есть будет найдено не первое, а второе значение ключа 129 (первое значение ключа расположено в позиции 14). В ряде случаев эта ошибка принципиальна, тогда она устраняется в результате очевидной модификации алгоритма бинарного поиска.
9.2.3. СРАВНЕНИЕ ПОСЛЕДОВАТЕЛЬНОГО И БИНАРНОГО ПОИСКА
Пусть файл, в котором выполняется поиск, отсортирован и содержит 1024 (2
10) элемента. В случае последовательного поиска наибольшее число итераций будет равно 1024, а бинарного - 11. То есть разница в два порядка.
Сравним теперь временные затраты на поиск в случае неотсортированного файла. При последовательном поиске максимальное число итераций, разумеется, сохраняется. Бинарный поиск неприменим. Выполним, однако, быструю сортировку файла. В среднем для этого потребуется 1024*log
21024 = 10240 итераций. Далее выполним бинарный поиск, на который будет затрачено не более 11 итераций.
Приведенные цифры позволяют сделать вывод: если файл неотсортирован и в процессе вычислений задача поиска в файле возникает сравнительно редко (в нашем примере не более 10 раз), то можно применять последовательный поиск, в противном случае более целесообразно прежде отсортировать файл или таблицу указателей и при вычислениях применять бинарный поиск. Как правило, именно такой подход используется на практике.
9.3. ПЕРЕДАЧА ДАННЫХ ИЗ 1С В DBF-ФАЙЛЫ
9.3.1. ЭКСПОРТ ДАННЫХ ИЗ СПРАВОЧНИКА СОТРУДНИКИ_2
9.З.1.1. ПОСТАНОВКА ЗАДАЧИ
В разд. 7.4.6 мы загрузили в 1С, используя объект типа XBase, DBF-файл с данными о начальном сальдо. Объекты того же типа применяются и для выгрузки данных из 1С.
Рассмотрим задачу переноса данных из справочника Сотрудники_2 в файл еm-ployee.dbf.
Задача осложняется тем, что реквизит Оклад справочника Сотрудники_2 является периодическим. Перенос значений этого реквизита мы выполним в отдельный файл -salary.dbf, то есть поступим так же, как и 1С, которая хранит данные о периодических реквизитах в файле 1SCONST.DBF. Структуру файла salary.dbf воспроизводит табл. 9.2, в заголовках столбцов которой после символа / указано имя соответствующего поля DBF-файла.
Таблица 9.2
Структура файла salary.dbf на примере истории окладов Горюновой У. В. |
Код\И |
Дата/Date |
Имя документа /DocNarne |
Номер документа /Dodd |
Оклад/Salary |
2010 |
20.11.2001 |
ПриказОПриеме |
2 |
2500 |
2010 |
22.11.2001 |
ИзменениеОклада |
2 |
2700 |
2010 |
30.11.2001 |
- |
- |
3200 |
|
Характеристики полей файла salary.dbf опишем в табл. 9.3, в которой формат числовых полей определяется заданными в конфигурации 1С свойствами Длина и Точность соответствующих реквизитов. |
Таблица 9.3
Характеристики полей файла salary. dbf |
Имя поля |
Свойства поля |
Id, Docld |
Числовые поля формата 5.0 |
Date |
Поле типа Дата |
DocName |
Строка из 20 символов |
Salary |
Числовое поле формата 10.2 |
|
Содержание раздела