В delphi как в 1с
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
1C + Delphi 5: Некоторые простые, полезные алгоритмы
(через OLE; "1C-предприятие версии 7.7")
1) ConnectTo1C_Application
Соединение с 1C OLE-сервером автоматизации.
s1cAppProgID - Имя 1C-сервера автоматизации
InitLine - Строка Инициализации (командная строка запуска 1С:Предприятие), см. инструкцию к 1C.
EmptyString - Строковое выражение. Параметр может содержать пустую строку или строковое значение "NO_SPLASH_SHOW" — отключить заставку при запуске системы 1С:Предприятие в режиме OLE Automation сервера.
Функция возвращает OLE-идентификатор 1C-сервера автоматизации.
2) DisconnetFrom1C_Application
Разрыв соединения и выгрузка из памяти 1C OLE-сервера автоматизации.
handle1C - OLE-идентификатор 1C-сервера автоматизации
Функция возвращает TRUE, если идентификатор не был "пустым".
function DisconnetFrom1C_Application (Var handle1C : OleVariant) : boolean;
//Рассоединение с 1С
//Возвращает TRUE, если соединение было "непустым"
begin
Result:=FALSE;
if not VarIsEmpty(handle1C) then Result:=TRUE;
handle1C:=Unassigned;
end;
3) ConnectTo1C_Object
Аналог функци "СоздатьОбъект", т.е. "назначает" соединение на заданный объект 1C.
handle1C - OLE-идентификатор 1C-сервера автоматизации (должен быть создан с помощью функции ConnectTo1C_Application)
(Предполагается, что создавать и манипулировать объектами нужно одновременно во многих Базах 1C).
Функция возвращает OLE-идентификатор созданного объекта.
function ConnectTo1C_Object (handle1C : OleVariant; NameObj : string) : OleVariant;
// Создание объекта 1C (аналог СоздатьОбъект)
begin
Result:=Unassigned;
if not VarIsEmpty(handle1C) then begin
Result:=handle1C.CreateObject(NameObj);
end;
end;
4) DisconnectFrom1C_Object
Разрыв соединения и уничтожение объекта, созданного функцией ConnectTo1C_Object.
handle1C - OLE-идентификатор 1C-сервера автоматизации
Функция возвращает TRUE, если идентификатор не был "пустым".
function DisconnectFrom1C_Object (Var handle1CObj : OleVariant) : boolean;
// Уничтожение объекта 1C (созданного функцией ConnectTo1C_Object)
//Возвращает TRUE, если объект "существовал"
begin
Result:=FALSE;
if not VarIsEmpty(handle1CObj) then Result:=TRUE;
handle1CObj:=Unassigned;
end;
5) YesLinkTo1C_Any
Проверка, является ли Непустым OLE-идентификатор, созданный функцией ConnectTo1C_Object.
Возвращает TRUE, если идентификатор "назначен"
function YesLinkTo1C_Any (HandleAny : OleVariant) : boolean;
//Проверяет, есть ли соединение с ЛЮБЫМ объектом (включая сам 1C OLE-сервер)
begin
Result:=FALSE;
if not VarIsEmpty(HandleAny) then Result:=TRUE;
end;
6) YesReferenceInThis1C .
Проверка, существует ли справочник с именем "NameReference" в Базе (конфигурации), заданной OLE-идентификатором handle1C (handle1C должен быть создан с помощью функции ConnectTo1C_Application).
AllTrim - вспомогательная функция.
Возвращает TRUE, если справочник есть.
7) YesTypeDocumentsInThis1C .
Проверка, существует ли Тип Документов с именем NameDoc в Базе (конфигурации), заданной OLE-идентификатором handle1C (handle1C должен быть создан с помощью функции ConnectTo1C_Application).
AllTrim - вспомогательная функция.
Возвращает TRUE, если тип документов есть.
8) CountReferenceInThis1C
Возвращает кол-во справочников в Базе (конфигурации), заданной OLE-идентификатором handle1C (handle1C должен быть создан с помощью функции ConnectTo1C_Application).
Возвращает ЧИСЛО (кол-во справочников).
function CountReferenceInThis1C (handle1C : OleVariant) : integer;
// Получить кол-во справочников в заданной 1C
begin
Result:=0;
if YesLinkTo1C_Any(handle1C) then begin
Result:=handle1C.Метаданные.Справочник;
end;
end;
9) CountTypeDocumentsInThis1C
Возвращает кол-во типов документов в Базе (конфигурации), заданной OLE-идентификатором handle1C (handle1C должен быть создан с помощью функции ConnectTo1C_Application).
Возвращает ЧИСЛО (кол-во типов документов).
function CountTypeDocumentsInThis1C (handle1C : OleVariant) : integer;
// Получить кол-во документов в заданной 1C
begin
Result:=0;
if YesLinkTo1C_Any(handle1C) then begin
Result:=handle1C.Метаданные.Документ;
end;
end;
10) GetSingleAttrFromReference_1C .
Прочитать Непериодический реквизит из справочника.
handle1C - OLE-идентификатор Базы 1C (handle1C должен быть создан с помощью функции ConnectTo1C_Application).
handle1CObj - OLE-идентификатор справочника (должен быть создан функцией ConnectTo1C_Object)
NameAttr - Имя Реквзита.
AllTrim - вспомогательная функция.
В переменной TypeValue возвращается тип прочитанного значения реквизита (тип приходится жестко контролировать для того, чтобы потом это значение можно было корректно записать).
Функция возвращает прочитанное значение атрибута.
11) PutSingleAttrToReference_1C .
Записать непериодический реквизит в справочник.
handle1C - OLE-идентификатор Базы 1C (handle1C должен быть создан с помощью функции ConnectTo1C_Application).
handle1CObj - OLE-идентификатор справочника (должен быть создан функцией ConnectTo1C_Object)
NameAttr - Имя Реквизита. Value - значение атрибута, которое нужно записать в Базу.
TypeValue - тип переменной, который возвращает функция GetSingleAttrFromReference_1C (тип приходится жестко контролировать для того, чтобы потом это значение можно было корректно записать ).
AllTrim - вспомогательная функция.
Функция возвращает TRUE, если значение атрибута записоно.
12) YesAttrInReference_1C .
Проверить, есть ли в заданном справочнике заданной Базы реквизит с именем NameAttr.
handle1C - OLE-идентификатор Базы 1C (handle1C должен быть создан с помощью функции ConnectTo1C_Application).
TypeReference - Имя справочника
NameAttr - Имя тестируемого Реквизита.
AllTrim - вспомогательная функция.
Функция возвращает TRUE, если такой реквизит существует.
13) ThisAttrInReferenceIsPeriodic_1C .
Проверить, является ли заданный реквизит в справочнике периодическим.
handle1C - OLE-идентификатор Базы 1C (handle1C должен быть создан с помощью функции ConnectTo1C_Application).
TypeReference - Имя справочника
NameAttr - имя тестируемого Реквизита. Функция возвращает TRUE, если тестируемый реквизит периодический.
14) GetCountAttrInReference_1C .
Получить кол-во реквизитов в заданном справочнике заданной Базы Данных 1C .
handle1C - OLE-идентификатор Базы 1C (handle1C должен быть создан с помощью функции ConnectTo1C_Application).
TypeReference - Имя справочника
AllTrim - вспомогательная функция.
Функция возвращает кол-во реквизитов в справочнике.
15) GetTypeAttrReferenceStr_1C .
Получить тип заданного атрибута (в виде строки).
handle1C - OLE-идентификатор Базы 1C
(handle1C должен быть создан с помощью функции ConnectTo1C_Application).
NameReference - Имя справочника
NameAttr - Имя тестируемого Реквизита.
AllTrim - вспомогательная функция.
Функция возвращает имя типа реквизита (строка).
16) GetTypeAttrReference_1C .
Получить тип заданного атрибута (в виде числа).
handle1C - OLE-идентификатор Базы 1C (handle1C должен быть создан с помощью функции ConnectTo1C_Application).
NameReference - Имя справочника
NameAttr - Имя тестируемого Реквизита.
AllTrim - вспомогательная функция.
Функция возвращает имя типа реквизита (целое число).
2.Г енератор проекта внешней компоненты, позволяющий получить готовый проект за несколько секунд. Остается только добавлять свойства и методы своей компоненты с помощью визуального редактора. Все идентификаторы, имена, интерфейсы уже прописаны генератором проекта.
Введение
Что это такое:
- Это компонент для DELPHI (любой версии), позволяющий значительно упростить создание внешних компонент 1С (технология COM)
- Это генератор проекта внешней компоненты, позволяющий получить готовый проект за несколько секунд. Остается только добавлять свойства и методы своей компоненты с помощью визуального редактора. Все идентификаторы, имена, интерфейсы уже прописаны генератором проекта.
Почему до сих пор создавать по технологии COM
- Эта технология дает возможность написания универсальной компоненты, которая будет работать для всех версий 1С:Предприятия под windows 7.7/8.0/8.1/8.2/8.3
- Многие старые компоненты написаны по этой технологии. Для создания их современной замены без изменения конфигурации 1С необходимо использовать именно эту технологию.
- Например, для подключения новых видов торгового оборудования к типовым программам, лишенным теперь внешних обработок обслуживания оборудования.
Почему DELPHI
- Относительно невысокая стоимость самой среды разработки.
- Обилие в сети бесплатных или дешевых компонент для работы с чем угодно.
- Наименьшее время разработки.
- Многие программисты 1С перешли с паскаля и им достаточно просто освоить DELPHI.
Почему мой проект, ведь полно в сети различных проектов на эту тему в том числе, бесплатных
- Включены все исходные коды.
- Готовый проект внешней компоненты 1С можно получить за несколько секунд, не разбираясь в том, как там что устроено.
- Экспортируются и используются все документированные 1С интерфейсы.
- Свойства и методы внешней компоненты можно добавлять визуально, как объекты обычной коллекции.
- Подробная документация
Начало работы
Содержимое архива
- 1C_ADDIN_HELPER. Компонент для DELPHI. Его надо установить. Инструкция ниже.
- 1C_ADDIN_ProjectCreator. Генератор проекта внешней компоненты. Инструкция ниже.
- 1C_ADDIN_DEMO. Демо-проект внешней компоненты, сделанный по данной технологии. Также включены обработки 1С 7.7 и 1С 8.2 для проверки работы компоненты. Инструкция ниже.
ШАГ 1. Установка компонента DELPHI
Добавляем путь к папке1C_ADDIN_HELPER в библиотеку DELPHI.
Меню: Tools – Environment options - Library path
Добавляем путь к папке1C_ADDIN_HELPER в библиотеку DELPHI.
Меню: Tools – options - Library –library path
Компонент появляется в палитре DELPHI
Компонент появляется в палитре DELPHI
Данный шаг необходимо выполнить один раз.
ШАГ 2. Генерация проекта внешней компоненты.- Запускаем PrCreator.exe из папки 1C_ADDIN_ProjectCreator
- Указываем:
- Путь к папке, в которой будет создан проект внешней компоненты
- Имя библиотеки внешней компоненты (имя dll-ки)
- Имя объекта внешней компоненты. Т.е имя, под которым ее объект можно будет создавать в 1С с помощью функций Новый() или СоздатьОбъект().
- Если у компоненты должна быть страница свойств, ставим галочку «Нужна страница свойств».
- Нажимаем большую кнопку «Создать». В указанной папке появляется DELPHI-проект внешней компоненты 1С с указанными параметрами.
- Его можно открывать в DELPHI.
ШАГ 3. Как добавлять функционал внешней компоненты.
- Весь функционал компоненты реализуется в модуле Un_DM_List.pas, основной объект которого унаследован от TDataModule. Это дает возможность простого использования компонентов из палитры компонент DELPHI.
- Добавление свойств и методов внешней компоненты осуществляется через коллекции (T1CMethCollection) и (T1CPropCollection) объекта AddinFPList уже добавленного в проект генератором проектов.
- Чтобы добавить свойство внешней компоненты 1С, щелкаем по (T1CPropCollection)
Добавляем элемент в коллекцию и прописываем его свойства:
- Английское название
- Русское название
- Признак «IsReadOnly» запрещает 1С записывать в это свойство что либо.
Описываем события у нашего свойства:
procedure TDM_List.AddinFPListProps0Get(var OldValue: OleVariant);
Это событие возникает, когда 1С пытается прочитать что либо из данного свойства. Прочитает она ровно то, что мы передадим в параметр OldValue. Тип OleVariant позволяет передавать строки, числа, даты, а также более сложные структуры, поддерживаемые 1С.
procedure TDM_List.AddinFPListProps0Set(var NewValue: OleVariant);
Это событие возникает, когда 1С пытается записать что либо в данное свойство. Значение, которое 1С хочет записать, содержится в переменной NewValue. Мы можем обработать его, как хотим. Например, сохранить в одном из свойств нашего объекта. Тип OleVariant может быть преобразован в строку, число, или дату явным присваиванием. Компилятор DELPHI в этом случае берет работу по преобразованию типов на себя.
- Чтобы добавить метод внешней компоненты 1С, щелкаем по (T1CMethCollection)
Добавляем элемент в коллекцию и прописываем его свойства:
- Английское название
- Русское название
- Количество параметров
- Признак «IsFunction» сообщит 1С, что этот метод может возвращать значения.
Описываем событие у нашего метода:
procedure TDM_List.AddinFPListMethods0Execute(var Params: PSafeArray;
В переменную Params 1C передает параметры метода. Получить их можно, используя функцию GetNParam , добавленную в проект генератором. Эта функция имеет два параметра. В первый передается массив Params, во второй – номер параметра, который мы хотим получить. Нумерация параметров с нуля!
Param1:=GetNParam(Params,0); //Получаем первый параметр из массива
Можно также записать в Params значение некоторого параметра. Тогда 1С получит это значение после вызова метода (параметры передаются по ссылке). Для этого можно использовать функцию PutNParam, также имеющуюся в проекте. Онаимеет три параметра. В первый передается массив Params, во второй – номер устанавливаемого параметра, в третий – значение, которое мы хотим передать. Нумерация параметров с нуля!
PutNParam(Params,0,Param1); //Установим значение первого параметра для 1С
Ну и в случае, если наш метод может возвращать значения, можно передать возвращаемое значение в переменную Ret. Тип OleVariant позволяет передавать строки, числа, даты, а также более сложные структуры, поддерживаемые 1С.
Ret:='Тест'; //Передаем строковое значение в качестве результата работы метода
Дополнительные возможности
- Объект DM_List экспортрует стандартные интерфейсы 1С:
- _pEvent : IAsyncEvent;
- _pErrorLog : IErrorLog;
- _pProfile : IPropertyProfile;
- _pStatusLine : IStatusLine;
Ими можно пользоваться в соответствии с их стандартным 1С-ким описанием. В поставляемом демо-проекте есть пример их использования.
- ВАЖНО: 1С-8 не реализует возможности интерфейса ExtWndSupport. Поэтому генератор проекта не добавляет экспорт этого интерфейса в проект. Вы можете сделать это самостоятельно в методе Init, описанном в AddInObj.pas.
- Опционально генератор проекта может добавить в проект страницу свойств компоненты.
Обмен данными между объектом компоненты и страницей свойств осуществляется через унаследованный интерфейс IPropertyLink. В модуле страницы свойств описаны два метода:
- UpdatePropertyPage. Запрашивает свойства из объекта и отображает их на форме страницы свойств.
- Вызывается метод get_Config объекта DM_List, описанный в модуле Un_DM_List.pas
- Передается структура TConfig, описанная в проекте в модуле AddInLib.pas . По сути это запись (RECORD).
- Что нужно сделать для того, чтобы добавить какой-либо параметр для передачи из компоненты в страницу свойств:
- Добавить элемент в структуру TRecord
- В методе get_Config объекта DM_List прописать его заполнение.
- В методе UpdatePropertyPage страницы свойств прописать его отображение на форме.
- Вызывается метод put_Config объекта DM_List, описанный в модуле Un_DM_List.pas
- Передается та же структура TConfig.
- Что нужно сделать для того, чтобы добавить какой-либо параметр для передачи со страницы свойств в компоненту:
- В методе UpdateObject страницы свойств прописать заполнение элемента структуры CFG по данным формы.
- В методе put_Config объекта DM_List прописать реакцию на изменение настройки со стороны страницы свойств.
- Методы LoadProps() и SaveProps() объекта DM_List.
- Данные методы вызываются автоматически при создании и уничтожении объекта, соответственно
Полезные знания
- Для того, чтобы в 1С-8 компоненту можно было подключать по имени объекта, т.е писать ПодключитьВнешнююКомпоненту(«Addin.MyObj»), файл внешней компоненты надо зарегистрировать в реестре с помощью команды regsvr32. В проекте, создаваемом генератором, добавлен командный файл Register.cmd, выполняющий это действие.
- Сложности могут возникнуть с передачей типа БУЛЕВО между 1С и внешней компонентой. 1С 7.7 такого типа вообще не знает. 1С-8 передает его в COM-компоненты в странном виде.
Описание демо-проекта, включенного в поставку
Причины купить
1. На создание проекта внешней компоненты всегда уходит время.
2. Добавлять свойства и методы внешней компоненты стандартными средствами долго и неудобно.
3. Мой проект позволит Вам сэкономить кучу времени
4. Ваше время дороже тысячи рублей:)
Достоинства
1.Включены все исходные коды.
2.Готовый проект внешней компоненты 1С можно получить за несколько секунд, не разбираясь в том, как там что устроено.
3.Экспортируются и используются все документированные 1С интерфейсы.
4.Свойства и методы внешней компоненты можно добавлять визуально, как объекты обычной коллекции.
5.Подробная документацияГарантия возврата денег
ООО "Инфостарт" гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом в течение 14-ти дней со дня поступления денег на наш счет.
Программа настолько проверена в работе, что мы с полной уверенностью можем дать такую гарантию. Мы хотим, чтобы все наши покупатели оставались довольны покупкой.
Насколько мне известно, многие 1С-ники хотели бы изучить написание внешних компонент, чтобы поднять свое магическое искусство 1С на качественно иную ступень.
Что этому может помешать? Во-первых, известный синдром компонентофобии (который исторически берет свое начало от криво написанных внешних компонент). Во-вторых –синдром клинически запутанного кода. OLE-программирование – это не самая простая штука, и, как говорится, «не всякая птица долетит до середины Днепра» (особенно, если эта «птица» – программист 1С).
Я предлагаю вашему вниманию шаблон внешней компоненты, который, как я надеюсь, достаточно прост для понимания (я постарался его значительно упростить по сравнению с типовым примером из «Технологии создания внешних компонент») и стабилен (везде, где это возможно, я использую обработку исключительных ситуаций).
Сборка проекта
Для компиляции примера потребуется среда разработки Delphi 6 или 7.
Файл проекта - TestVK.dpr.
Откройте этот файл (например, двойным щелчком мыши из Проводника).
Нажмите сочетание клавиш Ctrl-F9 (или пункт меню Project-Compile). Если все прошло нормально, в этой же папке образуется готовая внешняя компонента TestVK.dll (для проверки, а все ли хорошо, ее можно удалить, и получить готовую TestVK.dll еще раз).Проверка работоспособности DLL
В комплект примера входит тестовая конфигурация 1С:Предприятие 7.7.
Переименование DLL
Первое, что я делаю при создании новой внешней компоненты – переименовываю уже существующий образец.
Переименуйте TestVK.dpr так, как вы хотите (например, MyVK.dpr).
Произведите замену всех вхождений подстроки TestVK в файлах проекта на нужное вам имя внешней компоненты.
Подсказка: чтобы открыть другие модули проекта, используйте пункт меню View-Units…
Программный код 1С, разумеется, также нужно не забыть изменить так, чтобы заменить все подстроки «TestVK».
Важно: замените значение CLSID внешней компоненты, чтобы новая DLL, с точки зрения Windows, стала действительно новой.
Чтобы сгенерировать новый CLSID, нажмите сочетание клавиш Ctrl-Shift-G.
Попробуйте скомпилировать новый проект – 1С должна «увидеть» вашу новую внешнюю компоненту, которая создана на основе другой ВК, но содержит полный набор ее свойств и методов.
Что такое свойства и методы?
Новички могут задаться вопросом, а что такое свойства и что такое методы?
В коде 1С свойства выглядят как, своего рода, «переменные», объекта, доступные через точку, напримерЗдесь объект – имеет имя vk (посмотрите, как он объявляется и инициализируется в глобальном модуле 1С).. Этот объект поддерживает свойства и методы.
В этом коде я установил свойству "Заголовок" текстовое значение (посмотрите, как будет работать пример, если установить этому свойству другое значение заголовка, например, «Здесь был romix», или не устанавливать его вовсе).
Метод объекта – это, своего рода, «функция» объекта, доступная «через точку».
Изменение списка свойств и методов ВК
В модуле AddinObj.pas за количество свойств отвечают участки кода, которые я пометил (*2*), (*5*), (*6*), (*8*), (*11*) а за количество методов - (*3*), (*7*), (*9*), (*10*), (*12*).
Я завел в шаблон по 5 свойств и методов, но что нужно сделать, чтобы их стало 6, например, в приведенном ниже фрагменте кода, - я надеюсь, понятно без объяснений.
Вы можете завести свойства и методы «с запасом» - лишние заготовки не повредят (их можно будет оставить пустыми).
Программирование функциональности свойств
Откройте (через меню View – Units…) модуль vk_object.pas
Для свойств вы увидите примерно такой код, продублированный, с небольшими отличиями, несколько раз: Это самая важная часть наших действий, которую важно постараться понять.
Что я здесь делаю?
Программирование функциональности методов
Для методов код похожий:
Этот абзац можно воспроизвести несколько раз (что и сделано в примере), заменив meth1 на meth2, meth3 и т.д.
Приведенные ниже строчки устанавливают русское и английское имя метода.
Попробуйте изменить то или другое, перекомпилировать проект и посмотреть, что получится.
я устанавливаю количество параметров метода. Попробуйте изменять это количество (например, установить значение 3) и посмотреть, что получится.
Подробнее код я опишу ниже – но сначала полезно потренироваться со вставкой в него отладочной печати (именно так я исследую код).
Возвращаемое значение функции
Чтобы вернуть значение из функции, надо установить переменную g_Value, например:
Отладочная печать
Вы можете в качестве теста вписать в функциональность метода что-то свое, например,
Этот вызов покажет стандартное окно предупреждения с кнопкой ОК. Или вот так:
Во втором случае, если Delphi будет ругаться при компиляции, добавьте Dialogs в раздел uses модуля.
Получение параметров функции
В своей функции я завел две переменные для хранения параметров:
Сейчас мы их заполним значениями, полученными из 1С.
Параметры нумеруются, начиная с 0 (давняя традиция программистов на языке С).
Чем отличаются AsString и AsInteger, надеюсь, понятно.
Этот код можно было бы написать и так:
Отладочная печать параметров
При отладке полученные из 1С значения полезно выводить на экран. Но как это сделать?
Я обычно использую следующий прием:Чтобы показать строковые переменные, я пишу так:
А числовые значения и значение типа "дата-время" я отображаю примерно так:
Функциональность методов
Получив все значения из 1С, можно приступать к собственно написанию полезного кода.
Узнавать, как работают те или иные функции API, можно в поисковых машинах или в сборниках Delphi FAQ, которые в изобилии выложены в сети Интернет.
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
1C + Delphi 5: Простой пример подключения к Базе Данных 1C
(через OLE; в данном случае рассматривается подключение к "1C-предприятие версии 7.7")
Создадим простое приложение, которое считывает список из справочника "ФизическиеЛица".
Пример (в формате MS Word) можно скачать здесь (792 Кб)
Шаг N 1. (скачать, 177 Кб)
Создадим проект с именем Project1
Положим на форму 2-а компонента типа TPanel (у Panel1 свойство Align установим равным AlTop, а у Panel2 - AlClient)
На Panel1 положим кнопку Button1 (TButton) и установим свойство Caption = "Соединить"
Положим на Panel1 еще 4 компонента :
Label1, Edit1, Label2, Edit2
Установим :
- свойство Caption :
Label1.Caption - "Имя 1C-сервера Строка инициализации V77.Application"
Edit2.Text - "/DF:\1CV77\ATCDEMO"Должно получиться что-то вроде этого:
Некоторые пояснения.
Edit1.Text содержит имя 1C, как OLE - сервера автоматизации.
В нашем случае мы указали : V77.Application
Возможные значения (согласно документации по 1C) :
- V1СEnterprise.Application - версия независимый ключ;
- V77.Application - версия зависимый ключ;
- V77S.Application - версия зависимый ключ, SQL версия;
- V77L.Application - версия зависимый ключ, локальная версия;
- V77M.Application - версия зависимый ключ, сетевая версия.
Edit2.Text содержит строку инициализации 1C
В нашем случае мы указали : /D F:\1CV77\ATCDEMO
Т.е., указали только местонахождение Базы Данных, к которой желаем подключиться
(в этом примере : указан каталог F:\1CV77\ATCDEMO)
Возможные значения ключей (согласно документации по 1C) :
/D - Имя каталога (папки), где располагается База Данных
/N - Имя Пользователя
/P - Пароль доступа
Пример : /DC:\1CV77\ATCDEMO /NАдмин /P123В исходном тексте программы добавим следующее (выделено жирным красным цветом) :
uses
ComObj,
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
< Private declarations >
Ole1C : OleVariant;
public
< Public declarations >
end;
Переменная Ole1C (типа OleVariant) будет использована в дальнейшем, как указатель на объект 1C (OLE - сервер автоматизации).
Сделаем двойной щелчок по компоненту Button1 и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :
procedure TForm1.Button1Click(Sender: TObject);
Var
ResOpen : integer;
begin
Ole1C := CreateOleObject(Edit1.Text);
ResOpen:=Ole1C.Initialize(Ole1C.RMTrade, Edit2.Text, '');
end;
Строка :
Ole1C := CreateOleObject(Edit1.Text);
собственно, "запускает" программу 1C, как OLE - сервер автоматизации (имя указано в Edit1.Text)
Строка :
ResOpen:=Ole1C.Initialize(Ole1C.RMTrade, Edit2.Text, '');
инициализирует 1C, согласно нашим "указаниям" (Edit2.Text)Более подробно можно почитать соотв. документацию по 1C
Откомпилируем и запустим приложение Project1.exe
Нажмите на кнопку " Соединить ".
Если все указано корректно (содержание Edit1.Text и Edit2.Text ),
программа 1C должна запуститься (как OLE сервер автоматизации).Если в строке инициализации НЕ указаны имя пользователя и(или) пароль доступа, то следует запрос :
Если не корректно указан каталог Базы Данных, то следует запрос :
После загрузки и инициализации программы 1C, ссылка на 1C хранится в переменной Ole1C.
Следует помнить, что программа 1С:Предприятие (как и все создаваемые объекты OLE Automation), выступающая в качестве объекта OLE Automation в другой программе, будет находиться в памяти компьютера до удаления или изменения значения переменной, содержащей ее в качестве объекта.
Именно поэтому, мы вынесли объявление переменной Ole1C "за пределы" обработчика : TForm1.Button1ClickЯвных (видимых) признаков того, что мы запустили 1C - нет.
Для того, что убедиться в этом, нужно запустить диспетчер задач (по комбинации Ctrl+Alt+Del).
В списке задач можно увидеть :Следует отметить, что после того, как Project1.exe будет закрыт - автоматически выгрузится из памяти и 1C.
Шаг N 2. (скачать, 180Кб)
Продолжим наш проект.На Panel2 положим компонент ListBox1 (TListBox). Свойство Align установим равным AlClient.
Рядом с кнопкой Button1 ("Соединить") положим на Panel1 кнопку Button2 (установим свойство Caption = ФизЛица)
Получится что-то вроде этого :
В исходном тексте программы добавим описание переменной OleFizLica
private
< Private declarations >
Ole1C : OleVariant;
OleFizLica : OleVariant;
public
< Public declarations >
end;Сделаем двойной щелчок по компоненту Button2 и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :
procedure TForm1.Button2Click(Sender: TObject);
begin
OleFizLica := Unassigned;
if not VarIsEmpty(Ole1C) then begin
OleFizLica:=Ole1C.CreateObject('Справочник.ФизическиеЛица');
end;
end;Строка :
OleFizLica := Unassigned;
Здесь "обнуляется" значение переменной OleFizLica.
Тем самым, если ранее был создан какой-либо OLE-объект, на который ссылалась эта переменная, он будет уничтожен.
Строка :
if not VarIsEmpty(Ole1C) then begin
Здесь проверяется, чтобы значение переменной Ole1C не было "пустым".
Т.е., если Ole1C имеет "не пустое" значение, то это значит (в контексте нашего проекта), что программа 1C запущена и связь с ней установлена.Строка :
OleFizLica:=Ole1C.CreateObject('Справочник.ФизическиеЛица');
Здесь создается объект, который ссылается на справочник "ФизическиеЛица".
Если такой справочник существует, то в дальнейшем, переменная OleFizLica будет содержать ссылку на него.Шаг N 3. (скачать, 184 Кб)
Сделаем двойной щелчок по компоненту Button2 и еще раз изменим обработчик события нажатия на кнопку следующим образом :
Строки N 3,4,5,6 теперь понятны.
Строка N 7 :
if not VarIsEmpty(OleFizLica) then begin
Здесь проверяется, что объект, ссылающийся на справочник "ФизическиеЛица" действительно создан.Строки N 8..13
Здесь реализован стандартный алгоритм на языке 1C по перебору элементов справочника.Строка N 11
ListBox1.Items.Add(OleFizLica.Код+' '+OleFizLica.Наименование);
Здесь продемонстрирован один из вариантов обращения к реквизитам справочника по именам.Строка N 16
OleFizLica := Unassigned;
Здесь "обнуляется" значение переменной OleFizLica.
Тем самым, мы уничтожаем созданный нами объект, чтобы зря не занимать ресурсы.
Следует отметить, что поскольку (в нашем случае) мы используем переменную OleFizLica только в "пределах" обработчика
procedure TForm1.Button2Click(Sender: TObject), то мы могли бы и объявить эту переменную в этом обработчике.Откомпилируем и запустим приложение Project1.exe
Нажмите на кнопку " Соединить ". После того, как загрузится программа 1C, нажмите на кнопку " ФизЛица ".
Если все указано корректно , то в ListBox1 будет содержание справочника "ФизическиеЛица".
Т.е., будет что-то вроде этого :Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
1C + Delphi 5: Простой пример использования методов EvalExpr и ExecuteBatch 1C
Параллельно рассматривается один из способов, как "открыть" окно 1С
(через OLE; в данном случае рассматривается подключение к "1C-предприятие версии 7.7")
Создадим простое приложение, которое с помощью которого можно "потренироваться" в использовании метода ExecuteBatxh.
Будем исходить из того, что детали подключения у 1С рассмотрены в предыдущем примере и здесь мы этого уже касаться не будем.
Пример (в формате MS Word) можно скачать здесь (931 Кб)
Здесь мы реализуем соединение с 1С (запуск программы 1С) и способ сделать окно 1С видимым (впоследствии это нам пригодится).
Создадим проект с именем Project1
Положим на форму компоненты : типа TGroupBoxl (у GroupBox1 свойство Align установим равным AlTop)
На GroupBox1 положим 4 кнопки (TButton) и TLabel. Установим сво-во Caption у компонентов, как на рисунке (см. ниже).
У Label1 сво-ство Visible установим = FALSE . А свойство Caption .Должно получиться что-то вроде этого:
В исходном тексте программы добавим следующее (выделено жирным красным цветом) :
uses
Unit2,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
LabelYesConnect: TLabel;
Button1: TButton;
Button2: TButton;
Button4: TButton;
Button5: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
privatehW1C : hWND; //дескриптор главного окна приложения 1С
ref1C : OleVariant; //ссылка на 1С, как OLE-сервер автоматизацииpublic
< Public declarations >
end;
Переменная ref1C (типа OleVariant) будет использована в дальнейшем, как указатель на объект 1C (OLE - сервер автоматизации).
Переменная hW1C - дескриптор главного окна приложения 1C.В модуле Unit2.pas содержатся дополнительные процедуры и функции, которые нам будут нужны в данном примере.
Содержание модуля Unit2.pas :
Сделаем обработчкк события, которое возникает при создании формы, следующим образом :
procedure TForm1.FormCreate(Sender: TObject);
begin
hW1C:=0;
ref1C := UnAssigned;
end;
Сделаем двойной щелчок по компоненту Button1 (Connect) и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :
procedure TForm1.Button1Click(Sender: TObject);
//Запуск 1С
begin
LabelYesConnect.Visible:=FALSE;
hW1C:=0;
ref1C := UnAssigned;
//Вызов окна диалога 1С для выбора соотв. БазыДанных 1С и запуска приложения 1С
ref1C := ConnectTo1C_Application('','','');
if YesLinkTo1C_Any(ref1C) then begin //Контроль на всякий случай
LabelYesConnect.Visible:=TRUE; //Покажем (для себя), что есть соединение
//Найдем окно запущенного приложения 1С и получим
//дескриптор главного окна приложения 1С
hW1C:=GetHandleThisWindow('1С:Предприятие',1,TRUE,TRUE);
if hW1C ShowMessage('Главное окно приложения 1С не найдено !');
end;
end;
end;
Строка :
ref1C := ConnectTo1C_Application('','','');
Соединение с 1C. Текст функции ConnectTo1C_Application() находится в модуле Unit2.pasСтрока :
if YesLinkTo1C_Any(ref1C) then begin
На всякий случай проверяем, что ссылка на 1С - не пуста. Текст функции YesLinkTo1C_Any() находится в модуле Unit2.pasСтрока :
hW1C:=GetHandleThisWindow('1С:Предприятие',1,TRUE,TRUE);
Здесь мы получаем дескриптор главного окна приложения 1С. Это нужно для того, чтобы можно было управлять видимостью окна 1С.
Процедура GetHandleThisWindow() сканирует память компа и ищет процесс, заголовок окна которого начинается с цепочки символов " 1С:Предприятие ". Для этого используются функции API Windows.
Текст GetHandleThisWindow() находится в модуле Unit2.pasСделаем двойной щелчок по компоненту Button2 (Disconnect) и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :
procedure TForm1.Button2Click(Sender: TObject);
//Закрыть приложение 1С
begin
hW1C:=0;
ref1C := UnAssigned;
LabelYesConnect.Visible:=FALSE;
if YesLinkTo1C_Any(ref1C) then begin
LabelYesConnect.Visible:=TRUE;
end;
end;Здесь все ясно и комментарий не требуется.
Сделаем двойной щелчок по компоненту Button4 (Show) и изменим стандартный обработчик события - нажатие на кнопку - следующим образом (Button3 отсутствует вообще) :
procedure TForm1.Button4Click(Sender: TObject);
//Показать главное окно приложения 1С
begin
if YesLinkTo1C_Any(ref1C) then begin
if hW1C>32 then begin
ShowWindow(hW1C,SW_SHOW);//Показать главное окно приложения 1С
end;
end;
end;Строка :
if hW1C>32 then begin
Проверяем корректность дескриптора главного окна приложения 1С.Строка :
ShowWindow(hW1C, SW_SHOW);
Имея корректный дескриптор главного окна приложения - сделаем его видимым
(функция API ShowWindow с флагом SW_SHOW) .Сделаем двойной щелчок по компоненту Button5 (Hide) и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :
procedure TForm1.Button5Click(Sender: TObject);
//Скрыть главное окно приложения 1С
begin
if YesLinkTo1C_Any(ref1C) then begin
if hW1C>32 then begin
ShowWindow(hW1C,SW_HIDE);//Скрыть главное окно приложения 1С
end;
end;
end;Строка :
if hW1C>32 then begin
Проверяем корректность дескриптора главного окна приложения 1С.Строка :
ShowWindow(hW1C, SW_HIDE);
Имея корректный дескриптор главного окна приложения - скроем его
(функция API ShowWindow с флагом SW_HIDE) .ВНИМАНИЕ .
Сейчас нужно проверить, чтобы все программы 1С (имеющие заголовок окна 1С:Предприятие ) были выгружены (закрыты) . Ясно, что конфигуратор можно не закрывать .Откомпилируем и запустим приложение Project1.exe
Нажмите на кнопку " Connect ".
На экране появится диалог для выбора Базы Данных 1С :Выберите соотв. Базу Данных и нажмите Ok
После загрузки 1С можно продолжить эксперименты.Шаг N 2. (скачать, 185 Кб)
Продолжим наш проект. На этом шаге мы "потренируемся" с обращением к методу EvalExpr .Положим на форму еще 3 компонента (ниже, чем GroupBox1 ) :
TLabel, TEdit и TButton (Button3)
Изменим имя Edit1 на EditEvalExpr. Получится что-то вроде этого :
В исходном тексте программы добавим описание переменной OleFizLica
private
< Private declarations >
hW1C : hWND; //дескриптор главного окна приложения 1С
ref1C : OleVariant; //ссылка на 1С, как OLE-сервер автоматизацииrefEvalExpr : OleVariant; //ссылка на результат, возвращаемый функцией EvalExpr(1C)
public
< Public declarations >
end;var
Form1: TForm1;
Дополним обработчкк события, которое возникает при создании формы, следующим образом :
procedure TForm1.FormCreate(Sender: TObject);
begin
hW1C:=0;
ref1C := UnAssigned;refEvalExpr := UnAssigned;
end;Дополним обработчкк события для Button1 следующим образом :
procedure TForm1.Button1Click(Sender: TObject);
//Запуск 1С
begin
LabelYesConnect.Visible:=FALSE;
hW1C:=0;
ref1C := UnAssigned;refEvalExpr := UnAssigned;
//Вызов окна диалога 1С для выбора соотв. БазыДанных 1С и запуска приложения 1С
ref1C := ConnectTo1C_Application('','','');
if YesLinkTo1C_Any(ref1C) then begin //Контроль на всякий случай
LabelYesConnect.Visible:=TRUE; //Покажем (для себя), что есть соединение
//Найдем окно запущенного приложения 1С и получим
// дескриптор главного окна приложения 1С
hW1C:=GetHandleThisWindow('1С:Предприятие',1,TRUE,TRUE);
if hW1C ShowMessage('Главное окно приложения 1С не найдено !');
end;
end;
end;Дополним обработчкк события для Button2 следующим образом :
procedure TForm1.Button2Click(Sender: TObject);
//Закрыть приложение 1С
begin
hW1C:=0;
ref1C := UnAssigned;
refEvalExpr := UnAssigned;
LabelYesConnect.Visible:=FALSE;
if YesLinkTo1C_Any(ref1C) then begin
LabelYesConnect.Visible:=TRUE;
end;
end;Сделаем двойной щелчок по компоненту Button3 и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :
Все строки, кроме :
уже были рассмотрены ранее. Эта строка, собственно, и вызывает метод EvalExpr для выполнения. В данном случае, в качестве параметра для EvalExpr передается то, что будет введено в EditEvalExpr.Text.
Теперь нажмите кнопку Выполнить. Если Вы указали корректное имя файла внешней обработки, то на экране будет что-то вроде :
Шаг N 3. (скачать, 193 Кб)
Продолжим наш проект. На этом шаге мы "потренируемся" с обращением к методу ExecuteBatch .Положим на форму еще 4 компонента :
TGroupBox (GroupBox2) - установим сво-ство Caption = "Текст для ExecuteBatch : ", а св-во Align = alBottom
TPanel (Panel1) - установим сво-ство Align = alTop
На Panel1 кинем кнопку TButton (Button6) и установим сво-ство Caption = "Выполнить"
Затем, на GroupBox2 кинем TMemo и установим сво-ство Align = alClient.
Изменим имя Memo1 на MemoBatch.Получится что-то вроде этого :
Сделаем двойной щелчок по компоненту Button6 и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :
procedure TForm1.Button6Click(Sender: TObject);
//Выполнить метод ExecuteBatch (1C)
begin
if MemoBatch.Lines.Count>0 then begin
if YesLinkTo1C_Any(ref1C) then begin
if hW1C>32 then begin
// Здесь можно заставить окно 1С
// принудительно открываться перед выполнением ExecuteBatch, если надо
ShowWindow(hW1C,SW_SHOW); //Показать окно 1С, чтобы увидеть результат (если надо)
end;
ref1C.ExecuteBatch(MemoBatch.Text);
end;
end;
end;Здесь следует прокомментировать только строку :
ref1C.ExecuteBatch(MemoBatch.Text);
Это и есть вызов метода ExecuteBatch (1С)На этом, собственно, программирование заканчивается. Можно начинать экспериментировать с программой
ВНИМАНИЕ .
Перед началом экспериментов следует отметить, что если в тексте есть какие-либо ошибки, метод ExecuteBatch не сообщает об этом, а просто НЕ выполняется .Несколько простых примеров использования метода ExecuteBatch :
Пример-3 :
Это уже несколько более серьезный пример.
Чтобы его выполнить, нужно в глобальник 1С внести строку :
Перем гл9БуферДляOLE[100] Экспорт; //Для внешних обращений через OLEСуть примера в том, что создается и выполняется Запрос.
Затем, результат Запроса выгружается в ТаблицуЗначений и ТаблицаЗначений выдается на экран.
Введите в MemoBatch следующий текст :
и нажмите кнопку "Выполнить".
На экране будет что-то вроде этого (выполняется запрос).По окончанию процесса, должно получиться что-то вроде этого :
Вот, собственно, и все (чего мы хотели).
Читайте также:
- UpdatePropertyPage. Запрашивает свойства из объекта и отображает их на форме страницы свойств.