Имя: Пароль:
1C
1С v8
COMОбъект и Linux?
0 nsergn
 
14.03.25
16:00
Вопрос по COMОбъект (база локальная):
Возможно ли сформировать печатную форму с заполнением полей в формате docx на локальной машине с Linux (Astra Linux)?

На Windows это работает:
Объект = ПолучитьCOMОбъект(Каталог+"\ШаблонДоговора\"+ВыбраннаяСтрока.Имя);


Перенесли базу на Linux и не работает.

Как получить желаемое с минимальными затратами?
1 Волшебник
 
14.03.25
16:01
веб-сервис
2 arsik
 
гуру
14.03.25
16:10
(0) Посмотреть как это делается в БСП. Там давно уже com выпилили из печатных форм. Сейчас распаковка, корректировка XML, запаковка. Все делается методами БСП.
https://infostart.ru/1c/articles/2071187/
https://infostart.ru/1c/articles/2155772/
3 nsergn
 
14.03.25
16:36
Есть самописная база на основе УТ10, в которой на Windows формирование файла работает.
Как (одной волшебной кнопкой))) сделать заполнение того же файла из такой же базы 1С на Linux?
Или "волшебно" не получится?
(1) статьи, особенно первая, интересные, глянул по диагонали, но придется потратить время, чтобы разобраться.

Сейчас шаблон вордовского файла заполняется по принципу
Заменить = Объект.Content.Find; 
Попытка  
    Заменить.Execute("[ФИО]", Ложь, Истина, Ложь, , , Истина, , Ложь, ФИО,2); 
Исключение 
    Сообщить("В документе не найдет тег [дата договора], либо у контрагента отсутствует данная информация"); 
КонецПопытки;


(2) можно поподробнее, как это сделать "волшебно" и просто?
4 PLUT
 
14.03.25
16:37
(3) так вот жы

если docx распаковать - внутре XML

https://infostart.ru/1c/articles/590918/
5 arsik
 
гуру
14.03.25
16:41
(3) Подтяни в свою чудо конфигурацию модули из бсп для печати и пользуйся.
6 nsergn
 
14.03.25
17:03
(4) по каким-то убеждениям там используется версия 8.3.8...
7 nsergn
 
14.03.25
17:04
чувствую, что самый простой вариант - обычная печатная форма внутри 1С
8 PLUT
 
14.03.25
17:12
(6) для 2018 года норм убеждение. в будущее могут смотреть не только лишь все. мало кто может это делать

там минимальная платформа для примера из статьи, т.к. начиная с 8.3.8 появились заклинания для работы с потоками в памяти (заклинания используются для распакоуки и запакоуки)
9 Djelf
 
14.03.25
17:26
(3) Если ты хочешь извращений, то ставь 8ку на wine, туда же ставь офис, запускай там служебный сеанс и в нем пытайся работать через OLE.
Так работать возможно будет, но по факту ты потратишь значительно больше времени и возможно с нулевым результатом, чем найти альтернативную технологию заполнения, без ОЛЕ.
10 novichok79
 
14.03.25
19:12
проще поднять http-сервис на golang и туда стучаться.
скомпилировать можно сразу на кучу архитектур.
вот либа на чистом Go (без CGo приседаний).
примерчик даже есть.
https://github.com/unidoc/unioffice-examples/blob/master/document/edit-document/main.go

OLE - он был еще в моем детстве, хз, вы б еще на коболе написали свой велосипед.
11 Garykom
 
гуру
14.03.25
19:58
(0) можно
наилучший способ это wine + ms office + микросервис на Go
который внутри wine пашет, имея полный доступ к объектной модели офиса
с микросервисом через http из 1С общаться
можно реализовать полноценный RPC в обертке http-сервиса
12 Garykom
 
гуру
14.03.25
20:03
(10) пфф
https://github.com/Garykom/gotenberg_msoffice/blob/main/convert.go

ЗЫ unidoc/unioffice - она платная
13 Garykom
 
гуру
14.03.25
20:09
(11)+ если Golang слишком сложна
можно внутрь Wine кроме MS Office поставить PowerShell
и далее тупо из 1С создавать скрипты ps по типу
https://github.com/Garykom/office2pdf/blob/main/doc2pdf.ps1
запуская их из линуксовой 1С чтобы исполнялись через wine внутри
14 Кирпич
 
14.03.25
20:51
Про питон забыли. Там есть навороченная библиотека для генерации docx по шаблонам. Примерчик:

from docxtpl import DocxTemplate
doc = DocxTemplate("template.docx")
doc.render({"name" : "Иванов Иван Иваныч"})
doc.save("result.docx")


Шаблон: Уважаемый {{name}}, зайдите в бухгалтерию!
Выход: Уважаемый Иванов Иван Иваныч, зайдите в бухгалтерию!
15 Garykom
 
гуру
14.03.25
22:11
(14) к сожалению у всех независимых от мс офиса библиотек есть один фатальный недостаток: не весь функционал поддерживается
например макросы или формулы?
когда от значения в шаблоне зависят другие значения, как их обновить?
16 Кирпич
 
14.03.25
22:45
(15) Да пожалуйста. Напихай в шаблон макросы и формулы. Нахрен они там кому нужны.
17 Кирпич
 
14.03.25
22:48
(15) Шаблоны в docx обычно для договоров используют. Ну и тому подобное. Просто текст. Ну пара таблиц и пара рисунков. Я лет 20 макросов в ворде не видел. Ты с какой планеты?
18 Кирпич
 
14.03.25
22:52
сервис примитивный нацарапал вот


import cgi
import os
import string
import random
from http.server import SimpleHTTPRequestHandler, HTTPServer

from docxtpl import DocxTemplate

datadir = "C:\\temp\\serverdata\\"

def render(context, template):
    tempname = "".join(random.sample(string.ascii_letters, 10))
    result = datadir + tempname + ".tmp"
    doc = DocxTemplate(datadir+template)
    doc.render(context)
    doc.save(result)
    return result


class DocxTemplateHandler(SimpleHTTPRequestHandler):
    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length).decode("utf-8")
        p = post_data.split(";")
        context = {}

        template = p[0]
        for x in p[1:]:
            s = x.split("=")
            context[s[0]] = s[1]

        filename = render(context, template)
        sz = os.path.getsize(filename)

        with open(filename, 'rb') as f:
            self.send_response(200)
            self.send_header('Content-Length', str(sz))        
            self.end_headers()
            self.wfile.write(f.read())  
          
        os.remove(filename)  

server_address = ('', 8000)
httpd = HTTPServer(server_address, DocxTemplateHandler)

print("Starting server on port 8000...")
httpd.serve_forever()

//================================================

    Сервер = "127.0.0.1:8000";
    Соединение = Новый HTTPСоединение(Сервер);
    Адрес = "/";
    Запрос = Новый HTTPЗапрос(Адрес);
    Тело = "template.docx;name=Иванов Иван Иваныч";
    Запрос.УстановитьТелоИзСтроки(Тело);
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);  
    дд = Ответ.ПолучитьТелоКакДвоичныеДанные();
    дд.Записать("c:\temp\999.docx");

Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший