1c 7 ole закрыть базу
Функция ВернутьНеопределено () Экспорт
Возврат Неопределено;
КонецФункции
Функция ВернутьNULL () Экспорт
Возврат Null;
КонецФункции
Функция ВернутьИстину () Экспорт
Возврат Истина;
КонецФункции
Функция ВернутьЛожь () Экспорт
Возврат Ложь;
КонецФункции
Функция ВернутьСистемноеПеречисление ()Экспорт
Возврат( ВидДвиженияНакопления.Расход );
КонецФункции
- Клиент
- Сервер
- COM-соединение с требуемыми параметрами ищется в пуле соединений. Если найдено, то используется оно.
- Если COM-соединение с требуемыми параметрами не найдено, то анализируется не исчерпан ли лимит по числу одновременно существующих соединений. Если не исчерпан, то создается новое COM-соединение.
- Если лимит исчерпан, но при этом в пуле имеются неиспользуемые COM-соединение, то соединение, дольше всех находящееся в пуле, удаляется и создается новое COM-соединение.
- Если никаким способом найти подходящее или создать новое COM-соединение не удалось, то происходит ожидание освобождения COM-соединение другим потоком, после чего весь процесс повторяется, начиная с пункта 1.
- File с указанием пути к папке с файлом базы
- Usr с указанием имени прользователя
- Pwd с указанием пароля прользователя
КонецЕсли;
cntr = "" ;
КонецФункции
Функция УстановитьЛожь ()
ОткрытиеБазы ( "V81.Application" );
Если connection = Истина Тогда
cntr . Константы . Константа1 . Установить ( cntr . ЗначениеИзСтрокиВнутр ( "" ));
Сообщить ( cntr . Константы . Константа1 . Получить ());
Сообщить ( cntr . ЗначениеВстрокуВнутр ( cntr . Константы . Константа1 . Получить ()));
cntr = "" ;
КонецЕсли;
КонецФункции
Функция УстановитьЧисло ()
ОткрытиеБазы ( "V81.Application" );
Если connection = Истина Тогда
Чис = 0;
Если ВвестиЧисло ( Чис , "Константа1" , 12 , 2 )= 1 Тогда
cntr . Константы . Константа1 . Установить ( Чис );
Сообщить ( cntr . Константы . Константа1 . Получить ());
Сообщить ( cntr . ЗначениеВстрокуВнутр ( cntr . Константы . Константа1 . Получить ()));
cntr = "" ;
КонецЕсли;
КонецЕсли;
КонецФункции
Код denis84 --> denis84
Выполнить Там.ЗавершениеРаботыСистемы.
(как-то так. пишу по памяти) sava1 --> sava1
если все равно остается в памяти, убивать все переменные, являющиеся потомками Там = СоздатьОбъект("V77.Application"); , и сам Там тоже Talkman --> Talkman
| Текстовая версия | Сейчас: 23.11.21, 4:13 |
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!
Примечание - большая часть написанного здесь текста с примерами взята по памяти (пару лет назад изучал достаточно подробно, поэтому может что-то в алгоритмах не работать - я ведь их не копировал откуда-то, а прямо тут же и писал, так что за синтаксические ошибки не пинайте) - на данный момент я активно OLE не пользуюсь (не из-за каких-то проблем с самим OLE, а из-за отсутствия надобности в его использовании в текущий момент).
Основные преимущества, благодаря которым OLE активно используется:
- Для вызывающей базы "по барабану" - какой тип вызываемой базы (DBF или SQL)
- Объектами вызываемой базы можно управлять всеми известными методами работы с объектами в 1С (т.е. со справочниками работают методы ВыбратьЭлементы(), ИспользоватьДату() и т.п., с документами - ВыбратьДокументы() и т.п.), соответственно, можно напрямую решить - стоит отрабатывать конкретные объекты базы OLE или пропустить их.
Локальная версия (на одного пользователя): | V77L.Application |
Сетевая версия: | V77.Application |
Версия SQL: | V77S.Application |
Теперь, мы должны знать несколько параметров для запуска базы OLE: Каталог базы, имя пользователя и пароль. Ну, наверное, еще и желание запустить 1С в монопольном режиме :)
Комментарий: функции СокрЛП() стоят в примере на случай, если пользователь захочет указанные выше переменные сделать в форме диалога, а проблема при этом состоит в том, что в алгоритм программа передаст полное значение реквизита (т.е. допишет в конце значения то количество пробелов, которое необходимо для получения полной длины строки (указана в свойствах реквизита диалога)).Пример 2. Доступ к объектам базы OLE.
Запомните на будущее как непреложный факт:
- Из местной базы в базу OLE (и, соответственно, наоборот) напрямую методом присвоения можно перенести только числовые значения, даты и строки ограниченной длины. Т.е. местная база поймет прекрасно без дополнительных алгоритмов преобразования полученного значения только указанные типы значений. Кроме того, под ограничением строк подразумевается проблемы с пониманием в местной базе реквизитов объектов базы OLE типа "Строка неограниченной длины". К этому же еще надо добавить и периодические реквизиты. Естественно, под методом присвоения подразумеваются и попытки сравнить объекты разных баз в одном условии (например, в алгоритмах "Если" или "Пока" и т.п.).
- Есть проблемы при попытке перенести "пустую" дату - OLE может ее конвертировать, например, в 31.12.1899 года и т.п. Поэтому вам лучше заранее выяснить те значения, которые могут появится в местной базе при переносе "пустых" дат, чтобы предусмотреть условия преобразования их в местной базе.
Ж) Доступ к функциям и процедурам глобального модуля базы OLE!
Как же я про это забыл-то, а? Поскольку при запуске базы автоматически компилируется глобальный модуль, то нам становятся доступны функции и процедуры глобального модуля (поправлюсь - только те, у которых стоит признак "Экспорт"). Плюс к ним еще и различные системные функции 1С. А доступны они нам через функцию 1С OLE - EvalExpr(). Приведем примеры работы с базой OLE:
На самом деле, в последней строке примера я исхитрился и забежал немного вперед. Дело в том, что как и запрос (см. отдельную главу), так и EvalExpr() выполняются внутри базы OLE, причем команды передавается им обычной строкой, и поэтому надо долго думать, как передать необходимые ссылки на объекты базы OLE в строке текста местной базы. Так что, всегда есть возможность поломать голову над этим…Алгоритмы преобразования объектов в "удобоваримый вид" между базами.
Ясно, что алгоритмы преобразования нужны не только для переноса объектов между и базами, но и для такой простой задачи, как попытки сравнить их между собой.
И еще раз обращу внимание: ОБЪЕКТЫ ОДНОЙ БАЗЫ ПРЕКРАСНО ПОНИМАЮТ ДРУГ ДРУГА, ПРОБЛЕМЫ ВОЗНИКАЮТ ТОЛЬКО ТОГДА, КОГДА ВЫ НАЧИНАЕТЕ СВЯЗЫВАТЬ МЕЖДУ СОБОЙ ОБЪЕКТЫ РАЗНЫХ БАЗ, т.е. команда
ДокОле . Фирма = СпрОле . ТекущийЭлемент ();
// где ДокОле - документ базы OLE, а СпрОле - справочник "Фирмы" базы OLE
будет прекрасно работать без ошибок. Не забывайте это, чтобы не перемудрить с алгоритмами!
Итак, повторяюсь, что напрямую перенести, да и просто сравнить можно только даты (причем не "пустые"), числа и строки ограниченной длины. Итак, как же нам сравнить объекты разных баз (не числа, не даты, не строки), т.е. как их преобразовать в эту самую строку/число/дату.
Связь программы 1С Предприятие 7.7 с другой базой 1С (OLE)
Страшно не люблю этого делать, но иногда всё-таки приходится связываться из 1С с другой базой 1С. Из моего опыта это приходилось делать в таких случаях:
- Консолидация данных.
- Перенесение данных из одной конфигурации в другую.
- Вытаскивание данных, которые безвозвратно утеряны в рабочей базе, из архивной базы.
На этой странице я расскажу о методе соединения из одной базы 1С с другой базой 1С, а также приведу примеры программного кода, с помощью которого можно производить обмен данными.
Подключиться или соединиться с другой базой 1С:Предприятие 7.7
//подключение к другой базе 1С:Предприятие через OLE
Функция гБаза_Подключить ( Оле , Путь , Логин , Пароль , ФлагХорошо = 0 ) Экспорт
Если ПустаяСтрока( Путь )= 1 Тогда
Предупреждение( "Не указан Путь к базе!" );
Возврат( 0 );
ИначеЕсли ФС. СуществуетФайл ( Путь + "\1Cv7.MD" )= 0 Тогда
Предупреждение( "База данных по указанному пути не обнаружена!" );
Возврат( 0 );
КонецЕсли;
//строка запуска
Оле =СоздатьОбъект( "V1CEnterprise.Application" );
СтрокаЗапуска = "/d" + Путь ;
Если ПустаяСтрока( Логин )= 0 Тогда
СтрокаЗапуска = СтрокаЗапуска + " /n" + Логин ;
Если ПустаяСтрока( Пароль )= 0 Тогда
СтрокаЗапуска = СтрокаЗапуска + " /p" + Пароль ;
КонецЕсли;
КонецЕсли;
//подключение
Удача = Оле . Initialize ( Оле . RMTrade , СтрокаЗапуска ,);
Если Удача = 0 Тогда
Предупреждение( "Ошибка соединения!" );
Возврат( 0 );
ИначеЕсли ФлагХорошо = 1 Тогда
Предупреждение( "Соединение выполнено успешно" );
КонецЕсли;
Возврат( 1 );
КонецФункции
Импорт данных в 1С из другой базы 1С
Довольно часто возникает необходимость передать данные из одной базы в другую. Именно для таких целей можно использовать нижеприведённые примеры, в которых показано, как получать некоторые данные из базы, с которой установлено соединение посредством механизма OLE Automation.
//получение значения субконто текущей базы из запроса к бухгалтерским итогам другой базы через OLE
//аргументы: Б - бухгалтерские итоги, Номер - номер субконто в выборке
Функция Субконто_Получить ( Б , Номер )
Значение = Б . Субконто ( Номер );
//тип
Ч =СчетПоКоду( Б . Счет . Код );
Тип = Ч . ВидСубконто ( Номер ). ТипСубконто ();
Если Найти( "Число,Строка,Дата" , Тип )> 0 Тогда
Возврат( Значение );
ИначеЕсли Значение . Выбран ()= 0 Тогда
Сообщить( Ч . Код + ": Не выбрано значение " + Тип , "!" );
Возврат ПолучитьПустоеЗначение( Тип );
КонецЕсли;
//вид
Позиция =Найти( Тип , "." );
Если Позиция > 0 Тогда
Вид =Сред( Тип , Позиция + 1 );
Тип =Лев( Тип , Позиция - 1 );
Иначе
Вид = Значение . Вид ();
КонецЕсли;
ТипВид = Тип + "." + Вид ;
//поиск
Если Тип = "Справочник" Тогда
Если Метаданные. Справочник ( Вид ). ДлинаКода = 0 Тогда
Сообщить( Ч . Код + ": " + ТипВид + ": Коды не используются" , "!" );
Возврат ПолучитьПустоеЗначение( ТипВид );
ИначеЕсли Метаданные. Справочник ( Вид ). Владелец . Выбран ()= 1 Тогда
Сообщить( Ч . Код + ": " + ТипВид + ": Не найден элемент по владельцу" , "!" );
Возврат ПолучитьПустоеЗначение( ТипВид );
КонецЕсли;
//поиск
ТекКод = Значение . ПолныйКод ();
С =СоздатьОбъект( ТипВид );
Если С . НайтиПоКоду ( ТекКод , 2 )= 1 Тогда
Возврат( С . ТекущийЭлемент ());
Иначе
Сообщить( Ч . Код + ": Не найдено: " + ТипВид + ".ПолныйКод !" );
Возврат ПолучитьПустоеЗначение( ТипВид );
КонецЕсли;
ИначеЕсли Тип = "Документ" Тогда
ТекНомер =СокрЛП( Значение . НомерДок );
ТекДата = Значение . ДатаДок ;
//поиск
Г =СоздатьОбъект( ТипВид );
Если Г . НайтиПоНомеру ( ТекНомер , ТекДата )= 1 Тогда
Возврат( Г . ТекущийДокумент ());
Иначе
Сообщить( Ч . Код + ": Не найдено: " + ТипВид + ": " + ТекНомер + " (" + ТекДата + ")" , "!" );
Возврат ПолучитьПустоеЗначение( ТипВид );
КонецЕсли;
ИначеЕсли Тип = "Перечисление" Тогда
К =СоздатьОбъект( ТипВид );
Возврат К . ЗначениеПоИдентификатору ( Значение . Идентификатор ());
КонецЕсли;
КонецФункции
//получение элемента справочника текущей базы
//аргументы: Значение - элемент справочника базы, с которой выполнено соединение через OLE
Функция Справочник_Получить ( Значение )
Справочник = Значение . Вид ();
ТекКод = Значение . ПолныйКод ();
Если ПустаяСтрока( ТекКод )= 1 Тогда
Возврат ПолучитьПустоеЗначение( "Справочник." + Справочник );
КонецЕсли;
//справочник
С =СоздатьОбъект( "Справочник." + Справочник );
Если С . НайтиПоКоду ( ТекКод , 2 )= 1 Тогда
Возврат( С . ТекущийЭлемент ());
Иначе
Сообщить( "Не найдено: Справочник." + Справочник + ".ПолныйКод Справочник." + Справочник );
КонецЕсли;
КонецФункции
Резюме
В статье представлены образцы программного кода, который используется для установления связи между двумя базами данных, обслуживаемыми программой "1С:Предприятие".
Читайте также: