Работа с диском в бизнес-процессе Битрикс24: переименование загруженного файла + готовый пример

Самая популярная статья в моем блоге - это Работа с файлами и папками в бизнес-процессах Битрикс24, 2016 год. Когда я настраивала этот процесс для заказчика, столкнулась с тем, что загружаемый файл нужно переименовывать, но специальных настроек для этого нет. В комментариях к статье описала примерный алгоритм, как это сделать с помощью запуска дополнительного бизнес-процесса в диске. Получилась вполне рабочая схема без программных доработок, но с ограничением: корректно можно было только дописать что-то в начало названия файла, но не полностью поменять его. Если очень коротко, то проблема сводилась к тому, что нужно было в бизнес-процессе как-то получать расширение файла.

Настройка для переименования загружаемого файла так и не появилась, 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:



Думаю, что с настройкой основного процесса проблем быть не должно: если вы так же как и я столкнулись с проблемой получить расширение файла, значит с первой частью вы уже разобрались. Если с настройкой шаблона в общем диске есть сложности, то можете скачать мой шаблон по ссылке, заимпортировать на свой портал и посмотреть детали настройки😀


Комментарии

  1. Спасибо! Делал практически так же. Посмотрел внимательно как сделано у вас и заметил ошибку у себя. Очень помогло.
    Как бы подписаться на ваш блог?

    ОтветитьУдалить
    Ответы
    1. Отлично!) Добавила виджет для подписки на блог http://joxi.ru/EA46nkZfoGMYXm.

      Удалить
  2. Здравствуйте, не могли бы Вы подсказать, как быть в случаи, если название необходимо сформировать из нескольких полей документа? Например Договор №{=Document:PROPERTY_NOMER_DOGOVORA} от {=Document:PROPERTY_NOMER_DOGOVORA} и допустим еще что-то, два, три, четыре поля документа. Если вставить все поля в переменную Новое название файла, загруженный файл не переименовывается.

    ОтветитьУдалить
    Ответы
    1. Здравствуйте!
      Проверила БП - у меня файл переименовался и в случае, когда несколько полей используются при формировании названия. Попробуйте вывести новое название файла в уведомление пользователю. Может быть там есть какие-то символы, которых не должно быть в названии файла.

      Удалить
  3. Люба, здравствуйте. Если есть возможность - помогите пожалуйста советом. Есть вордовые документы на которых запускается БП согласования на диске, после согласования нужно автоматически запретить редактирование таких доков. Как примерно можно реализовать? Подойдет любой из вариантов - сконвертировать в pdf, установить права на существующий doc файл или что-то еще. Заранее извиняюсь, что не по теме Вашего исходного сообщения) Доброго дня!

    ОтветитьУдалить
    Ответы
    1. Здравствуйте)
      В Маркетплейс не нашла плагина для конвертации файла в pdf. Практического примера у меня нет, но можно попробовать после согласования файла перемещать его с помощью действия бизнес-процесса http://joxi.ru/brRYElph719OXA в другую папку от имени администратора. К этой папке у пользователя доступ должен быть ограничен настройками.

      Удалить
  4. Спасибо вам за интересные посты! Если будет возможность, осветите пожалуйста проблему организации доступа к загружаемым на диск файлам. А то, бизнес-процессами загружаем, но эти файлы доступны определенному количеству сотрудников, и это не подчиняется самому бизнес-процессу(

    ОтветитьУдалить
    Ответы
    1. Здравствуйте!)
      Да, есть такая проблема с доступами.

      Пока только такой вариант вижу: можно попробовать после согласования файла перемещать его с помощью действия бизнес-процесса http://joxi.ru/brRYElph719OXA в другую папку от имени администратора. К этой папке у пользователя доступ должен быть ограничен настройками.

      Удалить
  5. Вдохновенцев6 марта 2020 г. в 01:27

    А я вебхуком сделал, ну ладно)

    ОтветитьУдалить
  6. Благодарю за полезную статью! Но как это бывает при интеграции в свой БП возник вопрос.
    Если вкратце, мой БП создает задачу ответственному по сделке, в задаче имеется ссылка на скопированный на диске файл, в который ответственный будет вносить данные. Все работает, только вот имя файла также копируется на этапе копирования файла с присваиванием копии номера в скобках [пример - Файл(1)], что не совсем удобно.

    Я скопировал ваш шаблон БП по переименованию файла и БП исправно изменяет название файла, но вот только теперь другая беда - как в задаче из моего БП дать правильную ссылку на переименованный документ?

    ОтветитьУдалить
    Ответы
    1. Ринат, здравствуйте!

      По описанию не совсем поняла вопрос.

      Но если нужно получить ссылку на переименованный документ, то можно после переименования файла поставить действие "Детально об объекте Диска", в нем указать ID файла, а в задаче использовать "URL для загрузки" из дополнительных результатов этого действия.

      Удалить
    2. Ринат, у Вас получилось?

      Удалить
  7. Добрый вечер. Можете подсказать, как быть, если пользователь прикрепляет несколько файлов и их все необходимо переименовать? Сколько их пользователь прикрепит заранее не известно. (в бизнес процессе прикрепляются фото, которые необходимо переименовать). Для 1 фото все работает, не пойму как мне все прикрепленные файлы обойти и переименовать.

    ОтветитьУдалить
    Ответы
    1. Добрый день!)
      Для этого нужно обойти список прикрепленных файлов с помощью итератора. Если файлы заполняются при запуске процесса и сохраняются во множественном поле, то сначала нужно скопировать значение этого поля в множественную переменную. У меня есть статья про итератор https://luba-tinaeva-b24.blogspot.com/2018/04/blog-post.html

      Удалить
    2. Спасибо, действительно с итератором работает. Очень полезный блог, подписываюсь)

      Удалить
  8. Добрый день!
    Подскажите, пожалуйста, как сделать в переименовании:
    {{Дата ТЭ}} ПБ {{№ документа)}}
    Дата берется из строки внутри сделки и отображается в формате Д.М.Г., необходимо что бы в имени файла формат даты был Г.М.Д.
    Заранее благодарю.

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Попробуйте отформатировать вывод с помощью функции date: {{=date(" y.m.d", {{Дата ТЭ}})}}

      Удалить
  9. Добрый день, Люба!

    Подскажите пожалуйста, а как-то можно использовать имя файла, который прикреплен в пользовательское поле Файл в разделе CRM?

    Хочется сделать ренейм сделок в зависимости от имени прикрепленного документа

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      А сейчас при переименовании вместо имени файла что выводится в названии сделки?

      Удалить
    2. Если выбирать Изменение документа -> Название -> выбрать поле с файлом
      то пишет какие-то цифры

      Удалить
    3. Возможно как-то нужно использовать функцию Детально об объекте Диска
      там можно выбрать определенный файл, и его имя используется корректно

      Удалить
    4. Попробуйте сначала выбрать поле с файлом и добавить к нему модификатор > Name. Пример на скрине.

      Удалить
  10. Доброго дня, Любовь!
    Хочу закрыть папку для доступа, но открыть файлы для доступа внутри этой папки(чтоб пользователи только по ссылке могли видеть этот файл). Возможно ли в БП изменить права файла, прикрепленного к БП ?
    Спасибо!

    ОтветитьУдалить
  11. Здравствуйте!

    А есть какой-то аналог функции replace?

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Нет, по документации такой функции нет, но можно попробовать через комбинацию strpos и substr что-то такое сделать.

      Удалить
  12. Здравствуйте, Люба!
    Встала задача формирования реестра загружаемых файлов с присвоением им имени, содержащего названия элементов и разделов универсального списка, причём к одному элементу могут относиться несколько файлов. Описанное решение подойдёт для этого? Спасибо.

    ОтветитьУдалить
    Ответы
    1. Андрей, добрый день!
      Не увидела комментарий.

      В целом, да, через активити из этой статьи можно реализовать задачу. Но нужно более подробное описание.

      Удалить
  13. Люба, добрый день!
    Спасибо огромное за проделанную работу!
    Шикарно, все здорово работает!!!

    ОтветитьУдалить
  14. Задаюсь вопросом, есть ли возможность сформировать публичную ссылку в облачном Б24?
    Вот нашел вариант, но это так понимаю для коробочной версии:
    https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=57&LESSON_ID=3817

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Не проверяла, но модификатор publink должен и в облаке работать

      Удалить
  15. Добрый день, при создании папки на диске мне надо каким-то обазом убирать в названии ковычки "". не могу разобраться как это сделать, либо убрать, либо игнорировать, иначе при создании файла появляются "_" - нижние подчеркивания между словами, у вас есть идеи? буду благодарна за подсказку

    ОтветитьУдалить
    Ответы
    1. Елена, добрый день!
      Я что-то похожее делала на облачном портале с помощью функций explode и implode:
      1. Сначала разбила исходную строку функцией explode по символу "
      2. Соединила обратно функцией implode по какому-то другому символу

      Удалить
  16. Добрый день, файлы загруженные из сделки на диск переименовываются отлично, но мне кроме ссылки на переименованный файл (через детально об объекте диска) нужно вернуть этот переименованный файл в поле самой сделки.
    А вот тут есть подставлять ID из детально об объекте диска подставляется почему то совсем другой файл.

    Ссылка удобна скажем в задаче, где eе можно "спрятать" в нормальный вид, а вот в карточке сделки такое поле выглядит жутко громоздко.

    По этому хотелось бы или переименовать сам файл в поле сделки, или понять как загрузить уже переименованный в это поле обратно.

    ОтветитьУдалить
    Ответы
    1. "А вот тут есть подставлять ID " - в смысле есть подвох )))

      Удалить
    2. Добрый день!)
      Пока нет возможности протестировать.
      Попробуйте без загрузки файла на диск переименовать его с помощью вебхука.

      Удалить
    3. Попробую, увы с помощью итератора просто файл из поля, не с диска не переименовывается.
      И заметил такую вещь, хотел все таки сделать переименование в полях сделки:

      Сделал просто тестовый список с парой полей (из расчета потом его как темп очищать автоматом):
      1. Файл - поле файл
      2. Файл с дика - соответственно.

      Вносим данные Файл с диска и после запуска переименование передаем его в поле Файл.
      НО в поле файл при любом раскладе попадает старое исходное имея файла.
      Он от туда скачивается и поле рабочее, но там старое имя, до переименования.

      Если переименованный файл загрузить на диск заново и запустить процесс передачи его в поле файл, то все ок он там будет с новым именем с каким загрузился.

      ВОТ ОТКУДА БЕРЕТСЯ ЭТО СТАРОЕ ИМЯ ФАЙЛА ???????

      По ходу написал еще один вариант переименования.
      Так как не понял как итератор будет работать если в имени исходного файла уже есть точка кроме расширения.
      Ну любят некоторые их там ставить.
      Принцип прост, через "strlen" вычисляем длину имени файла и через "substr" отлавливаем точку перед расширением.
      Сделана небольшая проверка так как расширение может быть 3 или 4 символа.
      А дальше переименовываем файл возвращая расширение назад.

      Удалить
    4. Добрый день!
      По переименованию файла из поля сделки протестирую, как будет время - у меня подобная задача тоже была и тоже была проблема с переименованием.

      По расширению Вы правы - точки могут быть и в названии файла. Но итератор из данного примера должен корректно отработать. Итераций будет не 2, а 3 (если в названии 1 точка), на последней итерации сохраним в переменную расширение. Но надо проверить)

      Удалить
    5. По идее да, итератор в работы выдает последнюю точку перед расширением.

      Битрикс взял заявку на появление старого имени файла в разработку ))).
      Посмотрим может поправят.

      Удалить
  17. Спасибо помогло!!!

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения

Расширение возможностей бизнес-процессов с помощью вебхуков: работа с задачами