пятница, 26 марта 2010 г.

Как программно зарегистрировать базу данных в списке баз 1С 8

Этой статьей я хочу открыть новое направление в блоге, касающееся моей непосредственной работы. Это направление называется 1С: Предприятие - надеюсь оно найдет своих читателей :)


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

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


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


Пример командной строки:


ПолныйПутьДо1С\1cv8.exe createinfobase File=C:\newBase\ /AddInList NewDB


где
File - это путь к новой базе. Каталога может не существовать, программа создаст его сама. Если каталог существовал раньше, то он должен быть пустым, иначе база не создастся. Также хочу заметить, что у вас могут возникнуть проблемы с запуском 1С с указанием в качестве путей каталогов с пробелами, поэтому лучше не искушать судьбу и придумывать названия каталогов попроще. Впрочем, такие проблемы у меня были, когда я пытался запускать 1С с параметрами из командной строки. Когда это делалось программно из самой 1С, то все работало без проблем с любыми каталогами.
/AddinList - ключ, который сообщает системе имя, под которым зарегистрируется база данных в 1С, т.е. то, что вы будете видеть в списке БД 1С при запуске. В данном случае имя у нас NewDB

Код регистрации новой БД в 1С будет выглядить примерно следующим образом:


ПолныйПутьДо1С = "C:\Program Files\1cv81\bin\";
СтрокаЗапуска = ПолныйПутьДо1С + "1cv8.exe createinfobase File=C:\newBase\ /AddInList NewDB";
ЗапуститьПриложение(СтрокаЗапуска);


В общем-то, все достаточно просто. Проблема возникает тогда, когда нужно зарегистрировать уже существующую базу данных. Т.е. вы с ней давно уже работаете, а в списке баз 1С упоминания об этой базе нет. Если идти по предложенному выше сценарию, то мы упираемся в то, что все данные в каталоге д.б. удалены перед созданием новой базы. Понятное дело, что удалять свою базу мы не хотим, а не будем удалять старую, новая не зарегистрируется.
Тогда приходит на ум второй вариант:
1С 8-ой серии (я называю именно серия, т.к. версию ИМХО нужно называть конкретно 8.0 или 8.1 или 8.2), в отличие от версии 7.7 хранит список зарегистрированных баз в файле. Подробнее об этом можно прочитать здесь Так вот, почему бы не отредактировать этот файл, содержащий списки БД вручную, и не добавить туда информацию о нашей новой базе самостоятельно. Давайте посмотрим на структуру этого файла:
[OldDB]
Connect=File="F:\1C\1Cv8\OldDB";
ID=1cd97bfa-4e57-4a23-9ee1-073a0a28e01c
OrderInList=16384
Folder=/
OrderInTree=16384
[Enterprise]
Connect=File="F:\1C\1Cv8\1cv8.db\Enterprise";
ID=647840fa-65e0-44e8-ad40-12476f178b92
OrderInList=20480
Folder=/
OrderInTree=32768
  
Здесь мы видим описание двух баз OldDB и Enterprise. Главными параметрами являются первые две строчки описания каждой из этих баз. Это Connect и ID. Если с Connect все более менее понятно - это путь до нашей базы данных, то вот с ID загвоздка. Система генерирует его автоматически, по каким критериям - непонятно. Факт, что без него система ни в какую не будет показывать в списке ссылку на нашу базу данных, и даже если попытаться имитировать этот номер, результат будет тот же.
После недолгих раздумий пришло в голову объединить два этих варианта в один. Т.е. мы сначала создаем новую заведомо ненужную, пустую базу данных с названием ЗаготовкаБазыДанных и каталогом, что-то вроде c:\temp\tempBD. Ждем пока 1С зарегистрирует ее, а дальше лезем в список БД, находим там секцию с названием [ЗаготовкаБазыДанных], и меняем название базы данных на нужное нам, а также путь в параметре Connect. ID система поставила уже сама ;) Все!


Вот как примерно это может выглядеть в коде 1С:


ПолныйПутьДо1С = "C:\Program Files\1cv81\bin\";
СтрокаЗапуска = ПолныйПутьДо1С + "1cv8.exe createinfobase File=C:\tempBD\ /AddInList ЗаготовкаБазыДанных";
ЗапуститьПриложение(СтрокаЗапуска);
Предупреждение("Идет создание временной базы. Подождите пожалуйста", 10);// дадим 10 секунд 1С, чтобы список БД успел записаться
СписокБаз = Новый ЧтениеТекста;
НовыйСписокБаз = Новый ТекстовыйДокумент;
СписокБаз.Открыть(ПутьКСпискуБаз);
Стр = СписокБаз.ПрочитатьСтроку();
номерстроки = 1;
Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки
    Если Найти(Стр, "[ЗаготовкаБазыДанных]")>0 Тогда Стр="[NewDB]"; КонецЕсли;
    Если Найти(Стр, "c:\TempBD\")> 0 Тогда Стр="Connect=File=""C:\newBase\"";"; КонецЕсли;
    НовыйСписокБаз.ДобавитьСтроку(Стр);
    Стр = СписокБаз.ПрочитатьСтроку();
    номерстроки = номерстроки + 1;
КонецЦикла;
НовыйСписокБаз.Записать(ПутьКСпискуБаз,КодировкаТекста.UTF8);


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


На сегодня все! :)

Комментариев нет:

Отправить комментарий