Работа с диском в бизнес-процессе Битрикс24: переименование загруженного файла + готовый пример
Самая популярная статья в моем блоге - это Работа с файлами и папками в бизнес-процессах Битрикс24, 2016 год. Когда я настраивала этот процесс для заказчика, столкнулась с тем, что загружаемый файл нужно переименовывать, но специальных настроек для этого нет. В комментариях к статье описала примерный алгоритм, как это сделать с помощью запуска дополнительного бизнес-процесса в диске. Получилась вполне рабочая схема без программных доработок, но с ограничением: корректно можно было только дописать что-то в начало названия файла, но не полностью поменять его. Если очень коротко, то проблема сводилась к тому, что нужно было в бизнес-процессе как-то получать расширение файла.
Настройка для переименования загружаемого файла так и не появилась, 2020 год 😂, но зато в бизнес-процессах появились функция калькулятора выражений explode и итератор, и, если очень захотеть, то переименовать файл с их помощью можно 😉
Будем настраивать упрощенный процесс:
Инициатор запускает процесс Загрузка договора с полями Номер договора с типом Строка и Договор с типом Файл. Загруженный файл автоматом сохраняется на общем диске в папке Договоры с названием Договор №{Номер договора}.{Расширение исходного файла}.
В общем диске создаем новый бизнес-процесс с названием Переименование файла с параметром Новое название. Этот процесс НЕ должен запускаться на создание/изменение.
Полностью схема процесса выглядит так:
Настройка для переименования загружаемого файла так и не появилась, 2020 год 😂, но зато в бизнес-процессах появились функция калькулятора выражений explode и итератор, и, если очень захотеть, то переименовать файл с их помощью можно 😉
Будем настраивать упрощенный процесс:
Инициатор запускает процесс Загрузка договора с полями Номер договора с типом Строка и Договор с типом Файл. Загруженный файл автоматом сохраняется на общем диске в папке Договоры с названием Договор №{Номер договора}.{Расширение исходного файла}.
В общем диске создаем новый бизнес-процесс с названием Переименование файла с параметром Новое название. Этот процесс НЕ должен запускаться на создание/изменение.
Полностью схема процесса выглядит так:
1. В множественную переменную Название файла (массив) с типом Строка записываем выражение {{=explode('.',{=Document:NAME})}}. Эта функция разобьет имя файла на подстроки по разделителю точка. Для названия файла всегда будет 2 подстроки - название и расширение файла. Для того чтобы получить расширение мы всё это и делаем.
2. Запускаем итератор по переменной Название файла (массив).
3. На каждой итерации, а их будет 2, сохраняем значение итератора в переменную Значение итератора с типом Строка. Соответственно, на последней итерации мы сохраним в переменную расширение файла.
4. В переменной Новое название файла с типом Строка формируем новое название файла из значения параметра бизнес-процесса и полученного расширения: {=Template:new_name}.{=Variable:iterator_value}
Процесс в диске уже можно протестировать: для любого файла из общего диска запустить вручную бизнес-процесс Переименование файла, задать параметр и убедиться, что файл переименовался, а расширение при этом сохранилось.
Переходим к настройке основного процесса, полностью его схема выглядит так:
1. Загружаем исходный файл в диск.
2. Формируем в переменной Новое название файла (без расширения) значение параметра, который передадим в следующее действие: Договор №{=Document:PROPERTY_NOMER_DOGOVORA}.
3. Запускаем бизнес-процесс Переименование файла для загруженного файла, в параметр передаем значение переменной Новое название файла (без расширения):
Теперь можно тестировать весь процесс. Запускаем:
Мой Текстовый документ.docx сохранился в папке Договоры на Общем диске с новым названием Договор №165_34.docx:
Думаю, что с настройкой основного процесса проблем быть не должно: если вы так же как и я столкнулись с проблемой получить расширение файла, значит с первой частью вы уже разобрались. Если с настройкой шаблона в общем диске есть сложности, то можете скачать мой шаблон по ссылке, заимпортировать на свой портал и посмотреть детали настройки😀
Спасибо! Делал практически так же. Посмотрел внимательно как сделано у вас и заметил ошибку у себя. Очень помогло.
ОтветитьУдалитьКак бы подписаться на ваш блог?
Отлично!) Добавила виджет для подписки на блог http://joxi.ru/EA46nkZfoGMYXm.
УдалитьЗдравствуйте, не могли бы Вы подсказать, как быть в случаи, если название необходимо сформировать из нескольких полей документа? Например Договор №{=Document:PROPERTY_NOMER_DOGOVORA} от {=Document:PROPERTY_NOMER_DOGOVORA} и допустим еще что-то, два, три, четыре поля документа. Если вставить все поля в переменную Новое название файла, загруженный файл не переименовывается.
ОтветитьУдалитьЗдравствуйте!
УдалитьПроверила БП - у меня файл переименовался и в случае, когда несколько полей используются при формировании названия. Попробуйте вывести новое название файла в уведомление пользователю. Может быть там есть какие-то символы, которых не должно быть в названии файла.
Люба, здравствуйте. Если есть возможность - помогите пожалуйста советом. Есть вордовые документы на которых запускается БП согласования на диске, после согласования нужно автоматически запретить редактирование таких доков. Как примерно можно реализовать? Подойдет любой из вариантов - сконвертировать в pdf, установить права на существующий doc файл или что-то еще. Заранее извиняюсь, что не по теме Вашего исходного сообщения) Доброго дня!
ОтветитьУдалитьЗдравствуйте)
УдалитьВ Маркетплейс не нашла плагина для конвертации файла в pdf. Практического примера у меня нет, но можно попробовать после согласования файла перемещать его с помощью действия бизнес-процесса http://joxi.ru/brRYElph719OXA в другую папку от имени администратора. К этой папке у пользователя доступ должен быть ограничен настройками.
Спасибо вам за интересные посты! Если будет возможность, осветите пожалуйста проблему организации доступа к загружаемым на диск файлам. А то, бизнес-процессами загружаем, но эти файлы доступны определенному количеству сотрудников, и это не подчиняется самому бизнес-процессу(
ОтветитьУдалитьЗдравствуйте!)
УдалитьДа, есть такая проблема с доступами.
Пока только такой вариант вижу: можно попробовать после согласования файла перемещать его с помощью действия бизнес-процесса http://joxi.ru/brRYElph719OXA в другую папку от имени администратора. К этой папке у пользователя доступ должен быть ограничен настройками.
А я вебхуком сделал, ну ладно)
ОтветитьУдалитьТоже вариант)
УдалитьБлагодарю за полезную статью! Но как это бывает при интеграции в свой БП возник вопрос.
ОтветитьУдалитьЕсли вкратце, мой БП создает задачу ответственному по сделке, в задаче имеется ссылка на скопированный на диске файл, в который ответственный будет вносить данные. Все работает, только вот имя файла также копируется на этапе копирования файла с присваиванием копии номера в скобках [пример - Файл(1)], что не совсем удобно.
Я скопировал ваш шаблон БП по переименованию файла и БП исправно изменяет название файла, но вот только теперь другая беда - как в задаче из моего БП дать правильную ссылку на переименованный документ?
Ринат, здравствуйте!
УдалитьПо описанию не совсем поняла вопрос.
Но если нужно получить ссылку на переименованный документ, то можно после переименования файла поставить действие "Детально об объекте Диска", в нем указать ID файла, а в задаче использовать "URL для загрузки" из дополнительных результатов этого действия.
Ринат, у Вас получилось?
УдалитьДобрый вечер. Можете подсказать, как быть, если пользователь прикрепляет несколько файлов и их все необходимо переименовать? Сколько их пользователь прикрепит заранее не известно. (в бизнес процессе прикрепляются фото, которые необходимо переименовать). Для 1 фото все работает, не пойму как мне все прикрепленные файлы обойти и переименовать.
ОтветитьУдалитьДобрый день!)
УдалитьДля этого нужно обойти список прикрепленных файлов с помощью итератора. Если файлы заполняются при запуске процесса и сохраняются во множественном поле, то сначала нужно скопировать значение этого поля в множественную переменную. У меня есть статья про итератор https://luba-tinaeva-b24.blogspot.com/2018/04/blog-post.html
Спасибо, действительно с итератором работает. Очень полезный блог, подписываюсь)
Удалить👍
УдалитьДобрый день!
ОтветитьУдалитьПодскажите, пожалуйста, как сделать в переименовании:
{{Дата ТЭ}} ПБ {{№ документа)}}
Дата берется из строки внутри сделки и отображается в формате Д.М.Г., необходимо что бы в имени файла формат даты был Г.М.Д.
Заранее благодарю.
Добрый день!
УдалитьПопробуйте отформатировать вывод с помощью функции date: {{=date(" y.m.d", {{Дата ТЭ}})}}
Добрый день, Люба!
ОтветитьУдалитьПодскажите пожалуйста, а как-то можно использовать имя файла, который прикреплен в пользовательское поле Файл в разделе CRM?
Хочется сделать ренейм сделок в зависимости от имени прикрепленного документа
Добрый день!
УдалитьА сейчас при переименовании вместо имени файла что выводится в названии сделки?
Если выбирать Изменение документа -> Название -> выбрать поле с файлом
Удалитьто пишет какие-то цифры
Возможно как-то нужно использовать функцию Детально об объекте Диска
Удалитьтам можно выбрать определенный файл, и его имя используется корректно
Попробуйте сначала выбрать поле с файлом и добавить к нему модификатор > Name. Пример на скрине.
УдалитьСпасибо!
УдалитьДоброго дня, Любовь!
ОтветитьУдалитьХочу закрыть папку для доступа, но открыть файлы для доступа внутри этой папки(чтоб пользователи только по ссылке могли видеть этот файл). Возможно ли в БП изменить права файла, прикрепленного к БП ?
Спасибо!
Добрый день!
УдалитьДумаю, что нет такой возможности.
Здравствуйте!
ОтветитьУдалитьА есть какой-то аналог функции replace?
Добрый день!
УдалитьНет, по документации такой функции нет, но можно попробовать через комбинацию strpos и substr что-то такое сделать.
Здравствуйте, Люба!
ОтветитьУдалитьВстала задача формирования реестра загружаемых файлов с присвоением им имени, содержащего названия элементов и разделов универсального списка, причём к одному элементу могут относиться несколько файлов. Описанное решение подойдёт для этого? Спасибо.
Андрей, добрый день!
УдалитьНе увидела комментарий.
В целом, да, через активити из этой статьи можно реализовать задачу. Но нужно более подробное описание.
Люба, добрый день!
ОтветитьУдалитьСпасибо огромное за проделанную работу!
Шикарно, все здорово работает!!!
😀
УдалитьЗадаюсь вопросом, есть ли возможность сформировать публичную ссылку в облачном Б24?
ОтветитьУдалитьВот нашел вариант, но это так понимаю для коробочной версии:
https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=57&LESSON_ID=3817
Добрый день!
УдалитьНе проверяла, но модификатор publink должен и в облаке работать
Добрый день, при создании папки на диске мне надо каким-то обазом убирать в названии ковычки "". не могу разобраться как это сделать, либо убрать, либо игнорировать, иначе при создании файла появляются "_" - нижние подчеркивания между словами, у вас есть идеи? буду благодарна за подсказку
ОтветитьУдалитьЕлена, добрый день!
УдалитьЯ что-то похожее делала на облачном портале с помощью функций explode и implode:
1. Сначала разбила исходную строку функцией explode по символу "
2. Соединила обратно функцией implode по какому-то другому символу
Добрый день, файлы загруженные из сделки на диск переименовываются отлично, но мне кроме ссылки на переименованный файл (через детально об объекте диска) нужно вернуть этот переименованный файл в поле самой сделки.
ОтветитьУдалитьА вот тут есть подставлять ID из детально об объекте диска подставляется почему то совсем другой файл.
Ссылка удобна скажем в задаче, где eе можно "спрятать" в нормальный вид, а вот в карточке сделки такое поле выглядит жутко громоздко.
По этому хотелось бы или переименовать сам файл в поле сделки, или понять как загрузить уже переименованный в это поле обратно.
"А вот тут есть подставлять ID " - в смысле есть подвох )))
УдалитьДобрый день!)
УдалитьПока нет возможности протестировать.
Попробуйте без загрузки файла на диск переименовать его с помощью вебхука.
Попробую, увы с помощью итератора просто файл из поля, не с диска не переименовывается.
УдалитьИ заметил такую вещь, хотел все таки сделать переименование в полях сделки:
Сделал просто тестовый список с парой полей (из расчета потом его как темп очищать автоматом):
1. Файл - поле файл
2. Файл с дика - соответственно.
Вносим данные Файл с диска и после запуска переименование передаем его в поле Файл.
НО в поле файл при любом раскладе попадает старое исходное имея файла.
Он от туда скачивается и поле рабочее, но там старое имя, до переименования.
Если переименованный файл загрузить на диск заново и запустить процесс передачи его в поле файл, то все ок он там будет с новым именем с каким загрузился.
ВОТ ОТКУДА БЕРЕТСЯ ЭТО СТАРОЕ ИМЯ ФАЙЛА ???????
По ходу написал еще один вариант переименования.
Так как не понял как итератор будет работать если в имени исходного файла уже есть точка кроме расширения.
Ну любят некоторые их там ставить.
Принцип прост, через "strlen" вычисляем длину имени файла и через "substr" отлавливаем точку перед расширением.
Сделана небольшая проверка так как расширение может быть 3 или 4 символа.
А дальше переименовываем файл возвращая расширение назад.
Добрый день!
УдалитьПо переименованию файла из поля сделки протестирую, как будет время - у меня подобная задача тоже была и тоже была проблема с переименованием.
По расширению Вы правы - точки могут быть и в названии файла. Но итератор из данного примера должен корректно отработать. Итераций будет не 2, а 3 (если в названии 1 точка), на последней итерации сохраним в переменную расширение. Но надо проверить)
По идее да, итератор в работы выдает последнюю точку перед расширением.
УдалитьБитрикс взял заявку на появление старого имени файла в разработку ))).
Посмотрим может поправят.
Спасибо помогло!!!
ОтветитьУдалить