Как прикрепить печатную форму из 1С к объекту Битрикс24

Scope: crm, disk

Кто может выполнять методы:

Выберите инструмент для разработки с AI-агентом:

  • используйте Битрикс24 Вайбкод, чтобы создать приложение для Битрикс24 по описанию задачи без знания языков программирования. Агент напишет код и разместит приложение на сервере без ручной настройки хостинга
  • используйте MCP-сервер, чтобы разрабатывать интеграцию через REST API в своем проекте. Агент будет обращаться к официальной REST-документации

Печатную форму счета, акта или договора удобно передавать в Битрикс24 сразу после проведения документа в 1С: менеджер видит документ в карточке клиента и не запрашивает его у бухгалтерии.

Файл передают строкой в формате Base64. Разберем два способа:

  • комментарий в таймлайне — файл виден прямо в карточке сделки, счета или компании
  • загрузка на Диск — файл попадает в папку Диска, его можно переслать ссылкой

Перед началом

Для выполнения примеров нужны:

Как использовать примеры в документации

1. Готовим файл в 1С

Печатную форму сохраняем во временный файл, читаем его как двоичные данные и кодируем в Base64.

&НаСервере
Функция ПечатнаяФормаВBase64(ТабличныйДокумент)
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
	
	Попытка
		
		ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.PDF);
		
		ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяВременногоФайла);
		Результат = ДвоичныеДанныеВBase64(ДвоичныеДанныеФайла);
		
	Исключение
		
		УдалитьФайлы(ИмяВременногоФайла);
		ВызватьИсключение;
		
	КонецПопытки;
	
	УдалитьФайлы(ИмяВременногоФайла);
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Функция ДвоичныеДанныеВBase64(ДвоичныеДанныеФайла) Экспорт
	
	// Base64Строка разбивает результат на строки — убираем переводы строк,
	// чтобы передать значение одной строкой
	Результат = Base64Строка(ДвоичныеДанныеФайла);
	Результат = СтрЗаменить(Результат, Символы.ВК, "");
	Результат = СтрЗаменить(Результат, Символы.ПС, "");
	
	Возврат Результат;
	
КонецФункции

Функция Base64Строка разбивает результат на строки и вставляет переводы строк. Часть методов такую строку принимает, часть — нет, поэтому переводы строк лучше убрать всегда.

Если файл уже лежит на диске или в реквизите «ХранилищеФайла», отдельная печать не нужна — сразу создайте ДвоичныеДанные и вызовите ДвоичныеДанныеВBase64.

2. Прикрепляем файл комментарием в таймлайн

Метод crm.timeline.comment.add создает запись в таймлайне и прикрепляет к ней файлы. Каждый файл передают массивом из двух элементов: имя файла и строка Base64.

&НаСервере
Функция ПрикрепитьФайлКОбъектуCRM(ИдентификаторОбъекта, ТипОбъекта, ИмяФайла, СодержимоеBase64, Комментарий)
	
	Файл = Новый Массив;
	Файл.Добавить(ИмяФайла);
	Файл.Добавить(СодержимоеBase64);
	
	Файлы = Новый Массив;
	Файлы.Добавить(Файл);
	
	Поля = Новый Структура;
	Поля.Вставить("ENTITY_ID", ИдентификаторОбъекта);
	Поля.Вставить("ENTITY_TYPE", ТипОбъекта);
	Поля.Вставить("COMMENT", Комментарий);
	Поля.Вставить("FILES", Файлы);
	
	Параметры = Новый Структура;
	Параметры.Вставить("fields", Поля);
	
	Ответ = ИнтеграцияБитрикс24.ВыполнитьМетод("crm.timeline.comment.add", Параметры);
	
	Если НЕ Ответ.Успешно Тогда
		ВызватьИсключение СтрШаблон("Не удалось прикрепить файл «%1»: %2",
			ИмяФайла, Ответ.ОписаниеОшибки);
	КонецЕсли;
	
	Возврат ИнтеграцияБитрикс24.ИдентификаторИзОтвета(Ответ.Результат);
	
КонецФункции

Вызов для счета из туториала Как выставить счет из 1С:

СодержимоеBase64 = ПечатнаяФормаВBase64(ТабличныйДокументСчета);

ПрикрепитьФайлКОбъектуCRM(
	ИдентификаторСчета,
	"dynamic_31",
	"Счет № УТ-000123.pdf",
	СодержимоеBase64,
	"Печатная форма счета из 1С");

Метод возвращает идентификатор созданного комментария:

{
    "result": 13465
}

Значение поля ENTITY_TYPE зависит от объекта CRM:

Объект

ENTITY_TYPE

Лид

lead

Сделка

deal

Контакт

contact

Компания

company

Счет

dynamic_31

Элемент смарт-процесса

dynamic_{entityTypeId}, например dynamic_1046

3. Проверяем результат

Метод crm.timeline.comment.get возвращает комментарий вместе с данными файла.

Ответ = ИнтеграцияБитрикс24.ВыполнитьМетод("crm.timeline.comment.get",
	Новый Структура("id", ИдентификаторКомментария));

Файлы = Ответ.Результат.Получить("FILES");

Для Каждого КлючИЗначение Из Файлы Цикл
	ДанныеФайла = КлючИЗначение.Значение;
	Сообщить(ДанныеФайла.Получить("name") + ": " + ДанныеФайла.Получить("urlDownload"));
КонецЦикла;

Ответ метода:

{
    "result": {
        "ID": "13465",
        "ENTITY_ID": "4409",
        "ENTITY_TYPE": "deal",
        "CREATED": "2026-08-21T14:46:58+03:00",
        "COMMENT": "Счет на оплату № УТ-000123 выставлен в 1С",
        "AUTHOR_ID": "1",
        "FILES": {
            "2143": {
                "id": 2143,
                "date": "2026-08-21T14:46:58+03:00",
                "type": "file",
                "name": "schet-UT-000123.pdf",
                "size": 115,
                "image": false,
                "authorId": 1,
                "urlShow": "https://your-domain.bitrix24.ru/disk/downloadFile/2143/?&ncc=1&filename=schet-UT-000123.pdf",
                "urlDownload": "https://your-domain.bitrix24.ru/disk/downloadFile/2143/?&ncc=1&filename=schet-UT-000123.pdf"
            }
        }
    }
}

Ключ FILES — объект, где ключами служат идентификаторы файлов. В 1С такой объект читается в Соответствие, поэтому обходите его циклом Для Каждого, а не по индексу.

Проверьте результат в Битрикс24: откройте карточку объекта — в таймлайне появится комментарий с прикрепленным файлом.

4. Загружаем файл на Диск

Если файл нужен не в карточке, а в папке Диска — например, все акты за месяц в одной папке, — используйте метод disk.folder.uploadfile.

Сначала находим хранилище. Метод disk.storage.getlist возвращает личные диски пользователей, общий диск и диски групп: общий диск определяется по значению ENTITY_TYPE равному common.

&НаСервере
Функция КорневаяПапкаОбщегоДиска()
	
	Ответ = ИнтеграцияБитрикс24.ВыполнитьМетод("disk.storage.getlist");
	
	Если НЕ Ответ.Успешно Тогда
		ВызватьИсключение "Не удалось получить список хранилищ Диска: " + Ответ.ОписаниеОшибки;
	КонецЕсли;
	
	Для Каждого Хранилище Из Ответ.Результат Цикл
		Если Хранилище.Получить("ENTITY_TYPE") = "common" Тогда
			Возврат ИнтеграцияБитрикс24.ИдентификаторИзОтвета(Хранилище.Получить("ROOT_OBJECT_ID"));
		КонецЕсли;
	КонецЦикла;
	
	ВызватьИсключение "В Битрикс24 не найден общий диск";
	
КонецФункции

Затем загружаем файл в папку.

