image alt text


За несколько лет сначала вынужденного, а потом и вполне занимательного администрирования 1С у меня накопился набор решений под большинство особенностей продукта. Предлагаю отложить в сторону высокие материи про кластеры и тюнинг SQL, и перетряхнуть запасы скриптов и механизмов, которые облегчают жизнь с 1С.


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


Чистый кэш и крепкое здоровье


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


Если запустить 1С с параметром /ClearCache, то будут очищены только клиент-серверные запросы. Локальные метаданные останутся и их нужно удалять отдельно на уровне файлов и папок. Эти данные хранятся в профиле пользователя, в папках с длинными названиями из GUID баз данных. Если баз на сервере немного, то такой кэш нетрудно удалить руками. Но если БД исчисляется десятками, то чистке вручную вы не обрадуетесь.


image alt text


В подобных ситуациях выручит скрипт на Powershell, который запускается каждый раз при выходе пользователя из системы:


Get-ChildItem "$env:USERPROFILE\AppData\Local\1C\1Cv8\*","$env:USERPROFILE\AppData\Roaming\1C\1Cv8\*" | Where {$_.Name -as [guid]} |Remove-Item -Force -Recurse

И никаких связанных со старым кэшем проблем.


Исправляем ошибки


Для исправления испорченной файловой базы в поставку 1С входит утилита chdbfl.exe, которая просто считывает содержимое базы во временный файл. Если какие-то данные считать не может — пропускает. При этом у нее нет ключей запуска для автоматизации, и проверку приходится запускать вручную.


Вообще, правильнее запускать проверку БД конфигуратором, но этот процесс проходит значительно дольше. Если же использовать только проверку физической целостности средствами chdbfl.exe, то не забывайте делать резервную копию из-за возможной потери данных.


Для баз 8.1 Андрей Скляров создал хороший инструмент Check1CD, с двумя параметрами запуска: "исправлять найденные ошибки" и “путь к базе”.


Но в Check1CD не хватает двух вещей:


  • Индикатора прогресса;


  • Уведомлений техподдержки о найденных ошибках.

Раз есть "хотелка" и немного свободного времени, то почему бы не попробовать решить вопрос самостоятельно?


Так появился мега-скрипт на AutoIt
#NoTrayIcon

#include <GUIConstantsEx.au3>

#include <File.au3>

#include <Date.au3>

#include <Inet.au3>

Global $oMyError = ObjEvent("AutoIt.Error","MyErrFunc")

Global $Basepath="D:\Base\” ;база везде в одном месте, можно хардкодить

;Проверим, не запущена ли 1С.

If ProcessExists("1cv8.exe") or ProcessExists("chdbfl.exe") Then 

    Msgbox(0,"ошибка!", "1c уже запущена, запуск второй невозможен")

Exit

EndIf

;Проверим, не была ли прервана проверка, по наличию временного файла

if FileExists ($Basepath&"_$NEW$_.1CD") Then

MSGbox(0,"ошибка!", "проверка базы была прервана! обратитесь в Отдел ИТ")

Exit

EndIf

;Ну и проверим, на месте ли сам файл базы

If not FileExists ($Basepath&"1Cv8.1CD") Then

Msgbox(0,"ошибка!", "файл БД не обнаружен!")

Exit

EndIf

;Конечно, спросим

$hgui = GUICreate("проверка БД" , 200, 200) 

GUICtrlCreateLabel(" будет запущена проверка базы",2,2)

GUICtrlCreateLabel("что может занять более 30 мин",2,22)

GUICtrlCreateLabel("     уверены?      ",2,42)

$yes = GUICtrlCreateButton("да", 5, 150, 70, 25)

$no= GUICtrlCreateButton("нет", 75, 150, 70, 25)

GUISetState(@SW_SHOW) 

While 1 

$msg = GUIGetMsg() 

 Select 

 Case $msg = $GUI_EVENT_CLOSE 

        GUIDelete()

Exit 

 Case $msg = $yes

 GUIDelete()

 _check ()

ExitLoop 

Case $msg = $no

GUIDelete()

Exit 

 EndSelect

WEnd

;Сама проверка базы

func _check ()

$sTitle="Проверка физической целостности файла БД"

ProgressOn("проверка БД", "выполняется проверка базы данных", "0%",-1,-1,18)

run ("C:\Program Files\1cv81\bin\chdbfl.exe","", @SW_HIDE,7)

WinWait($sTitle)

local $size = filegetsize($Basepath&"1Cv8.1CD")

;Автокликер!

ControlSend($sTitle,"", "V8FormElement9",$Basepath&"1Cv8.1CD")

ControlClick($sTitle,"", "V8FormElement8")

ControlClick($sTitle,"", "V8FormElement7","left",2)

$filename = $Basepath&"\1Cv8.1CD"

local $size1 =0

;Считаем процент размера временного файла и заполняем прогрессбар

While 1

$size1 = filegetsize($Basepath&"_$NEW$_.1CD")

    $perc=round(($size1/$size)*100)

ProgressSet($perc, "пожалуйста, ожидайте. прошло "& $perc & "%")

sleep (1500)

;Проверяем, что проверка еще идет по наличию временного файла

;и заблокированности файла БД

If not FileInUse($filename) and not FileExists ($Basepath&"\_$NEW$_.1CD") Then

        ExitLoop

 EndIf  

WEnd

sleep(5000)

;К сожалению, получить информацию из объектов окна нормально не получилось

;Поэтому - автокликер!

WinSetState ( $sTitle, "", @SW_SHOW )

WinSetOnTop($sTitle, "", 1)

WinActivate($sTitle, "")

WinWaitActive($sTitle)

ControlClick($sTitle,"", "V8FormElement4")

sleep(50)

ControlSend($sTitle,"", "V8FormElement4","^{home}")

sleep(50)

ControlSend($sTitle,"", "V8FormElement4","+^{end}")

sleep(50)

ControlSend($sTitle,"", "V8FormElement4","^{ins}")

sleep(50)

$text = ClipGet()

ControlClick($sTitle,"", "V8FormElement6","left",2)

ProgressSet(100, "100%", "проверка завершена")

sleep (500)

ProgressOff()

;Создаем лог-файл, и пишем туда результат проверки, если он есть.

;И отправляем e-mail

;В организации используется Outlook Express. Берём отправителя из реестра

