Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
24 сен 2021, 00:46

COM соединение - есть проблема!

Автор Sheriff, 05 июл 2017, 12:42

0 Пользователей и 1 гость просматривают эту тему.

Sheriff

Всем привет! Есть конфа 1С Бухгалтерия на платформе 8.1 (ИСТОЧНИК) и 1С Бух. на 8.2 (ПРИЕМНИК). Так вот, надо чтобы при записи или проведении документа, он автоматически через COM соединение попадал из ИСТОЧНИКА в ПРИЕМНИК. Что я сделал для этого:
1. Добавил константу - ПутьБазыБК и добавил на форму "Параметров учета" и указал там путь к базе (на тесте - база в файловом варианте, а вообще на сервере расположена)
2. В модуле внешнего соединения (8.1) - добавил перем  глV21Object Экспорт;
3. В модуле регламентных заданий (8.1) - добавил 
Функция ПолучитьСтруктуруПодключения_БК(КаталогИБДляПодключения="") Экспорт

КаталогИнформационнойБазыДляПодключения = КаталогИБДляПодключения ;  // (Для серверного подключения = "")

АутентификацияWindowsИнформационнойБазыДляПодключения = Ложь;
ВерсияПлатформыИнформационнойБазыДляПодключения = "V82";
//ВерсияПлатформыИнформационнойБазыДляПодключения = "V81";

Если ПустаяСтрока(КаталогИБДляПодключения) Тогда
ТипИнформационнойБазыДляПодключения = ЛОЖЬ ; //Истина; //(Для серверного подключения = ЛОЖЬ)
ИмяСервераИнформационнойБазыДляПодключения = "server_1c" ;
ИмяИнформационнойБазыНаСервереДляПодключения = "zupczs" ;

Иначе
    ТипИнформационнойБазыДляПодключения = Истина; //(Для серверного подключения = ЛОЖЬ)
ИмяСервераИнформационнойБазыДляПодключения = "" ;
ИмяИнформационнойБазыНаСервереДляПодключения = "" ;
КонецЕсли;
ПользовательИнформационнойБазыДляПодключения = "Администратор" ;
ПарольИнформационнойБазыДляПодключения = "19911972" ;   //

СтруктураПодключения = Новый Структура();
//Если РаботаПринята() Тогда
СтруктураПодключения.Вставить("ФайловыйРежим" , ТипИнформационнойБазыДляПодключения); //
СтруктураПодключения.Вставить("АутентификацияWindows" , АутентификацияWindowsИнформационнойБазыДляПодключения); //
СтруктураПодключения.Вставить("КаталогИБ" , КаталогИнформационнойБазыДляПодключения);
СтруктураПодключения.Вставить("ИмяСервера" , ИмяСервераИнформационнойБазыДляПодключения);
СтруктураПодключения.Вставить("ИмяИБНаСервере" , ИмяИнформационнойБазыНаСервереДляПодключения);
СтруктураПодключения.Вставить("Пользователь" , ПользовательИнформационнойБазыДляПодключения);
СтруктураПодключения.Вставить("Пароль" , ПарольИнформационнойБазыДляПодключения);
СтруктураПодключения.Вставить("ВерсияПлатформы" , ВерсияПлатформыИнформационнойБазыДляПодключения);
// КонецЕсли;

Возврат (СтруктураПодключения) ;
КонецФункции // ПолучитьСтруктуруПодключения()

Функция ПодключитсяКИнформационнойБазеБК(СтруктураПодключения, СтрокаСообщенияОбОшибке = "") Экспорт

Перем СтрокаПодключения;

ПараметровДостаточно = ОпределитьДостаточностьПараметровДляПодключенияКИнформационнойБазе(СтруктураПодключения, СтрокаПодключения, СтрокаСообщенияОбОшибке);

Если Не ПараметровДостаточно Тогда
Возврат Неопределено;
КонецЕсли;

Если Не СтруктураПодключения.АутентификацияWindows Тогда
Если НЕ ПустаяСтрока(СтруктураПодключения.Пользователь) Тогда
СтрокаПодключения = СтрокаПодключения + ";Usr = """ + СтруктураПодключения.Пользователь + """";
КонецЕсли;
Если НЕ ПустаяСтрока(СтруктураПодключения.Пароль) Тогда
СтрокаПодключения = СтрокаПодключения + ";Pwd = """ + СтруктураПодключения.Пароль + """";
КонецЕсли;
КонецЕсли;


//"V8" или "V81"
ОбъектПодключения = СтруктураПодключения.ВерсияПлатформы;

СтрокаПодключения = СтрокаПодключения + ";";

Попытка

//#Если Клиент Тогда
Состояние("Идет процесс соединения ...");
//#КонецЕсли

ОбъектПодключения = ОбъектПодключения +".COMConnector";

Попытка
ТекCOMПодключение = Новый COMОбъект(ОбъектПодключения);
Исключение
Сообщить("Ошибка создания объекта "+ОбъектПодключения+" !") ;
Сообщить( ОписаниеОшибки()  ) ;
КонецПопытки;


ТекCOMОбъект = ТекCOMПодключение.Connect(СтрокаПодключения);

//#Если Клиент Тогда
Состояние("Соединение установлено");
//#КонецЕсли

Исключение

СтрокаСообщенияОбОшибке = "При попытке соедиения с COM-сервером произошла следующая ошибка:" + Символы.ПС
+ ОписаниеОшибки();
//#Если Клиент Тогда
Сообщить(СтрокаСообщенияОбОшибке, СтатусСообщения.Важное);
    Состояние("Соединение установить не удалось");
Состояние();
//#КонецЕсли

Возврат Неопределено;

КонецПопытки;

Возврат ТекCOMОбъект;

КонецФункции

4. В модуле формы списка документа (8.1), добавил
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
// Вставить содержимое обработчика.
Если  ЗначениеЗаполнено(Константы.ПутьБазыБК.Получить()) Тогда

Если глV21Object = Неопределено Тогда
ПутьКБазе = Константы.ПутьБазыБК.Получить();
СтруктураПодключения = МодульРегламентныхЗаданий.ПолучитьСтруктуруПодключения_БК(ПутьКБазе) ;
глV21Object = МодульРегламентныхЗаданий.ПодключитсяКИнформационнойБазеБК(СтруктураПодключения);
Если глV21Object = Неопределено Тогда
Сообщить( "Ошибка подключения к базе данных!!!", СтатусСообщения.Важное ) ;
Возврат ;
КонецЕсли;
Сообщить( ""+ТекущаяДата() + " - Подключение к конфигурации "+глV21Object.Метаданные.Synonym+" выполнено успешно!" ) ;
КонецЕсли;
КонецЕсли;


Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ЗначениеЯчейкиГруз= ОформлениеСтроки.Ячейки.Тонаж.Значение;
ЗначениеЯчейкиБезГрза= ОформлениеСтроки.Ячейки.Тонаж.Значение;

Если ЗначениеЯчейкиГруз =  0 Тогда
              ОформлениеСтроки.Ячейки.Дата.ЦветФона = WebЦвета.Желтый;

КонецЕсли;


Если ЗначениеЯчейкиБезГрза <>  0 Тогда
            ОформлениеСтроки.Ячейки.Дата.ЦветФона = WebЦвета.СветлоГрифельноСерый;
ОформлениеСтроки.Ячейки.Номер.ЦветФона = WebЦвета.СветлоГрифельноСерый;
КонецЕсли;



КонецЦикла;

КонецПроцедуры

Всё это сделал в базе ИСТОЧНИКЕ (под 8.1).
Запускаю базу, в константах указываю путь (пока что это файловый вариант), теперь при открытии списка документов, у меня идет процесс соединения, по его окончанию написано что "Подключение к конфе выполнено успешно!", но, при создании документов и их последующей записи\проведении, они не падают в базу ПРИЕМНИК. Почему???

alex0402

Ну подключение увидел! А где код создания документа и записи в приемнике?
Спасибо за Сказать спасибо

Sheriff

Цитата: alex0402 от 05 июл 2017, 13:24
Ну подключение увидел! А где код создания документа и записи в приемнике?
Процедура ЦЗСОбменДаннымиСВесовойПриЗаписи(Источник, Отказ) Экспорт
// Вставить содержимое обработчика.
// выполнять действия если документ имеет тип самовывоз
Если ЗначениеЗаполнено(Константы.ПутьБазыБК.Получить()) Тогда
Если Источник.ВидТранспортировки=перечисления.ВидТранспортировки.ЖДТранспорт Тогда
///--- добавление или внесение изменений в документ реализации Автовесовой
// ТабЧастьТовары =  Источник.Товары;
//Если  ТабЧастьТовары.количество() > 0 Тогда
Если глV21Object<> неопределено Тогда
///    поиск в базе автовесовой данного документа по идентификатору

ТекущийДокУникИнден =  Строка(Источник.Ссылка.УникальныйИдентификатор());
Документ1С = глV21Object.Документы.ВесоваяЖД.ПолучитьСсылку(глV21Object.NewObject("УникальныйИдентификатор", ТекущийДокУникИнден));

Если Найти(глV21Object.String(Документ1С),"не найден") = 0 Тогда

// сообщить(" документ уже есть в базе, производится обновление ");

НовыйДокумент =Документ1С.ПолучитьОбъект();
НовыйДокумент.Дата =Источник.Дата;
НовыйДокумент.Номер =Источник.Номер;
НовыйДокумент.ПометкаУдаления=Источник.ПометкаУдаления;
//обновить пометку на удаление

///---- склад
// ТекущийСкладДокаУникИнден =Строка(Источник.Ссылка.Склад.УникальныйИдентификатор());
// СкладАВ  =глV21Object.Справочники.Склады.ПолучитьСсылку(глV21Object.NewObject("УникальныйИдентификатор", ТекущийСкладДокаУникИнден));
  //Если Найти(глV21Object.String(СкладАВ),"не найден") = 0 Тогда
//    НовыйДокумент.Склад = СкладАВ;
//иначе
//-- процедура добавление нового склада

//КонецЕсли;
//---  организация
// ТекущийОргн =Строка(Источник.Ссылка.Организация.УникальныйИдентификатор());
//ОргдАВ  =глV21Object.Справочники.Организации.ПолучитьСсылку(глV21Object.NewObject("УникальныйИдентификатор", ТекущийОргн));

// Если //////Найти(глV21Object.String(ОргдАВ),"не найден") = 0 Тогда
  //НовыйДокумент.Организация = ОргдАВ;
иначе
//-- процедура добавление нового склада

//КонецЕсли;
//--- контрагент
////НаимКонтрагента=глV21Object.Справочники.Контрагенты.НайтиПоНаименованию(Источник.Ссылка.Контрагент.Наименование);
          //  ТекущийКонтрг =xmlСтрока(Источник.Ссылка.Контрагент.УникальныйИдентификатор());
//КонтрАВ  =глV21Object.Справочники.Контрагенты.ПолучитьСсылку(глV21Object.NewObject("УникальныйИдентификатор", ТекущийКонтрг));

// Если Найти(глV21Object.String(КонтрАВ),"не найден") = 0 Тогда
  //НовыйДокумент.Контрагент = КонтрАВ;
//иначеЕсли  //Найти(глV21Object.String(НаимКонтрагента),"не найден") = 0  Тогда
// ////НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(НаимКонтрагента);

// Иначе
//-- процедура добавление контрагента
// Сообщить("Контрагент не найден, будет добавлен в базу Автовесов");
//НовыйКонтрагент =глV21Object.Справочники.Контрагенты.СоздатьЭлемент();
//НовыйКонтрагент.Код =  Источник.Ссылка.Контрагент.Код;
//НовыйКонтрагент.Наименование =  Источник.Ссылка.Контрагент.Наименование;
//НовыйКонтрагент.НаименованиеПолное =  Источник.Ссылка.Контрагент.НаименованиеПолное;
//НовыйКонтрагент.БИН = Источник.Ссылка.Контрагент.БИН;
//НовыйКонтрагент.УстановитьСсылкуНового(КонтрАВ);
//НовыйКонтрагент.Записать();
//НовыйДокумент.Контрагент =КонтрАВ ;

//КонецЕсли;
  //--- перенос табличной части
 
// НовыйДокумент.Товары.очистить();
//Для каждого стр  Из ТабЧастьТовары  Цикл
//СтрТабДокаАВ = НовыйДокумент.Товары.Добавить();
  ///-- номенклатура
//  ТекНоменкл =Строка(стр.Номенклатура.УникальныйИдентификатор());
//  НомАВ  =глV21Object.Справочники.Номенклатура.ПолучитьСсылку(глV21Object.NewObject("УникальныйИдентификатор",ТекНоменкл ));

//  Если Найти(глV21Object.String(НомАВ),"не найден") = 0 Тогда
  СтрТабДокаАВ.Номенклатура = НомАВ;
// иначе
//-- процедура добавление контрагента
// //Сообщить("Номенклатура не найдена, будет добавлена в базу Автовесов");
//НовыйНомАВ =глV21Object.Справочники.Номенклатура.СоздатьЭлемент();
//НовыйНомАВ.Код =  стр.Номенклатура.Код;
//НовыйНомАВ.Наименование =  стр.Номенклатура.Наименование;
//НовыйНомАВ.НаименованиеПолное =  стр.Номенклатура.НаименованиеПолное;
/НовыйНомАВ.УстановитьСсылкуНового(НомАВ);
//НовыйНомАВ.Записать();
//СтрТабДокаАВ.Номенклатура = НомАВ;
  // КонецЕсли;
//СтрТабДокаАВ.Количество= стр.Количество ;
//СтрТабДокаАВ.Цена = стр.Цена ;
//СтрТабДокаАВ.Сумма  = стр.Сумма ;
//КонецЦикла;  
//НовыйДокумент.Комментарий = "Перенос данных из БК";
//УникальныйИдентификаторДокументаВВидеСтроки = ТекущийДокУникИнден;
НовыйДокумент.Записать();
// Сообщить("Копией документа перезаполнена база в автовесовой");
иначе

// НовыйДокумент =V81Object.Документы.ВесоваяЖД.СоздатьДокумент().ПолучитьСсылкуНового(Источник.Ссылка.УникальныйИдентификатор());
НовыйДокумент =глV21Object.Документы.ВесоваяЖД.СоздатьДокумент();
//ОбъектДок = НовыйДокумент.ПолучитьОбъект();
///--- заполняем документ
НовыйДокумент.Дата =Источник.Дата;
НовыйДокумент.Номер =Источник.Номер;
НовыйДокумент.ПометкаУдаления=Источник.ПометкаУдаления;


///---- склад
// ТекущийСкладДокаУникИнден =Строка(Источник.Ссылка.Склад.УникальныйИдентификатор());
// СкладАВ  =глV21Object.Справочники.Склады.ПолучитьСсылку(глV21Object.NewObject("УникальныйИдентификатор", ТекущийСкладДокаУникИнден));

// Если //Найти(глV21Object.String(СкладАВ),"не найден") = 0 Тогда
  //НовыйДокумент.Склад = СкладАВ;
//иначе
//-- процедура добавление нового склада

//КонецЕсли;
//---  организация
  //ТекущийОргн =Строка(Источник.Ссылка.Организация.УникальныйИдентификатор());
// ОргдАВ  =глV21Object.Справочники.Организации.ПолучитьСсылку(глV21Object.NewObject("УникальныйИдентификатор", ТекущийОргн));

//Если //Найти(глV21Object.String(ОргдАВ),"не найден") = 0 Тогда
  //НовыйДокумент.Организация = ОргдАВ;
// иначе
//-- процедура добавление нового склада

//КонецЕсли;
//--- контрагент
////НаимКонтрагента=глV21Object.Справочники.Контрагенты.НайтиПоНаименованию(Источник.Ссылка.Контрагент.Наименование);

      //ТекущийКонтрг =Строка(Источник.Ссылка.Контрагент.УникальныйИдентификатор());
      //КонтрАВ  =глV21Object.Справочники.Контрагенты.ПолучитьСсылку(глV21Object.NewObject("УникальныйИдентификатор", ТекущийКонтрг));

// Если //Найти(глV21Object.String(КонтрАВ),"не найден") = 0 Тогда
  //НовыйДокумент.Контрагент = КонтрАВ;
       
    //  иначе
//-- процедура добавление контрагента
// Сообщить("Контрагент не найден, будет добавлен в базу Автовесов");
//НовыйКонтрагент =глV21Object.Справочники.Контрагенты.СоздатьЭлемент();
//НовыйКонтрагент.Код =  Источник.Ссылка.Контрагент.Код;
//НовыйКонтрагент.Наименование =  Источник.Ссылка.Контрагент.Наименование;
//НовыйКонтрагент.НаименованиеПолное =  Источник.Ссылка.Контрагент.НаименованиеПолное;
// НовыйКонтрагент.БИН = Источник.Ссылка.Контрагент.БИН;
//НовыйКонтрагент.УстановитьСсылкуНового(КонтрАВ);
//НовыйКонтрагент.Записать();
//НовыйДокумент.Контрагент =КонтрАВ ;
//   КонецЕсли;
  //--- перенос табличной части
 
//Для каждого стр  Из ТабЧастьТовары  Цикл

//СтрТабДокаАВ = НовыйДокумент.Товары.Добавить();

  ///-- номенклатура
// ТекНоменкл =Строка(стр.Номенклатура.УникальныйИдентификатор());
// НомАВ  =глV21Object.Справочники.Номенклатура.ПолучитьСсылку(глV21Object.NewObject("УникальныйИдентификатор",ТекНоменкл ));

  // Если Найти(глV21Object.String(НомАВ),"не найден") = 0 Тогда
  //СтрТабДокаАВ.Номенклатура = НомАВ;
//иначе
//-- процедура добавление контрагента
// Сообщить("Номенклатура не найдена, будет добавлена в базу Автовесов");
//НовыйНомАВ =глV21Object.Справочники.Номенклатура.СоздатьЭлемент();
//НовыйНомАВ.Код =  стр.Номенклатура.Код;
//НовыйНомАВ.Наименование =  стр.Номенклатура.Наименование;
//НовыйНомАВ.НаименованиеПолное =  стр.Номенклатура.НаименованиеПолное;


//НовыйНомАВ.УстановитьСсылкуНового(НомАВ);
//НовыйНомАВ.Записать();
//СтрТабДокаАВ.Номенклатура = НомАВ;

  // КонецЕсли;
//СтрТабДокаАВ.Количество= стр.Количество ;
//СтрТабДокаАВ.Цена = стр.Цена ;
//СтрТабДокаАВ.Сумма  = стр.Сумма ;
//КонецЦикла;  
//НовыйДокумент.Комментарий = "Перенос данных из БК";
//УникальныйИдентификаторДокументаВВидеСтроки = ТекущийДокУникИнден;
//НовыйДокумент.УстановитьСсылкуНового(Документ1С);
//НовыйДокумент.Записать();
// Сообщить("Копия документа передана в базу автовесовой");
//КонецЕсли;               

//КонецЕсли;

КонецЕсли;
//КонецЕсли
КонецЕсли

КонецПроцедуры

Просто в этом документе нет склада, контрагента, есть номенклатура и данные по вагонам, но я этого ничего не указывал, просто хотел чтобы он мне хотя бы создал что-то, не говоря уже о его заполнении как в ИСТОЧНИКЕ
Возможно что-то лишнее закомментил:))

alex0402

В ветке Иначе на вижу метода записать для документа в приемнике.

Можно использовать конвертацию данных.
1) Создать правила.
2) Записать правила в какой нибудь макет.
3) Использовать обработку УниверсальныйОбменДаннымиЧерезXML есть в каждой конфигурации.
Спасибо за Сказать спасибо

Sheriff

Цитата: alex0402 от 05 июл 2017, 14:06
В ветке Иначе на вижу метода записать для документа в приемнике.

Можно использовать конвертацию данных.
1) Создать правила.
2) Записать правила в какой нибудь макет.
3) Использовать обработку УниверсальныйОбменДаннымиЧерезXML есть в каждой конфигурации.
А если настроить через обмен данными между базами и прописать регламентное задание, чтобы по времени выполнялось? Мне просто надо получать оперативно эти данные из другой базы. Между собой, они идентичны этим документом. 

alex0402

Цитата: Sheriff от 05 июл 2017, 14:23А если настроить через обмен данными между базами и прописать регламентное задание, чтобы по времени выполнялось? Мне просто надо получать оперативно эти данные из другой базы. Между собой, они идентичны этим документом. 

можно и так. Но придется заводить свой обмен данными или модифицировать, например, полный. Прописать игнорирование всех объектов, кроме этого документа и связанных справочников/документов.
Добавлено: 05 июл 2017, 14:42


Писать свой обмен через СОМ то же можно, только нужно помнить, сто передавать можно только простые типы, а в приемнике искать/создвавть и заполнять объекты.
Спасибо за Сказать спасибо

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск