среда, 29 июля 2015 г.

Остановка зависшего сервиса в Windows

Чтобы остановить сервис, зависший в состоянии starting или stopping (в этом случае команды net start/stop не работают), делаем следующее:

1. Открываем командную строку:
Пуск -> Выполнить -> вводим cmd.exe и нажимаем Ввод.

2. Узнаем PID (Process ID) сервиса:
В cmd.exe выполняем следующий код:
sc queryex SERVICENAME
где SERVICENAME - имя зависшего процесса, можно посмотреть в списке сервисов. Например для сервиса очереди печати (Print spooler) имя процесса - spooler.

3. Убиваем процесс:
Выполняем в cmd.exe следующий код:
taskkill /PID PROCESS_PID_NNN /F
где PROCESS_PID_NNN - номер процесса для остановки.

upd. Для windows 2003 server встретилась ситуация, когда при установке обновлений индикатор прогресса останавливается насовсем, при этом в процессах присутствует WmiPrvSE.exe (кушает от 25 и выше % процессорного времени).  В этом случае убивать сервис автоматического обновления не надо.
Необходимо удалить процесс WmiPrvSE.exe, и установка обновлений продолжится дальше. 

четверг, 9 июля 2015 г.

1С и 1С++: пометка на удаление документов определенного вида до определенной даты

Необходимо: Пометить 200 тыс. документов вида "кпкЗадание" на удаление. Документ не принадлежит ни к одной из компонент.

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

F=CLOSED                |Flag document is clo    |Y   |0     |0
F=ISMARK                |Doc is Marked for De    |L   |0     |0
  
CLOSED - Флаг проведения документа. Для каждого набора компонент свое значение (аналогично полю APPCODE). Значение последнего бита отвечает за флаг проведения документа. Тип - Число(1). 
ISMARK - Флаг пометки на удаление. 0 - не помечен, 1 - помечен. Тип - Число(1,0) (бинарное значение).
 
Источники:
http://www.skalnyy.com/1c-sql-bystroe-udalenie-dokumentov/ 
http://www.script-coding.com/Direct_queries.html#3.
http://www.script-coding.com/v77tables.html#1.2.4.

Текст модуля:

выбДата = Формат(ДобавитьМесяц(РабочаяДата(), -6), "ДГГГГММДД");
ТекстЗапроса = "
    |UPDATE
    |    _1sjourn
    |SET
    |    ismark = 1, closed = 0
    |WHERE
    |    (Date_Time_IDDOC<'"+выбДата+"')

    |AND
    |    IDDocDef=$ВидДокумента.кпкЗадание
    |";
Query = СоздатьОбъект("ODBCRecordSet");  
Возвр = Query.Выполнить(ТекстЗапроса);
Если Возвр = 0 Тогда
    глКомментарий(Query.GetLastError(),0,,"!");
КонецЕсли;
Query.Закрыть();

понедельник, 6 июля 2015 г.

1С++ и 1С 7.7: выборка документов за определенный период

В примере - выборка документов вида "Маршрут доставки" до определенной даты (6 мес.):


выбДата = Формат(ДобавитьМесяц(РабочаяДата(), -6), "ДГГГГММДД");

//
ТекстЗапроса = "
|SELECT
|    Док.IDDOC AS [МаршрутДоставки $Документ.МаршрутДоставки]
|FROM
|    $Документ.МаршрутДоставки AS Док (NOLOCK)
|INNER JOIN
|    _1SJourn AS Журнал ON (Док.IDDOC = Журнал.IDDOC)
|WHERE
|    Журнал.DATE_TIME_IDDOC < '" + выбДата + "'
|";
   
рс = СоздатьОбъект("ODBCRecordset");
тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
   
Сообщить(тз.КоличествоСтрок());


P.S. Для таких простых прямых запросов выигрыша в скорости по сравнению со стандартными методами 1С практически нет.

* Полная документация по прямым запросам здесь: http://www.script-coding.com/Direct_queries.html

пятница, 3 июля 2015 г.

Заполнение шаблонов Excel из 1С

Требуется: Заполнить готовую книгу Excel с кучей формул и форматированием из 1С.

Решение: Просматриваем из 1С все листы, и в ячейки с примечаниями (комментариями)  записываем результат формулы, указанные в этих же ячейках.

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


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

Идея: http://infostart.ru/public/16466/

Текст примера под катом, функция ЗначениеПоказателя() и переменная ФайлШаблона - в фрагменте не описаны.