среда, 13 апреля 2016 г.

Розница 2.1.
Испортился файл "1cv8u.pfl", поэтому у Вас создаётся при каждом запуске новое рабочее место.
В Win8, например, он находится по адресу: "C:\Users\<Пользователь>\AppData\Local\1C\1Cv82\1cv8u.pfl".

Вобщем закройте 1С, сделайте, на всякий случай, резервную копию сломанного файла.
Замените содержимое (при помощи блокнота) на: 
Код
{
{""},
{
{"Universal",
{"ClientID",
{"#",fc01b5df-97fe-449b-83d4-218a090e681e,88888888-0000-0000-0000-000000000000},""},
{
{""}
}
},
{""}
}
}


Вместо "88888888-0000-0000-0000-000000000000" можете подставить CLSID нужного рабочего места или оставить как есть, остальное не менять, сохранить. Затем запустить Розницу, выбрать рабочее место с вставленным CLSID'ом, настроить это рабочее место (в т.ч. торговое оборудование). Для порядка, удалить кучу ненужных насозданных рабочих мест. 
Готово.

понедельник, 1 декабря 2014 г.

Скрипт PowerShell, отслеживающий свободное место на диске и удаляющий старые файлы.

Решил освоить PowerShell. Подвернулась подходящая задача - необходимо настроить на сервере очистку жесткого диска в зависимости от свободного места. Будем удалить старые файлы в определенном каталоге (старые бэкапы).

Скрипт:

$d = "d:\1" // объявляю переменную, в данном случае путь к каталогу
cd $d // перехожу в каталог
psdrive | ForEach-Object {if ($_.free -gt 10000000000 -and $_.name -eq "d"){ls $d | Sort-Object LastWriteTime -descending | select LastWriteTime, name -last 2| ForEach-Object {Remove-item $_.name -whatif}}} //  см. ниже

// psdrive - показать все диски
// | - передать данные дальше по конвееру
// ForEach-Object - перебираем диски по порядку
// if ($_.free -gt 10000000000 -and $_.name -eq "d") - находим диск D, у которого меньше 10Gb
// ls $d - (ls, dir в данном случае псевдонимы основной команды get-childitem) получаем список файлов и каталогов внутри данного
// Sort-Object LastWriteTime -descending - сортируем объекты по времени последнего изменения в обратном понятке
// select LastWriteTime, name -last 2 - выбираем последнии две записи, выводим поля время и имя
// Remove-item $_.name - удаляем файлы с этими именами
// -whatif - симулируем данный скрипт для проверки

Данный скрипт сохранил с расширением .ps1. Запуск данного файла осуществляю через .bat файл с таким содержимым:

powershell.exe d:\psdrive01.ps1

Файл с расширением .bat запускаю через планировщик заданий.

Есть еще один нюанс при запуске. По умолчанию выполнение сценариев PowerShell в системе запрещено. Т.к. в скриптах может находится вредоносный код, который может нанести вред системе. По соображениям безопасности скрипты PowerShell должны быть подписаны цифровой подписью, такой подход называется политика выполнения. new 6 Notepad 2011 06 08 15 29 19 thumb PowerShell. Выполнение скриптов запрещено для данной системы
Для тестирования скриптов можно отключить проверку выполнения для локальный скриптов. Для этого запускаем консоль PowerShell от имени администратора и вводим команду:
Set-ExecutionPolicy RemoteSigned
new 6 Notepad 2011 06 08 15 30 08 thumb PowerShell. Выполнение скриптов запрещено для данной системы

Подтверждаем изменение политики выполнения – [Y] Да.
Теперь все ЛОКАЛЬНЫЕ сценарии PowerShell будут выполняться без подписи и сценарий загруженные из интернета с цифровой подписью надежного издателя.

четверг, 15 августа 2013 г.

Автоматический запуск профиля пользователя на терминальном сервере.

В моей работе появилась необходимость автоматического запуска 1С со специальной обработкой на терминальном сервере.
Эту задачу можно выполнить в несколько этапов:

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


2. Заданий несколько, и надо их запускать под разными пользователями, то задача усложняется. Запустить с разных ярлыков по одному адресу под разными пользователями не получится, придется дать конкретному серверу необходимое количество IP адресов (или обращаться к нему по имени :) ) .

3. Для пользователя, под которым будет запускать сеанс 1c с обработкой добавляем нужную строку:

"C:\Program Files (x86)\1cv82\common\1cestart.exe" ENTERPRISE /S "SERVER\Base" /N Admin /P password /RunModeOrdinaryApplication /Execute "C:\обработка.epf" 


4. Создаем bat файл для автозагрузки.

mstsc с:\UT.rdp

5. Добавляем в планировщик (при включении компьютера) созданный bat файл.


понедельник, 18 марта 2013 г.

Обновление конфигурации базы 1С из командной строки.

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

Запуск одной строкой обновления конфигурации и базы не получилось. Сделал это последовательно двумя строкими:

start "" /wait  "C:\Program Files\1cv82-eletech\8.2.14.528\bin\1cv8.exe" CONFIG /F F:\roznica /N adm /P 123 /UpdateCfg "D:\BASE Temlpates\1c\1c\Accounting\2_0_45_5\1cv8.cf" - обновление конфигурации
start "" /wait  "C:\Program Files\1cv82-eletech\8.2.14.528\bin\1cv8.exe" CONFIG /F F:\roznica /N adm /P 123 /UpdateDBCfg - обновление базы


Последовательность нескольких действий можно запустить одним bat файлом, например:

"D:\Distr 1C\update.bat" Base1




******************************************************************************

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

Эту задачу решил выполнять с помощью bat файла, в котором будет последовательный перебор названия баз из текстового файла.