&НаСервере
Функция ЗагрузитьФайлНаДиск(ИдентификаторПапки, ИмяФайла, СодержимоеBase64)
	
	СодержимоеФайла = Новый Массив;
	СодержимоеФайла.Добавить(ИмяФайла);
	СодержимоеФайла.Добавить(СодержимоеBase64);
	
	Параметры = Новый Структура;
	Параметры.Вставить("id", ИдентификаторПапки);
	Параметры.Вставить("data", Новый Структура("NAME", ИмяФайла));
	Параметры.Вставить("fileContent", СодержимоеФайла);
	
	Ответ = ИнтеграцияБитрикс24.ВыполнитьМетод("disk.folder.uploadfile", Параметры);
	
	Если НЕ Ответ.Успешно Тогда
		ВызватьИсключение СтрШаблон("Не удалось загрузить файл «%1» на Диск: %2",
			ИмяФайла, Ответ.ОписаниеОшибки);
	КонецЕсли;
	
	Возврат Ответ.Результат;
	
КонецФункции

Ответ метода — объект файла на Диске:

{
    "result": {
        "ID": 2147,
        "NAME": "schet-UT-000123.pdf",
        "TYPE": "file",
        "PARENT_ID": "3",
        "STORAGE_ID": "3",
        "FILE_ID": 6181,
        "SIZE": "115",
        "CREATE_TIME": "2026-08-21T15:05:21+03:00",
        "UPDATE_TIME": "2026-08-21T15:05:21+03:00",
        "CREATED_BY": "1",
        "DOWNLOAD_URL": "https://your-domain.bitrix24.ru/rest/1/xxxxxxxxxxxxxxxx/download/?token=disk%7C...",
        "DETAIL_URL": "https://your-domain.bitrix24.ru/docs/path/..."
    }
}

Идентификатор из поля ID передают в поля типа «Файл (диск)» — например, в поле задачи UF_TASK_WEBDAV_FILES. Пример такого сценария разобран в туториале Как создать задачу с прикрепленным файлом.

Ссылка DOWNLOAD_URL содержит токен доступа. Не публикуйте ее и не сохраняйте в общедоступных отчетах 1С. Чтобы дать пользователю постоянную ссылку, используйте DETAIL_URL — открывается в интерфейсе Битрикс24 с проверкой прав.

Ошибки и диагностика

Если метод вернул ошибку, проверьте данные запроса.

Ошибка

Причина и решение

OWNER_NOT_FOUND или NOT_FOUND в crm.timeline.comment.add

Объект CRM не найден. Проверьте значения ENTITY_TYPE и ENTITY_ID

INVALID_ARG_VALUE

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

ACCESS_DENIED

У пользователя, создавшего вебхук, нет прав на объект CRM или на добавление файла в папку Диска

ERROR_NOT_FOUND в disk.folder.uploadfile

Папка с указанным id не найдена. Возьмите ROOT_OBJECT_ID из ответа disk.storage.getlist

DISK_BASE_SERVICE_22001

В массиве data не передано имя файла NAME

ERROR_COULD_NOT_SAVE_FILE

Файл не удалось сохранить. Проверьте свободное место на Диске и строку Base64 — в ней не должно быть переводов строк

Что важно учитывать

  • Размер запроса. Строка Base64 примерно на треть длиннее исходного файла. Ограничения на размер запроса и другие детали загрузки описаны на странице Как загрузить файлы
  • Формат печатной формы. PDF подходит для документов, которые не нужно редактировать. Табличный документ также можно сохранить в ТипФайлаТабличногоДокумента.XLSX или MXL, если файл будут открывать в 1С
  • Имя файла. Указывайте расширение — по нему Битрикс24 определяет тип файла и показывает предпросмотр. Кириллица в имени допустима
  • Повторная отправка. Метод crm.timeline.comment.add каждый раз создает новый комментарий. Если документ перепечатали, старый комментарий удаляют методом crm.timeline.comment.delete или сохраняют оба — как история версий
  • Файловые поля CRM. Файл можно записать и в пользовательское поле типа «Файл» — тогда он будет виден в карточке как реквизит. Формат значения тот же: массив из имени файла и строки Base64

Продолжите изучение