$sender = RegRead("HKEY_CURRENT_USER\Software\Microsoft\ _

Internet Account Manager\Accounts\00000001","SMTP Email Address")

$sendername = RegRead("HKEY_CURRENT_USER\Software\Microsoft\ _

Internet Account Manager\Accounts\00000001","SMTP Display Name")

If not FileExists($Basepath&"check.Log") then _FileCreate($Basepath&"\check.Log")

FileWrite ($Basepath&"check.Log", _NowCalc()&@CRLF )

If $text <> "" Then

FileWrite ( $Basepath&"check.Log", "база бита:"&@CRLF)

FileWrite ( $Basepath&"check.Log", $text&@CRLF)

FileWrite ( $Basepath&"check.Log", "отправляем имейл.."&@CRLF)

;Проверяем доступность нашего smtp. Да-да, опять хардкод

If Ping("smtp-server") <> 0 then 

  if $sender = "" or $sendername="" Then

     MSGbox(0,"ошибка!", "не настроена почта, обратитесь в отдел ИТ!") 

  Else

  email($sender, $sendername,$text)

EndIf

endif 

;а если все хорошо, то и писать не будем

Else

 FileWrite ( $Basepath&"check.Log", "всё чисто"&@CRLF)  

EndIf

$hgui = GUICreate("проверка БД" , 200, 200) 

GUICtrlCreateLabel("проверка БД завершена",2,2)

$ok = GUICtrlCreateButton("да", 5, 150, 70, 25)

GUISetState(@SW_SHOW) 

While 1 

$msg = GUIGetMsg() 

 Select 

 Case $msg = $GUI_EVENT_CLOSE or $msg=$1

        GUIDelete()

Exit 

EndSelect

WEnd

EndFunc

Func FileInUse($filename)

$handle = FileOpen($filename, 1)

$result = False

if $handle = -1 then $result = True

FileClose($handle)

return $result

 EndFunc

func email($sender, $sendername,$text)

local $array[1]

$array[0]=$text

$t=_INetSmtpMail("smtpserver", $sendername,$sender, "[helpdesk@domain.com](mailto:helpdesk@domain.com)", _

"базка побилась" ,$array,"EHLO " & @ComputerName,-1 )

$error=@error

if $t <> 1 Then

FileWrite ( $Basepath&"check.Log", "ошибка отправки e-mail от "&$sendername& " "&$sender&@CRLF) 

FileWrite ( $Basepath&"check.Log", "ошибка протокола "&$error&@CRLF)

Else

FileWrite ( $Basepath&"check.Log", "email отправлен"&@CRLF)

    EndIf

EndFunc

;----------------------------------------------------------------------------------------------------------

 ; Com Error Handler

 ;----------------------------------------------------------------------------------------------------------

 Func MyErrFunc() 

 Local $HexNumber

 Local $strMsg

 $HexNumber = Hex($oMyError.Number, 8) 

 $strMsg = " " & $HexNumber & @CRLF 

 $strMsg &= "описание " & $oMyError.WinDescription & @CRLF 

 $strMsg &= "строка: " & $oMyError.ScriptLine & @CRLF 

 FileWrite ( $Basepath&"check.Log", "ошибка ком-объекта: "&$strMsg)

     FileWrite ( $Basepath&"check.Log", "e-mail не отправлен"& @CRLF)

 SetError(1)

 Endfunc

Доработать код для передачи параметров через ключи командной строки — дело техники.


image alt text


Так было


image alt text


Так стало


С выходом 1С 8.2 возникла проблема — путь к chdbfl менялся с установкой нового релиза. Что ж, дополним скрипт:


;Соберём в массив все пути к chdbfl в отсортированный массив

$path=_FileListToArrayRec(@ProgramFilesDir&"\1cv8\","chdbfl.exe",1,1,0,2)

If @error then

    Msgbox("","","1c не установлена, или установлена не туда"

Exit

Endif

;и запустим первый

Run ($path[1],"", @SW_HIDE,7)

Надо сказать, недавно был опубликован исходный код Check1CD. Да, тоже на AutoIT.


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


Выкидываем из базы с выдумкой


При различных регламентных операциях с 1С (ночное обновление конфигурации или бэкап в .dt) важно обеспечить отсутствие подключенных к ней пользователей. Можно конечно запускать 1С: Предприятие с ключом /C ЗавершитьРаботуПользователей, но это не всегда удобно, да и хочется же потом написать личное письмо с рекомендациями по устранению склероза.


Можно использовать штатную возможность подключения к 1С через COMConnector и скрипт на AutoIT. Код написан под 1С 8.1 и позволяет выкинуть пользователей из базы с записью в журнал.


global $obj = ObjCreate("v81.comconnector")

$AgentConnection = $obj.ConnectAgent("tcp://servername:1540")

$Cluster = $AgentConnection.GetClusters()[0]

$AgentConnection.Authenticate($Cluster, "", "")

$WorkingProcess = $AgentConnection.GetWorkingProcesses($Cluster)[0]

$ConnectString = $WorkingProcess.HostName & ":" & $WorkingProcess.MainPort

$WorkingProcessConnection = $obj.ConnectWorkingProcess($ConnectString)

$WorkingProcessConnection.AddAuthentication("логин","пароль")

$ibDesc = $WorkingProcessConnection.CreateInfoBaseInfo()

$ibDesc.Name = "имя базы"

$connections = $WorkingProcessConnection.GetInfoBaseConnections($ibDesc)

for $temp in $connections

if $temp.username <> "логин" and ($temp.AppID <> "COMConsole" _

or "COM-соединение") then

        FileWriteLine ( "файл лога", @MDAY&"."&@MON&"."&@YEAR&" _

"&@HOUR&":"&@MIN&" в базе сидит "&$temp.username &" _

тип подключения "&$temp.AppID)

$WorkingProcessConnection.Disconnect($temp)

endif

Next

$AgentConnection=""

$connect=""

Но операцию иногда нужно проворачивать по просьбе самого пользователя, который запустил "тяжелый" отчет и повесил 1С. Если не хотите решать эти вопросы самостоятельно, то просто выведите любителям “тяжелых” отчётов ярлык на скомпилированный скрипт:


$a=Msgbox(4,"Вы уверены?","Вы точно хотите выкинуться из базы?")

If $a<>6 then

exit

Else

global $obj = ObjCreate("v83.comconnector")

$AgentConnection = $obj.ConnectAgent("tcp://servername:1540")

$Cluster = $AgentConnection.GetClusters()[0]

$AgentConnection.Authenticate($Cluster, "", "")

$infobases=$AgentConnection.GetInfoBases($Cluster)

for $base in $infobases

if $base.name="basename" Then

$connections=$AgentConnection.GetInfoBaseSessions($Cluster, $base)

        for $temp in $connections

;Пользователи в базе именуются так же, как и доменный пользователь

            If $temp.username = @username then

                $AgentConnection.terminatesession($cluster,$temp)

            EndIf

         next

         Exit

    EndIf

next

Endif

Еще COMConnector помогает проверить наличие обновлений конфигурации, получить какую-то информацию из базы, и автоматизировать заведение пользователей в 1С.


Технологичное создание новых пользователей


На мой взгляд, создавать новых пользователей 1С должен системный администратор, а не программист 1С. Но последнему нужно сделать процесс максимально простым. Чтобы администратору не приходилось "заглядывать" в каждую базу отдельно, можно использовать еще один скрипт.


Для примера приведу функцию создания пользователей в типовой Бухгалтерии 2.0.
;передаем функции имя пользователя в домене, фамилию, имя и отчество

func _1cBuh($username, $surname,$name,$fathername)

FileWriteLine($logfile, "добавляем в 1с 8.3 бухгалтерия "& $Username)

$obj = ObjCreate("v83.comconnector")

$connect=$obj.Connect("Srvr=""servername"";Ref=""basename"";Usr=""login"";Pwd=""password"";")

Local $avArray[1], $i=0

;Спрашиваем про роли в базе

$hgui = GUICreate("вопрос" , 200, 200)

GUICtrlCreateLabel("какие права в бухгалтерии?",2,2)

GUICtrlCreateLabel("полные или пользовательские?",2,22)

$1 = GUICtrlCreateButton("полные", 5, 150, 70, 25)

$2= GUICtrlCreateButton("пользователь", 75, 150, 70, 25)

GUISetState(@SW_SHOW)

While 1

$msg = GUIGetMsg()

Select

Case $msg = $1

GUIDelete()

$rght="ПолныеПрава"

ExitLoop

Case $msg = $2

GUIDelete()

$rght="Бухгалтер"

ExitLoop

 EndSelect

 WEnd

$mt=$connect.Metadata.Roles.find($rght)

;создаем пользователя ИБ

$newuser= $connect.ПользователиИнформационнойБазы.createuser()

$newuser.name = $surname&" "&$name

$newuser.fullname = $surname&" "&$name&" "&$fathername

$newuser.StandardAuthentication = "False"

$newuser.OSAuthentication="True"

$newuser.OSuser="\\DOMAINNAME\"&$Username

$newuser.Roles.add($mt)

$newuser.write()

;создаем пользователя в справочнике

$bject=$connect.NewObject("СправочникМенеджер.Пользователи")

$newuserS=$bject.CreateItem()

$newuserS.code=$surname&" "&$name

$newuserS.Description=$surname&" "&$name&" "&$fathername

$newuserS.write()

;Выбираем группы (юрлица)

$query=$connect.Catalogs.ГруппыПользователей.Выбрать()

while $query.Следующий()

if StringInStr ( $query.Description, "Группа") then

_ArrayAdd($avArray, $query.Description)

$i+=1

endif

wend

$avArray[0]=$i

GUICreate("Группы Бухгалтерии", 200,$i*20+70)

for $i=1 to $avArray[0]

assign ("var"&$i, GUICtrlCreateCheckbox( $avArray[$i], 2, 0+20*$i));, 90, 20))

next

$OK_Btn = GUICtrlCreateButton("добавить", 50,$i*20+20, 60)

GUISetState()

While 1

$msg = GUIGetMsg()

Select

Case $msg = $OK_Btn

For $i=1 to $avArray[0]

if BitAND(GUICtrlRead(eval("var"&$i)), $GUI_CHECKED) = _

$GUI_CHECKED Then

$grp=$connect.Справочники.ГруппыПользователей. _

НайтиПоНаименованию($avArray[$i]).ПолучитьОбъект()

$t=$grp.ПользователиГруппы.add()

$t.Пользователь = $newuserS.ссылка

$grp.write()

endif

next

GUIDelete()

ExitLoop

EndSelect

 WEnd

$connect=""

endfunc

image alt text


Юрлиц развелось слишком много — нужно разбивать на столбцы.


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


Автоматическое перемещение баз


Если нужно перенести базу 1С: Предприятия вместе с ее данными в SQL на другой сервер, то делать это вручную целесообразно только для 1-2 БД.


При большем их числе рутина станет утомительной - лучше воспользоваться скриптом.
#include <GUIConstantsEx.au3>
local $name
GUICreate("перенос", 200, 180)
GUICtrlCreateLabel("название базы по английки",2,35)
$name1 = GUICtrlCreateInput($name, 2, 50, 300, 20)
$OK_Btn = GUICtrlCreateButton("погнали", 70, 180, 60)
GUISetState()
While 1
  $msg = GUIGetMsg()
  Select
     Case $msg = $GUI_EVENT_CLOSE
         Exit
     Case $msg = $OK_Btn
     $name = GUICtrlRead($name1)
     exitloop
  endselect
WEnd
GUIDelete()
GUICreate("перенос", 200, 180)
GUICtrlCreateLabel("отключаем базу",2,2)
GUISetState()
$constrim="DRIVER={SQL Server};SERVER=старый_сервер;DATABASE=master;uid=sa;pwd=пароль;"
$adCN = ObjCreate ("ADODB.Connection")
$adCN.Open ($constrim)
$sQuery = "sp_detach_db @dbname = N'"&$name&"'"
$adCN.Execute($sQuery)
$adCN.Close
GUICtrlCreateLabel("перемещаем базу",2,15)
$u=FileCopy ("\\старый_сервер\путь к папке с SQL-базами\"&$name&".mdf","\\новый_сервер\путь к папке с SQL-базами\"&$name&".mdf")
if $u = 0 Then
  GUICtrlCreateLabel("ОШИБКА! ПЕРЕМЕЩЕНИЕ НЕУСПЕШНО!!!!",2,15)
  $OK_Btn = GUICtrlCreateButton("закрыть", 336,40, 60)
  GUISetState()
  While 1
     $msg = GUIGetMsg()
     Select
         Case $msg = $GUI_EVENT_CLOSE
            exit
         Case $msg = $OK_Btn
            exit
     endselect
  WEnd
  GUIDelete()
EndIf

$u=FileCopy ("\\старый_сервер\путь к папке с _

SQL-базами\"&$name&".ldf","\\новый_сервер\путь к папке с SQL-базами\"&$name&".ldf")
if $u = 0 Then
  GUICtrlCreateLabel("ОШИБКА! ПЕРЕМЕЩЕНИЕ НЕУСПЕШНО!!!!",2,15)
  $OK_Btn = GUICtrlCreateButton("закрыть", 336,40, 60)
  GUISetState()
  While 1
     $msg = GUIGetMsg()
     Select
         Case $msg = $GUI_EVENT_CLOSE
            exit
         Case $msg = $OK_Btn
            exit
     endselect
  WEnd
  GUIDelete()
EndIf

GUICtrlCreateLabel("создаем скулевую базу "&$name,2,28)
GUISetState()
$constrim="DRIVER={SQL Server};SERVER=новый_сервер;DATABASE=master;uid=sa;pwd=пароль;"
$adCN = ObjCreate ("ADODB.Connection")
$adCN.Open ($constrim)
$sQuery = "CREATE DATABASE "&$name&" ON (FILENAME = 'путь к папке с _

базами\"&$name&".mdf'), (FILENAME = 'путь к папке с базами\"&$name&".ldf') FOR ATTACH"
$adCN.Execute($sQuery)
$adCN.Close
GUICtrlCreateLabel("создаем 1c-ную базу "&$name,2,41)
GUISetState()
run ("""C:\Program Files (x86)\1cv8\common\1cestart.exe"" createinfobase_

""Srvr=localhost;Ref="&$name&";DB="&$name&";DBMS=MSSQLServer;DBSrvr=localhost;DBUID=sa;DBPwd=пароль""")
GUICtrlCreateLabel("закончили, проверяйте ",2,54)
$OK_Btn = GUICtrlCreateButton("закрыть", 336,40, 60)
GUISetState()
While 1
 $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
             exitloop
     Case $msg = $OK_Btn
            exitloop
    endselect
WEnd
GUIDelete()

image alt text


Список баз для миграции можно брать и из файла, а лог выводить в текстовый файл. Аналогичным образом можно конвертировать несколько десятков баз из файловых в SQL простой выгрузкой-загрузкой в .dt


На этом набор заканчивается


Конечно, это далеко не все, что можно автоматизировать в связке с 1С. Но разного рода обмены, получение real-time информации из 1С в других приложениях и прочие сценарии не попали в этот обзор из-за узкой направленности и специфики.


Наверняка у вас тоже есть свой набор "ноу хау" для администрирования 1С — будет здорово если поделитесь с коллегами в комментариях.


Скрипты и ноу-хау предоставлены avelor, за что ему огромное спасибо!

Поделиться с друзьями
-->

Комментарии (37)


  1. rasswet
    31.01.2017 11:28

    может имеет смысл обновить статью относительно того как это всё работает с 8.3?


  1. aspire
    31.01.2017 12:07
    +2

    Такое ощущение что люди придумывают, а для чего бы еще написать скрипт. Распишу по пунктам:
    1. Чистить кэш после каждого выхода это просто жесть, пользователь настраивает программу для удобной работы, а вы эти настройки каждый день сбиваете.
    2. Ни разу не пришлось исправлять ошибки таким способом, при нем разрушается целостность базы и не факт что это не вылезет боком позже. На этот случаю и существуют бэкапы.
    3. Спасибо за скрипт, можно придумать применение.
    4. Как часто нужно добавлять новых пользователей в базу? По своему опыту, в бухгалтерии текучка небольшая, для оного пользователя в год скрипт ненужен.
    5.Как часто нужно таскать базы между серверами? Это рутинная задача только тогда когда один человек обслуживает сотни баз 1с.


    1. avelor
      31.01.2017 12:49

      отвечу по пунктам:)
      1. далеко не все настройки хранятся в кэше. + представьте две сотни файловых баз, каждая из которых регулярно обновляется, причем самими пользователями.
      2. об этом и есть предупреждение. опять же, представьте РИБ c файловыми базами в магазинах. бэкап файловой базы — это отдельная песня (а необходимо держать и архив бэкапов), выгрузка нового образа занимает время, а проверка на физ. целостность занимает полчаса от силы — и в 95% случаев магазин может торговать. да и в случае повреждения документов можно перепровести их в центральном узле.
      4. пример приведен для бухгалтерии, доработать можно и до любой другой конфигурации. а на счет текучки… контора на контору не приходится:)
      5. да, всё верно. или когда сотню баз нужно разово перенести — написать скрипт быстрее, чем руками:)


      1. o4karek
        31.01.2017 15:19

        А что такого отдельного в бэкапе файловой базы?! Более простой операции, чем копирование 1 (одного) файла сложно себе представить. И уж там создавайте истории как душе угодно.


        1. avelor
          31.01.2017 15:27

          вам нужно чтоб она была закрыта. использование vss при копировании (я так делаю) ситуацию спасает, но не до конца — есть шанс получить битую базу за счёт копирования снапшота, сделанного в момент записи.
          единственный православный вариант бэкапа файловой базы — выгрузка в .dt. Ну или хотя бы гарантировать отсутствие рабочих процессов в базе. оба варианта не всегда реальны (отключение электричества в нерабочие часы).


          1. o4karek
            31.01.2017 15:46

            Выгрузка в .dt не является бэкапом от слова «совсем» (об этом даже в платформенной документации написано). Плюс для такого «бэкапа» точно так же нужно отсутствие пользователей в базе.
            Поэтому единственно надежным вариантом бэкапа файловой базы является копирование файла базы данных.


            1. avelor
              31.01.2017 16:10

              на эту тему много копий сломано, можно ли бэкапить выгрузкой, спорить не буду. 1С не рекомендует, поскольку не может гарантировать, что dt-шка загрузится обратно.

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


              1. o4karek
                31.01.2017 16:59

                Каждый выбирает для себя :)
                Случаев, когда база не загружалась из выгрузки — овер много.
                Но если вы продолжаете не верить настоятельным рекомендациям вендора — каждый выбирает для себя :)


                1. avelor
                  31.01.2017 17:05

                  согласен. как я уже писал, я не могу позволить себе монопольный доступ к базе… поэтому где нужно бэкапить — я копирую с vss-снапшота. на озвученных точках бэкапить очень хочется, но было не реально — и монопольного доступа не получить, и железо дряхлое и тухлое. поэтому и chdbfl в обёртке.
                  в последствии там переехали на мини-сервачки с линуксом и постгре.


              1. yosemity
                31.01.2017 18:22

                Начиная с 8.3.7 при выгрузке идет проверка целостности.


                1. o4karek
                  31.01.2017 23:58

                  Рекомендации от этого не меняются.


                  1. yosemity
                    01.02.2017 11:59

                    Рекомендации может и не меняются, но вероятность загрузки из dt значительно выше. Я у себя каждую ночь делаю выгрузку в dt и дамп sql, своей же тулзой на том же AutoIT. Если выгрузка не прошла за отведенное количество попыток, то алерт на мыло предупредит, что что-то не так, и дальше можно по логам смотреть, база это побилась или какое соединение висит.


                    1. vis_inet
                      01.02.2017 14:44

                      «вероятность загрузки из dt значительно выше» — по сравнению с чем?


                      1. yosemity
                        03.02.2017 11:11

                        По сравнению с дт, выгруженным в версии <8.3.7.


                        1. vis_inet
                          03.02.2017 11:33

                          Да, возможно.
                          Но, в любом случае, надёжнее всего просто копия файла базы или бэкап SQL базы.


                          1. yosemity
                            03.02.2017 12:03

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


                            1. vis_inet
                              03.02.2017 12:33

                              Согласен.
                              Я хотел только акцентировать на том, что .DT файл выгрузки не является более надёжным чем копия базы или SQL бэкап.


                    1. o4karek
                      03.02.2017 12:37

                      вероятность загрузки из dt значительно выше

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


              1. ZEEGIN
                31.01.2017 22:28
                +1

                В типовых решениях на 8.3 встроена система резервного копирования.
                Укажите путь и план работы. Сама заблокирует базу, выгонет пользователей (в том числе в файловой версии), сделает бэкап 1C.CD запакованного в zip и разблокируется. Для файловых либо должен быть активный сеанс ночью (особенность регламентных заданий в файловой) либо можно настроить предложение сделать бэкап при завершении сеанса администратора.


                1. avelor
                  31.01.2017 23:25

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


    1. cleaner_it
      01.02.2017 09:07

      Всему можно найти применение. Кроме заведения пользователей на конфигурациях с БСП — группы доступа всё равно назначать в самой 1С.


  1. aspire
    31.01.2017 13:41

    Вот это вы меня удивили, пользователи сами себе обновляют базы. Тогда понятно зачем вам все эти скрипты. Как по мне это просто костыли из-за нежелания увеличивать расходы на содержание компьютерной техники. На текущем месте работы все настроено через стандартные механизмы обмена 1с, за несколько год только раз возникла проблема с профилем пользователя. Правда в нас все более по взрослому, все базы крутятся на mssql.

    ответ для avelor


    1. avelor
      31.01.2017 14:44

      не, как было написано — когда обычный клиент с 2-4 базами всякие затейства не нужны (ну максимум — заведение пользователей и какие-нибудь хитрые регламентные задачи). Но вот у меня был клиент — бухгалтерский аутсорс, пара сотен файловых баз и сотня скулёвых. согласовать с пользователями регулярные обновления конфигураций в автоматическом режиме не реально, руками обновлять — свихнёшься, но сами пользователи вполне бодро обновляют базы (в том числе и скулевые), как через конфигуратор, так и через предприятие. так же как и классификаторы:) тут правда пришлось повозится с SRP и нагородить ещё костылей (грёбаный bnk.exe!), но это уже детали.


      1. MAXXL
        31.01.2017 15:49

        А какими костылями обходили обновление класификатора банков?



  1. fishca
    31.01.2017 14:29

    Я бы добавил еще одну «маленькую» отверточку http://infostart.ru/public/15126/


    1. vis_inet
      01.02.2017 10:23

      Да, это отличная вещь!


    1. sdk_inc
      01.02.2017 10:23

      Вот-вот. Эдакий «мультитул» даже, а не маленькая отверточка! Уже не первый год пользуюсь, и поминаю автора добрым словом! Только я бы добавил ссылку напрямую на сайт автора, т.к. там доступен инструмент без наличия startmoney.


  1. Sergey-S-Kovalev
    31.01.2017 15:07

    Самобытьненько. Иногда, конечно, такие решения лучше чем ничего.
    Но на всю статью одна строчка Powershell. Надеялся на большее.

    А еще системные администраторы НЕ должны создавать пользователей в базах 1С. Это должен или владелец базы делать, или обслуживающий ее специалист по 1С. Это правильно с точки зрения разделения ответственности и безопасности.


    1. avelor
      31.01.2017 22:02

      обслуживающий ее специалист по 1С

      в моей практике хорошие 1с-специалисты бежали от такой рутины как от огня, а плохих… лучше не брать вовсе :) Это как заставить ведущего сисадмина, короля Active Directory, заводить в ней пользователей. другое дело, что структура пользователей и групп должна быть чёткой, а не сотня дополнительных свойств и хардкода имён пользователей в обработках.

      Хорошая тема создавать пользователей отделу кадров, при приёме на работу. сразу и в 1с, и в AD (автоматически). но такое может привести к безумию в наших реалиях =(


      1. Sergey-S-Kovalev
        01.02.2017 20:01

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

        А вот что касаемо до AD, то массовые заведения учеток делаются через синхронизацию с учетной системой, либо по отдельной выгрузке. А пару-тройку руками создать могу и я, не вижу ничего зазорного, хотя AD леса в том или ином виде в веденье моей группы. Структура организационных подразделений в AD всегда должна повторять штатную расстановку в учетной системе в контексте сотрудников.

        У нас кадровая служба не создает ни 1Сные, ни АДшные учетки, они могут только подать заявку на создание учетной записи в сервисдеск. В некоторых организациях у нас это реализовано доп обработками, когда кадровик только выбирает обработку, а письмо со всей необходимой инфой улетает куда нужно само.


  1. vasyzpetya
    01.02.2017 07:39

    кровь из глаз от ваших костылей

    вы читали руководство администратора?
    плохой стиль написания, без конкретных примеров…

    Эти данные хранятся в профиле пользователя, в папках с длинными названиями из GUID баз данных.


    что за мистика?

    в %appdata% хранятся а дальше по конкретной версии платформы

    на чем у вас скрипты?? инструменты администратора 1с это vbs и прочие bat'ники


  1. toga
    01.02.2017 10:24

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


    1. avelor
      01.02.2017 12:21
      +2

      если база на поддержке — то штатным механизмом (запуск с ключом /UpdateCfg). вообще штатный механизм обновления из предприятия типовых баз весьма неплох — скачивается .hta файл, оттуда ком-соединениями управляется база (выгоняются пользователи. делается бэкап, последовательно применяются нужные .cf). или вы имеете ввиду обновление нетиповых\снятых с поддержки баз?


      1. toga
        04.02.2017 14:37

        с типовой конфигурацией все в принципе понятно, а вот со снятой с поддержки возникает затруднение…


        1. avelor
          04.02.2017 15:03

          можно намутить свою поставку обновления а-ля штатная — https://its.1c.ru/db/metod8dev#content:4727:hdoc


  1. user343
    03.02.2017 23:45

    Ещё 2 отвёртки в набор стар.пирата.


    1) для работы с файловыми базами: переносной (portable) сcleaner+winapp2.ini+программа Auslogics disk defrag. Просто скопированная папка ранее установленного A.d.d. с офиц.сайта, но с меньшим кол-вом спама, чем в инсталляторе.


    Лучше день 20 минут на ccleaner+defrag потерять — потом за час долететь обновить.
    Заодно и SMART параметры НЖМД глянуть, если это не RAID.
    Вдруг он (HDD) уже помирает и температурит, а обновления его добьют или бэкапы на том же диске окажутся битыми.


    2) сборники обработок infostart_mega и т.п. с торрентов.