Имя: Пароль:
1C
1C 7.7
v7: КомандаСистемы не отрабатывает...
0 MWWRuza
 
гуру
20.04.22
23:20
Добрый вечер!

Понадобилось сделать утилиту обслуживания базы ПрайсЧекера(иногда рушатся индексы, а база Парадокс, и встроенного средства реиндексации не предусмотрено, поэтому решил через бекапы проблему решить).
Нужно просто останавливать службу, копировать файлы базы, и потом запускать службу.
Дел на 15 минут, быстренько написал, протестировал - все идеально работает, службой рулю через КомандаСистемы Net Start/Stop.
Стал ставить клиенту, и вот тут вылезла проблеммка...
У себя-то я писал и отлаживал, предпологая, что все это на одном компе крутится, а у клиента 1С на сервере, к которому подключается клиент по RDP, и служба ПрайсЧекера на клиентском компе(Почему так - ну, так сложилось, не захотел ПрайсЧекер видить службу по сети на сервере, пришлось на клиентском компе поднять, это уже давно, больше года так работает).
Почитал, нашел, как управлять службами удаленного компьютера - оказывается, вариантов куча.
Перепробовал много чего, и добился, что такой командой, из консоли CMD сервера, останавливаю/запускаю службу на клиенте: PsService.exe \\M-001 -u Manager -p 1978 stop srvPricechecker
В принципе - работает нормально.
Но, когда я пытаюсь делать это из 1С, так: КомандаСистемы("PsService.exe \\M-001 -u Manager -p 1978 stop srvPricechecker");
то почему-то не работает...
Казалось бы, какая разница? Что из консоли, что через КомандаСистемы... Пробовал 1С и из под Администратора запускать, и так... Все равно не работает.
Куда копать?
1 Franchiser
 
гуру
21.04.22
00:27
В сторону запуска через vbs / js
2 mikecool
 
21.04.22
00:30
(0) это как я базу решил резать запросом через 1с++
выполнение ушло в зависон на 2 дня(без движухи на скуле), запрос в консоли скуля - 2 часа
хз - почему )
3 Злопчинский
 
21.04.22
02:11
Что значит "не работает"?
4 andrewalexk
 
21.04.22
08:23
(0) :)
у меня иногда двойные кавычки помогали
а проще сделать батник
проверить ручками
потом из 1с запустить
5 Franchiser
 
гуру
21.04.22
09:42
Да , там скорее всего со слешами что-то не то
6 MWWRuza
 
гуру
21.04.22
09:43
(3) Да х.з.... Запускаю команду системы из под 1С, окошко черное промелькивает, захожу на клиентский компТимВиевером, а служба как работала, так и работает. Если ту-же команду делаю "пешком", без 1С, из окна CMD, то служба останавливается, и стартует, если в команде stop на start поменять.
7 MWWRuza
 
гуру
21.04.22
09:44
Кстати, с батником идея хорошая... Сегодня вечером попробую.
8 Builder
 
21.04.22
09:45
(0) Полный путь до PsService.exe укажи, скорее всего он запускает из своей папки и тупо не видит PsService
9 MWWRuza
 
гуру
21.04.22
09:47
Пробовал. Первым делом это в голову пришло.
Он хоть и лежит в систем32, но все равно.

Кстати, а может ему именно Систем32 не нравится? Система там 64 бита, может надо его в СисВау64 положить?
10 MWWRuza
 
гуру
21.04.22
09:57
Из СП:
Параметры:
<СтрокаКоманды> - строка, содержащая команду.
Последовательность поиска программы (если не задан путь):
  текущий системный каталог;
  каталог Windows;
  системный каталог Windows;
  все каталоги, указанные в переменной PATH.

По идее, должно работать и без указанмя пути... Только что они имеют в виду под "системный каталог Windows" - ? Может от разрядности системы зависит, и в Систем32, 64 битная система, "с подачи 1С", и не заглядывает?
11 MWWRuza
 
гуру
21.04.22
10:01
А вот "промелькивающее окошко", может можно как-то в файл переназначить, что-бы увидеть, что там происходит, может там явно ошибка описана? Ну, типа через ">" и путь к файлу, в конце команды... Будет такая конструкция работать?
12 Builder
 
21.04.22
10:02
(11) Сделай cmd файл и его запускай, в нем паузу в конце, все будет срезу видно.
13 MWWRuza
 
гуру
21.04.22
10:04
(12) Попробую.
14 MWWRuza
 
гуру
21.04.22
17:58
Хм... Все оказалось еще интереснее. Сделал для начала бат файл для локальной остановки/запуска сервиса с таким содержимым:
NET STOP srvPricechecker
Не работает, прав не хватает...
При этом, в свойствах файла, в "Совместимости" установить галочку "Запускать от имени администратора", не дает - она просто не активна.
Есть конечно вариант, создать ярлык, и в дополнительных свойствах ярлыка поставить эту галочку.
Но, при этом, из 1С запущенной от имени администратора, эта команда работает, получается, 1С как в случае с ярлыком, переносит свои права на команду системы.
На просторах интернета, нашел такой скрипт, для временного повышения прав исполняемого бат/смд до админских:

echo off
:: BatchGotAdmin
::-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    set params = %*:"="
    echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"
::--------------------------------------

::ENTER YOUR CODE BELOW:

Работает, и без ярлыка, просто щелчком по файлу.
Пока до управления службами по сети не добрался, там люди работают, мешать не хочется...
15 MWWRuza
 
