Имя: Пароль:
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) + этот вопрос уже не по теме, создал новую Программно определить открыта ли нужная база для пользователя?
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан