| Цитата |
|---|
| Александр Медведев написал: Олег Брага , попробуйте событие onBeforeProcessDocument и подмените значения на лету |
Наше дело:
Наше дело:
|
|||
|
|
|
|
Олег Брага, добрый день
По поводу события Александр Медведев вам правильно рассказал. Вам надо в обработчике события вызвать $document->setValues(['MY_COMPANY' => 1]); Вычисление конкретных значений полей происходит позже, после этого события. Там будут учтены переданные вами данные |
|||
|
|
|
|
Приветствую, Антон Горбылев,
не работает это:
Но все равно в файле печатается название той у которой идентификатор меньше. А вот такой код меняет наименование организации в конечном документе:
но это совсем не то что хочется, перебивать отдельные параметры совсем бы не хотелось.
Наше дело:
|
|||||||
|
|
|
|
Олег Брага, проверил у себя. Работает.
Как я проверяю. 1. В init.php сделал обработчик.
2. Вывел доступные значения для поля "MY_COMPANY"
3. Ставим в обработчике значение поля
4. В документ вставилось название компании из реквизитов компании с ид 15 Пишите в таком же формате ваши действия, посмотрим, что не так. |
|||||||||
|
|
|
|
Приветствую, Антон Горбылев,
В init.php событие (указание на соответствие ID компании ее наименованию из реквизитов на скриншоте screen_1):
Выдержки из логов (полный файл ):
Результат генерации документа на скриншоте screen_2
Наше дело:
|
|||||
|
|
|
И неясно откуда у вас берётся "Территориальный отдел №1", в названии компаний такого нет |
|||
|
|
|
|
Приветствую, Александр Медведев,
Наименование вставляется из реквизитов, показано на скриншоте screen_1 а насчет логов вы правы, там этот блок встречается дважды поскольку я забыл отключить обработчик события onCreateDocument, где обновляю привязку к моей компании непосредственно в данных документа. сейчас проведу еще раз более чистый эксперимент.
Наше дело:
|
|
|
|
|
|
Олег Брага, должно работать.
Уберите вызов \Bitrix\DocumentGenerator\Document::getFields() до того, как вы вызываете setValues() Важно, чтобы ид моей компании был указан до того, как документ произведет инициализацию цепочки провайдеров и вычислит значения их полей. А в getFields() как раз идёт вычисление значений. После этого менять значение провайдера бесполезно, там будет работать только смена конечных значений. |
|
|
|
|
|
Понятно, спасибо, сейчас попробую. Правда у меня на этом была основана проверка, нужно ли вообще обновлять это поле, не прописано ли оно уже правильное. Ну ладно пусть каждый раз обновляет.
Наше дело:
|
|
|
|
|
|
Олег Брага, не надо ничего проверять. setValues() только добавляет данные во внутреннее хранилище переопределенных значений, внутри там нет никаких вычислений и можете дергать метод сколько хотите (он не перезаписывает, а всегда дополняет данные).
Не забудьте написать, получилось или нет. |
|
|
|
|
|
Антон Горбылев, спасибо, все получилось.
В конечно итоге я сделал в обработчике onBeforeProcessDocument переопределение для печати, как вы писали, а в onCreateDocument изменение данных самого объекта документа, без запуска генерации (update со вторым параметром false), что бы при открытии данных тоже правильная компания привязанная отображалась.
Наше дело:
|
|
|
|
|
|
|||
|
|
|
|
Да, Антон Горбылев, вы правы, можно и без обработки на создание. Я просто подумал сначала, что то событие только на данные в рантайме перед генерацией документа влияет, а в базу не сохранит.
Наше дело:
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
Бегло посмотрел код и насколько понял, вся работа с трансформером идёт через генератор документов.
Хочу возможность подменить трансформер (реализовать интерфейс), так как давно для конвертации использую другой сервис, размещённый в локалке и отлично работающий, без всяких облаков и отсылки документов "куда-то". Однако, пока же модуль подключается жёстко и такой возможности вроде нет
спасибо на лайк не намажешь
|
|
|
|
|
|
nukemonk, я думаю, что можно использовать и своё решение.
Тут вариантов два. Первый - это переписать сам модуль transformer. Он не очень сложный, кода там немного. Обновления для модуля выходят редко, можно держать его под системой контроля версий для возможности отката. 1. Указать свой адрес обработчика (смотрите код \Bitrix\Transformer\Http::__construct()) - в этом случае команда будет уходить по вашему адресу. 2. Сделать свою обработку результатов конвертации. Если другой хост, то надо подшаманить метод \Bitrix\Transformer\Http::getBackUrl() 3. Если данные у вас конвертируются локально, то можно писать сразу в базу 4. Сохранить файлы (таблица b_transformer_command - указать STATUS=400, сохранить файлы в b_documentgenerator_file, можете посмотреть \Bitrix\DocumentGenerator\Integration\TransformerManager::call()) Второй вариант - конвертировать самостоятельно через события генератора документов 1. Отключаете модуль transformer (если он нужен в другом месте, то можете дергать \Bitrix\Main\ModuleManager::unRegisterModule() и \Bitrix\Main\ModuleManager::registerModule() в рантайме, но это не очень) 2. Перехватываете события onCreateDocument и onUpdateDocument 3. В обработчике события конвертируете самостоятельно и сохраняете, куда нужно. Опять же сохранение можно посмотреть тут \Bitrix\DocumentGenerator\Integration\TransformerManager::call() Сейчас связь жесткая, но развязывать, мне кажется, надо на уровне модуля transformer. Если есть потребность - пишите в техподдержку. |
|
|
|
|
|
Так вот именно хотелось бы обойтись без того, чтобы калечить ядро
Это итак понятно, что можно.Как написал, подумал, что есть вариант установить controller_transformer_url на свой и просто организовать скрипт-прослойку. Тогда в битриксе вообще ничего не надо будет трогать, но пока не хватило времени посмотреть, как именно идёт обмен
спасибо на лайк не намажешь
|
|
|
|
|
|
Воспроизвести полный цикл загрузки результатов обработки на клиент будет сложно (с учетом того, что надо полностью воспроизвести структуру запросов).
Там сначала идёт запрос информации, куда загружать, потом файлы бьются на части и по частям загружаются на клиент, в конце склеиваются. Лучше сделать отправку себе и загрузить себе самостоятельно. |
|
|
|
|
спасибо на лайк не намажешь
|
|||
|
|
|
|
|||||
|
|
|
|
То, что асинхронная - это само собой, но как-то слишком сложно, имхо.
Почему на клиент (коллбэк) просто не отдавать данные по загрузке сконвертированного файла (урл на файл)? И загрузку реализовывать на клиенте? Единственный плюс такого подхода вижу - разве что для некоторого повышения безопасности. Больше плюсов навскидку не нахожу )
спасибо на лайк не намажешь
|
|
|
|
|
|
|||
|
|
|
|
Печалька. Как раз временное хранение файла и отдача только урла на него позволили бы без проблем организовывать прослойку (шину). У нас сейчас так работает, надеялся, что тут будет такой же подход. И не мог понять, что там за методы сохранения частей.
спасибо на лайк не намажешь
|
||||
|
|
|
|||