По-моему уже где-то пробегало, только никак найти не могу...
Нужно из 1С:Предприятие 8.2 (8.2.13.219) определить букву подключенного по USB сканера штрих-кодов Motorola CS3000. В системе он появляется как флешка с именем CS3000. Путь к файлу с данными на этой флешке всегда постоянен, но на разных компах разное количество дисков - нужно автоматизировать получение данных для неподготовленного пользователя...
---
Да кстати от com лучше избавится как-то так
Функция GetComputers()
objWMIService = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2");
colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk");
disk = "";
Для Каждого objDisk Из colDisks Цикл
disk = disk + objDisk.VolumeName + ";" + objDisk.DeviceId + ";";
КонецЦикла;
Результат =СокрЛП(disk);
objWMIService ="";
 Возврат Результат;
КонецФункции;
---
актуальный вопрос! встречался с такой проблемой, пока решить не удалось. ждем ответов
---
щас попробую у себя найти, смысл в том, что через wmi...и по какому-то идентификатору
---
(4)(5) cool.vlad4 громадное спасибо, что откликнулись на мою проблему. Попробую Ваш вариант.
Но где-то на Инфостарте пробегала темка, связанная с паролями 1С. Там в комментариях народ предлагал хранить кодовое слово на флешке в файлике, уникальное для пользователя, как один из способов дополнительной секьюрности. И предлагалось несколько довольно несложных способов определения флешки (если ничего не путаю). Я еще тогда для себя отметил, что может пригодится - и как водится забыл...
---
Вот это http://infostart.ru/public/76282/ ?
---
Да, это оно. Как минимум это тема, которую я искал. Спасибо, буду ковырять дальше!
(8) Я перечислять не буду, что только не набиралось при поиске... Но "секрет" и "информация" точно не пробовалось... :)
---
В общем получилось. Взял из обработки "Получить ID USB" (7) скрипт, немного допилил под себя, стало такого вида:

```1c
    ScrptCtrl = Новый COMОбъект("MSScriptControl.ScriptControl");
    ScrptCtrl.Language = "vbscript";
    ScrptCtrl.addcode("
    |Function GetComputers()
    | Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    | Set colDisks = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk")
    | For Each objDisk in colDisks
    | disk = disk & objDisk.VolumeName & ";" & objDisk.DeviceId & ";"
    | Next
    | GetComputers = disk
    |End Function
    |");
    Текст = СокрЛП(ScrptCtrl.Run("GetComputers"));
```

На выходе получаю Текст = "SYSTEM;C:;DATA;D:;ITS1108U;E:;CS3000;F:;HP_SW;G:;DATA;Z:;". Я специально вынес VolumeName первым, чтоб по нему искать свой CS3000, а после него уже выбрать букву диска. В моем случае CS3000 это диск F:. Кому не подходит - меняйте местами VolumeName с DeviceId.
По-хорошему можно было бы прямо в самом скрипте проверять на содержание CS3000 в поле VolumeName и сразу получать букву диска. Но я не силен в VB, мне проще выдрать из строки нужные данные... :)
---
Тоже самое на 1С, не проверял, только, что сделал
Функция GetComputers()
objWMIService = ПолучитьCOMОбъект("winmgmts:\\" + strComputer + "\root\CIMV2");
colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk");
disk = "";
Для Каждого objDisk Из colDisks Цикл
disk = disk + objDisk.VolumeName + ";" + objDisk.DeviceId + ";";
КонецЦикла;
Возврат СокрЛП(disk);
КонецФункции;
---
сайт безобразно работает(((
сообщение второй раз пишу((
...

У себя так и не нашел, сделал просто перечисление USB устройств, но можно переделать под себя зная ID устройства. А так удобно использовать WMI creator (есть еще версия от Душелова для 1С)
strComputer = ".";
objWMIService = ПолучитьCOMОбъект("winmgmts:\\" + strComputer + "\root\CIMV2");
colItems = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive where InterfaceType='USB'",,48);
//colItems = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive",,48);
Для Каждого drive Из colItems Цикл
 ManagementObject = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + drive["DeviceID"]
          + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition");
   Для Каждого partition Из ManagementObject Цикл

    Сообщить("Partition=" + partition["Name"]);
    disks = objWMIService.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='"
             + partition["DeviceID"]+"'} WHERE AssocClass =Win32_LogicalDiskToPartition");

    Для Каждого disk Из disks Цикл
               Сообщить("Disk=" + disk["Name"]);
             КонецЦикла;
   КонецЦикла;

    Сообщить("Serial=" + drive["DeviceID"]);
  serial = objWMIService.ExecQuery("SELECT * FROM Win32_PhysicalMedia WHERE Tag='"+ drive["DeviceID"] + "'");
  //["SerialNumber"])
  Для Каждого number Из serial Цикл
    Сообщить(serial["SerialNumber"]);
  КонецЦикла;

   КонецЦикла;
---
В последних строчках , вот это
serial = objWMIService.ExecQuery("SELECT * FROM Win32_PhysicalMedia WHERE Tag='"+ drive["DeviceID"] + "'");
//["SerialNumber"])
Для Каждого number Из serial Цикл
Сообщить(serial["SerialNumber"]);
КонецЦикла;
лишнее, пардон...
---
При поиске главное запоминать ключевые фразы))) я нашел по "секретная информация"
---
Проверил 1-ую строку надо заменить на

objWMIService = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") ;
---
Да кстати от com лучше избавится как-то так
Функция GetComputers()
objWMIService = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2");
colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk");
disk = "";
Для Каждого objDisk Из colDisks Цикл
disk = disk + objDisk.VolumeName + ";" + objDisk.DeviceId + ";";
КонецЦикла;
Результат =СокрЛП(disk);
objWMIService ="";
 Возврат Результат;
КонецФункции;
---
Так, Ваш вариант мне понравился больше собственного :), так что взял его за основу и переделал под себя. Окончательный вариант:

```1c
    Функция ПолучитьДиск()
    disk = ";
    Попытка
    objWMIService = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2");
    colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk");
    Для Каждого objDisk Из colDisks Цикл
    Если СокрЛП(objDisk.VolumeName) = "CS3000" Тогда
    disk = СокрЛП(objDisk.DeviceId);
    Прервать;
    КонецЕсли;
    КонецЦикла;
    objWMIService = ";
    Исключение
    Сообщить(ОписаниеОшибки());
    КонецПопытки;
    Возврат disk;
    КонецФункции;
```
Тут я четко на выходе имею букву нужного мне диска (или пустую строку).