Главная » Тарифы » Что такое ole в 1с. Доступ к объектам базы данных

Что такое ole в 1с. Доступ к объектам базы данных

Примечание - большая часть написанного здесь текста с примерами взята по памяти (пару лет назад изучал достаточно подробно, поэтому может что-то в алгоритмах не работать - я ведь их не копировал откуда-то, а прямо тут же и писал, так что за синтаксические ошибки не пинайте) - на данный момент я активно OLE не пользуюсь (не из-за каких-то проблем с самим OLE, а из-за отсутствия надобности в его использовании в текущий момент).

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

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

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

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

Пример 2. Доступ к объектам базы OLE.

Запомните на будущее как непреложный факт:

  1. Из местной базы в базу OLE (и, соответственно, наоборот) напрямую методом присвоения можно перенести только числовые значения, даты и строки ограниченной длины!!! Т.е. местная база поймет прекрасно без дополнительных алгоритмов преобразования полученного значения только указанные типы значений. Кроме того, под ограничением строк подразумевается проблемы с пониманием в местной базе реквизитов объектов базы OLE типа "Строка неограниченной длины". К этому же еще надо добавить и периодические реквизиты. Естественно, под методом присвоения подразумеваются и попытки сравнить объекты разных баз в одном условии (например, в алгоритмах "Если" или "Пока" и т.п.).
  2. Есть проблемы при попытке перенести "пустую" дату - OLE может ее конвертировать, например, в 31.12.1899 года и т.п. Поэтому вам лучше заранее выяснить те значения, которые могут появится в местной базе при переносе "пустых" дат, чтобы предусмотреть условия преобразования их в местной базе.
A) Доступ к константам базы OLE: Б) Доступ к справочникам и документам базы OLE (через функцию "CreateObject"):

После создания объекта справочника или документа к ним применимы все методы, касающиеся таких объектов в 1С:

Заметьте, что если вместо "Сообщить(Спр.Наименование)" вы укажете "Сообщить(Спр.ТекущийЭлемент())" , то вместо строкового/числового представления этого элемента программа выдаст вам в окошке сообщение "OLE". Именно это я и имел в виду, когда говорил, что напрямую мало что можно перенести. Т.е. не будут работать следующие методы (ошибки 1С не будет, но и результат работы будет нулевой). Рассмотрим следующий пример:

СпрOLE = БазаОле .CreateObject("Справочник.Фирмы" ); // это справочник в базе OLE
Док = СоздатьОбъект(); // а это документ в местной базе
Док . Новый (); // создаем новый документ в местной базе
СпрOLE . НайтиПоКоду (1 , 0 ); // спозиционируем в базе OLE
// на фирме с кодом "1".
Док . Фирма = СпрOLE . ТекущийЭлемент (); // такой метод не сработает, т.к. справа от "=" стоит
// объект не местной базы, и местная база 1С его не понимает!

Отсюда вывод: возможность доступа к объектам базы 1С через OLE требуется, в основном, только для определенной задачи - получить доступ к реквизитам определенного элемента справочника или документа. Однако, не забываем, что объекты базы OLE поддерживают все методы работы с ними, в т.ч. и "Новый()", т.е. приведем пример противоположный предыдущему:

Однако, сработает следующий метод:

СпрОле = БазаОле .CreateObject("Справочник.Фирмы" ); // создаем объект справочника базы OLE
СпрОле . НайтиПоНаименованию (Спр . Наименование , 0 , 0 ); // Или СпрОле.найтиПоКоду(Спр.Код,0);
// т.е. Спр.Код и Спр.Наименование являются обычными числовыми/строковыми значениями,
// которые понимает база OLE!
ДокОле . Фирма = СпрОле . ТекущийЭлемент (); // Вот теперь все в порядке, т.к. с обоих сторон
// метода стоят объекты базы OLE!
ДокОле . Записать (); // запишем документ в базе OLE
Если ДокОле . Провести ()= 0 тогда
Сообщить("Не смогли провести документ!" );
КонецЕсли;
В) Доступ к регистрам базы OLE (Не сложнее справочников и документов): Г) Доступ к перечислениям базы OLE (аналогичен константе):

Заметьте, что пользы для местной базы от переменной "ЗначениеПеречисленияOLE" особо-то и нет, ведь подобно справочнику и документу перечисление также напрямую недоступно для местной базы. Пожалуй, пример работы с ними может быть следующим (в качестве параметра условия):

= 1 ; // предположим, что это - флажок в форме диалога,
// который мы либо устанавливаем, либо снимаем
ДокОле = БазаОле .CreateObject("Документ.РасходнаяНакладная" );
ДокОле . ВыбратьДокументы (НачДата , КонДата ); // НачДата и КонДата - также реквизиты формы
// диалога, но база OLE прекрасно их понимает -
// ведь это же даты!
Пока ДокОле . ПолучитьДокумент ()= 1 Цикл
Если СмотретьТолькоВозвратыПоставщикам = 1 Тогда
Если ДокОле . ПризнакНакладной <> БазаОле .Перечисление. ПризнРасхНакл . ВозвратПоставщику Тогда
Продолжить;
КонецЕсли;
Иначе
Если ДокОле . ПризнакНакладной = БазаОле .Перечисление. ПризнРасхНакл . ВозвратПоставщику Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
Сообщить(ДокОле . Вид () + " № " + ДокОле . НомерДок + " от " + ДокОле . датаДок );
КонецЦикла;
Д) Доступ к счетам базы OLE: = БазаОле .ВидыСубконто. Контрагенты ;

По аналогии со справочниками и документами работает объект "Периодический", план счетов работает по аналогии с ВидомСубконто, ну и далее в том же духе… Отдельную главу посвятим запросу, а сейчас… стоп. Еще пункт забыл!

Ж) Доступ к функциям и процедурам глобального модуля базы OLE!

Как же я про это забыл-то, а? Поскольку при запуске базы автоматически компилируется глобальный модуль, то нам становятся доступны функции и процедуры глобального модуля (поправлюсь - только те, у которых стоит признак "Экспорт"). Плюс к ним еще и различные системные функции 1С. А доступны они нам через функцию 1С OLE - EvalExpr() . Приведем примеры работы с базой OLE:

ДатаАктуальностиОле = БазаОле . EvalExpr ("ПолучитьДатуТА()" );
// Возвращает дату актуальности
ИмяПользователяОле = БазаОле . EvalExpr ("ИмяПользователя()" );
// возвращает строку
// попробуем теперь получить числовое значение НДС у элемента номенклатуры
// через функцию глобального модуля ПроцентНДС(СтавкаНДС) Экспорт!
ТовОле = БазаОле .CreateObject("Справочник.Номенклатура" );
ТовОле . ВыбратьЭлементы ();
// Найдем элемент справочника (не группа!)
Пока ТовОле . ПолучитьЭлемент ()= 1 Цикл
Если ТовОле . ЭтоГруппа ()= 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
ЧисловоеЗначениеПроцентаНДСТовараОле = БазаОле . EvalExpr ("ПроцентНДС(Перечисление.ЗначенияНДС." +
ТовОле . СтавкаНДС . Идентификатор ()+ ")" );

На самом деле, в последней строке примера я исхитрился и забежал немного вперед. Дело в том, что как и запрос (см. отдельную главу), так и EvalExpr() выполняются внутри базы OLE, причем команды передавается им обычной строкой, и поэтому надо долго думать, как передать необходимые ссылки на объекты базы OLE в строке текста местной базы. Так что, всегда есть возможность поломать голову над этим…

Краткая справка по использованию OLE в 1С-Предприятии.

Для запуска системы 1С-Предприятия в качестве OLE Automation сервера из внешнего приложения выполняется следующая последовательность действий:

  1. Создается объект с OLE идентификатором (регистр символов непринципиален):
  • V1CEnterprise.Application - версия независимый ключ;
  • V77.Application - версия зависимый ключ;
  • V77S.Application - версия зависимый ключ, SQL версия;
  • V77L.Application - версия зависимый ключ, локальная версия;
  • V77M.Application - версия зависимый ключ, сетевая версия.
  • Выполняется инициализация системы 1С-Предприятие методом Initialize().
  • Вызываются атрибуты и методы системы 1С-Предприятия как OLE Automation сервера.
  • 1С-Предприятие в качестве OLE Automation сервера имеет 4 метода:

    • Initialize() - выполнить инициализацию системы 1С-Предприятие.
    • CreateObject() - Создает объект агрегатного типа данных 1С-Предприятия и возвращает ссылку на него.
    • EvalExpr() - Вычислить выражение системы 1С-Предприятие.
    • ExecuteBatch() - Выполнить последовательность операторов системы 1С-Предприятие.

    Методы:

    1. Initialize() - открыть базу.

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

    Initialize(<Имя объекта>.RMTrade, <Командная строка>, <Пустая строка>)

    <Имя объекта>.RMTrade - имя переменной и ключевое слово RMTrade.
    <Командная строка> - командная строка, в которой можно прописать путь к базе, имф пользователя и пароль.
    <Пустая строка>) - либо пустая строка, либо "NO_SPLASH_SHOW" - чтобы не показывать заставку при загрузке.

    Для того, чтобы открыть базу через OLE - необходимо создать объект с идентификатором OLE, выполнить инициализацию базы и проверить успешность выполнения инициализации. В своем примере я не указываю никаких дополнительных параметров, поэтому открывается квадратное окошко выбора базы, предлагается выбрать пользователя и ввести пароль.

    ДругаяБаза=СоздатьОбъект("V77.Application"); Открыта=ДругаяБаза.Initialize(ДругаяБаза.RMTrade,); Если Открыта=0 Тогда // True=-1, False=0. Для всех OLE команд. Сообщить("База не была открыта."); Возврат; КонецЕсли;

    2. CreateObject() - создать объект агрегатного типа.

    Этот метод создает объект агрегатного типа данных системы 1С-Предприятия и возвращает ссылку на него.

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

    CreateObject(<ИмяАгрегатногоТипа>)

    <ИмяАгрегатногоТипа> - строковое выражение, значение которого содержит имя агрегатного типа данных, заданного в конфигураторе. Например: "Справочник.Номенклатура", "Документ.ПриходнаяНакладная".

    3. EvalExpr() - вычислить выражение.

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

    EvalExpr(<СтрокаВыражения>)

    <СтрокаВыражения> - строковое выражение, записанное на встроенном языке 1С-Предприятия.

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

    4. ExecuteBatch() - выполнить последовательность операторов.

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

    ExecuteBatch(<СтрокаОператоров>)

    <СтрокаОператоров> - строковое выражение, текст программы на встроенном языке 1С-предприятия.

    Возвращает значение логического типа: TRUE, если последовательность операторов выполнена успешно, FALSE, если нет. В OLE Automation TRUE и FALSE имеют соответственно значения -1 (минус единица) и 0.

    Пример: создание документа в другой базе, открытой через OLE.

    Выгрузка происходит из обработки. ВыбДокумент - документ, выбранный пользователем для выгрузки в другую базу.

    ДругаяБаза=СоздатьОбъект("v77.application"); Открыта=ДругаяБаза.Initialize(ДругаяБаза.RMTrade,); Если Открыта=0 Тогда Сообщить("База не была открыта."); Возврат; КонецЕсли; дДок=ДругаяБаза.CreateObject("Документ.ПриходнаяНакладная"); дТовар=ДругаяБаза.CreateObject("Справочник.Номенклатура"); дДок.Новый(); дДок.ДатаДок=ВыбДокумент.ДатаДок; дДок.Фирма=ДругаяБаза.evalexpr("Константа.ОсновнаяФирма"); дДок.Склад=ДругаяБаза.evalexpr("Константа.ОсновнойСклад"); дДок.КатегорияЦен=ДругаяБаза.evalexpr("Константа.ПриходнаяКатегорияЦен"); дДок.ВариантРасчетаНалогов=ДругаяБаза.evalexpr("Константа.ОсновнойВариантРасчетаНалогов"); дДок.Валюта=ДругаяБаза.evalexpr("Константа.БазоваяВалюта");//рубли дДок.Дата_курса=дДок.ДатаДок; дДок.ТипУчета=1; дДок.Автор=ДругаяБаза.evalexpr("глПользователь"); дДок.ПризнакНакладной=ДругаяБаза.evalexpr("Перечисление.ПризнПрихНакл.Закупка"); дДок.Курс=1;//рубли дДок.Комментарий=ВыбДОкумент.Комментарий; ВыбДОкумент.ВыбратьСтроки(); Пока ВыбДокумент.ПолучитьСтроку()=1 Цикл дДок.НоваяСтрока(); ТовКод=СокрЛП(ВыбДОкумент.Товар.Код); Если дТовар.НайтиПоКоду(ТовКод)=0 Тогда Сообщить("Не найден товар с кодом "+ТовКод); Возврат; КонецЕсли; дТовар.ИспользоватьДату(дДок.ДатаДок); дДок.Товар=дТовар.ТекущийЭлемент(); дДок.Количество=ВыбДокумент.Количество; дДок.Единица=дТовар.ЕдиницаПоУмолчанию; дДок.Цена=ВыбДОкумент.Цена; дДок.Коэффициент=1; дДок.Всего=ВыбДОкумент.Сумма; дДок.Сумма=ВыбДОкумент.Сумма-ВыбДокумент.НП; дДок.СтавкаНДС=дТовар.СтавкаНДС; дДок.НДС=ВыбДокумент.НДС; дДок.СтавкаНП=дТовар.СтавкаНП; дДок.СуммаНП=ВыбДокумент.НП; КонецЦикла; дДок.УстановитьНовыйНомер(ДругаяБаза.evalexpr("Константа.ПрефиксНомеровДокументовУпрУчета")); Сообщить(""+дДок.НомерДок); дДок.Записать();

    Этот пример на 100% рабочий. Используется у меня для выгрузки документов из одной конфигурации в другую.

    Сравнение в базе OLE. Константы, перечисления, элементы справочников.

    Для сравнения значений агрегатных типов данных в базе, открытой через Оле, использовать стандартный алгоритм с использование знаков равно и неравно (=,<>) не получается. Выход простой. Необходимо перейти от сравнения агрегатных типов данных к простым типам данных - дата, строка и число.

    Отсюда вывод: мы сравниваем не сами элементы, а их уникальные атрибуты. Например, для элементов справочника - это код (если он есть), либо наименование. Для перечисления используется метод Идентификатор(). Вот два примера:

    //Сравнение реквизита номенклатуры с Константой БазоваяВалюта Если дТовар.ВалютаУчета.Код<>Другая.Константа.БазоваяВалюта.Код Тогда дТовар.ВалютаУчета=Другая.Константа.БазоваяВалюта; КонецЕсли; //Сравнение реквизита номенклатуры с перечислением Если дТовар.ТипТовара.Идентификатор()<>Другая.Перечисление.ТипыТоваров.Штучный.Идентификатор() Тогда дТовар.ТипТовара=Другая.Перечисление.ТипыТоваров.Штучный; КонецЕсли;

    Электронные таблицы, текстовые процессоры и другие программы предоставляют пользователю множество полезных возможностей. Почему бы не обеспечить доступ к ним и другому программному обеспечению при работе с привычного рабочего места бухгалтера?

    Понятие OLE Automation

    Чтобы это стало возможным, приложения должны предоставлять свои сервисы не только человеку, но и программам, т. е. они должны быть программируемыми. Обеспечение программируемости и является целью "Автоматизации" (технология OLE Automation). Приложение можно сделать программируемым, обеспечив доступ к его сервисам, через обычный СОМ-интерфейс.

    Механизм OLE был задуман как технология интеграции программных продуктов Microsoft Office. Технология OLE предоставляет нам возможность работать с объектами, созданными в других приложениях (документы, рисунки, таблицы).Основные термины, с которыми оперирует данная технология, — это OLE-объект, сервер приложения и контейнер приложения.

    OLE-объектом называют объект, созданный в другом приложении и сохранивший связь с этим приложением. Документ, редакции Word, или электронные таблицы в формате Excel — все они могут быть OLE-объектами, если будут вставлены в документ соответствующим образом. Если не вставлять их как OLE-объект, то связь с оригинальным приложением будет отсутствовать.

    Контейнером приложения OLE называют приложение, в котором создается составной документ, позволяя обрабатывать его в исходном приложении (например, таком как Word или Excel), которое использовалось для создания этого объекта.

    Сервером приложения OLE (OLE Server Application) называют приложение, создающее объекты, которые можно поместить в документ-контейнер.

    Программы — "1С:Предприятие", Microsoft Word и Excel являются приложениями, которые могут выступать и как OLE-сервер, и как OLE-контейнер. Другими словами, эти приложения могут создавать новые OLE-объекты, а такжет хранить OLE-объекты, созданные в других приложениях.

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

    Использование Automation сервера в версии 8.2

    Система "1С:Предприятие 8.2" может использоваться внешними приложениями в качестве OLE Automation сервера.

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

    Для запуска системы "1С:Предприятие" в качестве OLE Automation сервера из внешнего приложения выполняется следующая последовательность действий:

    1. Создается OLE Объект с идентификатором "V82.Application".

    2. Выполняется инициализация системы "1С:Предприятие" методом Connect .

    3. Вызываются свойства и методы системы "1С:Предприятие" как OLE Automation сервера.

    Приведем пример доступа к данным информационной базы посредством из Visual Basic скрипта

    " Подключение к БД средствами OLE Automation Set cc = CreateObject("v82.Application") cc.Connect("File=C:\1C\1S_82; usr=Администатор") " Установка видимости приложения cc.Visible = True " Задаем текст запроса Text = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты" " Создаем объект Запрос Set Query = cc.NewObject("Запрос") Query.Text = Text " Выполнение запроса Set Result = Query.Execute() Set Choose = Result.Choose() " Выборка результата выполнения запроса Do While Choose.Next() " Пример вывода сообщения в OLE-базе cc.Message(Choose.Description) Loop " Пример вывода предупреждения в OLE-базе cc.DoMessageBox "Для вопросов http://forum.amur.ru", 10,"Внимание!!!"

    Некоторые версии внешних программ, в том числе и Visual Basic Script, обращающихся к программе "1С:Предприятие" посредством OLE Automation, могут неправильно интерпретировать русские идентификаторы объектов. По этому, для обращения к свойствам и методам агрегатных типов данных системы "1С:Предприятие" из внешних приложений рекомендуется использовать их англоязычные синонимы.

    При работе в качестве OLE Automation сервера "1С:Предприятием предоставляет доступ ко всем свойствам и методам своего глобального контекста, а также позволяет включать и выключать пользовательский интерфейс (главное окно приложения). Поэтому объект OLE-сервер системы «1С:Предприятием» в качестве своих свойств может использовать: системные перечисления, значения констант, перечислений, справочников, документов и т. п., а также переменные, объявленные в модуле приложения с ключевым СЛОВОМ Экспорт.

    Кроме того, OLE Automation сервер имеет одно дополнительное свойство и два метода с целью выполнения действий, специфичных для работы в режиме OLE Automation.

    Единственное свойство visible имеет значение логического типа и позволяет управлять видимостью пользовательского интерфейса системы «1С:Предприятием». По умолчанию свойство имеет значение ложь.

    Объект OLE-сервер системы "1С:Предприятие" в качестве своих методов может использовать системные процедуры и функции, а также процедуры и функции модуля приложения и общих модулей, объявленные с ключевым словом экспорт. Кроме того, OLE-сервер системы "1С:Предприятие" имеет два дополнительных метода: Connec t и NewObject .

    Метод Connect выполняет инициализацию системы "1С:Предприятие" и имеет единственный параметр — строку, используемую для соединения с информационной базой. Метод возвращает Истина , если инициализация прошла успешно, или Ложь , если нет.

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

    " Подключение к БД файлового варианта Set FileDb = CreateObject("v82.Application") FileDb.Connect("File=C:\Progra~l\lcv8\Db\Trade; Usr=Иванов; Pwd=super") " Подключение к БД клиент-серверного варианта Set ServerDb = CreateObject ("v82.Application") ServerDb.Connect("Srvr=ServerlC; Ref=Trade; Usr=Иванов; Pwd=super")

    Рассмотрим параметры подключения к базе данных в файловом варианте.

    File — указывает на каталог базы данных.

    Usr — имя пользователя, под которым будет происходить авторизация.

    Pwd — пароль пользователя.

    Для подключения к базе данных в клиент-серверном варианте используются четыре параметра.

    Srvr — указывает имя сервера, на котором работает сервер приложений системы "1С:Предприятие";

    Ref — указывает имя базы данных на сервере приложений;

    Usr — определяет имя пользователя, под которым будет происходить авторизация;

    Pwd — пароль пользователя.

    Второй специальный метод OLE-сервера системы "1С:Предприятие" — NewObject , который создает объект агрегатного типа данных системы "1С:Предприятие" и возвращает ссылку на него. Единственный параметр метода — строковое выражение, значение которого содержит имя агрегатного типа данных, объявленного в конфигураторе.

    Доступ к объектам базы данных

    Mетод NewObject используется для создания объекта типа запрос.

    Поскольку система "1С:Предприятие" может создавать и использовать OLE Automation серверы, то из системы "1С:Предприятие" можно обращаться к другим информационным базам.

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

    База = Новый СОМОбъект("V82.Application"); База.Connect(СтрокаПодключения); // Доступ к константам Сообщить(База.Константы.ОсновнаяВалюта.Получить().Наименование); // Доступ к перечислениям Сообщить(База.Перечисления.Периодичность.День);

    Для доступа к справочникам и документам можно использовать метод NewObject . Однако можно использовать и свойства глобального контекста Справочники и Документы. После создания объекта справочника или документа к нему применимы все методы, касающиеся соответствующего объекта в среде "1С:Предприятие".

    База = Новый COMОбъект("V82.Application"); База.Connect(СтрокаПодключения); // Доступ к справочникам СправочникОLЕ = База.Справочники.Контрагенты; Выборка = СправочникОLЕ.Выбрать(); // Обход выборки элементов справочника Пока Выборка.Следующий() Цикл Сообщить(Выборка.Наименование); КонецЦикла; // Создание нового элемента справочника СправочникОLЕ = База.Справочники.Контрагенты; НовыйЭлемент = СправочникОLЕ.СоздатьЭлемент(); НовыйЭлемент.Наименование = "Алхимов Новый"; НовыйЭлемент.Записать();

    Доступ к документам производится так же, как и к справочникам.

    База = Новый COMОбъект("V82.Application"); База.Connect(СтрокаПодключения); // Поиск контрагента в OLE-базе СправочникОLЕ = База.Справочники.Контрагенты; СпрЭлемент = СправочникОLЕ.НайтиПоНаименованию("Алхимов"); // Создание нового документа ДокументОLЕ= База.Документы.ПоступлениеТоваров.СоздатьДокумент(); ДокументОLЕ.Дата = ТекущаяДата(); ДокументОLЕ.Контрагент = СпрЭлемент; ДокументОLЕ.УстановитьНовыйНомер(); ДокументОLЕ.Записать();

    В объектах OLE-базы данных можно использовать только ее же объекты. В примере, рассмотренном выше, для заполнения реквизита документа контрагент используется элемент справочника контрагенты той же OLE-базы. Это правило касается не только объектов агрегатных типов (справочников, документов, регистров и т. п.), но и универсальных коллекций значений, таких как массивы, структуры, списки значений и т.п.

    Рассмотрим пример вывода курса доллара из регистра сведений.

    База = Новый СОМОбъект("V82.Application"); База.Connect(СтрокаПодключения); // Доступ к регистрам сведений // Поиск элемента справочника с наименованием "USD" СправочникОLЕ = База.Справочники.Валюты; СпрЭлемент = СправочникОLЕ.НайтиПоНаименованию("USD"); // Создаем структуру в OLE-базе Структура = База.NewObject("Структура"); Структура.Вставить("Валюта", СпрЭлемент); // Получаем курс доллара на текущую дату РегистрСведенийОLЕ = База.РегистрыСведений.КурсыВалют; Структура = РегистрСведенийОLЕ.ПолучитьПоследнее(ТекущаяДата(), Структура); Сообщить("Курс доллара = " + Структура.Курс); Сообщить("Кратность = " + Структура.Кратность);

    В этом примере для использования фильтра применяется структура, которая создается с помощью метода NewObject . Важно иметь в виду, что если создать структуру в исходной конфигурации с помощью конструктора Новый Структура() , то произойдет ошибка.

    Использование запросов

    Работа с регистрами полностью аналогична работе со справочниками и документами.

    В системе "1С:Предприятие" использование запросов является самым основным способом получения сводных данных, поэтому и при использовании системы в качестве OLE Automation сервера очень важно уметь использовать механизмы запросов.

    Для выполнения запроса к данным OLE-базы достаточно с помощью метода NewObject создать объект Запрос и далее работать с ним стандартными методами.

    Рассмотрим простой пример вывода списка наименований контрагентов

    СтрокаПодключения="File=C:\1C\1S_82; usr=Администатор"; База = Новый COMОбъект("V82.Application"); База.Connect(СтрокаПодключения); Текст = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты"; // Создаем объект запрос Запрос = База.NewObject("Запрос"); Запрос.Текст = Текст; // Выполняем запрос РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); // Обход результата выполнения запроса Пока Выборка.Следующий() Цикл Сообщить(Выборка.Наименование); КонецЦикла;

    Вызов пользовательских интерфейсов

    В предыдущем примере показана возможность выборки данных с помощью запроса и вывода результатов запроса в основную базу. Эти же данные можно визуализировать и в базе данных, используемой в качестве OLE Automation сервера.

    Для начала необходимо показать основное окно приложения с помощью свойства Visible , а затем можно вызывать стандартные операторы — сообщить, предупреждение, а также открывать формы объектов и формировать отчеты.

    СтрокаПодключения="File=C:\1C\1S_82; usr=Администатор"; База = Новый COMОбъект("V82.Application"); // Шаг 1. Соединение с базой данных База.Connect(СтрокаПодключения); // Шаг 2. Установка видимости главного окна приложения База.Visible = Истина; // Шаг 3. Пример вывода сообщения в OLE-базе База.Сообщить("Пример сообщения через OLE Automation"); // Пример вывода предупреждения в OLE-базе База.Предупреждение("Для вопросов http://forum.amur.ru","Внимание!!!"); // Шаг 4. Открытие формы списка справочника Форма = База.Справочники.Контрагенты.ПолучитьФорму("ФормаСписка"); Форма.Открыть();

    В приведенном примере последовательно выполняются следующие действия:

    1. Соединение с базой данных.

    2. Установка видимости главного окна приложения.

    3. ВЫВОД сообщений С ПОМОЩЬЮ операторов Сообщить И Предупреждение.

    4. Открытие формы списка справочника контрагенты.

    Доступ к метаданным

    Для доступа к метаданным можно использовать свойство глобального контекста метаданные. Приведем пример вывода всех справочников и их реквизитов для конфигурации, используемой в качестве OLE Automation сервера

    СтрокаПодключения="File=C:\1C\1S_82; usr=Администатор"; База = Новый COMОбъект("V82.Application"); База.Connect(СтрокаПодключения); МетаСправочники = База.Метаданные.Справочники; // Перебираем все справочники Для каждого Справочник Из МетаСправочники Цикл Сообщить(Справочник.Имя); // Перебираем все реквизиты Для каждого Реквизит Из Справочник.Реквизиты Цикл Сообщить(Символы.Таб + Реквизит.Имя); КонецЦикла; КонецЦикла;

    Использование СОМ-соединения в версии 8.2

    Основная задача использования СОМ-соединения для конфигурации системы "1С:Предприятие 8.2" — это обеспечение надежного и быстрого программного доступа к объектам конфигурации из внешних приложений. Применение СОМ-соединения во многом похоже на использование OLE Automation сервера, но существуют и очень важные отличия. Приведем некоторые общесистемные отличия СОМ-соединения от OLE Automation.

    При использовании СОМ-соединения:

    Затрачиваются гораздо меньше системных ресурсов;

    Происходит более быстрая установка соединения с базой данных;

    Происходит более быстрое обращение к свойствам и методам объектов;

    Полностью отсутствуют пользовательские интерфейсы.

    Отличия в программном использовании СОМ-соединения можно определить следующим образом:

    OLE-объект создается с идентификатором «V82.COMConnector»;

    Отсутствует свойство Visible ;

    Не работают все методы системы "1С:Предприятие", касающиеся визуализации объектов;

    Недоступен модуль приложения, но при этом доступен модуль внешнего соединения;

    Из общих модулей доступны только те, у которых установлено свойство Внешнее соединение;

    Метод Connect возвращает объект соединения с базой данных (в OLE Automation метод возвращал значение логического типа, а доступ к базе данных происходил через объект, созданный с помощью идентификатора "V82.Application").

    Приведем пример подключения к базе данных системы "1С:Предприятие 8.2" с помощью СОМ-соединения на языке Visual Basic Script .

    " Подключение к БД Set cc = CreateObject("v82.COMConnector") " Set con = cc.Connect("File=C:\1C\1S_82; usr=Администатор") " Вывод сообщения о названии конфигурации MsgBox con.Metadata.Name, 0, "Конфигурация" " Задаем текст запроса Text = "ВЫБРАТЬ * ИЗ Справочник.Контрагенты" " Создаем объект Запрос Set Query = con.NewObject("Запрос") Query.Text = Text " Выполнение запроса Set Result = Query.Execute() Set Choose = Result.Choose() ResultChoose = "" " Выборка результата выполнения запроса Do While Choose.Next () " Конкатенация всех значений выборки в одну строку ResultChoose = ResultChoose & vbCrLf & Choose.Description Loop " Вывод результата выполнения запроса MsgBox ResultChoose, 0, "Результат выборки" Работа с Microsoft Excel

    С помощью объекта Excel.Application, предоставляемого OLE-сервером MS Excel, можно программно создавать электронные таблицы, а также использовать все функции MS Excel, предоставляемые пользователям.

    Основным, в объектной модели Excel, является объект Application, содержащий коллекцию Workbooks объектов типа WorkBook . Каждый объект типа WorkBook содержит коллекцию объектов Worksheets типа Worksheet , коллекцию объектов Сharts типа Сhart и др. Манипуляция рабочими книгами, их листами, ячейками, диаграммами и др. осуществляется путем обращения к свойствам и методам этих объектов.

    Для создания примеров использования Microsoft Excel можно использовать следующий код создания контроллера:

    Excel = Новый СОМОбъект("Excel.Application") .

    Создать новую рабочую книгу Excel можно, используя метод Add коллекции Workbooks объекта Application:

    Excel.Workbooks.Add()

    Для создания рабочей книги на основе шаблона следует указать его имя в качестве первого параметра метода Add :

    Excel.WorkBooks.AddC("C:\Templates\tm.xltx")

    В качестве первого параметра этого метода можно также использовать следующие константы:

    4109 — рабочая книга состоит из листа с диаграммой;

    4167 — рабочая книга состоит из листа с данными.

    В этом случае рабочая книга будет содержать лист того типа, который задан указанной константой (график, обычный лист с данными и др.).

    Для открытия уже существующего документа следует воспользоваться методом Open коллекции WorkBooks .

    Excel.Documents.Open("С:\MyExcelFile.xlsx") .

    Отметим, что свойство ActiveWorkBook объекта Excel.Application указывает на текущую активную рабочую книгу среди одной или нескольких открытых. Помимо этого к рабочей книге можно обращаться по ее порядковому номеру. Например, ко второй открытой рабочей книге можно обратиться с помощью записи:

    Excel.WorkBooks.

    Сделать рабочую книгу активной можно с помощью метода Activate :

    Excel.WorkBooks.Activate() .

    Следующее, чему следует научиться, — это сохранять рабочие книги в файлах.

    Закрытие документа может быть осуществлено с помощью метода close:

    Excel.WorkBooks .Close() ИЛИ Excel.ActiveWorkBook.Close ().

    Метод Сlose имеет несколько необязательных (в случае позднего связывания) параметров, влияющих на правила сохранения рабочей книги. Первый из параметров принимает значения истина или ложь и влияет на то, сохранять ли изменения, внесенные в рабочую книгу. Второй параметр — имя файла, в котором нужно сохранить рабочую книгу (если в нее были внесены изменения). Третий параметр также принимает значения истина или ложь и влияет на то, будет ли пересылаться документ следующему пользователю по электронной почте.

    Excel.ActiveWorkBook.Save(); Excel.ActiveWorkBook.SaveAs("C:\MyWorkBook.xls") .

    Метод SaveAs имеет более десятка параметров, влияющих на то, как именно сохраняется документ (под каким именем, с паролем или без него, какова кодовая страница для содержащегося в ней текста и др.).

    Закрыть среду Excel можно с помощью метода Quit объекта Excel .Application. В случае Excel этот метод параметров не имеет.

    Вывод документа Excel на устройство печати можно осуществить с помощью метода PrintOut объекта WorkBook , например:

    Excel.ActiveWorkBook.Printout() .

    Если нужно изменить параметры печати, следует указать значения соответствующих параметров метода PrintOut (в случае Excel их восемь).

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

    Excel.WorkBooks[I].Worksheets[I].Name = "Страница 1".

    Приведенная выше запись иллюстрирует, как можно изменить имя листа рабочей книги.

    К листу рабочей книги можно обратиться и по имени, например:

    Excel.WorkBooks.Worksheets["Лист1"].Name = "Страница 1".

    Обращение к отдельным ячейкам листа производится с помощью коллекции Cells объекта WorkSheet . Например, добавить данные в ячейку B1 можно следующим образом:

    Excel.WorkBooks.Worksheets["Лист1"].Cells.Value = "25".

    Здесь первая из координат ячейки указывает на номер строки, вторая — на номер столбца.

    Добавление формул в ячейки производится аналогичным способом:

    Excel.WorkBooks[I].Worksheets["Лист1"].Cells.Value=" =SUM(B1:B2)".

    Очистить ячейку можно с помощью метода ClearContents .

    Форматирование текста в ячейках производится с помощью свойств Font

    и Interior объекта Cell и их свойств. Например, приведенный фрагмент кода, выводит текст в ячейке красным жирным шрифтом Courier размера 16 на желтом фоне.

    Excel.WorkBooks.Worksheets.Cells.Interior.ColorIndex = 6; Excel.WorkBooks.Worksheets.Cells.Font,Colorlndex = 3; Excel.WorkBooks.Worksheets.Cells.Font,Name - "Courier"; Excel.WorkBooks.Worksheets.Cells.Font.Size = 16; Excel.WorkBooks.Worksheets.Cells.Font.Bold = Истина;

    Свойство Colorlndex может принимать числовые значения от 1 до 56. Ниже

    приведены значения только основных цветов:

    1 — белый;

    2 - черный;

    З — красный;

    5 — синий;

    Б — желтый;

    7 — лиловый;

    10 — зеленый;

    33 — голубой;

    39 - сиреневый;

    46 — оранжевый.

    Обратиться к текущей ячейке можно с помощью свойства ActiveCell объекта Excel.Application, а узнать местоположение ячейки можно с помощью свойства Address объекта Cell , например:

    Сообщить(Excel.ActiveCell.Address).

    Помимо обращения к отдельным ячейкам, можно манипулировать прямоугольными областями ячеек с помощью объекта Range. Объект Range также часто используется для копирования прямоугольных областей через буфер обмена.

    Excel.WorkBooks.Worksheets.Range["A1:C5"].Copy(); Excel.Workbooks.Worksheets.Range["A11:C15"].Select(); Excel.WorkBooks.Worksheets.Paste();

    Обратите внимание на то, что диапазон, куда копируются данные, предварительно выделяется с помощью метода Select .

    Выгрузка метаданных в MS Excel

    Рассмотрим пример выгрузки метаданных произвольной конфигурации системы "1С:Предприятие 8.2" в лист Microsoft Excel.

    // Определяем все возможные объекты метаданных ВсеТипы = Новый Структура(); ВсеТипы.Вставить("ОбщиеМодули", "Общие модули"); ВсеТипы.Вставить("ОбщиеФормы", "Общие формы"); ВсеТипы.Вставить("ОбщиеМакеты", "Общие макеты"); ВсеТипы.Вставить("ОбщиеКартинки", "Общие картинки"); ВсеТипы.Вставить("Роли", "Роли"); ВсеТипы.Вставить("Интерфейсы", "Интерфейсы"); ВсеТипы.Вставить("Стили", "Стили"); ВсеТипы.Вставить("Языки", "Языки"); ВсеТипы.Вставить("ПланыОбмена", "Планы обмена"); ВсеТипы.Вставить("Константы", "Константы"); ВсеТипы.Вставить("КритерииОтбора", "Критерии отбора"); ВсеТипы.Вставить("Справочники", "Справочники"); ВсеТипы.Вставить("Документы", "Документы"); ВсеТипы.Вставить("ЖурналыДокументов", "Журналы документов"); ВсеТипы.Вставить("Перечисления", "Перечисления"); ВсеТипы.Вставить("Отчеты", "Отчеты"); ВсеТипы.Вставить("Обработки", "Обработки"); ВсеТипы.Вставить("ПланыВидовХарактеристик", "Планы видов характеристик"); ВсеТипы.Вставить("ПланыСчетов", "Планы счетов"); ВсеТипы.Вставить("ПланыВидовРасчета", "Планы видов расчета"); ВсеТипы.Вставить("РегистрыСведений", "Регистры сведений"); ВсеТипы.Вставить("РегистрыБухгалтерии", "Регистры бухгалтерии"); ВсеТипы.Вставить("РегистрыРасчета", "Регистры расчета"); // Определяем все возможные параметры ВсеПараметры = Новый Структура(); ВсеПараметры.Вставить("Измерения", "Измерения"); ВсеПараметры.Вставить("Ресурсы", "Ресурсы"); ВсеПараметры.Вставить("Реквизиты", "Реквизиты"); ВсеПараметры.Вставить("Формы", "Формы"); ВсеПараметры.Вставить("Макеты", "Макеты"); ВсеПараметры.Вставить("Графы", "Графы"); ВсеПараметры.Вставить("ТабличныеЧасти", "Табличные части"); ВсеПараметры.Вставить("Значения", "Значения"); Попытка Excel = Новый COMОбъект("Excel.Application"); Исключение Сообщить("Не удалось открыть Excel"); Возврат; КонецПопытки; // Добавляем новый лист Excel.Application.Workbooks.Add("C:\For1C82.xlsx"); Лист = Excel.ActiveSheet; // Задаем имя закладки Лист.Name = "Данные"; НомерСтроки = 0; // Перебор типов метаданных Для Каждого ТипОбъекта Из ВсеТипы Цикл //Состояние("" + ТипОбъекта.Значение); Если Метаданные[ТипОбъекта.Ключ].Количество() > 0 Тогда // Добавляем новую строку НомерСтроки = НомерСтроки + 1; // Устанавливаем текст в ячейку Лист.Cells(НомерСтроки, 1).Value = ТипОбъекта.Значение; // Перебираем конкретные объекты Для каждого ОбъектМД Из Метаданные[ТипОбъекта.Ключ] Цикл // Добавляем новую строку НомерСтроки = НомерСтроки + 1; // Устанавливаем текст в ячейку Лист.Cells(НомерСтроки, 1).Value = ОбъектМД.Синоним; // Перебираем параметры метаданных Для каждого Параметр Из ВсеПараметры Цикл Попытка Количество = Объект[Параметр.Ключ].Количество(); Исключение Продолжить; КонецПопытки; Если Количество > 0 Тогда // Добавляем новую строку НомерСтроки = НомерСтроки + 1; Лист.Cells(НомерСтроки, 1).Value = Параметр.Значение + " (" + Количество + ") " ; // Добавляем новую таблицу НомерСтроки = НомерСтроки + 1; Лист.Cells(НомерСтроки, 1).Value = "Имя"; Лист.Cells(НомерСтроки, 2).Value = "Синоним"; Лист.Cells(НомерСтроки, 3).Value = "Тип"; Лист.Cells(НомерСтроки, 4).Value = "Комментарий"; Для каждого Значение Из Объект[Параметр.Ключ] Цикл НомерСтроки = НомерСтроки + 1; // Заполняем содержимое таблицы Попытка Лист.Сеlls(НомерСтроки, 1).Value = Значение.Имя; Исключение КонецПопытки; Попытка Лист.Cells(НомерСтроки, 2).Value = Значение.Синоним; Исключение КонецПопытки; Попытка СтрокаТипов = ""; // Выводим все типы Для каждого Тип Из Значение.Тип.Типы() Цикл СтрокаТипов = СтрокаТипов + " " + Строка(Тип); КонецЦикла; Лист.Cells(НомерСтроки, 3).Value = СтрокаТипов; Исключение КонецПопытки; Попытка Лист.Cells(НомерСтроки, 4).Value = Значение.Комментарий; Исключение КонецПопытки; КонецЦикла; КонецЕсли; КонецЦикла; КонецЦикла; КонецЕсли; КонецЦикла; // Показываем документ Excel.Visible = Истина; Excel = Неопределено;

    Основной недостаток данного примера в том, что все тексты ячеек не отформатированы и представлены одним цветом, что затрудняет чтение таблицы.

    Ниже показан пример цветового оформления ячеек MS Excel и задание в них определенного шрифта.

    // Получаем ссылку на определенную ячейку Ячейка = Лист.Cells(НомерСтроки, НомерКолонки); // Устанавливаем отступ в 2 символа Ячейка.InsertIndent(2); // Устанавливаем размер шрифта Ячейка.Font.Size = 12; // Устанавливаем цвет Ячейка.Font.Colorlndex = 5; // Устанавливаем жирный шрифт Ячейка.Font.Bold = Истина; // Устанавливаем ширину колонки Ячейка.ColumnWidth = 20; // Очищаем все границы Ячейка.Borders(5).LineStyle = -4142; // Устанавливаем левую границу Ячейка.Borders(7).LineStyle = 1;" // Устанавливаем верхнюю границу Ячейка.Borders(8).LineStyle = 1; // Устанавливаем нижнюю границу Ячейка.Borders(9).LineStyle = 1; // Устанавливаем правую границу Ячейка.Borders(10).LineStyle = 1; // Устанавливаем выравнивание по левому краю Ячейка.VerticalAlignment = -4160; // Устанавливаем перенос слов Ячейка.WrapText = Истина;

    В первой строке данного примера в переменную ячейка помещается ссылка на конкретную ячейку с координатами НомерСтроки и НомерКолонки . После этого через данную переменную устанавливается размер шрифта, цвет текста, ширина ячейки, границы, положение текста и т. д.

    *Источник информации: Михайлов А. В. 1С:Предприятие 7.7/8.0: системное программирование.

    Печать (Ctrl+P)

    Один из вариантов обмена данными между базами 1С это обмен через COM соединение. С помощью COM соединения можно из одной базы 1С подключиться к другой и прочитать или записать данные. Пользоваться этим методом можно как в клиент-серверных вариантах баз, так и в файловых базах. В этой статье рассматривается такого рода соединений на платформа 8.3

    com соединение

    Можно создать два вида COM объектов для приложения 1С. Это ole соединения V83.Application и com соединения V83.COMConnector . В случае с V83.Application запускается практически полноценный экземпляр приложения 1С. В случае использования V83.COMConnector запускается небольшая серверная часть. Скорость работы в этом случае выше, но некоторые функции могут быть недоступны. В частности работа с формами и с общими модулями для которых не установлено свойство работы с внешними соединениями. Преимущественно надо использовать V83.COMConnector и только в случае нехватки функционала V83.Application . Особенно сильно разница в скорости работы может быть заметна на базах большого объема. Для платформе 8.2 используется V82.Application или V82.COMConnector

    Установить OLE соединение

    Соединение = Новый COMОбъект(“V83.Application” ) ;

    Установить COM соединение

    Соединение = Новый COMОбъект(“V83.COMConnector” ) ;

    Строка подключения

    //Для варианта клиент- сервер
    СтрокаСоединения = “Srvr = “ “ИмяСервера” “;Ref = “ “ИмяБазы” ;
    //Для варианта файлового режима:
    СтрокаСоединения = “File = “ “ПутьКБазе” “; Usr = ИмяПользователя; Pwd = Пароль” ;
    Попытка
    Подключение = Соединение. Connect (СтрокаСоединения) ;
    Исключение
    Сообщение = Новый СообщениеПользователю;
    Сообщение. Текст = “Не удалось подключиться к базе” + ОписаниеОшибки() ; Сообщение. Сообщить() ;
    КонецПопытки ;

    Разрыв соединения

    Соединение = Неопределено ;
    Для объекта V83.Application выполнять разрыв соединения обязательно, в противном случае останется висеть незавершенный сеанс, который потом придется удалять вручную. В случае с V83.COMConnector соединение разрывается автоматически при завершении процедуры в которой выполнялось подключение.И есть еще один маленький момент. Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках.

    Метод NewObject()

    Для создания нового объекта можно воспользоваться методом NewObject(), например:

    для V83.COMConnector

    ЗапросCOM = Подключение. NewObject(“Запрос “ ) ;
    ТаблицаCOM = Подключение. NewObject(“ТаблицаЗначений” ) ;
    МассивCOM = Подключение. NewObject(“Массив” ) ;

    УидCOM =Подключение.NewObject

    для V83.Application

    ЗапросOLE = Соединение. NewObject(“Запрос “ ) ;
    ТаблицаOLE = Соединение. NewObject (“ТаблицаЗначений” ) ;
    МассивOLE = Соединение.NewObject (“Массив” ) ;
    УидCOM =Соединение.NewObject (“УникальныйИдентификатор”,СтрокаУИД);

    ЗапросCOM. Текст = “ВЫБРАТЬ
    | ДолжностиОрганизаций.Код,
    | ДолжностиОрганизаций.Наименование
    |ИЗ | Справочник.ДолжностиОрганизаций
    КАК ДолжностиОрганизаций” ;

    Результат = ЗапросCOM. Выполнить () ;
    Выборка = Результат. Выбрать () ;
    Пока Выборка. Следующий() Цикл
    КонецЦикла ;
    Можно также использовать менеджеры объектов конфигурации:
    СправочникCOM = Подключение. Справочники. ИмяСправочника;
    ДокументCOM = Подключение. Документы. ИмяДокумента;
    РегистрCOM = Подключение . РегистрыСведений . ИмяРегистра ;

    Получение и сравнение перечисления через COM соединение

    Для сравнения значений элементов перечислений, определенных в конфигурации, необходимо выполнить преобразование этих элементов к одному из примитивных типов, сравнение которых не вызывает трудности. Такими типами могут быть либо числовой, либо строковый тип. Преобразовать значение элемента перечисления к числовому типу можно так

    ЭлементПеречисления = Подключение.Справочники.Справочник1.НайтиПоКоду(1).Реквизит1;

    ВозможныеЗначения = ЭлементПеречисления.Метаданные().ЗначенияПеречисления;

    НомерЭлементаПеречисления = ВозможныеЗначения.Индекс(ВозможныеЗначения.Найти(Соединение.XMLString(ЭлементПеречисления)));

    Если НомерЭлементаПеречисления = 0 Тогда Сообщить(“ЗначениеПеречисления1” );

    ИначеЕсли НомерЭлементаПеречисления = 1 Тогда Сообщить (“ЗначениеПеречисления2”);

    КонецЕсли;

    Получение объекта через COM по идентификатору

    Через менеджеры объектов конфигурации получаем com объект, например:
    ДокументCOM = Соединение. Документы. ИмяДокумента;

    Затем получаем строку уникального идентификатора:

    СтрокаУИД =Соединение.string (ДокументCOM.УникальныйИдентификатор ())

    Идентификатор = Новый УникальныйИдентификатор(СтрокаУИД) ;
    СсылкаПоИдентификатору = Документы[ИмяДокумента].ПолучитьСсылку(Идентификатор);

    Если нужно найти com объект по документ по идентификатору, то тогда нужно написать так:

    УидCOM = Соединение.NewObject (“УникальныйИдентификатор”,СтрокаУИД );
    СсылкаПоИдентификатору = Соединение.Документы[ИмяДокумента].ПолучитьСсылку(УидCOM);

    Для запуска системы 1С-Предприятия в качесте OLE Automation сервера из внешнего приложения выполняется следующая последовательность действий:

    • Создается объект с OLE идентификатором (регистр символов непринципиален):
    • V1CEnterprise.Application - версия независимый ключ;
    • V77.Application - версия зависимый ключ;
    • V77S.Application - версия зависимый ключ, SQL версия;
    • V77L.Application - версия зависимый ключ, локальная версия;
    • V77M.Application - версия зависимый ключ, сетевая версия.
    • Выполняется инициализация системы 1С-Предприятие методом Initialize().
    • Вызываются атрибуты и методы системы 1с-Предприятия как OLE Automation сервера.

    1С-Предприятие в качестве OLE Automation сервера имеет 4 метода:

    • Initialize() - выполнить инициализацию системы 1С-Предприятие.
    • CreateObject() - Создает объект агрегатного типа данных 1С-Предприятия и возвращает ссылку на него.
    • EvalExpr() - Вычислить выражение системы 1С-Предприятие.
    • ExecuteBatch() - Выполнить последовательность операторов системы 1С-Предприятие.

    Методы: Initialize() - открыть базу.

    Синтаксис метода такой: Initialize(<Имя объекта>.RMTrade, <Командная строка>, <Пустая строка>), где:

    • <Имя объекта>.RMTrade - имя переменной и ключевое слово RMTrade.
    • <Командная строка> - командная строка, в которой можно прописать путь к базе, имф пользователя и пароль.
    • <Пустая строка>) - либо пустая строка, либо "NO_SPLASH_SHOW" - чтобы не показывать заставку при загрузке.

    Для того, чтобы открыть базу через OLE - необходимо создать объект с идентификатором OLE, выполнить инициализацию базы и проверить успешность выполнения инициализации. В своем примере я не указываю никаких дополнительных параметров, поэтому открывается квадратное окошко выбора базы, предлагается выбрать пользователя и ввести пароль.

    ДругаяБаза=СоздатьОбъект("V77.Application"); Открыта=ДругаяБаза.Initialize(ДругаяБаза.RMTrade,); Если Открыта=0 Тогда // True=-1, False=0. Для всех OLE команд. Сообщить("База не была открыта."); Возврат; КонецЕсли;

    Методы: CreateObject() - создать объект агрегатного типа.

    Этот метод создает объект агрегатного типа данных системы 1С-Предприятия и возвращает ссылку на него.

    Синтаксис метода такой: CreateObject(<ИмяАгрегатногоТипа>), где: <ИмяАгрегатногоТипа> - строковое выражение, значение которого содержит имя агрегатного типа данных, заданного в конфигураторе. Например: "Справочник.Номенклатура", "Документ.ПриходнаяНакладная".

    Методы: EvalExpr() - вычислить выражение.

    Синтаксис метода такой: EvalExpr(<СтрокаВыражения>), где:

    <СтрокаВыражения> - строковое выражение, записанное на встроенном языке 1С-Предприятия.

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

    Методы: ExecuteBatch() - выполнить последовательность операторов.

    Синтаксис метода такой: ExecuteBatch(<СтрокаОператоров>), где:

    <СтрокаОператоров> - строковое выражение, текст программы на встроенном языке 1С-предприятия. Возвращает значение логического типа: TRUE, если последовательность операторов выполнена успешно, FALSE, если нет. В OLE Automation TRUE и FALSE имеют соответственно значения -1 (минус единица) и 0.

    Пример: создание документа в другой базе, открытой через OLE.

    Выгрузка происходит из обработки. ВыбДокумент - документ, выбранный пользователем для выгрузки в другую базу.

    ДругаяБаза=СоздатьОбъект("v77.application"); Открыта=ДругаяБаза.Initialize(ДругаяБаза.RMTrade,); Если Открыта=0 Тогда Сообщить("База не была открыта."); Возврат; КонецЕсли; дДок=ДругаяБаза.CreateObject("Документ.ПриходнаяНакладная"); дТовар=ДругаяБаза.CreateObject("Справочник.Номенклатура"); дДок.Новый(); дДок.ДатаДок=ВыбДокумент.ДатаДок; дДок.Фирма=ДругаяБаза.evalexpr("Константа.ОсновнаяФирма"); дДок.Склад=ДругаяБаза.evalexpr("Константа.ОсновнойСклад"); дДок.КатегорияЦен=ДругаяБаза.evalexpr("Константа.ПриходнаяКатегорияЦен"); дДок.ВариантРасчетаНалогов=ДругаяБаза.evalexpr("Константа.ОсновнойВариантРасчетаНалогов"); дДок.Валюта=ДругаяБаза.evalexpr("Константа.БазоваяВалюта");//рубли дДок.Дата_курса=дДок.ДатаДок; дДок.ТипУчета=1; дДок.Автор=ДругаяБаза.evalexpr("глПользователь"); дДок.ПризнакНакладной=ДругаяБаза.evalexpr("Перечисление.ПризнПрихНакл.Закупка"); дДок.Курс=1;//рубли дДок.Комментарий=ВыбДОкумент.Комментарий; ВыбДОкумент.ВыбратьСтроки(); Пока ВыбДокумент.ПолучитьСтроку()=1 Цикл дДок.НоваяСтрока(); ТовКод=СокрЛП(ВыбДОкумент.Товар.Код); Если дТовар.НайтиПоКоду(ТовКод)=0 Тогда Сообщить("Не найден товар с кодом "+ТовКод); Возврат; КонецЕсли; дТовар.ИспользоватьДату(дДок.ДатаДок); дДок.Товар=дТовар.ТекущийЭлемент(); дДок.Количество=ВыбДокумент.Количество; дДок.Единица=дТовар.ЕдиницаПоУмолчанию; дДок.Цена=ВыбДОкумент.Цена; дДок.Коэффициент=1; дДок.Всего=ВыбДОкумент.Сумма; дДок.Сумма=ВыбДОкумент.Сумма-ВыбДокумент.НП; дДок.СтавкаНДС=дТовар.СтавкаНДС; дДок.НДС=ВыбДокумент.НДС; дДок.СтавкаНП=дТовар.СтавкаНП; дДок.СуммаНП=ВыбДокумент.НП; КонецЦикла; дДок.УстановитьНовыйНомер(ДругаяБаза.evalexpr("Константа.ПрефиксНомеровДокументовУпрУчета")); Сообщить(""+дДок.НомерДок); дДок.Записать();

    Этот пример на 100% рабочий. Используется у меня для выгрузки документов из одной конфигурации в другую.

    Сравнение в базе OLE. Константы, перечисления, элементы справочников.

    Для сравнения значений агрегатных типов данных в базе, открытой через Оле, использовать стандартный алгоритм с использование знаков равно и неравно (=,<>) не получается. Выход простой. Необходимо перейти от сравнения агрегатных типов данных к простым типам данных - дата, строка и число.

    Отсюда вывод: мы сравниваем не сами элементы, а их уникальные атрибуты. Например, для элементов справочника - это код (если он есть), либо наименование. Для перечисления используется метод Идентификатор(). Вот два примера:

    //Сравнение реквизита номенклатуры с Константой БазоваяВалюта Если дТовар.ВалютаУчета.Код<>Другая.Константа.БазоваяВалюта.Код Тогда дТовар.ВалютаУчета=Другая.Константа.БазоваяВалюта; КонецЕсли; //Сравнение реквизита номенклатуры с перечислением Если дТовар.ТипТовара.Идентификатор()<>Другая.Перечисление.ТипыТоваров.Штучный.Идентификатор() Тогда дТовар.ТипТовара=Другая.Перечисление.ТипыТоваров.Штучный; КонецЕсли;



    Предыдущая статья: Следующая статья:

    © 2015 .
    О сайте | Контакты
    | Карта сайта