OLE в 1С-Предприятии

Публикация № 57224

Разработка - Математика и алгоритмы

Небольшая инструкция с примерами - как работать с OLE

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

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

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

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

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

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

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. recommend 51 13.08.08 11:05 Сейчас в теме
А что изменится если вместо
дДок.Фирма=ДругаяБаза.evalexpr("Константа.ОсновнаяФирма");
написать
дДок.Фирма=ДругаяБаза.Константа.ОсновнаяФирма;
?
2. valerasv 13.08.08 11:15 Сейчас в теме
****А что изменится если****
Не прокатит
3. recommend 51 13.08.08 11:31 Сейчас в теме
Сдается мне, что "покатит "
да и выполняться быстрее будет
4. g789 13.08.08 16:04 Сейчас в теме
100% - "покатит", у меня работает
ОлдДата = База.Константа.ДатаЗапретаРедактирования;
5. Minotavrik 1577 14.08.08 07:20 Сейчас в теме
В итоге получишь тоже самое, единственное может чуть медленнее, т.к функция EvalExpr() является COM т.е. храниться по сути в dll, которая подгружается в память скорее всего при загрузке компа и является голимым кодом для исполнения :))
6. Sanario 22 03.09.16 09:15 Сейчас в теме
Курс же периодический реквизит - будет 0 равен, если установить, как установлено в коде про создание нового документа
7. white-mount 03.09.16 11:37 Сейчас в теме
дДок=ДругаяБаза.CreateObject("Документ.ПриходнаяНакладная");
дТовар=ДругаяБаза.CreateObject("Справочник.Номенклатура");
дДок.Новый();
...

На мой взгляд основная ошибка данного метода в манипулировании открываемой базой.
Создавать объекты необходимо в базе-приёмнике.
источник это только источник данных.

Необходимость открытия ИБ для перепроверки это не самое главное.
Возможные ошибки при таком переносе потом дольше вылавливать.
Сбой целостности это тот ещё подарок.
Оставьте свое сообщение

См. также

Как в 1С 7.7 сделать обмен на базе FTP

Файловые протоколы обмена, FTP 1С7.7<->1C7.7 v7.7 1cv7.md Бесплатно (free)

Выгрузка данных на FTP на примере в конфигурации Штрих-М Кассир 1.10.

12.05.2020    1465    Ignatov_mu    7    

.NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия

Разработка внешних компонент Математика и алгоритмы v7.7 v8 Бесплатно (free)

Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия, а так же генерация модулей на C# и 1С для подключения к событиям. Использование DynamicMethod и ILGenerator. Представлены примеры для использовании событий System.IO.FileSystemWatcher (Ожидает уведомления файловой системы об изменениях и инициирует события при изменениях каталога или файла в каталоге.) и SerialPort (обработка сканера штрих кода подключенного к COM порту). Обертка позволяет использовать классы .Net только на языке 1С. Реализация 1C Messenger описанного здесь http://infostart.ru/public/434771/

12.11.2015    46721    Serginio    36    

Оптимизация выгрузки из 1С 7.7 по правилам обмена большого объема данных

Перенос данных из 1С7.7 в 1C8.X Обмен через XML 1С7.7<->1C7.7 v7.7 1cv7.md Бесплатно (free)

При выгрузке из 1С 7.7. большого справочника программа завершалась примерно с таким сообщением: "msxml6.dll: Недостаточно памяти для завершения операции". Вариант выгрузки порциями меня не устраивал. Поэтому немного оптимизировал обработку выгрузки. Возможно кому-то сэкономит время.

24.09.2014    31924    Just4Fun    29    

КД 2.0. Перенос документов 7.7 - 7.7. Передача параметра "Проведен"

Обмен через XML 1С7.7<->1C7.7 v77::ОУ v77::БУ v77::Расчет 1cv7.md КД Бесплатно (free)

1С:Конвертация данных 2.0. Решение проблемы проведения документов при переносе между базами 7.7

20.12.2011    18618    xazrad    18    

Работа с 1С через OLE 8.* (V81.Application, V81.COMConnector)

Перенос данных из 1С7.7 в 1C8.X Математика и алгоритмы v7.7 v8 1cv8.cf 1cv7.md Бесплатно (free)

Решил серьезно заняться изучением OLE. Конечно OLE это не КД, но все же...

07.04.2011    96902    artspeed    16    

Конвертация данных 2 - Отмена проведения документов в 7.7 при повторной загрузке

1С7.7<->1C7.7 Обработка документов v7.7 1cv7.md КД Бесплатно (free)

При повторной загрузке данных в 1С бывает необходимо отменить проведение у существующих документов.

21.10.2010    18823    nicxxx    7    

Заполнение списков для отборов в отчетах и обработках

Математика и алгоритмы v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Бесплатно (free)

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

01.07.2010    10669    ne_en    8    

Ликбез 7.7: Инициализация переменных во внешнем отчете.

Математика и алгоритмы v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Бесплатно (free)

Хотя апологеты самодокументированных программ категорически не рекомендовали передавать в процедуры параметры-ссылки, все же иногда хочется.

25.06.2010    15803    Арчибальд    18    

УРБД, типы миграции (Буферные документы, буферные элементы)

Математика и алгоритмы Распределенная БД (УРИБ, УРБД) v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Бесплатно (free)

Часто при использовании стандартного механизма УРБД в 1С:Предприятии 7.7 нехватает типа миграции "центр и место назначения". Данная статейка излагает лишь возможный принцип решения данной проблемы.

08.06.2009    10833    Bosma    4    

Как определить путь к Информационной Базе?

Математика и алгоритмы v7.7 1cv7.md Россия Бесплатно (free)

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

13.03.2009    81718    anempadest    26    

(OLE 1С - 1C 7.7) Функции для 1С:Предприятие 7.7 для работы с другой базой 1С.

1С7.7<->1C7.7 Практика программирования v7.7 1cv7.md Россия Бесплатно (free)

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

06.08.2008    29007    venger    8    

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

Математика и алгоритмы Обмен через XML 1С7.7<->1C7.7 v7.7 1cv7.md КД Бесплатно (free)

Данная задача возникает когда необходимо перенести справочники между конфигурациями у которых различается количество уровней. Например, количество уровней в справочнике "Номенклатура" в конфигурации "Торговля и Склад" - 5, а в конфигурации "Бухгалтерия" - 4. Самое простое решение - отбросить реквизит "Родитель" элементов справочника при выгрузке, но есть способ элегантнее. В данном случае мы не обсуждаем возможность изменения структуры справочника в базе-приемнике конфигурации "1С:Бухгалтерия".

23.06.2008    13119    api.vl    2    

Много общих журналов + гибкие закладки

Математика и алгоритмы Обработка документов Работа с интерфейсом v7.7 1cv7.md Бесплатно (free)

Общий журнал в ТиС имеет удобный механизм отбора, однако, жальба, что из меню можно открыть только один его экземпляр. Исправляем... А также добавляем "гибкие" закладки.

21.10.2007    16187    Shaman100M    20    

Что такое ТА - точка актуальности итогов

Математика и алгоритмы v77::ОУ 1С7:ТиС Россия Бесплатно (free)

Статья посвящена точке актуальности итогов - одному из важнейших понятий компоненты "Оперативный учет".

04.05.2007    46341    adv73    31    

Продвинутая технология внешних печатных форм

Математика и алгоритмы Универсальные печатные формы v7.7 1cv7.md Бесплатно (free)

Технология позволяет создавать внешние печатные формы на основе существующих встроенных с минимальными изменениями кода и макета таблицы. Ввод в печатные формы и запоминание в базе любой дополнительной информации без проблем с обновлением конфигурации.

18.02.2007    27212    clappa    10    

Методическое пособие "Основные объекты"

Математика и алгоритмы v7.7 1cv7.md Россия Бесплатно (free)

Методические пособие для начинающих программистов в среде 1С:Предприятие 7.7.

09.10.2006    16187    GROOVY    29    

Учет материалов по принципу LIFO/FIFO в типовой бухгалтерии 7.7 ред. 4.5

Математика и алгоритмы Учет ТМЦ Учет ТМЦ v7.7 1С7:ТиС 1С7:ПУБ Россия БУ УУ Бесплатно (free)

Описание идеи реализации учета материалов по принципу FIFO/LIFO в типовой бухгалтерии без внесения изменений в конфигурацию посредством пересчета данных внешней обработкой и формирования корректирующих проводок

24.05.2006    14194    Timesoft    4