Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Работа между базами 1С через COM

Работа между базами 1С через COM
Я
   Raff86rus
 
28.08.20 - 17:36
Исходные данные:
1) БД Бухгалтерия предприятия, редакция 3.0.
2) БД Документооборот 8 КОРП, редакция 1.4.
Режим работы БД: клиент-сервер. Обе базы на одном серваке.

Задача: в БД Бухгалтерия есть документ "Уведомление" с печатной формой. На форме данного документа прикрутил команду и прописываю действие в модуле формы по заполнению табдока данными из текущего документа и записи его в формате xls. Через com-соединение в базе Документооборот создаю документ "Исходящий документ", к которому надо прикрепить записанный файл xls. Как это лучше сделать, какие варианты? Условие: работа только через COM.
   Raff86rus
 
1 - 28.08.20 - 17:39
И да, все это надо сделать только на стороне БД Бухгалтерия.
   hhhh
 
2 - 28.08.20 - 17:47
(1) в чем конкретно проблема? Прикрепить файл к документу?
   Raff86rus
 
3 - 28.08.20 - 17:47
Ошибся, не документ "Исходящий документ" а элемент справочника "Исходящие документы". Но не суть в данном случае думаю.
   Raff86rus
 
4 - 28.08.20 - 17:50
Проблема 1 - передача на сервер xls, 2 - в программном прикреплении xls к элементу справочника. И все это на стороне БП 3 и через COM
.
   hhhh
 
5 - 28.08.20 - 17:54
(4) если через com, то это на стороне документооборота. Поэтому на сервер ничего передавать не надо.
   fisher
 
6 - 28.08.20 - 18:05
xls в ДвоичныеДанные, их передаешь сериализованными через ком, на той стороне десериализуешь.
Я так через ком табличные документы гонял. Не помню уже в чем был затык, но сериализовывать приходилось явно.
// Функция - возвращает XML-строку с сериализованным значением

//
// Параметры:

//  Значение - значение произвольного типа, которое необходимо сериализовать
//

// Возвращаемое значение:
//  XML-строка, содержащая сериализованное значение

//
Функция СериализацияXML(Значение) Экспорт
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение);
    
    Возврат ЗаписьXML.Закрыть();
    
КонецФункции

// Функция - возвращает значение, десериализованное из XML-строки

//
// Параметры:

//  СтрокаXML - XML-строка с сериализованным значением произвольного типа
//

// Возвращаемое значение:
//  Десериализованное значение

//
Функция ДесериализацияXML(СтрокаXML) Экспорт
    
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(СтрокаXML);
    ЧтениеXML.Прочитать();
    
    Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
    
КонецФункции

   Mikhail Volkov
 
7 - 28.08.20 - 19:59
А если базы работают на разных версиях платформы 8.3, возникают проблемы обмена через COM. Это временно, или как?
   ДенисЧ
 
8 - 28.08.20 - 20:19
(7) Да, временно. До тех пор, пока ты не сравняешь версии
   Провинциальный 1сник
 
9 - 28.08.20 - 20:43
(6) Через ком лучше всё сериализовывать, ибо там точность чисел теряется, потому что через ком передается плавающая точка, а в 1с числа хранятся иначе. И чтобы не терять копейки, лучше сериализовывать.
   d4rkmesa
 
10 - 28.08.20 - 21:32
(4) Через com строки можно гонять. Не пробовал сериализовывать xls, думаю как минимум можно через двоичные данные и преобразование в base64 пропихивать xls-ки, преобразуя в строки.
   Mikhail Volkov
 
11 - 29.08.20 - 08:08
(8) У нас Альфа-Авто, которая не может работать на последних версиях платформы нужных для ERP/КА2. Требует переходить на новую редакцию. Да, и для 6 редакции требуется 32-х разрядная клиентская часть. Просто удивительно, через COM 1С может обмениваться с другими приложениями не 1С. Может с разными платформами, например 8.3 с 8.2 и 7.7. Только с разными платформами 8.3 беда!? Что это, временно, в 1С забыли про это? Или какая-то основательная причина?
   ДенисЧ
 
12 - 29.08.20 - 08:31
(11) Потому что в 8.2 один гуйд для ком-контрола, а в 8.3 - другой. Но в пределах одной второй цифры он одинаковый. Поэтому нельзя.

А то, что альфа не хочет работать на 8.3 - это проблема альфы. И программиста, который оленится написать обмен через хттп или файлы.
   ДенисЧ
 
13 - 29.08.20 - 08:31
Ибо ограничение "только сом, и ничего больше" - это явный признак ограниченности не платформы, а погроммитса.
   Lexandr
 
14 - 29.08.20 - 20:34
Год назад смастрячил выгрузку документов из БП3 в управленческую базу, но использую КД2(там такие вещи легко и просто). Работает через ком (ну как вам и надо) каждый день несколько раз, за год ни одного глюка.
   sdf
 
15 - 29.08.20 - 20:56
(0) эту задачу нужно решать через библиотеку интеграции док (БИД). если это бух корп - она уже там есть. проф - нужно интегрировать.
и работать с файлами/документами ДОК через его API (веб-сервисы)
   Mikhail Volkov
 
16 - 30.08.20 - 08:40
(12) На практике приходится вести обмены с чужими базами, у которых не поднят Web-сервис. Возможен только COM.
   Mikhail Volkov
 
17 - 31.08.20 - 09:05
(8) > До тех пор, пока ты не сравняешь версии
Наверное разработчики 1С также думают...
   Mikhail Volkov
 
18 - 01.09.20 - 10:14
(12) Вроде дело не в GUID-ах, при подключении по COM запускается именно зарегистрированная версия утилитой администрирования серверов. Причем неправильно запускается версия клиентской части, а серверной - правильно: https://i.ibb.co/pdrH9Wy/COM.jpg. Вроде как недоработка 1С!? Пред запуском COM или OLE-соединения конечно можно сменить зарегистрированную версию (например, сменой значения в регистре Windows). Но это доступно только для пользователей с административными правами.
   Mikhail Volkov
 
19 - 01.09.20 - 12:30
(18) > Вроде как недоработка 1С!?
Вопрос: будет ли она исправлена 1С?
   fisher
 
20 - 01.09.20 - 12:50
Это виндовая фича, которую 1С лень обходить. Так как для обхода придется версионировать ком-объекты по именам.
Будет ли она "исправлена" 1С? Очень сомневаюсь. Этой "врожденной травме" столько же лет, сколько и 1С.
   fisher
 
21 - 01.09.20 - 12:55
Обычно это никого не парит, так как большинству не проблема работать на одной версии платформы, благо в конфигурациях работает режим совместимости.
   VladZ
 
22 - 01.09.20 - 14:12
(0) В топку COM! Переходи на веб-сервисы.
   Mikhail Volkov
 
23 - 01.09.20 - 16:09
(22) См. (16)
(20) Вроде для COM-соединения есть пути обхода этой "недоработки": http://catalog.mista.ru/public/685924/, http://catalog.mista.ru/public/610960/ (не проверял). А для OLE-соединения не нашел ничего подобного?
   fisher
 
24 - 01.09.20 - 17:09
(23) Ну, это вручную типа регистрировать разные версии под разными именами и в коде обращаться по разным именам. Такой себе костыль. Но как вариант, если положение безвыходное.
   Mikhail Volkov
 
25 - 01.09.20 - 17:21
(24) Для OLE-соединения существует подобное? Плохо искал?
   Raff86rus
 
26 - 02.09.20 - 10:27
Все получилось, всем спасибо, в частности (6). Пришлось изрядно покапаться в Документообороте. Веб-сервисы и http использую регулярно и тут дело не в лени или ограниченности знаний и навыков. Тут дело в ситуации, когда клиенту надо через com и точка. Ole технологию не было причин использовать, так как интерфейсную часть прогружать не нужно было. Решил при помощи передачи сериализованного заполненного табличного документа из бухгалтерии через com в документооборот. А там уже десериализовав и сохранив во временное хранилище обработал и прикрепил к созданному программно новому элементу справочника Исходящий документ. После чего программно запустил комплексный процесс используя шаблон.
   Mikhail Volkov
 
27 - 06.09.20 - 15:03
В процессе обмена можно сходу определить какое у меня установлено соединение: OLE или COM? А то при COM некоторые функции стали недоступны, например, СтрокаСоединенияИнформационнойБазы(). Ну или COM-объекта определить с каким сервером (его порты), или базой установлено соединение?
   Mikhail Volkov
 
28 - 07.09.20 - 13:09
+ (27) Пока написал такую функцию:
Функция ПодключенаВысокаяВерсия()   Экспорт

    Если ОбъектКА <> Неопределено Тогда
        Попытка
            Возврат Найти(ComОбъект.СтрокаСоединенияИнформационнойБазы(), ":1641") > 0;
        Исключение
            Возврат Истина;
        КонецПопытки;
    КонецЕсли;
    Возврат Ложь;
КонецФункции  // ПодключенаВысокаяВерсия()

Но дальше:
    Метод объекта не обнаружен (NewObject)
    Запрос = ComОбъект.NewObject("Запрос");
Для COM-соединения и NewObject недоступен? Или кэш почистить? COM соединение NewObject Запрос в другой базе
   Aleksey
 
29 - 07.09.20 - 13:12
У кома и Оле по разному доступ к свойствам
   Mikhail Volkov
 
30 - 07.09.20 - 13:34
(29) И как переписать запрос к другой базе в случае Com-соединения? Вместо:
    Запрос = ComОбъект.NewObject("Запрос");
    Запрос.Текст =
    "ВЫБРАТЬ
 
 Рекламное место пустует
   Aleksey
 
31 - 07.09.20 - 14:09
ComОбъект это что?
   Mikhail Volkov
 
32 - 07.09.20 - 14:32
(31) сейчас Новый COMОбъект("V83.COMConnector"), было (когда работало на OLE) Новый COMОбъект("V83.Application").
   Галахад
 
33 - 07.09.20 - 14:45
   Aleksey
 
34 - 07.09.20 - 15:22
(32) там разница в том что в одном случае работаешь через соединение, а в другом через подключение
   Mikhail Volkov
 
35 - 07.09.20 - 15:24
(33) Не увидел разницы между OLE и COM в отношении NewObject?
   mikecool
 
36 - 07.09.20 - 15:29
(11) странно, у нас АА 4.1 обгоняет ЕРП )) уже на 8.3.17 работает
   Mikhail Volkov
 
37 - 07.09.20 - 15:32
(34) Какая разница как переменную назвал: Подключение, Соединение, или ComОбъект?
(36) Не, АА 4.1 выше 8.3.10 не работает. Причем клиентская часть только 32-разрядная.
   mikecool
 
38 - 07.09.20 - 15:34
   mikecool
 
39 - 07.09.20 - 15:35
+38 а мы работаем и не знаем об ограничениях оО
   Mikhail Volkov
 
40 - 07.09.20 - 15:41
(38) Это (37) рекомендация Раруса, выше не пробовал. Пробовал ставить платформу полностью х64 - торговое оборудование не работает.
   Mikhail Volkov
 
41 - 07.09.20 - 17:09
(34) Извини, сразу не заметил разницу: Подключение = Соединение.Connect(СтрокаСоединения);
Вернемся к функции определяющей какое у меня установлено соединение: OLE или COM. Есть что покомпактней чем (28)?
   Mikhail Volkov
 
42 - 08.09.20 - 08:04
+ Хм, и ComОбъект.СтрокаСоединенияИнформационнойБазы() заработала для Com-соединения...
   Mikhail Volkov
 
43 - 15.09.20 - 09:22
(25) Вроде нашел как открыть объект в другой базе по ссылке, найденной по Com-соединению: http://catalog.mista.ru/public/1042208/, вроде работает. Но для первого открытия другой базы наверное надо в параметрах прописать имя пользователя и его пароль (при 1С-аутентификации). Как-то можно указать только имена сервера и базы, а при 1-м открытии базы запрашивался пользователь и пароль (как обычно)?
   Mikhail Volkov
 
44 - 15.09.20 - 11:41
Странно, у себя создал ярлык запуска 1С с "C:\Program Files\1cv8\common\1cestart.exe" enterprise /S "ИмяСервера\ИмяБазы", запускается база именно эта база с запросом пользователя и пароля. И в обработке (43) в параметрах ИмяСервера\ИмяБазы вроде прописано.
А можно программно определить открыта ли нужная база?
   Mikhail Volkov
 
45 - 15.09.20 - 13:57


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.