Я часто использовал статьи из ИнфоСтарт в своей работе. Теперь и мне есть чем поделиться с сообществом 1С.
Мне была поставлена задача перевода на платформу «1С: Предприятие» (конфигурация местная и не имеет значения) программы «Зарплата» (тоже местная разработка), написанная на FoxPro 2.x /32 с файлами DBF/FPT.
Fox я знаю давно и не понаслышке. Писал серьезные проекты на нем. Ну а в 1С разработчики внедрили отличный механизм «Внешние источники данных». Вот и решил я поработать с DBF/FPT через данный механизм.
Замечание: для работы с ODBC/32 требуется именно 1C/32. И без вариантов.
Для работы нужно найти и скачать драйвер ODBC/32 для VFP версии 6.01.8629.01 (похоже подойдет любая версия 6.*):
64-х-разрядного драйвера я не нашел. Похоже, его «Майк» не разрабатывал ввиду существующих косяков в уже написанных версиях драйвера ODBC/32.
Наиболее известная из них:
-
Ошибка при открытии DBF с полями, внутри которых имеется символ/ы подчеркивания, типа: «fld_1».
-
Драйвер VFP 6.* ODBC/32 при открытии такого файла дает ошибку (я перепробовал все версии и до 6.*, которые только удалось найти за сутки):
-
И как только убираем из запроса поля с подчеркиваниями, - вуаля – результат с мемо-полями:
Но ведь когда-то я писал на Fox-е. И писал даже библиотеки *.fll/16 на Watcom/С (x16).
Поэтому я задумался над возникшей проблемой…
Многое уже под/забылось и решил я «пошариться» в Сети.
Вот очень нужная статья:
https://independent-software.com/dbase-dbf-dbt-file-format.html
Самое важное из нее:
-
Описание заголовка DBF (нам нужен нулевой байт, Version byte)
-
Таблица типов DBF-файлов (нулевой байт):
-
И абзац:
В переводе:
Хочу особо подчеркнуть:
Файлы memo-полей FPT (FoxPro/DOS) и DBT (dBase3+) полностью одинаковые внутри до версии Visual FoxPro!
Вот она, ВОЗМОЖНОCТЬ работать через драйвер dBase ODBC/32!
Осознав данность, мне оставалось только надеяться, что у dBase ODBC/32 не будет косяков:
-
с полями с подчеркиванием
-
с memo-полями
Из моего опыта разработок (Fox, 1С и других платформ), уже существующие базы данных можно смело модифицировать в сторону добавления нужных полей (как и для промежуточных XLS-файлов, которые используются при обмене с другими системами; да… еще и такое имеется).
Теперь мне для опыта нужен был файл, сделанный в старом dBase3+ с memo-полем.
Опять «пошарил» Сеть.
Остановился на «Sdbf 4.5.exe» по причине его бесплатности и возможностей:
Создал в нем файл dBase3+ «test.dbf»:
Данный файл прекрасно открывался в VFP 6.0 (под который «Майк» и написал драйвер VFP ODBC/32):
Версия VFP:
Данный файл также прекрасно открывался и работал в нужной мне «Зарплате» под FoxPro/DOS:
Теперь нужно было проверить работу с данным файлом через «Внешние источники данных» «1С: Предприятие».
-
Настройка драйвера ODBC/32 dBase3+:
-
Создание конфигурации управляемого приложения «1С: Предприятие» (в «Толстом клиенте» сервис «очень куцый», хотя мне нужно получать инфу именно для конфига 1С в «Толстом клиенте»; вариант: реализация обмена через http-сервис 1С).
Замечание: добавляю описываемый пример в уже частично разработанную свою конфигурацию без удаления объектов 1С, не мешающих для раскрытия темы данной статьи.
-
Буду использовать подсистему «Администрирование»
-
«Внешний источник данных» dBase:
-
Далее командами (по Конфигуратору 1С):
-
На элементе дерева «Таблицы» => «Правая мышь» => «Добавить»:
-
-
«Далее» => +заполняем:
-
«ОК» => +выбираем:
Обязательно нужно ставить галочку на «Только чтение» на всю таблицу DBF, так как стандартные индексные файлы CDX/foxpro использовать не будем и даже никак не рекомендую при любом раскладе через ODBC/32 – получите разрушение индекса CDX если не сразу, то, как пить дать (!), во время совместной работы FoxPro + ODBC/1C.
Примечание: информацию по типу «Внешние источники данных» ищите в Сети самостоятельно.
Примечание: «Поле ключа» лучше не заполнять. Тогда всегда открывается стандартный просмотр 1С по внешнему источнику данных (для работы он не нужен).
Иначе, при указании полей, может возникнуть проблема дублирования при отображении стандартного списка 1С:
-
«Готово» => +добавляю в подсистему «Администрирование»:
-
По Конфигуратору 1С всё.
-
Запускаем «1С: Предприятие» и выбираем «Администрирование».
-
Параметры подключения к dBase3+ ODBC/32 приходится вводить заново:
-
Доступ к данной форме можно получить в любой момент через «Функции для технического специалиста» => «Стандартные» «Управление внешними источниками данных» (при наличии определенных прав доступа):
-
После настройки «Системного DSN» жмем «Подключиться» и «Оп ля!» - полностью доступная таблица test.dbf + test.dbt с полями с подчеркиванием и memo-полем с подчеркиванием:
Параметр подключения выбирайте такой (все пустое):
Простейший запрос на агрегатную функцию «Количество» работает без проблем:
Итак, проверка на совместимость DBF+DBT по ODBC/32/1С + FoxPro/DOS + FoxPro/Win завершена.
Все в тесте работает великолепно!
Теперь это нужно применить к реальным файлам старой «Зарплаты» и решить поставленную задачу, сохранив возможность работоспособности «и старого и нового».
В первую очередь нужно составить список таблиц, которые содержат:
-
Поля с подчеркиванием
-
Memo-поля
Ну, с мемами – все ясно – по расширению FPT.
Их у меня оказалось 15 штук.
Общий размер таких файлов DBF+FPT оказался небольшим – всего 308 Mb.
Время копирования таких файлов в отдельную папку (под отдельные имена) – всего 1 сек.
FoxPro открывает файлы «в шаринге», значит копирование (без блокировки) может осуществляться свободно.
Создал подкаталог «copyfpt» и сунул туда данные файлы.
Один из вариантов реализации уже начинает вырисовываться… Отлично…
Еще 4 dbf-файла оказались с именами полей через «подчеркивание» (проверял через VFP).
Стоп! А будет ли работать dBase/3+ ODBC/32 для файлов без memo-полей?
Делаю тесты и, о Чудо! – нахожу вариант, где с последними 4-мя файлами (без memo, с подчеркиванием в именах полей) не нужно вообще ничего делать! И запросы 1С работают!
Расскажу «как это сделать» (для файлов FoxPro/DOS без memo-полей):
-
Настраиваете «Системный DSN» по оригинальному драйверу «Microsoft FoxPro VFP Driver»:
-
Открываете в Конфигураторе 1С нужный «Внешний источник данных» и подключаетесь к нему по «DSN = Fox».
-
Через данный драйвер будут видны все поля таблицы DBF-файла
-
Через драйвер dBase поля таблицы недоступны!
-
-
При работе в режиме тонкого клиента «1С: Предприятие» подключаетесь к нужным файлам уже через драйвер «DSN=dBase».
-
Всё! Запросы 1С (по файлам dbf без memo-полей) работают «на ура!»:
Та-а-ак…
Мне осталось получить доступ через dBase/3+ ODBC/32 к остальным 15 файлам с «мемами».
В первую очередь нужно «скормить» драйверу dBase/3+ ODBC/32 файлы DBF/FPT, созданные в FoxPro/DOS.
Через 16-ти-ричный редактор смотрю заголовок одного оригинального файла с «мемами»:
По таблице в начале статьи это:
Запишем вместо «0xF5» символ «0x83»:
Ведь в нашем первом файле test.dbf + test.dbt:
Ну и, конечно, переименуем расширение файла FPT на DBT.
С переименованием проблем нет ни в FoxPro:
Ни в 1С (пример):
Осталось подменить нулевой байт заголовка DBF-файла.
Процедура для FoxPro (адаптирована из другой):
Аналогичная функция для 1С:
Проверяю работу файла с подмененным заголовком и переименованным расширением memo-файла с FPT на DBT и «вуаля» - работает без проблем:
Осталось сделать полуавтоматическую работу в «1С: Предприятие» по варианту:
-
Перед каждым запросом (продолжительность порядка 1 сек):
-
Копирование по списку DBF/DBT с переименованием в тот же каталог «Зарплаты» в имена с префиксом «подчеркивание» (или конкретного файла, который используется в запросе, время снизится до миллисекунд).
-
Подмена нулевого байта заголовков DBF на 0x83 (за мгновение).
-
-
Публикация внутреннего http-сервиса 1С по данной конфигурации для возможности работы из толстого клиента нужной мне конфигурации 1С.
Сказано – сделано.
Проверка – и 100% результат доступа через драйвер dBase/3+ ODBC/32 ко всем файлам старой зарплаты из 1С через «Внешние источники данных».
Стандартный «просмотрщик» для таких объектов не всегда работает, так как для стандартного отображения в 1С нужна сортировка по уникальному полю без дублирования. А этого стандарт DBF не обеспечивает от слова «совсем». Реализуется необходимая уникальность программистом FoxPro только на этапе проектирования таблиц. И то не всегда и не для всех таблиц.
Но мне нужна только выборка по запросам 1С, которые прекрасно работают. Так что…
Проблема решена.
Но у такого Решения есть недостаток.
Это – дополнительное копирование.
Благо, у меня общий размер файлов небольшой.
Ну а вдруг – огромный у кого-то!
И есть ли «Вариант без копирования файлов»?
Вариант имеется.
И вот основания данного Утверждения (по моему опыту и знаниям синтаксиса FoxPro).
-
Файлы в FoxPro обычно открываются «в коде FoxPro» по ИмениФайла либо «без», либо «с» расширением DBF.
-
Memo-файл открывается исходя из управляющего нулевого байта заголовка DBF-файла.
-
-
FoxPro 2+ прекрасно работает с файлами DBF/DBT формата dBASE/3+.
-
Проверил на FoxPro/DOS и на VFP/Win.
-
-
Удивительно, но FoxPro прекрасно открывает автоматически файлы DBF/DBT и индексы CDX(!):
Открытие в FoxPro/DOS:
Открытие его же в VFP/Win:
Этого от Fox-а я и сам не ожидал. Вау…
-
Индексы CDX через ODBC/32 не используем и таблицы - «Только чтение».
Поэтому, сделав предварительно полный архив для последующего восстановления всей системы, можно пробовать вариант полной подмены файлов с memo-полями по приведенному варианту.
Но для меня и предыдущий вариант полностью подходит (по времени исполнения запросов).
А времени на полную замену и последующую проверку работоспособности старой «Зарплаты» с подмененными файлами у меня нет. Но если кому-то будет нужно – вариант описан.
Так что – «Стоп машина!»
Итого:
-
1С-ке я «скормил» все файлы от FoxPro/DOS
-
Все «скульные» запросы 1С работают без проблем
-
Можно работать в 1С не отвлекаясь на FoxPro/DOS «на лету»
Статья вышла большая, но как смог, так и написал.
Мониторить «коменты» и отвечать не будет времени. Простите заранее.
Так что – дерзайте далее самостоятельно…
Ну а вибрациям в словах благодарности буду только рад.
С уважением ко всем вам,
Ваш Коллега 1С-ник.