В качестве внешней программы используется Borland C++ Builder.
Как всегда пользователи Билдера обделены информацией по сравнению с пользователями Делфи
(см. также http://ixbt.wallst.ru/db/d00005.html)
Но информации по теме я не нашел даже для Делфи.
Пришлось самому разбираться
Решение.
Вызов и инициализация программы 1С как сервера автоматизации осуществляется так:
//Создаем новый счет
char *IntializationLine = "CreateObject(\"Документ.Счет\")";
Buh1 = Ole1C.OleFunction("EvalExpr", IntializationLine);
Buh1.OleProcedure("Новый");
Смотрим, какие поля должны быть заполнены в счете:
Расчетный счет
Плательщик
Договор
Грузоволучатель
Налоги
Тип цен
Наименование
Количество
Цена
Сумма
Всего
Номер счета и дата заполняются автоматически.
Тип этих полей можно посмотреть в конфигураторе:
К сожалению большинство полей имеют не базовые (число, сторока, дата), а агрегатные типы.
Наприме, поле "Контрагент" имеет тип "Справочник.Контрагенты":
Подробности о типах данных можно посмотреть в руководстве по 1С.
И для того, чтобы установить нужного контрагента, он же "Плательщик", нужно проделать следующие
действия:
// Находим нужного контрагента
Variant ka = Ole1C.OleFunction("EvalExpr", "CreateObject(\"Справочник.Контрагенты\")");
ka.OleFunction("НайтиПоКоду", "np000041");
// Устанавливаем контрагента в счет
Buh1.OlePropertySet("Контрагент",ka.OleFunction("ТекущийЭлемент"));
Откуда взялосо значение "np000041"? Это код контрагента. Самое простое - посмотреть его в
справочнике контрагентов:
Подобные действия нужно совершить и для других подобных полей.
Несколько по другому устанавливается договор. Согласно конфигуратору тип поля "Договор" -
"Справочник.Договора".
Но, если зайти в Справочники, то там мы не увидим справочника договоров:
Дело в том, что справочник договоров является зависимым от контрагентов.
Нужно поступисть так:
// Устанавливаем договор в счет
vtemp = Ole1C.OleFunction("EvalExpr", "CreateObject(\"Справочник.Договоры\")");
vtemp.OleFunction("ИспользоватьВладельца", ka);
vtemp.OleFunction("НайтиПоКоду", "000001");
Buh1.OlePropertySet("Договор",vtemp.OleFunction("ТекущийЭлемент"));
Значение "000001" берется из справочника
Ну, вот, все основные моменты учтены.
Ниже полный код:
Variant Ole1C, rmTrade, Buh1;
char *IntializationLine ="";
s1cResult = GetActiveObject(ProgIDToClassID("V77.Application"), NULL, &pIUnknown);
if ( s1cResult == MK_E_UNAVAILABLE )
Ole1C = CreateOleObject("V77.Application");
else
Ole1C = GetActiveOleObject("V77.Application");
rmTrade = Ole1C.OlePropertyGet("RMTrade");
Ole1C.OleProcedure("Initialize", rmTrade, IntializationLine,"");
//Создаем новый счет
char *IntializationLine = "CreateObject(\"Документ.Счет\")";
Buh1 = Ole1C.OleFunction("EvalExpr", IntializationLine);
Buh1.OleProcedure("Новый");
// Находим нужного контрагента
Variant ka = Ole1C.OleFunction("EvalExpr", "CreateObject(\"Справочник.Контрагенты\")");
ka.OleFunction("НайтиПоКоду", "np000041");
// Устанавливаем контрагента в счет
Buh1.OlePropertySet("Контрагент",ka.OleFunction("ТекущийЭлемент"));
// Устанавливаем договор в счет
vtemp = Ole1C.OleFunction("EvalExpr", "CreateObject(\"Справочник.Договоры\")");
vtemp.OleFunction("ИспользоватьВладельца", ka);
vtemp.OleFunction("НайтиПоКоду", "000001");
Buh1.OlePropertySet("Договор",vtemp.OleFunction("ТекущийЭлемент"));
// Находим нужный расчетный счет
ka = Ole1C.OleFunction("EvalExpr",
"CreateObject(\"Справочник.БанковскиеСчета\")");
ka.OleFunction("НайтиПоНаименованию", "НП - основной");
// Устанавливаем расчетный счет
Buh1.OlePropertySet("РасчетныйСчет",ka.OleFunction("ТекущийЭлемент"));
// Устанавливаем вариант расчета налогов в счет
vtemp = Ole1C.OleFunction("EvalExpr", "CreateObject(\"Справочник.ВариантыРасчетаНалогов\")");
if(vtemp.OleFunction("НайтиПоКоду", "1") == 0) ShowMessage("Не найден элемент справочника расчета налогов");
Buh1.OlePropertySet("ВариантРасчетаНалогов",vtemp.OleFunction("ТекущийЭлемент"));
// Устанавливаем вариант типа цен в счет
vtemp = Ole1C.OleFunction("EvalExpr", "CreateObject(\"Справочник.ТипыЦен\")");
if(vtemp.OleFunction("НайтиПоКоду", "00001") == 0) ShowMessage("Не найден элемент справочника расчета налогов");
Buh1.OlePropertySet("ТипЦен",vtemp.OleFunction("ТекущийЭлемент"));
if(!eComment->Text.IsEmpty())
Buh1.OlePropertySet("Комментарий",eComment->Text);
// Заполняем табличную часть счета
Buh1.OleProcedure("НоваяСтрока"); // Добавляем новый товар
// Устанавливаем наименование работ в счет.товар
vtemp = Ole1C.OleFunction("EvalExpr", "CreateObject(\"Справочник.Номенклатура\")");
vtemp.OleProcedure("НайтиПоКоду", "np0000002");
Buh1.OlePropertySet("Товар",vtemp.OleFunction("ТекущийЭлемент"));
Buh1.OlePropertySet("Количество",3);
Buh1.OlePropertySet("Цена", 100);
Buh1.OlePropertySet("Сумма", 100*3);
Buh1.OlePropertySet("Всего", 100*3);
// Вот и все. Сохраняем счет
Buh1.OleProcedure("Записать");
Ole1C = Unassigned;
var rand = Math.floor(Math.random() * 1000000000);
document.write('');
document.write('');
document.write('');
Полный список вопросов и ответов можно посмотреть
здесь.