Статья крайне хорошая и дополнения о базе ДБФ очень полезны. Я как раз сейчас оптимизирую одну ДБФ базу и это мне очень пригодилось. Но есть и некоторые неточности:
1) Подключение к базе. Там такой текст:
Цитата:Для DBF версии рекомендуется использовать объект “ OLEDBData”(для версии 1С++ 2.0.0.0 и выше) следующим образом:
База = СоздатьОбъект("OLEDBData");
Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN=""";
Рез = База.Соединение(Соединение);
Запрос = База.СоздатьКоманду();
RS = СоздатьОбъект("ODBCRecordset");
SQL версия не требует дополнительной инструкции подключения к базе
//RS.УстБД1С();
ТекстЗапроса = "
|SELECT
| Спр.Code as Код,
| Спр.Descr as Наименование
|FROM
| sc433 as Спр";
ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
ТЗ.ВыбратьСтроку();
Для подключения к БД используется OLEDBData, а для выполнения запроса ODBCRecordset. Естественно, это не работает...
Плюс, строка подключения некорректная (хотя и работает). Например, строковые константы указаны неправильно (две кавычки в тексте 1С превращает в одну). Также в строке есть ненужные параметры. Вот про строку подключения из МСДН:
Цитата:After the connection is open, you can query the value of ConnectionString to determine the data source evaluated.
A connection string includes the following attribute keywords and values:
Provider= cVFPOLEDBProvider
Specifies the Visual FoxPro OLE DB Provider (VFPOLEDB).
Data Source= cPath
Specifies the path to the Visual FoxPro database or a folder containing free tables. For example, c:\Microsoft Visual FoxPro\Samples\Data\Testdata.dbc
DSN= cDSNName
Specifies an existing ODBC DSN.
Mode= cMode
Specifies one of the following: Read, ReadWrite, Share Deny None (default), Share Deny Read, Share Deny Write, or Share Exclusive, which includes the previous two modes.
For a complete explanation of connection string syntax, see the Microsoft OLE DB 2.5 Programmer's Reference and SDK Guide.
Также есть неточность здесь:
Цитата:И еще: в DBF версии в модуле проведения ЗАПРОСЫ НЕ РАБОТАЮТ! Т.к. при этом происходит начало транзакции и драйвер FoxPro не может ничего получить из базы.
На самом деле в модуле проведения запросы работают. Но есть тонкости: выбирать данные из регистра нужно ДО того, как в модуле проведения будет как-либо произведена запись в регистр. После записи в регистр 1С запрещает блокировать таблицу регистра и Fox не может из нее вытащить данные. Запись в регистр происходит, например, при выполнении ДвижениеПриходВыполнить и ПРИ УДАЛЕНИИ ДВИЖЕНИЙ перед перепроведением документа. Поэтому, чтобы можно было использовать запросы в модуле документа, нужно отключить автоматическое удаление движений в "Конфигураторе". Соответственно, при выборке остатков нужно из них, в определенных случаях, вычитать собственные неудаленные движения документа. После выборки данных из регистра удаляем движения документа самостоятельно и делаем проведение с использованием собранных прямым запросом данных.
Вообще, Fox не может вытащить данные потому, что пытается заблокировать таблицу перед чтением. Если 1С ее занимает, то блокировка не удается. Из-за этого, в частности, прямые запросы не работают, если пытаются вытащить данные из регистра, по которому в текущий момент проводится документ. Меня это сильно разозлило - ведь 1С спокойно формирует отчеты по регистрам в момент проведения документов. Немного поковырял драйвер OLE DB (vfpoledb.dll) и повырезал там вызовы функции LockFile. В результате, теперь прямые запросы работают, даже если в этот момент проводится документ. Вероятно, и запросы к регистру в модуле проведения будут работать после модификации самого регистра. Естественно, такой драйвер нельзя использовать для записи данных в таблицу ДБФ - можно обгадить базу.
Также этот патч решает потенциальную проблему: ведь Fox при выполнении запроса блокирует таблицу. Соответственно, если вдруг кто-то захочет провести документ по регистру, по которому формируется запрос, то его ждет облом. Что при этом будет с 1С - не знаю, но для 1С это явно будет нештатная ситуация. Возможно, такой патч - это аналог скульного NOLOCK'а для ДБФ.