Маленькие хитрости

Маленькие хитрости 

Владимир Козлов 

Введение

Очень часто в различных электронных конференциях по программам семейства "1С:Предприятие" попадаются вопросы, связанные с администрированием баз данных. Желание поделиться опытом, накопленным почти за три года работы и обкатанными приемами в данной области с одной стороны и природная лень - с другой (в смысле надоело раз от разу отвечать на одни и те же вопросы) и вызвало желание как-то систематизировать все это в одном - общедоступном месте. Все нижеизложенное касается программ сетевой файл-серверной версии 7.5 (на 7.7 и SQL я только вот-вот перейду), т.ч. в случае использования более старших версий (как и SQL версий) возможно потребуется некая адаптация кода : Кроме этого подразумевается, что читатель хотя бы поверхностно знаком с компьютерной техникой, сетями, c основами MS Windows и основами работы с программой "1С:Предприятие". Приводимый в прилагаемых конфигурациях код не "привязан" к какой-то отдельной компоненте программы (Оперативный учет, Бухгалтерия, Расчет), а потому может быть использован в любых конфигурациях.

Общие сведения (v.7.5)

Итак, вы распаковали увесистую желто-красную коробочку с логотипом 1С :, что же дальше? Как и какую вязать сеть, что для этого нужно и прочие технические вопросы мы здесь рассматривать не будем - это отдельная тема - предположим, что сеть уже есть : Также не будем останавливаться на процедуре инсталляции программы 1С, как правило здесь вопросов не возникает. Единственное, что хочется отметить - я бы не советовал производить "административную" установку программы (сугубо личное мнение, наверняка у меня тут же найдутся оппоненты). Проще установить программу локально каждому клиенту - мне кажется, что такой режим более "человечен" по отношению к сетевому трафику. Хочу сразу же предостеречь - для работы в сети каталог базы данных лучше разместить на специально отведенном для этих целей компьютере - сервере. По возможности не следует нагружать его еще чем-либо (типа MS Office), т.е. сделать "выделенным", также следует помнить, что тактико-технические характеристики данного аппарата напрямую влияют на комфортность вашей работы, поэтому жаться здесь не стоит. Что выбрать в качестве операционной системы для вашего сетевого файл-сервера базы данных? Однозначный ответ - ни в коем случае не Microsoft Windows 9X ! Дело в том, что у этих операционных систем существует ограничение на число одновременно открываемых файлов (1К: 1024) - в результате с таким "сервером" в сети смогут работать лишь несколько пользователей (конкретное количество зависит от числа файлов в конфигурации вашей базы). Лично я предпочитаю пользоваться системой Microsoft NT 4.0. Если вы уверены, что число клиентов вашей сети не превысит 10, то можно установить на сервер NT Workstation (большее число соединений ей просто не поддерживается), в противном случае не обойтись без NT Server. В качестве альтернативы для серверной системы можно использовать и Nowell Netware, но я с ней к сожалению (или быть может к счастью) не знаком, поэтому ничего посоветовать не могу : Также уже начали появляться первые восторженные отзывы об использовании долгожданной Windows 2000 (NT 5) в связке с 1С, но мне кажется не стоит торопить события, 17 февраля уже не за горами, поживем - увидим.

Для начала приведу ключи запуска программы из командной строки (как не странно, много раз с удивлением убеждался, что не всем они известны) :

1cv7.exe MODE [ /M | /D<Path> | /U<Path> | /N<Name> | /P<Pass> ], 

где MODE - режим запуска, может принимать только одно из трех значений :

config - режим конфигуратора;

debug - режим отладчика;

enterprise - нормальный (рабочий) режим.

следующие ключи опциональны :

/M - запуск программы в монопольном режиме;

/D - каталог базы данных;

/U - рабочий каталог пользователя (каталог из списка пользователей игнорируется);

/N - имя пользователя;

/P - пароль пользователя;

Например при выполнении такой команды : 1cv7 enterprise /DD:\Dbase /NИванов /P123, 

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

Также хочу здесь остановиться еще на одном нюансе. В режиме кофигуратора в пункте меню "Файл" есть две команды : "Выгрузить данные" и "Загрузить данные" (не путать с командами "Сохранить/Восстановить" - это просто архивирование). Исходно они предназначены для переноса информационных баз между файл-серверной и клиент-серверной (SQL) версиями. Но у них есть одна приятная особеннось - в процессе выгрузки - загрузки производится верификация корректности исходных данных на уровне информационных объектов (т.е. констант, справочников, документов и пр.). Поэтому если в базе содержатся ошибки, появившиеся в процессе работы из-за сбоев оборудования или программы, при выполнении данной процедуры база с большой долей вероятности будет корректно восстановлена. Так что в процессе работы полезно периодически производить сие действие для уверенности в корректности данных (хотя данная процедура занимает порядка нескольких десятков минут - в зависимости от железа и объемов базы) - я обязательно выполняю ее раз в месяц. Кроме этого желательно почаще переиндексировать базу (особенно если есть документы, проведенные "задним числом") - напрочь сносим *.CDX и открываем базу в монопольном режиме, у меня это делается автоматически каждую ночь.

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

@ECHO OFF

NET TIME \\Server /SET /Y

(здесь Server - сетевое имя сервера базы)

Подальше положишь - поближе возьмешь :

Регулярно выполнять резервное архивирование нужно обязательно, чтобы не было потом обидно за безвозвратно утерянные данные. Чем это делать - это вопрос скорее вкуса. Существует например специально "заточенная" под 1С программа "Хранитель" от ростовской фирмы "Гендальф" http://www.gendalf.ru/, которая умеет делать массу полезных вещей, но мне она кажется слишком перегруженной для таких простых целей, я пользуюсь старым добрым RAR'ом. Архивировать следует только файлы базы *.dbf и сами метаданные (1cv7.dd/md), ну еще LOG-файл и ваши оригинальные файлы (если они есть). Сначала приведу содержимое нескольких командных файлов (расширение *.cmd работает только под Win NT, если используется Win'9X, то расширение должно быть *.bat):

ARCH.CMD

REM используемые каталоги (должны существовать)

REM D:\1C\DB - рабочая база

REM C:\Temp\DB - временная копия базы

REM C:\BACKUP - архив базы

REM \\Adm\Storage - резервный архив базы (на другом компьютере сети)

@echo off

; чистим временный каталог

Del С:\Temp\DB\*.*

; копируем в него архивируемые файлы рабочей базы (*.md, *.dd, *.log, *dbf)

Copy D:\1С\DB\1cv7* С:\Temp\DB

Copy D:\1C\DB\*.dbf C:\Temp\DB

; сохраняем предыдущую версию архива под новым именем

copy C:\BACKUP\db.rar C:\BACKUP\db0.rar

; создаем новый архив

rar.exe u - r - m1 - dh - std C:\BACKUP\db.rar С:\Temp\DB\*.*

if errorlevel 0 goto rpl

echo P_A_C_K_I_N_G___E_R_R_O_R__!

goto end

:rpl

; сохраняем копию архива в надежном месте

net use Z: \\Adm\Storage

copy C:\BACKUP\*.rar Z:

net use Z: /delete

:end

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

На этом все, осталось всего навсего запустить системную службу Sсhedule: Explorer-ControlPanel-Services-Schedule-Startup-Automatic (поддерживается только под Win NT, для Win'9X нужны специальные внешние утилиты) и набрать из командной строки что-нибудь аналогичное :

At 13:00 /Every:M, T, W, Th, F C:\COMMAND\arch.cmd

At 18:00 /Every:M, T, W, Th, F C:\COMMAND\arch.cmd

At 07:00 /Every:M, T, W, Th, F C:\COMMAND\shutdown /l /r /y /c

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

Теперь о третьей строке в команде AT - в плане автоматизиции рутинных действий я пошел еще дальше, как я уже упоминал у меня каждую ночь производится реиндексация базы, для этого используется такой командный файл :

REINDEX.CMD

@echo off

; каталог базы

set db=D:\1С\DB

; каталог программы

set pr="C:\Program Files\1cv75\bin\1cv7"

; принудительно сносим индексы

del %db%\*.cdx /Q

; запускаем программу монопольно под "фиктивным" пользователем

%pr% enterprise /D%db% /M /NЧистяков /Pstart

Этот командный файл вставляется в папку автозагрузки на сервере, утилита SHUTDOWN.EXE (из Windows NT Resource Kit - это набор дополнительных сервисных утилит) производит перезагрузку сервера, для того чтобы по загрузке не нажимать магическую комбинацию из трех пальцев (Ctrl-Alt-Del) и не вводить пароль, а загрузить сервер автоматически, нужно подправить системный реестр NT (запустить из командной строки regedit.exe) :

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]

"DefaultUserName"="YourProfileName"

"DefaultDomainName"="Comp"

"AutoAdminLogon"="1"

"DefaultPassword"="YourPass"

где YourProfileName - имя профиля администратора на сервере (по умолчанию Administrator), Comp - сетевое имя сервера, YourPass - пароль аминистратора на сервере (обязательно должен быть не пустым).

Итак подъитожим - в заданное нами время происходит автоматическая перезагрузка сервера с переиндексацией базы, для того чтобы программа по окончании переиндексации сама завершилась необходимо в глобальном модуле конфигурации предусмотреть некие нестандартные действия по обработке входа в программу исскуственного "фиктивного" пользователя (Чистяков - без пароля) - они приведены в демонстрационной конфигурации (архив Adm.rar).

В принципе никто не запрещает пойти еще дальше - и наряду с переиндексацией базы по ночам выполнять любые желаемые действия, например групповое перепроведение документов для восстановления границы последовательности или формирование "тяжеловесных" отчетов, с последующим сохранением их результатов в *.mxl файлах, рассылки прайсов по факсу или e-mail'у и т.д. Все ограничивается только вашей фантазией.

Уборка мусора в DBF-файлах

Идеология использования DBF/CDX-файлов построена таким образом, что при удалении объекта базы производится только пометка объекта как удаленного, физически же запись об этом объекте остается в базе в качестве "мусора". Если не предпринимать никаких специальных мер, то этот мусор копится, база пухнет, драгоценный сетевой трафик забивается зря. В принципе "уборку мусора" можно производить в конфигураторе через выгрузку-загрузку данных, но это не очень удобно, поскольку, как я уже упоминал выше, выполнение данной процедуры может требовать значительных временных затрат: Альтернативный путь - использовать для этих целей внешние утилиты, предназначенные для работы с DBF/CDX-файлами (например утилитка DBU.EXE из Clipper'а) тоже не очень хорош, т.к. обычно они не умеют работать с маской файлов (*.dbf), а "подсовывать" им по одному файлу из сотни - удовольствие ниже среднего.

В тоже время встроенный язык программ "1С:Предприятия" поддерживает соответствующий DBF-примитив (метод объекта Xbase Сжать()), поэтому я в свое время и написал на 1С небольшую конфигурацию, предназначенную исключительно для этих целей и пользуюсь ей регулярно до сих пор (раз в неделю). Кроме "чистки" базы в ней также попутно предусмотрена возможность использования стандартного внешнего архиватора WinZip/WinRAR для архивирования базы, собственно сама конфигурация в архиве Cleaner.rar, небольшое описание приведено в этом же архиве в файле Read.me.

Есть кто живой ? 

Как известно, в состав сетевых версий программы 1С:Предприятие входит встроенная утилитка - монитор пользователей (пункт главного меню программы "Помощь", далее пункт меню "О программе" и кнопка "Монитор"), назначение ее очевидно - отображать кто в данный момент находится в системе, причем реализована она как внешнее приложение (..\1cv75\bin\usrmon.exe). В свое время, на ранних релизах версии 7.5 я столкнулся с крайне неудовлетворительной работой данной утилиты - либо безумно долго запускалась, либо вообще убивала систему. Но ведь вещь то нужная и я решил построить что-то аналогичное средствами 1С.

Идея проста - я завел новый справочник "Сеансы", у которого текстовое поле код - это имя пользователя, а наименование - текстовое представление времени входа в систему.

Далее, при входе каждого нового пользователя в программу создается новый элемент данного справочника, при выходе - соответстветствующий элемент уничтожается. Теперь для того чтобы узнать кто работает в программе, нам достаточно просто выбрать все элементы данного справочника и отобразить их в удобном виде. Подробный код, реализующий данный механизм можно найти во все той же демонстрационной конфигурациии - adm.rar.

Опять же, при таком подходе можно пойти дальше - добавить дополнительные поля в данный справочник и хранить в них все что заблагорассудится. К примеру, год назад у меня были проблемы с сетью, почти ежедневно кто-то из пользователей аварийно отваливался, нужно было как-то автоматически отслеживать кто именно. Я добавил к данному справочнику поле, в которое один раз в 15 минут для каждого пользователя записывалось текущее время (делалось это в глобальном модуле через процедуру ОбработкаОжидания(), т.е. если пользователь умирал, то запись соответственно не производилась). Перед каждой записью из элемента справочника считывалось предыдущее значение времени и если разница между ним и текущим значением времени превышала 18 минут (15 мин. + некий запас), то констатировался факт "смерти" пользователя с сохранением некролога в LOG файл. Это в свое время помогло съэкономить мне массу сил и нервов - не пришлось допрашивать с пристрастием бедных пользователей "А корректно ли вы сегодня закончили работу ?" и сверять результаты допроса с содержимым LOG-файла - подсчитывать для каждого пользователя число входов/выходов в/из систему/системы:

Как поняли, прием : 

Часто бывает крайне полезно иметь под рукой средства интерактивного общения по сети, например, попросить всех "выйти вон" на 5 мин. для переиндексации базы, или пользователь просит меня открыть ему доступ для авансового резервирования товара (выписать счет на товар, который уже пришел, но еще не оприходован), в конце концов просто послать кого-нибудь куда подальше : Штатные средства, предназначенные для этих целей (WinPopUp и пр.) не всегда удобны - они должны быть установлены и запущены у всех клиентов - в общем морока.

Общеизвестно, что в типовых конфигурациях Торговли, по-моему начиная с Редакции 6, появился справочник "Блокнот", предназначенный именно для этих целей. Но моя реализация мне нравится больше, к тому же на момент ее написания - не только 6, но и Редакции 5 еще в помине не было. Ну а насколько я объективен - судить вам. Суть в следующем - есть справочник "Сообщения" со следующими полями : "Наименование" - адресат сообщения, "Запись" - собственно текст сообщения, "Прочитано" - флаг 1/0 (дошло до адресата или нет), "Кто" - отправитель сообщения и "ДВ" - дата и время отправки. Для каждого активного пользователя системы (опять же нам здесь пригодился справочник "Сеансы") каждые 30 секунд перебираются элементы справочника "Сообщения", в случае совпадения имени пользователя и значения поля "Адресат" и нулевого значения флага "Прочитано", выводится сообщение "Вам письмо!" и открывается соответствующая форма с текстом сообщения. По закрытии данной формы, что предполагает прочтение адресатом сообщения, флаг "Прочитано" автоматически устанавливается в 1. При выходе пользователя из системы все прочитанные им сообщения автоматически удаляются. Каждый "обычный" пользователь может послать сообщение только одному из пользователей, активных в данный момент. И только администратор (для себя любимого возможность) может послать сообщение для всех пользователей сразу. Такая организация кажется мне наиболее оптимальной исходя из соотношения сервисные возможности / загрузка трафика. Реализация приведена все в той же конфигурации - adm.rar.

Кому-то можно, кому-то нет :

Достаточно часто встречаются вопросы, а как производить авторизацию пользователей с одинаковым набором прав - скажем есть 5 менеджеров и желательно сделать так, чтобы доступ у каждого из них был только к своим документам. Это делается достаточно просто - при помощи предопределенных процедур глобального модуля ПриУдалении() и ПриОтменеПроведения(), все это совершенно очивидно из кода демонстрационной конфигурации adm.rar, поэтому задерживаться на этом не буду. Еще один момент - мне кажется довольно удобным, когда каждому пользователю соответствует свой цифровой префикс (точнее его часть) в нумерации документов (конечно же при условии, что пользователей не очень много). Механизм реализации этого можно посмотреть там же :

Ссылки на полезный софт (всякие всякости) 

Поскольку все наши данные хранятся в формате DBF/CDX, очень часто бывает полезно, а порой и просто необходимо средство для просмотра / редактирования данных на уровне файлов. Таких утилит существует множество, единственный недостаток - не все из них умеют сами разбираться с перекодировкой ANSI-OEM (да еще и с кириллицей), в этом смысле самая на мой взгляд удобная - это DBFView от фирмы "Гендальф", скачать ее можно совершенно бесплатно здесь: http://www.gendalf.ru/DOWNLOAD/wDBFview.zip

Теперь остановимся подробнее на собственно средствах системного сетевого администрирования. Их сейчас появилось очень много, поэтому здесь я упомяну только те, с которыми я сам постоянно работаю и которые мне нравятся. Начну пожалуй со своей любимой программы Hyena от фирмы "Adkins Resource Inc." http://www.asdkins-resource.com/. Пожалуй проще перечислить чего она не умеет, чем наоборот : С ее помощью вы сможете получить полный доступ к локальным дискам клиентов, просматривать журналы событий на компьютерах сети, запускать и останавливать service'ы на клиентах, изменять их права, ну в общем почти все что может придти в голову. В общем настоятельно ее рекомендую. Да, стоит упомянуть, что как и положено, работает она только с Windows NT 4 / 2000, т.ч. любителям Windows 9X можно не беспокоиться. Достойны также пристального внимания продукты, предназначенные для целей сетевого администрирования фирмы "Aelita Software" http://aelita.net/. Их целый ряд, на мой взгляд наиболее полезны MultiReg - средство для удаленного редактирования системного реестра клиента, EventAdmin и Journal - база данных для накопления и последующего анализа системных журналов событий на клиентских машинах, ну и пожалуй еще ERDisk - утилита для создания копий загрузчиков и системных файлов сетевых клиентов (в случае "Blue Screen of Death" - это первое и, пожалуй единственное средство). Все эти продукты также поддерживают только Windows NT. 

В последнее время появился целый ряд программ для полного удаленного доступа к сетевым компьютерам. Собственно Norton pcAnywere создан давно и достаточно хорошо известен, но он не является лучшим продуктом этого класса. Я экспериментировал с двумя аналогичными программами - это WinOp (отдельное большое спасибо BigHarry) фирмы "Danware A/S" http://www.danware.com/ и Remoute Administrator нашего соотечественника Дмитрия Зноско http://www.famatech.com/, функциональные возможности у них примерно одинаковые, но первая мне нравится больше, мне показалась, что она более разумно обходится с сетевым трафиком, т.ч. я работаю с ней. Что же она умеет, а почти все - поддерживает все сетевые протоколы от Microsoft, включая MSDN и модемный Dial-Up (чуствуете какие перспективы открываются для ленивых админов!). Программа состоит из двух компонент - host (устанавливается на клиентов) и guest (ставится на компьютер администратора). Причем клиентская часть под WinNT может устанавливаться как service в stealth-режиме, абсолютно прозрачно для клиента. При запуске guest'а и подключении к клиенту вы видите на своем мониторе его экран, ваши клава и мышь работают как клиентские, т.е. доступ действительно полный ! Более того, вы можете погасить экран клиента, заблокировать его клаву и мышь и даже удаленно перезагрузить его компьютер : Есть еще такие вещи как chat, файловый обмен и пр. В общем штука чрезвычайно полезная. Работает быстро и надежно (и кстати поддерживает Windows 9X/3.1). Единственное хочу предостеречь от злоупотреблений - трафик то не резиновый, т.е. пользоваться ей нужно только тогда, когда это действительно необходимо.

Итак подытожим - используя все эти средства у сисадмина появляются реальные возможности для проведения своего рабочего времени целиком у родного компьютера, беготня по клиентам канула в лету :

Ну и напоследок хочу привести несколько полезных ссылок на различные FAQ'и по Windows NT :

http://www.ntfaq.com/ - это классика, FAQ от John Savill (кстати там есть и локальный вариант, т.е. можно скачать файл (html/hlp/txt) и штудировать его в off-line), здесь можно найти ответы на абсолютно любые вопросы;

http://www.pvv.spb.ru/ - очень приятный и полезный для любого компьютерщика русский FAQ по Windows 9X/NT/2000 от Владислава Пестова, настоятельно рекомендую;

http://windowsnt.miningo.com/mlibrary.htm - это просто огромный каталог всего (ресурсы, публикации, ссылки на сайты и т.д.), что связано с WinNT.