for {%переменная|%%переменнаяin (множество) do команда [ПараметрыКоманднойСтроки]

Mifile.txt - файл названия баз.









Пример:
for /F "usebackq delims=;" %%i in ("D:\Distr 1C\Myfile.txt") do "D:\Distr 1C\update.bat" %%i



delims=xxxЗадает набор разделителей. Заменяет набор разделителей по умолчанию, состоящий из пробела и символа табуляции.
usebackqЗадает возможность использования кавычек для имен файлов в параметре МножествоИменФайлов. Задает исполнение строки, заключенной в обратные кавычки, как команды, а строки в одиночных кавычках — как команды в символьной строке.



понедельник, 11 марта 2013 г.

Как выгрузить базу 1С при помощи командной строки.

В процессе работы появилась задача единовременно произвести выгрузку с нескольких баз 1С.
Единственным решением я посчитал - создание bat файла с ключами запуска 1С.
 И в него добавил следующее:

"C:\Program Files\1cv82-eletech\8.2.14.528\bin\1cv8.exe" CONFIG /F F:\roznica /N adm /P 123 /DumpIB E:\%date%-name.dt

Из выше написанного следует:

- C:\Program Files\1cv82\8.2.14.528\bin\1cv8.exe - этот запуск самого 1С
- CONFIG - в режиме конфигуратора
- /F - путь до файловой базы
- /N - имя пользователя, под которым разрешено выгружать базу
- /P - пароль пользователя
- E:\name.dt - куда выгружать базу


Далее переименовываем это файл с расширением .bat
В результате мы таким образом можем организовать бэкап и в конце получим файлы вида 18.01.2012-name.dt

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

start "" /wait 

/wait
Запускает приложение с ожиданием окончания его работы.


Конечный вид содержимого bat файла следующий:


start "" /wait  "C:\Program Files\1cv82-eletech\8.2.14.528\bin\1cv8.exe" CONFIG /F F:\roznica /N adm /P 123 /DumpIB E:\%date%-name.dt


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


И можно вставлять в планировщик

среда, 26 декабря 2012 г.

Простейший backup на основе WinRAR, WSH скриптов и Планировщика задач Windows


Как будет работать бэкап

Итак, мне требуется:
  • Хранить бэкап за каждый день в виде архивного файла
  • Каждый файл должен создаваться с уникальным именем (в идеале включать дату создания в имя файла)
  • Процесс создания бэкапа должен проходить в автоматическом режиме
  • Файлы старше 1 недели должны автоматически удаляться
Архивацией будет заниматься WinRAR, он же будет автоматически именовать файлы. Определять возраст и удалять старые файлы будет скрипт (VBScript), а автоматизировать все я буду с помощью встроенного Планировщика Windows.

Скрипты

Основу скриптов составляют процедуры из книги Джесси Торреса "Скрипты для администратора Windows" (а конкретно из главы 3 "Обслуживание файлов"). Они были дополнены мной для реализации моих задач.
Вот какие функции нам понадобятся (привожу код целиком): 
' ---------- 
' Начало основной секции. Отсюда начнется выполнение при запуске скрипта. 
Set FSO = CreateObject("Scripting.FileSystemObject")
' директория, где будут храниться бэкапы. Вы должны вписать свою директорию
' вместо "X:\DailyBackup"
sDir = "X:\DailyBackup"
Set objDir = GetFolder(sDir)
DeleteOlderFiles(objDir)

' ---------- Секция функций

' Получить файл
Function GetFile(sFile)
 On Error Resume Next
 
 Set FSO = CreateObject("Scripting.FileSystemObject")
 Set GetFile = FSO.GetFile(sFile)
 if err.number <> 0 then
 WScript.Echo "Error Opening file " & sFile & VBlf & "["&Err.Description&"]"
 Wscript.Quit Err.number
 end if
End Function 

' Получить папку
Function GetFolder (sFolder)
 On Error Resume Next
 
 Set GetFolder = FSO.GetFolder(sFolder)
 if err.number <> 0 then
 WScript.Echo "Error Opening folder " & sFolder & VBlf & "["&Err.Description&"]"
 Wscript.Quit Err.number
 end if
End Function 

' удалить один файл (имя файла передается в sFile)
Sub DeleteFile(sFile)
 On Error Resume Next

 FSO.DeleteFile sFile, True
 if err.number <> 0 then
 WScript.Echo "Error Deleteing file " & sFile & VBlf & "["&Err.Description&"]"
 Wscript.Quit Err.number
 end if
End Sub 

' Удалить файлы старше 7 дней
Sub DeleteOlderFiles(objDir)
    ' просматриваем все файлы в директории
 for each efile in objDir.Files  
  ' используем DateLastModified, а не DateCreated, поскольку
  ' DateCreated не всегда возвращает правильную дату
  FileDate = efile.DateLastModified 
  Age = DateDiff("d",Now,FileDate)  
  ' в данном случае возраст файла не больше семи дней
  If Abs(Age)>7 Then 
   DeleteFile(efile)
  End If  
 next 
End Sub          
Этот код помещаем в файл remove_old_backups.vbs.

Командная строка WinRAR

Архиватор WinRAR обладает мощной поддержкой командной строки. В частности, он может формировать имя файла на основе пользовательского шаблона, включая в него разную служебную информацию, например, дату. Что нам, собственно говоря, и требуется. Кроме того, он умеет работать со списком файлов или директорий на архивацию, что сильно облегчает редактирование командного файла.
Я использую следующую командную строку для архивирования (прописана в файле make_daily.bat):
"c:\program files\winrar\winrar.exe" a -s -r -rr10p -dh -ed -m3 -ilogC:\DailyBackupScript\dailybackup.log -ag+YYYYMMDD X:\DailyBackup\backup
Разберем ее по составляющим:
  • "c:\program files\winrar\winrar.exe" - путь к WinRAR-у
  • a - команда на добавление файлов
  • -s - режим сжатия "solid"
  • -r - с поддиректориями
  • -rr10p - на всякий случай добавляем информацию для восстановления (-rr), в количестве 10% (10p)
  • -dh - открывать шареные фалы. Полезно, если кто-нибудь засиделся до 12 ночи, и редактирует файл, который должен уйти в бэкап
  • -ed - не добавлять пустые директории
  • -m3 - степень сжатия 3 
  • -ilogC:\DailyBackupScript\dailybackup.log - вести лог (-ilog) и записывать его в "C:\DailyBackupScript\dailybackup.log"
  • -ag+YYYYMMDD X:\DailyBackup\backup - формировать имя файла, прибавляя в начало текущий год, месяц и число. Имя файла будет иметь примерно такой вид: 20060927backup.rar
  •  X:\DailyBackup\backup - папка, куда писать бэкапы и имя бэкапа (к которому в начало дописываются год, месяц, число)

Командные файлы

Вся работа по созданию бэкапа строится на основе командных файлов (.bat-файлов). У меня их два:
  • make_daily.bat - содержит команды для создания архивного файла или файлов.
  • backup_task.bat - выполняет следующие действия:
    • вызывает интерпретатор скриптов cscript и передают ему на выполнение скрипт, удаляющий старые файлы.
    • вызывает make_daily.bat и передает ему в качестве параметра либо папку, которую надо архивировать, либо файл-список (в котором несколько папок на архивацию).
  • В свою очередь,  backup_task.bat вызывается Планировщиком Windows в назначенное время
Содержимое файла make_daily.bat (в одну строку):
@"c:\program files\winrar\winrar.exe" a -s -r -rr10p -dh -ed -m3 -ilogC:\DailyBackupScript\dailybackup.log -ag+YYYYMMDD X:\DailyBackup\backup %1
Содержимое файла backup_task.bat:
@cscript remove_old_backups.vbs
call make_daily.bat @backup.lst
Для работы также необходимо создать файл backup.lst (обычный текстовый файл). Он должен содержать список директорий, которые включаются в бэкап. Каждая директория должна располагаться на отдельной строчке, например, так:
c:\Projects
c:\VeryImportantProjects
c:\Folder Name With Spaces\SubFolder
Обратите внимание, что имя директории-источника, содержащее пробелы, не обязательно заключать в кавычки, если вы пользуетесь файл-списком. Если же вы передаёте его напрямую, то кавычки обязательны. Не ставьте завершающий слэш - WinRAR этого не поймёт.

четверг, 6 декабря 2012 г.

Импорт почтовых сообщений из Thunderbird в Outlook


Перенос почты из Mozilla ThunderBird в MS Outlook Express и MS Outlook


В Thunderbird не нашёл возможность экспорта всех/выбранных сообщений, а по одному сохранять сотни или тысячи сообщений как минимум не разумно. Поэтому я воспользовался первой же найденной программой — IMAPSize (есть дистрибутив не требующий установки) — которая смогла сконвертировать ящики Thunderbird в eml файлы. Создана она не для этого, но есть у неё такая функция.



1. Запустите IMAPSize и откажитесь от предложения создать аккаунт.


Нажмите "No"

2. Tools > mbox2eml




3. Кликните кнопку "Select mbox files to convert", в Files of type выберите All files (*.*), т.к. файлы Thunderbird не имеют расширений:



4. Перейдите в директорию с файлами Thunderbird для нужного вам аккаунта.
Скорее всего в C:\Documents and Settings\Имя_Пользователя\Application Data\Thunderbird\Profiles\Something.default\Mail\mail.ВАШ_ДОМЕН.com

5. Удерживая Ctrl, или по одному, выберите файлы — "ящики" без расширений которые будете переносить (Inboх, Sent, …)

6. В "Select destination folder" выберите директорию в которой временно сохраните eml файлы. Обязательно добавьте \ (бэкслэш) в конце!

Эта программа автоматически создаст отдельные директории для каждого выбранного ящика, и в них сохранит сообщения в EML. Например, если здесь укажите C:\Temp\Eml\, и выберите Inbox и Sent, то после конвертации у вас появятся C:\Temp\Eml\Inbox и C:\Temp\Eml\Sent с EML файлами.



EML к PST преобразования EML для Outlook 

Следующий этап - импортировать сообщения eml в pst файл.
Для этого можно использовать программу EML к PST Converter.