Примечание - большая часть написанного здесь текста с примерами взята по памяти (пару лет назад изучал достаточно подробно, поэтому может что-то в алгоритмах не работать - я ведь их не копировал откуда-то, а прямо тут же и писал, так что за синтаксические ошибки не пинайте) - на данный момент я активно OLE не пользуюсь (не из-за каких-то проблем с самим OLE, а из-за отсутствия надобности в его использовании в текущий момент).
Основные преимущества, благодаря которым 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". Именно это я и имел в виду, когда говорил, что напрямую мало что можно перенести. Т.е. не будут работать следующие методы (ошибки 1С не будет, но и результат работы будет нулевой). Рассмотрим следующий пример:
СпрOLE
=
БазаОле
.CreateObject("Справочник.Фирмы"
);
// это справочник в базе OLE Док = СоздатьОбъект(); // а это документ в местной базе Док . Новый (); // создаем новый документ в местной базе СпрOLE . НайтиПоКоду (1 , 0 ); // спозиционируем в базе OLE // на фирме с кодом "1". Док . Фирма = СпрOLE . ТекущийЭлемент (); // такой метод не сработает, т.к. справа от "=" стоит // объект не местной базы, и местная база 1С его не понимает! |
Отсюда вывод: возможность доступа к объектам базы 1С через OLE требуется, в основном, только для определенной задачи - получить доступ к реквизитам определенного элемента справочника или документа. Однако, не забываем, что объекты базы OLE поддерживают все методы работы с ними, в т.ч. и "Новый()", т.е. приведем пример противоположный предыдущему:
Однако, сработает следующий метод:
СпрОле
=
БазаОле
.CreateObject("Справочник.Фирмы"
);
// создаем объект справочника базы OLE СпрОле . НайтиПоНаименованию (Спр . Наименование , 0 , 0 ); // Или СпрОле.найтиПоКоду(Спр.Код,0); // т.е. Спр.Код и Спр.Наименование являются обычными числовыми/строковыми значениями, // которые понимает база OLE! ДокОле . Фирма = СпрОле . ТекущийЭлемент (); // Вот теперь все в порядке, т.к. с обоих сторон // метода стоят объекты базы OLE! ДокОле . Записать (); // запишем документ в базе OLE Если ДокОле . Провести ()= 0 тогда Сообщить("Не смогли провести документ!" ); КонецЕсли; |
Заметьте, что пользы для местной базы от переменной "ЗначениеПеречисленияOLE" особо-то и нет, ведь подобно справочнику и документу перечисление также напрямую недоступно для местной базы. Пожалуй, пример работы с ними может быть следующим (в качестве параметра условия):
=
1
;
// предположим, что это - флажок в форме диалога, // который мы либо устанавливаем, либо снимаем ДокОле = БазаОле .CreateObject("Документ.РасходнаяНакладная" ); ДокОле . ВыбратьДокументы (НачДата , КонДата ); // НачДата и КонДата - также реквизиты формы // диалога, но база OLE прекрасно их понимает - // ведь это же даты! Пока ДокОле . ПолучитьДокумент ()= 1 Цикл Если СмотретьТолькоВозвратыПоставщикам = 1 Тогда Если ДокОле . ПризнакНакладной <> БазаОле .Перечисление. ПризнРасхНакл . ВозвратПоставщику Тогда Продолжить; КонецЕсли; Иначе Если ДокОле . ПризнакНакладной = БазаОле .Перечисление. ПризнРасхНакл . ВозвратПоставщику Тогда Продолжить; КонецЕсли; КонецЕсли; Сообщить(ДокОле . Вид () + " № " + ДокОле . НомерДок + " от " + ДокОле . датаДок ); КонецЦикла; |
По аналогии со справочниками и документами работает объект "Периодический", план счетов работает по аналогии с ВидомСубконто, ну и далее в том же духе… Отдельную главу посвятим запросу, а сейчас… стоп. Еще пункт забыл!
Ж) Доступ к функциям и процедурам глобального модуля базы OLE!
Как же я про это забыл-то, а? Поскольку при запуске базы автоматически компилируется глобальный модуль, то нам становятся доступны функции и процедуры глобального модуля (поправлюсь - только те, у которых стоит признак "Экспорт"). Плюс к ним еще и различные системные функции 1С. А доступны они нам через функцию 1С OLE - EvalExpr() . Приведем примеры работы с базой OLE:
ДатаАктуальностиОле
=
БазаОле
.
EvalExpr
("ПолучитьДатуТА()"
); // Возвращает дату актуальности ИмяПользователяОле = БазаОле . EvalExpr ("ИмяПользователя()" ); // возвращает строку // попробуем теперь получить числовое значение НДС у элемента номенклатуры // через функцию глобального модуля ПроцентНДС(СтавкаНДС) Экспорт! ТовОле = БазаОле .CreateObject("Справочник.Номенклатура" ); ТовОле . ВыбратьЭлементы (); // Найдем элемент справочника (не группа!) Пока ТовОле . ПолучитьЭлемент ()= 1 Цикл Если ТовОле . ЭтоГруппа ()= 0 Тогда Прервать; КонецЕсли; КонецЦикла; ЧисловоеЗначениеПроцентаНДСТовараОле = БазаОле . EvalExpr ("ПроцентНДС(Перечисление.ЗначенияНДС." + ТовОле . СтавкаНДС . Идентификатор ()+ ")" ); |
На самом деле, в последней строке примера я исхитрился и забежал немного вперед. Дело в том, что как и запрос (см. отдельную главу), так и EvalExpr() выполняются внутри базы OLE, причем команды передавается им обычной строкой, и поэтому надо долго думать, как передать необходимые ссылки на объекты базы OLE в строке текста местной базы. Так что, всегда есть возможность поломать голову над этим…
Краткая справка по использованию OLE в 1С-Предприятии.
Для запуска системы 1С-Предприятия в качестве OLE Automation сервера из внешнего приложения выполняется следующая последовательность действий:
1С-Предприятие в качестве OLE Automation сервера имеет 4 метода:
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.
Выгрузка происходит из обработки. ВыбДокумент - документ, выбранный пользователем для выгрузки в другую базу.
ДругаяБаза=СоздатьОбъект("v77.application"); Открыта=ДругаяБаза.Initialize(ДругаяБаза.RMTrade,); Если Открыта=0 Тогда Сообщить("База не была открыта."); Возврат; КонецЕсли; дДок=ДругаяБаза.CreateObject("Документ.ПриходнаяНакладная"); дТовар=ДругаяБаза.CreateObject("Справочник.Номенклатура"); дДок.Новый(); дДок.ДатаДок=ВыбДокумент.ДатаДок; дДок.Фирма=ДругаяБаза.evalexpr("Константа.ОсновнаяФирма"); дДок.Склад=ДругаяБаза.evalexpr("Константа.ОсновнойСклад"); дДок.КатегорияЦен=ДругаяБаза.evalexpr("Константа.ПриходнаяКатегорияЦен"); дДок.ВариантРасчетаНалогов=ДругаяБаза.evalexpr("Константа.ОсновнойВариантРасчетаНалогов"); дДок.Валюта=ДругаяБаза.evalexpr("Константа.БазоваяВалюта");//рубли дДок.Дата_курса=дДок.ДатаДок; дДок.ТипУчета=1; дДок.Автор=ДругаяБаза.evalexpr("глПользователь"); дДок.ПризнакНакладной=ДругаяБаза.evalexpr("Перечисление.ПризнПрихНакл.Закупка"); дДок.Курс=1;//рубли дДок.Комментарий=ВыбДОкумент.Комментарий; ВыбДОкумент.ВыбратьСтроки(); Пока ВыбДокумент.ПолучитьСтроку()=1 Цикл дДок.НоваяСтрока(); ТовКод=СокрЛП(ВыбДОкумент.Товар.Код); Если дТовар.НайтиПоКоду(ТовКод)=0 Тогда Сообщить("Не найден товар с кодом "+ТовКод); Возврат; КонецЕсли; дТовар.ИспользоватьДату(дДок.ДатаДок); дДок.Товар=дТовар.ТекущийЭлемент(); дДок.Количество=ВыбДокумент.Количество; дДок.Единица=дТовар.ЕдиницаПоУмолчанию; дДок.Цена=ВыбДОкумент.Цена; дДок.Коэффициент=1; дДок.Всего=ВыбДОкумент.Сумма; дДок.Сумма=ВыбДОкумент.Сумма-ВыбДокумент.НП; дДок.СтавкаНДС=дТовар.СтавкаНДС; дДок.НДС=ВыбДокумент.НДС; дДок.СтавкаНП=дТовар.СтавкаНП; дДок.СуммаНП=ВыбДокумент.НП; КонецЦикла; дДок.УстановитьНовыйНомер(ДругаяБаза.evalexpr("Константа.ПрефиксНомеровДокументовУпрУчета")); Сообщить(""+дДок.НомерДок); дДок.Записать();
Этот пример на 100% рабочий. Используется у меня для выгрузки документов из одной конфигурации в другую.
Для сравнения значений агрегатных типов данных в базе, открытой через Оле, использовать стандартный алгоритм с использование знаков равно и неравно (=,<>) не получается. Выход простой. Необходимо перейти от сравнения агрегатных типов данных к простым типам данных - дата, строка и число.
Отсюда вывод: мы сравниваем не сами элементы, а их уникальные атрибуты. Например, для элементов справочника - это код (если он есть), либо наименование. Для перечисления используется метод Идентификатор(). Вот два примера:
//Сравнение реквизита номенклатуры с Константой БазоваяВалюта Если дТовар.ВалютаУчета.Код<>Другая.Константа.БазоваяВалюта.Код Тогда дТовар.ВалютаУчета=Другая.Константа.БазоваяВалюта; КонецЕсли; //Сравнение реквизита номенклатуры с перечислением Если дТовар.ТипТовара.Идентификатор()<>Другая.Перечисление.ТипыТоваров.Штучный.Идентификатор() Тогда дТовар.ТипТовара=Другая.Перечисление.ТипыТоваров.Штучный; КонецЕсли;
Электронные таблицы, текстовые процессоры и другие программы предоставляют пользователю множество полезных возможностей. Почему бы не обеспечить доступ к ним и другому программному обеспечению при работе с привычного рабочего места бухгалтера?
Чтобы это стало возможным, приложения должны предоставлять свои сервисы не только человеку, но и программам, т. е. они должны быть программируемыми. Обеспечение программируемости и является целью "Автоматизации" (технология 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 объектов для приложения 1С. Это ole соединения V83.Application и com соединения V83.COMConnector . В случае с V83.Application запускается практически полноценный экземпляр приложения 1С. В случае использования V83.COMConnector запускается небольшая серверная часть. Скорость работы в этом случае выше, но некоторые функции могут быть недоступны. В частности работа с формами и с общими модулями для которых не установлено свойство работы с внешними соединениями. Преимущественно надо использовать V83.COMConnector и только в случае нехватки функционала V83.Application . Особенно сильно разница в скорости работы может быть заметна на базах большого объема. Для платформе 8.2 используется V82.Application или V82.COMConnector
Соединение = Новый COMОбъект(“V83.Application” ) ;
Соединение = Новый COMОбъект(“V83.COMConnector” ) ;
//Для варианта клиент- сервер
СтрокаСоединения
=
“Srvr = “
“ИмяСервера”
“;Ref = “
“ИмяБазы”
;
//Для варианта файлового режима:
СтрокаСоединения
=
“File = “
“ПутьКБазе”
“; Usr = ИмяПользователя; Pwd = Пароль”
;
Попытка
Подключение
=
Соединение.
Connect
(СтрокаСоединения)
;
Исключение
Сообщение
=
Новый
СообщениеПользователю;
Сообщение.
Текст
=
“Не удалось подключиться к базе”
+
ОписаниеОшибки()
;
Сообщение.
Сообщить()
;
КонецПопытки
;
Соединение
=
Неопределено
;
Для объекта V83.Application
выполнять разрыв соединения обязательно, в противном случае останется висеть незавершенный сеанс, который потом придется удалять вручную. В случае с V83.COMConnector
соединение разрывается автоматически при завершении процедуры в которой выполнялось подключение.И есть еще один маленький момент. Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках.
Для создания нового объекта можно воспользоваться методом NewObject(), например:
ЗапросCOM =
Подключение.
NewObject(“Запрос
“
)
;
ТаблицаCOM =
Подключение.
NewObject(“ТаблицаЗначений”
)
;
МассивCOM =
Подключение.
NewObject(“Массив”
)
;
УидCOM =Подключение.NewObject
ЗапросOLE =
Соединение.
NewObject(“Запрос
“
)
;
ТаблицаOLE = Соединение.
NewObject
(“ТаблицаЗначений”
)
;
МассивOLE = Соединение.NewObject
(“Массив”
)
;
УидCOM =Соединение.NewObject
(“УникальныйИдентификатор”,СтрокаУИД);
ЗапросCOM.
Текст =
“ВЫБРАТЬ
| ДолжностиОрганизаций.Код,
| ДолжностиОрганизаций.Наименование
|ИЗ
| Справочник.ДолжностиОрганизаций
КАК ДолжностиОрганизаций”
;
Результат =
ЗапросCOM.
Выполнить
()
;
Выборка =
Результат.
Выбрать
()
;
Пока
Выборка.
Следующий()
Цикл
КонецЦикла
;
Можно также использовать менеджеры объектов конфигурации:
СправочникCOM =
Подключение.
Справочники.
ИмяСправочника;
ДокументCOM =
Подключение.
Документы.
ИмяДокумента;
РегистрCOM
=
Подключение
.
РегистрыСведений
.
ИмяРегистра
;
Для сравнения значений элементов перечислений, определенных в конфигурации, необходимо выполнить преобразование этих элементов к одному из примитивных типов, сравнение которых не вызывает трудности. Такими типами могут быть либо числовой, либо строковый тип. Преобразовать значение элемента перечисления к числовому типу можно так
ЭлементПеречисления = Подключение.Справочники.Справочник1.НайтиПоКоду(1).Реквизит1;
ВозможныеЗначения = ЭлементПеречисления.Метаданные().ЗначенияПеречисления;
НомерЭлементаПеречисления = ВозможныеЗначения.Индекс(ВозможныеЗначения.Найти(Соединение.XMLString(ЭлементПеречисления)));
Если НомерЭлементаПеречисления = 0 Тогда Сообщить(“ЗначениеПеречисления1” );
ИначеЕсли НомерЭлементаПеречисления = 1 Тогда Сообщить (“ЗначениеПеречисления2”);
КонецЕсли;
Через менеджеры объектов конфигурации получаем com объект, например:
ДокументCOM =
Соединение.
Документы.
ИмяДокумента;
Затем получаем строку уникального идентификатора:
СтрокаУИД =Соединение.string (ДокументCOM.УникальныйИдентификатор ())
Идентификатор
= Новый
УникальныйИдентификатор(СтрокаУИД)
;
СсылкаПоИдентификатору = Документы[ИмяДокумента].ПолучитьСсылку(Идентификатор);
Если нужно найти com объект по документ по идентификатору, то тогда нужно написать так:
УидCOM
= Соединение.NewObject
(“УникальныйИдентификатор”,СтрокаУИД
);
СсылкаПоИдентификатору = Соединение.Документы[ИмяДокумента].ПолучитьСсылку(УидCOM);
Для запуска системы 1С-Предприятия в качесте OLE Automation сервера из внешнего приложения выполняется следующая последовательность действий:
Синтаксис метода такой: Initialize(<Имя объекта>.RMTrade, <Командная строка>, <Пустая строка>), где:
Для того, чтобы открыть базу через OLE - необходимо создать объект с идентификатором OLE, выполнить инициализацию базы и проверить успешность выполнения инициализации. В своем примере я не указываю никаких дополнительных параметров, поэтому открывается квадратное окошко выбора базы, предлагается выбрать пользователя и ввести пароль.
ДругаяБаза=СоздатьОбъект("V77.Application"); Открыта=ДругаяБаза.Initialize(ДругаяБаза.RMTrade,); Если Открыта=0 Тогда // True=-1, False=0. Для всех OLE команд. Сообщить("База не была открыта."); Возврат; КонецЕсли;
Этот метод создает объект агрегатного типа данных системы 1С-Предприятия и возвращает ссылку на него.
Синтаксис метода такой: CreateObject(<ИмяАгрегатногоТипа>), где: <ИмяАгрегатногоТипа> - строковое выражение, значение которого содержит имя агрегатного типа данных, заданного в конфигураторе. Например: "Справочник.Номенклатура", "Документ.ПриходнаяНакладная".
Синтаксис метода такой: EvalExpr(<СтрокаВыражения>), где:
<СтрокаВыражения> - строковое выражение, записанное на встроенном языке 1С-Предприятия.
Результатом выражения может быть число, строка, дата или значение любого агрегатного типа данных. Результат с неопределенным типом преобразуется к строковому типу.
Синтаксис метода такой: ExecuteBatch(<СтрокаОператоров>), где:
<СтрокаОператоров> - строковое выражение, текст программы на встроенном языке 1С-предприятия. Возвращает значение логического типа: TRUE, если последовательность операторов выполнена успешно, FALSE, если нет. В OLE Automation TRUE и FALSE имеют соответственно значения -1 (минус единица) и 0.
Выгрузка происходит из обработки. ВыбДокумент - документ, выбранный пользователем для выгрузки в другую базу.
ДругаяБаза=СоздатьОбъект("v77.application"); Открыта=ДругаяБаза.Initialize(ДругаяБаза.RMTrade,); Если Открыта=0 Тогда Сообщить("База не была открыта."); Возврат; КонецЕсли; дДок=ДругаяБаза.CreateObject("Документ.ПриходнаяНакладная"); дТовар=ДругаяБаза.CreateObject("Справочник.Номенклатура"); дДок.Новый(); дДок.ДатаДок=ВыбДокумент.ДатаДок; дДок.Фирма=ДругаяБаза.evalexpr("Константа.ОсновнаяФирма"); дДок.Склад=ДругаяБаза.evalexpr("Константа.ОсновнойСклад"); дДок.КатегорияЦен=ДругаяБаза.evalexpr("Константа.ПриходнаяКатегорияЦен"); дДок.ВариантРасчетаНалогов=ДругаяБаза.evalexpr("Константа.ОсновнойВариантРасчетаНалогов"); дДок.Валюта=ДругаяБаза.evalexpr("Константа.БазоваяВалюта");//рубли дДок.Дата_курса=дДок.ДатаДок; дДок.ТипУчета=1; дДок.Автор=ДругаяБаза.evalexpr("глПользователь"); дДок.ПризнакНакладной=ДругаяБаза.evalexpr("Перечисление.ПризнПрихНакл.Закупка"); дДок.Курс=1;//рубли дДок.Комментарий=ВыбДОкумент.Комментарий; ВыбДОкумент.ВыбратьСтроки(); Пока ВыбДокумент.ПолучитьСтроку()=1 Цикл дДок.НоваяСтрока(); ТовКод=СокрЛП(ВыбДОкумент.Товар.Код); Если дТовар.НайтиПоКоду(ТовКод)=0 Тогда Сообщить("Не найден товар с кодом "+ТовКод); Возврат; КонецЕсли; дТовар.ИспользоватьДату(дДок.ДатаДок); дДок.Товар=дТовар.ТекущийЭлемент(); дДок.Количество=ВыбДокумент.Количество; дДок.Единица=дТовар.ЕдиницаПоУмолчанию; дДок.Цена=ВыбДОкумент.Цена; дДок.Коэффициент=1; дДок.Всего=ВыбДОкумент.Сумма; дДок.Сумма=ВыбДОкумент.Сумма-ВыбДокумент.НП; дДок.СтавкаНДС=дТовар.СтавкаНДС; дДок.НДС=ВыбДокумент.НДС; дДок.СтавкаНП=дТовар.СтавкаНП; дДок.СуммаНП=ВыбДокумент.НП; КонецЦикла; дДок.УстановитьНовыйНомер(ДругаяБаза.evalexpr("Константа.ПрефиксНомеровДокументовУпрУчета")); Сообщить(""+дДок.НомерДок); дДок.Записать();
Этот пример на 100% рабочий. Используется у меня для выгрузки документов из одной конфигурации в другую.
Для сравнения значений агрегатных типов данных в базе, открытой через Оле, использовать стандартный алгоритм с использование знаков равно и неравно (=,<>) не получается. Выход простой. Необходимо перейти от сравнения агрегатных типов данных к простым типам данных - дата, строка и число.
Отсюда вывод: мы сравниваем не сами элементы, а их уникальные атрибуты. Например, для элементов справочника - это код (если он есть), либо наименование. Для перечисления используется метод Идентификатор(). Вот два примера:
//Сравнение реквизита номенклатуры с Константой БазоваяВалюта Если дТовар.ВалютаУчета.Код<>Другая.Константа.БазоваяВалюта.Код Тогда дТовар.ВалютаУчета=Другая.Константа.БазоваяВалюта; КонецЕсли; //Сравнение реквизита номенклатуры с перечислением Если дТовар.ТипТовара.Идентификатор()<>Другая.Перечисление.ТипыТоваров.Штучный.Идентификатор() Тогда дТовар.ТипТовара=Другая.Перечисление.ТипыТоваров.Штучный; КонецЕсли;