гуру
22.04.22
12:14
В общем, переделал в 1С на батники, для универсальности. Командой системы запускаю бат из каталога базы. 1С по любому запускается от администратора, так, что работает и без добавки на повышение прав из предыдущего поста.
Для тех клиентов, у которых база ПЧ лежит на том же компе, где работает 1С - просто через NET STOP/START, одной строкой в батнике(ну, или если 1С не от админа, то с добавкой скрипта для повышения прав).
Для тех, у кого 1С и база ПЧ на разных компах - через PsService.exe. А со скриптом повышения прав или нет - в зависимости от того, как 1С запускается.
Если что, бат проще отредактировать, чем обработку(в составе конфигурации 1С) - можно "на ходу" не останавливая пользователей базы 1С.

Поднял дома на втором компе службу и базу ПЧ - у меня работает - останавливается, копируется, стартует, вообще все как задумано. Клиентам пока не ставил, подожду удобного момента.
16 vladmenleo
 
22.04.22
12:44
(15) Давным-давно программировал на Delphi и Paradox базы были у меня практически основные. Для переиндексации была такая утилита DTUTIL32.EXE. Гуглится на раз, может проще ей переиндексировать?
17 MWWRuza
 
гуру
22.04.22
13:32
(16) Да, возможно... Но, я с Парадоксом вообще не работал, и структуру его базы/индексов не понимаю...
Вот так выглядит база:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-441.jpg

Как видим, там два файла DB... И куча еще каких-то файлов... могу предположить, что индексы - это PX...
А что такое - VAL, XGO, YG0 - ???
Почему у одного файла DB есть по одному файлу с таким-же именем всех расширений, а у второго только PX и VAL - ?
Все файлы создаются при установке программы из дистрибутива. Если удалить(ну, наверно и если повредится) любой из них - программа не запускается...
Если реиндексировать утилитой, она создаст все необходимые файлы, или только PX - ??? Где структура всего-этого безобразия прописана, (в 1С, в словаре метаданных DD), а тут где? В ЕХЕшнике?
Поэтому, так, с наскока я не понял, как это работает, и решил ограничиться бекап/ресторе, хотя реиндексация была бы правильнее.
18 vladmenleo
 
22.04.22
14:00
(17) PX это первичный индекс по ключу, а остальные дополнительные, их может быть несколько, а может и не быть совсем. Т.е. идея парадокса всегда должен быть первичный ключ по автоинкрементному полю, а остальные уже создает пользователь какие хочет по всяким полям. если к примеру far-ом по f3 глянуть внутрь, то в начале файла будет видно из чего состоит ключ типа pole1+pole2...
19 MWWRuza
 
гуру
22.04.22
14:46
(18) Ясно, что ничего не ясно... Если переиндексировать утилитой, то скорее всего переиндекируются только первичные индексы.
А остальные, "уже создает пользователь", т.е. в моем случае - программа при инсталяции. И к сожалению, без них уже установленная служба стартует, но не создает их сама, видимо, косяк разработчиков - не умеет... Если их удалить, и оставить только первичные, то так и остаются только два PX без остальных... На сколько они нужны и критичны для работы, я х.з...
20 MWWRuza
 
гуру
22.04.22
15:50
И вообще, странный этот Парадокс...
Решил все-таки утилиту попробовать:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-442.jpg

Был файл БД ~59 MB, после утилиты стал ~3 MB, индекс был ~6 MB, стал 238 KB.
Файл на просмотр открывается:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-443.jpg

количество записей не поменялось, как было 7587 в исходном, так и осталось... Это как? В 20 раз файл похудел? Сжатие таблицы, очистка от удаленных записей? Но не в 20 же раз? Что-то тут не то...

Попробовать оба файла обработать таким образом, и посмотреть, как будет реальный ПЧ с этой бвзой работать? Но, все равно нет доп. индексов, и не понятно, как их создать.
21 MWWRuza
 
гуру
22.04.22
18:26
В общем, с реиндексацией утилитой, более-менее разобрался.
Во первых, она восстанавливает все индексы, какие есть, в том числе и дополнительные. Скорее всего, их структура определяется файлами  VAL. Это, типа DD в 1С, только для одного файла DB.
Во вторых, файлы "раздутых" размеров, были скорее всего, все-таки из-за удаленных записей, так, как в эту базу ПЧ(тестовая на моем компе) грузилось не один раз, и с разных баз. Естественно, там товар/штрихкоды где-то пересекались, а где-то нет, поэтому, там удаленных записей куча. После утилиты, база сжимается, и уменьшается в объеме. Загрузив в "сжатую" базу товар с одной из маленьких баз, объем базы ПЧ не изменился почти.

Остается теперь только разобраться, как запустить переиндексацию из командной строки... Я так понимаю, что "DTUTIL32.EXE" это просто GUI к "tutil32.dll", и она по сути не нужна, надо батник писать к длл-ке, и его из под 1С(или, вообще ярлыком с рабочего стола на том компе где база) запускать...
22 MWWRuza
 
гуру
22.04.22
21:35
(9) Кстати, а может ему именно Систем32 не нравится? Система там 64 бита, может надо его в СисВау64 положить?

Да, именно так. На 64 битной винде, утилита "PsService.exe" положенная в System32, из батника, без указания пути не находится. Скопировал в SysWOW64 и все полетело. Отрабатывает батник со строкой "PsService.exe \\M-001 -u Manager -p 1978 stop[start] srvPricechecker" из 1C через КомандаСистемы.

Но, со скриптом на переиндексацию, все равно вопрос открытый :-)  
По любому, start\stop службы, и для переиндексации понадобится, так, что будем считать это первым шагом к более совершенному скрипту.
23 ДедМорроз
 
22.04.22
21:50
Самый простой вариант - скрипты положить на клиентскую машину,а зарускать через создание процесса по wmi.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший