Отправка документа без сохранения в файл (ПотокВПамяти)

21.08.23

Интеграция - Внешние источники данных

Бывали задачи, когда необходимо печатную форму из 1С отправить по http во внешний сервис. Желательно в формате pdf.

Но зачастую я вижу вот такую реализацию этого процесса "пруф"

ТабДок = Новый ТабличныйДокумент;
// какое-то заполнение табличного документа
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
ДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);
// формирование http запроса или сервис ответа
ЗапросИлиОтвет.УстановитьТелоИзДвоичныхДанных(ДанныеФайла);

Потом начинаются обвязки по удалению временных файлов, или хранение файлов какой-то специальной директории. Мне все это казалось неким костылем. И я решил посмотреть в сторону непопулярного объекта, который очень редко можно встретить в коде, а именно ПотокВПамяти

Но для начала, посмотрим в синтакс-помощник по методу Записать объекта ТабличныйДокумент. Мы увидим что метод перегружен и имеет 2 варианта синтаксиса: В файл и В Поток. Разница будет в 1 параметре, либо мы передаем строку с указанием пути до файла, либо передадим объект поток. Как это выглядит в коде?

Поток = Новый ПотокВПамяти;
ТабДок.Записать(Поток, ТипФайлаТабличногоДокумента.PDF);

Ну вот, ничего сложного, записали, и что делать дальше? Дальше мы обращаемся к синтакс-помощнику и ищем там ПотокВПамяти. В графе "методы" последним методом будет указан "ЗакрытьИПолучитьДвоичныеДанные". Читаем описание метода:

Возвращает экземпляр объекта ДвоичныеДанные, содержащего данные, записанный в поток

Запись в поток есть? Есть. Пробуем получить данные

ДанныеФайла = Поток.ЗакрытьИПолучитьДвоичныеДанные();

Далее нам остается только положить двоичные данные по месту назначения. 

ТабДок = Новый ТабличныйДокумент;
// какое-то заполнение табличного документа
Поток = Новый ПотокВПамяти;
ТабДок.Записать(Поток, ТипФайлаТабличногоДокумента.PDF);
ДанныеФайла = Поток.ЗакрытьИПолучитьДвоичныеДанные();
// формирование http запроса или сервис ответа
ЗапросИлиОтвет.УстановитьТелоИзДвоичныхДанных(ДанныеФайла);
// а еще я хочу чтобы браузер понимал что я отправляю ему именно pdf файл
ЗапросИлиОтвет.Заголовки.Вставить("Content-Type", "application/pdf");

Магия сработала. Мы сформировали документ в формате Табличного Документа (любой отчет или печ. форма), преобразовали его в pdf, оттуда в двоичные данные и сделали все это в оперативной памяти, не засоряя дисковое пространство.  

ВНИМАТЕЛЬНО ЧИТАЙТЕ СИНТАКС-ПОМОЩНИК! В нем вы можете увидеть, что через поток вы можете записывать данные только при использовании форматов txt, pdf, ods, mxl7, mxl, xlsx, docx, ansitxt. Также недоступна запись табличного документа в поток при использовании веб клиента. 

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование Конфигурации 1cv8 Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

28500 руб.

15.11.2022    21605    22    49    

39

Внешние источники данных Зарплата Бюджетный учет Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 7.хх учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

84000 руб.

24.04.2017    51850    104    165    

91

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 8 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

120000 руб.

19.08.2020    25688    25    1    

27

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

84000 руб.

05.10.2022    11279    13    8    

15

Розничная торговля Внешние источники данных Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Бухгалтерский учет 1С:Бухгалтерия 3.0 Фармацевтика, аптеки Россия Бухгалтерский учет Платные (руб)

Внешняя обработка загрузки данных из файла-выгрузки, сформированного в программе F3 TAIL версии 3.4 (и выше) или еФарма версии 2.1, в базу конфигурации 1С: Бухгалтерия предприятия 8, ред. 3.0 (базовая, ПРОФ, КОРП, ФРЕШ).

13200 руб.

19.12.2016    47774    88    105    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Andreyyy 77 22.08.23 06:41 Сейчас в теме
По опыту была проблема (а может ограничения) на более ранних версиях - в PDF через поток не сохранялся табличный документ.
5. mikl79 120 19.09.23 20:01 Сейчас в теме
(1), потверждаю платформа 8.3.23.1739, обычные формы УПП
ТабДок.Записать(Поток, ТипФайлаТабличногоДокумента.PDF);
в этот момент получается файл урезанный, например,
нормальный файл весит 242 кб, а урезанный 218 кб.
поэтому файл битый

причем, перепробовал разные форматы PDF, PDF_A_1, PDF_A_2, PDF_A_3

причем, например, ТабДок.Записать(Поток, ТипФайлаТабличногоДокумента.DOCX);
отрабатывает нормально
6. mikl79 120 19.09.23 20:37 Сейчас в теме
(5), неверно сделал вывод, оказывается

ДанныеФайла = Поток.ЗакрытьИПолучитьДвоичныеДанные();

вот здесь двоичные данные получаются урезанные
7. mikl79 120 20.09.23 12:46 Сейчас в теме
(6), опять неправильно сделал вывод, извините )))
строка Base64 получается нормальная!

просто у меня при запихивании её в json убираются Символы.ПС
2. starik-2005 3096 22.08.23 10:44 Сейчас в теме
(1) Про не сохранялся - не помню, а вот загрузить из потока в табличный документ эксель я не мог раньше - валилось с обшибками. Потом не пробовал уже )))
ЗЫ: Вообще написал в свое время загрузку нового экселя из архива через XDTO - там все работало, но нужно было разархивировать файл...
3. GenAcid 22.08.23 12:50 Сейчас в теме
(2) Проблема есть до сих пор и описана в синтакс-помощнике "При чтении из потока допускается использование только следующих форматов: MXL, MXL7, ODS."
Andreyyy; cleaner_it; +2 Ответить
4. Andreyyy 77 30.08.23 04:23 Сейчас в теме
(2) Да, скорее эта проблема. Помню что не хватало функциональности Потока.
8. FReIM 9 26.11.23 17:23 Сейчас в теме
Запись в поток не работает на 8.3.13.1644 для xlsx, для pdf работает. Но pdf корежит.
9. Поручик 4661 02.07.24 00:39 Сейчас в теме
В нашей конфигурации используется в нескольких местах.
Оставьте свое сообщение