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

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

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