Добрый день!
Подскажите пожалуйста, можно ли как-нибудь реализовать экспорт одной текущей записи в 1С V77 по событию? (Например: при сохранении нового документа, этот документ автоматически экспортируется в 1С). Если можно, буду рад примерам.
Нравится
Здравствуйте, Дмитрий.
Теоретически - можно.
Необходимо настроить автоматический запуск БП по событию создания новой записи в разделе "Документы".
В этом БП на элементе Start получаем ID созданного документа, и далее в элементе скрипт получаем все необходимые данные по этому документу, и далее пишем напрямую в 1С:
var Invoice1C = v8.Документы.СчетНаОплатуПокупателю.СоздатьДокумент(); Invoice1C.Дата = "10.09.2012"; Invoice1C.Номер = "92837482374"; Invoice1C.Организация = v8.Справочники.Организации.НайтиПоНаименованию("ТОВ \"БАРЕЛЬ\"""");
Вот так:
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");
Пишет: "Невозможно создание объекта сервером программирования объектов"
Сделал так:
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'; } }