Экспорт одной записи по событию

Добрый день!

Подскажите пожалуйста, можно ли как-нибудь реализовать экспорт одной текущей записи в 1С V77 по событию? (Например: при сохранении нового документа, этот документ автоматически экспортируется в 1С). Если можно, буду рад примерам.

Нравится

18 комментариев

Здравствуйте, Дмитрий.

Теоретически - можно.

Необходимо настроить автоматический запуск БП по событию создания новой записи в разделе "Документы".
В этом БП на элементе Start получаем ID созданного документа, и далее в элементе скрипт получаем все необходимые данные по этому документу, и далее пишем напрямую в 1С:

var Invoice1C = v8.Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
Invoice1C.Дата = "10.09.2012";
Invoice1C.Номер = "92837482374";
Invoice1C.Организация = v8.Справочники.Организации.НайтиПоНаименованию("ТОВ \"БАРЕЛЬ\""""); 

А не подскажите примерную строку подключения к 1С?

Вот так:

var v8=new ActiveXObject("V77.COMConnector");
v8.Connect(GenerateConnectString(Param));
 
function GenerateConnectString(Param) {
	var ConnectString;
	if (Param.IsServer) {
		ConnectString = 'Srvr="' + Param.Path + '";Ref="' + Param.DBName;	 //"
	} else {
		ConnectString = 'File="' + Param.Path;	 //"
	}
	ConnectString = ConnectString + '";Usr="' + Param.UserName + '";Pwd="' + 
		Param.Password + '"'; //"
	return ConnectString;		
}

Эх, не получается. На строке

var v8=new ActiveXObject("V77.COMConnector");

Пишет: "Невозможно создание объекта сервером программирования объектов"

А так?

"V77.Application"

Сделал так:

var v77 = new ActiveXObject('V77.Application');
v77.Initialize(v77.RMTrade, Generate1CParamString(Path, Login, Password, IsExclusive), NO_SPLASH_SHOW');
var Invoice1C = v77.CreateObject('Документ.ЗаказНарядНовый');
Invoice1C.Новый();

На 3-ей строке пишет: "Неудачная попытка создания объекта (Документ.ЗаказНарядНовый)". В чем может быть проблема?

Здравствуйте, Дмитрий.

Возможная причина - нету такого типа документа в БД 1С:

var Doc = v77.CreateObject('Документ.РасходнаяНакладная'); // Создаем документ в базе OLE
Doc.Новый(); 

Такой тип есть. Проверил на других документах и справочниках, то же самое.

Дмитрий,

какое значение в переменной IsConnected?

var IsConnected = v77.Initialize(v77.RMTrade, Generate1CParamString(Path, Login, Password, IsExclusive), NO_SPLASH_SHOW');

IsConnected = false.

Интересно, в чем-нибудь еще может быть проблема, кроме неправильного пути/пользователя/пароля? (перепроверил несколько раз, ввожу все правильно; процесс в диспетчере задач появляется).

В Path ведь полный путь к exe файлу 1С прописывается?

Функция Generate1CParamString(Path, Login, Password, IsExclusive) отсюда.

В Path нужно указать путь к каталогу с базой (т.е. к папке).

Разобрался с подключением, коннект проходит. Все поля прописываются кроме перечислений.
Как записать в поле значение, если это перечисление?
Для справочников делал так:

var Firm1C = v77.CreateObject('Справочник.Фирмы');
Invoice1C.Фирма = Firm1C.НайтиПоНаименованию(GetDatasetFieldValueByID('ds_Account', Dataset('FirmID'), 'Name'));

Аналогично для перечислений делаю:

var State1C = v77.CreateObject('Перечисление.СостояниеЗаказНаряда');
Invoice1C.Состояние = State1C.НайтиПоНаименованию(GetDatasetFieldValueByID('ds_DocumentState', Dataset('StateID'), 'Name'));

Не работает. Пишет: "Неудачная попытка создания объекта"

Здравствуйте, Дмитрий.

К сожалению, не большой специалист в 1С, но попробуйте что-то вроде этого:

 Invoice1C.Состояние = V77.перечисление.ПризнакПроводки.Баланс;

Также вот полезная информация:

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

Может быть вы знаете как прописать значение в поле типа справочник в 1С.
Пробовал так:

Первый вариант:

var Customer1C = v77.CreateObject('Справочник.Контрагенты');
Invoice1C.Заказчик = Customer1C.НайтиПоНаименованию(GetDatasetFieldValueByID('ds_Account', Dataset('CustomerID'), 'Name'));

Ошибок нет, но в поле "Заказчик" ничего не записывается

Второй вариант:

var Customer1C = v77.CreateObject('Справочник.Контрагенты');
Customer1C.НайтиПоНаименованию(GetDatasetFieldValueByID('ds_Account', Dataset('CustomerID'), 'Name'));
Invoice1C.Заказчик = Customer1C.ТекущийЭлемент();

Пишет: "Недопустимый вызов или аргумент процедуры".

Третий вариант:

var Customer1C = v77.CreateObject('Справочник.Контрагенты');
Customer1C.НайтиПоНаименованию(GetDatasetFieldValueByID('ds_Account', Dataset('CustomerID'), 'Name'));
Invoice1C.Заказчик.Код = Customer1C.ТекущийЭлемент().Код;

Пишет: "Не выбран элемент!".

Не знаю уже что делать.

А так?

Account = V77.CreateObject("Справочник.Контрагенты");
Account.НайтиПоНаименованию(GetDatasetFieldValueByID('ds_Account', Dataset('CustomerID'), 'Name'),0,0);
Invoice1C.Заказчик=Account.ТекущийЭлемент(); 

Не работает.
Пишет "Недопустимый вызов или аргумент процедуры" на строке

Invoice1C.Заказчик = Customer1C.ТекущийЭлемент();

Здравствуйте, Дмитрий.

Очень странно...
А какое значение возвращает строка

Account.НайтиПоНаименованию(GetDatasetFieldValueByID('ds_Account', Dataset('CustomerID'), 'Name'),0,0);

не 0 ли случаем?
В таком случае элемент не был найдет, и соответственно позиционирование на строке не произошло.

Также попробуйте селдующий враиант:

Account = V77.CreateObject("Справочник.Контрагенты");
Account.НайтиПоНаименованию(GetDatasetFieldValueByID('ds_Account', Dataset('CustomerID'), 'Name'),0,0);
Invoice1C.УстановитьАтрибут('Заказчик', Account.ТекущийЭлемент); 

Все теперь работает!
Сделал так:

1) Перечисление:

if (Dataset('StateID')) {
	try {
	var State1C = v77.CreateObject('Перечисление.СостояниеЗаказНаряда.' + GetDatasetFieldValueByID('ds_DocumentState', Dataset('StateID'), 'Code1C'));
	Invoice1C.УстановитьАтрибут('Состояние', State1C);
        } catch (e) {Dialog += '"Состояние" нет совпадений в базе 1С' + '\r\n'; } finally {}
}

2) Справочник:

if (Dataset('FirmID')) {
	InsertDictionaryFieldTo1C(v77, Invoice1C, 'Справочник.Фирмы', 'Фирма', 'ds_Account', Dataset('FirmID'));
}
 
function InsertDictionaryFieldTo1C(v77, Invoice1C, Object1CName, Field1CName, DatasetUSI, ValueID) {
	var Object1C = v77.CreateObject(Object1CName);
	var Object1CIsFound = Object1C.НайтиПоКоду(GetDatasetFieldValueByID(DatasetUSI, ValueID, 'Code1C'), 0, 0);
	if (Object1CIsFound != 0) {
		Invoice1C.УстановитьАтрибут(Field1CName, Object1C.ТекущийЭлемент());
	} else {
		Dialog += '"' + Field1CName + '" нет совпадений в базе 1С' + '\r\n';
	}
}
Показать все комментарии