Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Вопросы и ответы по программированию.


Информационный Канал Subscribe.Ru

Вопросы и ответы по программированию.


Как выставить счет в 1С из внешней программы?

В качестве внешней программы используется Borland C++ Builder.
Как всегда пользователи Билдера обделены информацией по сравнению с пользователями Делфи
(см. также http://ixbt.wallst.ru/db/d00005.html)
Но информации по теме я не нашел даже для Делфи.
Пришлось самому разбираться

Решение.
Вызов и инициализация программы 1С как сервера автоматизации осуществляется так:
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("Новый");
Смотрим, какие поля должны быть заполнены в счете:

  1. Расчетный счет
  2. Плательщик
  3. Договор
  4. Грузоволучатель
  5. Налоги
  6. Тип цен
  7. Наименование
  8. Количество
  9. Цена
  10. Сумма
  11. Всего
Номер счета и дата заполняются автоматически.
Тип этих полей можно посмотреть в конфигураторе:



К сожалению большинство полей имеют не базовые (число, сторока, дата), а агрегатные типы. Наприме, поле "Контрагент" имеет тип "Справочник.Контрагенты":



Подробности о типах данных можно посмотреть в руководстве по 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;

TopList Rambler's Top100
var rand = Math.floor(Math.random() * 1000000000); document.write(''); document.write(''); document.write('');
Полный список вопросов и ответов можно посмотреть здесь.

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.ixbtqa
Отписаться
Вспомнить пароль

В избранное