18 | 10 | 2017

 Visual Foxpro и 1С - как организовать обмен 

Задача, которую довольно часто необходимо реализовать. Например надо обмениваться  списком сотрудником, а также их реквизитами(адрес, паспорт и т.д.) из справочника "Сотрудники" или любых других справочников 1С и программы на Visual Foxpro . 

Существует как минимум 2 способа , но требуется знания встроенного языка 1С, как же без этого,  либо сторонней помощи программиста, знающего 1С.

1. Взаимодействие с 1С через OLE.
При этом Вы в Visual Foxpro  создаете обьект 1С и даете ему команды на языке 1С, при этом можете выполнять любые манипуляции с базой 1С, создавать и проводить документы, добавлять элементы справочников и т.д. Соответственно можете также читать любые необходимые данные из 1С.

Важно. Способ требует сетевой версии 1С, либо (в случае с локальной версией) отсутствия работающих с 1С пользователей в момент взаимодействия с Visual Foxpro. Тоесть необходим расшаренный доступ.

2. Обмен данными через файловую систему.
В Visual Foxpro пишем процедуру выгрузки необходимых данных в файл, (текстовый или DBase). В 1С соответственно пишем процедуру загрузки этих данных.

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

Еще один способ  - стандартно через COM
А если передать какие нибудь данные ,ТО через третье приложение (Excel, access, dbf, sql server и подключатся к ним через ADO)

Наименее трудоемкая вещь - OLE, затраты времени и сил вдвое (если не больше...) уменьшаются, по-сравнению с файловым методом. 

Однако OLE медленная штука.  Нужно использовать либо ODBC, либо ADO драйвер и читать данные прям из базы Visual Foxpro. 

Использование OLE, более перспективно, объясняется это тем что позволяет избежать множества ошибок которые можно было бы получить при использовании например того же ODBC. При этом подразумевается что при использовании Фокса вы все таки имеет опыт работы с 1С и вледеете достаточными знаниями для разработки или редактирования 1С, поскольку вам придется непосредственно работать с объектами 1С.

Основные преимущества, благодаря которым OLE активно используется:

    • Объектами вызываемой базы можно управлять всеми известными методами работы с объектами в 1С (т.е. со справочниками работают методы ВыбратьЭлементы(), ИспользоватьДату() и т.п., с документами - ВыбратьДокументы() и т.п.), соответственно, следовательно можно напрямую решить - стоит отрабатывать конкретные объекты базы OLE или пропустить их.

  • Для вызывающей базы все равно  какой тип вызываемой базы (SQL или DBF ) 

Пример.  Присоединение к базе 1С через OLE.

БазаОле=СоздатьОбъект("V77.Application");// Получаем доступ к OLE объекту 1С


Теперь, мы должны знать несколько параметров для запуска базы OLE: Каталог базы, имя пользователя и пароль. Ну, наверное, еще и желание запустить 1С в монопольном режиме :)
Далее вместо термина "вызываемая база" будет написано просто "база OLE", а вместо термина "вызывающая база" - "местная база"

КаталогБазыОЛе  = "C:\program files\1cv77\МояБаза\";
ПользовательОле = "Администратор";
ПарольОле       = "qwerty";
МонопольныйРежимOLE = " /m"; // для немонопольного запуска указать пустую строку!
ЗапускБезЗаставки = 1;       // для появления заставки (например, чтобы наблюдать
                             // процесс запуска базы OLE визуально) поставьте здесь "0"
РезультатПодключения = БазаОле.Initialize ( БазаОле.RMTrade , "/d" +
                       СокрЛП(КаталогБазыОле) + " /n" + СокрЛП(ПользовательОле)+
                       " /p" + СокрЛП(ПарольОле) + МонопольныйРежимOLE,
                       ?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW",""));
Если
 РезультатПодключения = 0 Тогда
     Предупреждение("Не удалось подключится к указанной базе - проверьте вводные!");
КонецЕсли;

 

Комментарий: функции СокрЛП() стоят в примере на случай, если пользователь захочет указанные выше переменные сделать в форме диалога, а проблема при этом состоит в том, что в алгоритм программа передаст полное значение реквизита (т.е. допишет в конце значения то количество пробелов, которое необходимо для получения полной длины строки (указана в свойствах реквизита диалога)).