Как понять выгрузить файл

Обновлено: 03.07.2024

Благодаря удобству и информационной надежности 1С огромное количество пользователей используют решения для автоматизации и обработки бизнес-процессов на любых фирмах. Но, все же, зачастую возникает необходимость выгрузки информации из 1С в другие программы и файлы. Данный материал раскрывает понятие выгрузки и показывает, как проводится данный процесс и потенциальные сложности при его проведении. Сразу хотим отметить, если у вас возникнет необходимость задать вопрос по 1С, вы можете это сделать по телефону или через заявку на сайте, по которой с вами свяжутся в ближайшее время.

Какие данные можно выгружать из 1С

В 1С любой конфигурации доступна выгрузка следующей информации:

  • Печатные формы;
  • Отчеты;
  • Таблицы и списки.

Форматы для выгрузки поддерживаются следующие:

  • Microsoft Excel;
  • Microsoft Word;
  • PDF;
  • Выгрузка в CSV;
  • HTML и другие.

Процесс выгрузки печатных форм и отчетов

Сохранение в требуемом формате можно сделать для любой печатной формы или отчета в 1С. Открываем форму или отчет и выбираем в Главном меню Файл – Сохранить как.



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



Потенциальные сложности во время выгрузки

Опция «Сохранить как» не всегда может функционировать.



Объясняется это неактивизированной печатной формой или отчетом в настоящий момент. Кликаем мышкой в любом месте и печатная форма становится активной для сохранения.



Можно увидеть, что опция «Сохранить как» уже доступна. Напомним, по любым вопросам касаемо выгрузки и не только вы можете обращаться к нашим консультантам по сопровождению 1С 8.3.

Особенности выгрузки в Excel

Чаще всего требуется произвести выгрузку в табличном формате Excel. Для сохранения данных указываем тип Лист Excel2007 -…(*.xlsx), реже используется старый формат Лист Excel (*.xls):



Выгрузка из 1С в другие форматы (PDF, Word, CSV и др) проводится таким же образом.

Как выгружать произвольные таблицы из 1С

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

Используя штатный механизм в 1С, позволяющий выгружать любые списки (к примеру, список документов или элементы справочника), пользователь может получать комплексные данные удобным способом. Так, в командной панели любого списка выбираем группу «Еще» и затем команду «Вывести список»:



После этого нужно определить требуемые колонки и нажать кнопку ОК:



Мы получим данные в виде специального табличного документа, имеющего аналогичный вид, как и у всех отчетов в 1С. Выгрузка проводится также с помощью опции Файл – Сохранить как:



Выгрузка невидимых в перечне данных

Часто пользователи сталкиваются с необходимостью добавить в список колонки, присутствующие в документе, но отсутствующие по каким-то причинам в текущем перечне. Например, в перечне «Клиенты» отсутствует поле «Телефон», которое видно только в дополнительной панели с правой стороны.



Для возможности выгрузить телефон из 1С необходимо эти данные сначала внести в список. Нажимаем «Еще – Изменить форму». Из перечня колонок выбираем нужную нам. Стоит отметить, что почти во всех конфигурациях программы имеется поле «Ссылка». При переходе на это поле и нажав кнопку «Добавить поля» нам отобразятся все доступные поля этого справочника. Тут мы и делаем выбор поля «Телефон» и присваиваем ему галочку использования.





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

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

Что мы будем делать?

  • Напишем небольшую страничку, на которой пользователь сможет выбрать файл для загрузки его на сервер
  • Добавим progress bar, чтобы отображался прогресс загрузки файла
  • Добавим возможность отменить загрузку нажатием на кнопку отмены
Для понимания данной статьи вам потребуются базовые знания RxJS. Что такое Observable, операторы, а так-же HOO операторы

Не будем тянуть кота за хвост и сразу перейдем к делу!

Подготовка

Для начала нам потребуется сервер, который может принимать запросы на загрузку файлов. Для этого может подойти любой сервер, я для статьи буду использовать node.js в связке с express и multer:


Теперь создадим html страничку, на которой мы разместим все необходимые элементы:


Сейчас на страничке у нас есть 4 элемента, с которыми пользователь будет взаимодействовать:

  • Input с типом file, чтобы пользователь смог выбрать файл для выгрузки
  • Кнопка upload, при нажатии на которую мы начнем выгрузку
  • Кнопка cancel, которая будет отменять загрузку
  • Progress bar со стартовой шириной 0. В процессе выгрузки мы будем менять его ширину


Выглядеть все это должно примерно так:


Всё — поток

Чтобы сказать браузеру, какой файл нужно выбрать, пользователь должен кликнуть по кнопке «Choose file». После этого откроется диалоговое окно вашей операционной системы, где отобразится дерево папок. После выбора файла браузер загрузит всю необходимую информацию о нем.

Как нам понять, что пользователь выбрал файл? Для этого существует событие «change». После срабатывания события мы можем обратиться к массиву files в input’е, куда и будут записаны данные файла.

Как же нам слушать событие «change»? Можно воспользоваться методом addEventListener и работать с ним. Но мы работаем с RxJS, где любое событие может быть представлено как поток:


Добавим функцию upload, которая будет выгружать файл на сервер. Пока оставим ее тело пустым:


Функция upload должна вызываться после нажатия на кнопку uploadBtn:

Объединяем потоки

Сейчас наш код ничем не отличается от того, который бы мы написали, используя addEventListener. Да, он работает, но если мы оставим его таким, то потеряем те преимущества, которые открывает перед нами RxJS.

Что мы можем сделать? Распишем последовательность шагов для выгрузки файла:

  • Выбор файла
  • Нажатие кнопки uploadBtn
  • Извлечение файла из input.files
  • Выгрузка файла


Данный код очень похож на последовательность тех инструкций, что мы описали выше. Пользователь выбирает файл, срабатывает switchMap и мы подписываемся на uploadBtn. Но дальше ничего не произойдет.

switchMap пропускает во внешний поток только те значения, которые генерирует fromEvent(uploadBtn, 'click').Чтобы выгрузка файлов началась, нужно выполнить вторую инструкцию, а именно — нажать на uploadBtn. Затем отработает метод map, который извлечет файл из массива, и уже в subscribe произойдет вызов метода upload.

Самое интересное здесь то, что последовательность инструкций не нарушаема. Чтобы сработала функция upload, нужно, чтобы перед этим сработало событие 'change'.

Но все же одна проблема осталась. Пользователь может выбрать файл, а затем отменить свой выбор. И тогда при попытке выгрузки файла, мы передадим в функцию upload — undefined. Чтобы избежать подобной ситуации, нам следует добавить проверку:

Работаем с xhr


Пора реализовать самое сложное — процесс выгрузки. Я буду показывать его на примере работы с xhr, так как fetch, на момент написания статьи, не умеет отслеживать прогресс выгрузки.
Вы можете реализовать выгрузку с помощью любой другой библиотеки, например axios или jQuery.ajax.

Так как на серверной стороне я использую multer, то передавать файл мне придется внутри формы(multer принимает данные только в таком формате). Для этого я написал функцию createFormData:


Теперь у нас есть рабочий пример. Но он содержит пару недостатков:

  • Нет возможности отменить загрузку
  • Если нажать на кнопку uploadBtn n раз, то у нас откроется n параллельных соединений на выгрузку одного файла


Обратите внимание на возвращаемую внутри Observable стрелочную функцию. Данный метод будет вызван в момент отписки и отменит выгрузку.

Поместим вызов upload в switchMap:


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

Отменяем запрос по клику

У нас еще осталась кнопка calcelBtn. Мы должны реализовать отмену запроса. Здесь нам поможет оператор takeUntil.

takeUntil переводится как “бери пока”. Данный оператор забирает значения из внешнего потока и отдает их дальше по цепочке. До тех пор, пока внутренний поток существует и ничего не генерирует. Как только внутренний поток сгенерирует значение — takeUntil вызовет метод unsubscribe и отпишется от внешнего потока.

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

Progress bar

Осталось добавить progress bar. Для отслеживания прогресса нам понадобится определить метод xhr.upload.onprogress. Данный метод вызывается при возникновении события ProgressEvent. Объект события содержит в себе несколько полезных для нас свойств:

  • lengthComputable — если true, значит, что нам известен полный размер файла(в нашем случае всегда true)
  • total — общее количество байт
  • loaded — количество отосланных байт


Теперь upload выплевывает в поток состояние выгрузки. Осталось только написать функцию, которая будет менять свойства style у элемента progressBar:




Небольшой совет: чтобы ваши файлы локально выгружались не так быстро, включите настройку «Fast 3G» или «Slow 3G» во вкладке «Performance» в Chrome devtools.

Доводим до ума

Мы получили полноценное рабочее приложение. Осталось добавить пару штрихов. Сейчас при нажатии на кнопку uploadBtn мы отменяем предыдущую выгрузку и начинаем новую. Но у нас уже есть кнопка отмены.

Хочется, чтобы кнопка uploadBtn не реагировала на последующие нажатия, пока мы не выгрузили файл(или пока мы не отменили выгрузку). Что можно предпринять?

Можно вешать атрибут disable, пока процесс выгрузки не завершится. Но есть другой вариант — оператор exhaustMap. Данный оператор будет игнорировать новые значения из внешнего потока, пока внутренний поток не будет завершен. Заменим switchMap на exhaustMap:


И вот теперь можно считать наше приложение законченным. Немного рефакторинга и получаем финальный вариант:


Мой вариант я выложил здесь.

Пример приложения на Angular можно найти здесь.

Заключение

RxJS очень мощный инструмент в руках разработчика. В его арсенале есть огромнейший набор операторов на все случаи жизни. К сожалению, из-за этого порог входа в данную технологию довольно высок. И часто, люди по незнанию начинают писать свои «велосипеды», из-за чего код становится трудно поддерживаемым.

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

Пользователю должно быть удобно и понятно.

CALL METHOD cl_gui_frontend_services = > file_save_dialog file_filter = zcl_excel_common = > c_xlsx_file_filter CHECK lv_user_action NE cl_gui_frontend_services = > action_cancel .

А имя файла можно задать понятное до деталей:

Это совсем не сложно, не стоит этого бояться.

Во-вторых, полномочия на стороне пользователя.

В моём случае show_document встречает две проверки:

А) Проверка на выгрузку файла в папку:

Word security 1

Б) Проверка на открытие файла:

Word security 2

Если метод cl_gui_frontend_services=>show_document заставляет SAP GUI искать программу, ассоциированную с данным типом файлов, то метод cl_gui_frontend_services=>execute работает хитрее. Он просто предоставляет операционной системе самой разобраться что к чему.

Вот такой маленький proof-of-concept:

DATA : lv _ template TYPE string VALUE 'ZR_CA001.DOCX' .

Метод SHOW реализован отдельно:

CALL METHOD cl _ bcs _ convert = > xstring _ to _ xtab cl _ gui _ frontend _ services = > get_temp_directory ( temp _ dir = lv _ temp _ dir "D:\Users\<username>\AppData\Local\SAP\SAP GUI\tmp "D:\Users\<username>\AppData\Local\SAP\SAP GUI\tmp\Order AA 123 15.06.2018 Ivanov Ivan.docx cl _ gui _ frontend _ services = > execute ( EXPORTING document = lv _ fullname ) . "access_denied = файл уже открыт в приложении, дописываем счетчик пока не достигнем успеха "D:\Users\<username>\AppData\Local\SAP\SAP GUI\tmp\Order AA 123 15.06.2018 Ivanov Ivan (2).docx

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

Метод SHOW_DOCUMENT выгружает файл во вторую папку и там есть параметр KEEP_FILE. Очевидно тогда, что если флаг специально не выставить, то файл будет подчищен автоматически; вопрос только в какой момент.

В нашем новом методе EXECUTE данный параметр отсутствует. Что это значит? Интересно, чистит ли папку кто-нибудь и когда-нибудь?

Documents in the temporary directory will be deleted, when SAP GUI is closed. You can configure the deletion of files also in other directories. For information on this, refer to the security guide.

Для понимания механизма достаточно воспользоваться следующими новыми методами: НачатьПомещениеФайла , НачатьПолучениеКаталогаДокументов , НачатьПолучениеФайлов . Вспомогательными будут: ОписаниеОповещения , Файл , ПолучитьИзВременногоХранилища .

В свойствах конфигурации установлено :

Режим использования модальности - Не использовать
Режим использования синхронных вызовов - Не использовать (Свойство доступно начиная с версии 8.3.6.1760)
Режим совместимости - Не использовать.

Настройки БД:

Для реализации примера создал константу "Данные файла" (тип ХранилищеЗначения) общую форму "Сохранение файла". Через общую форму (где все реализовано) выполняется сохранение файла в константу, выгрузка и открытие загруженного ранее файла.

Спросите "Почему данные записываются в константу, а не в справочник или регистр сведений?". Тут все просто. Я посчитал что для упрощения понимания механизма использовать константу самое то :). Главное понять суть механизма, а вариант реализации программист уже выбирает исходя из структуры своей БД.

Почему не прикрепил конфигурацию, а выложил листинг кода?

Я считаю, что публикацию будет читать пользователь, уже имеющий опыт программирования в среде платформы 8.3 (умеет создавать объекты конфигурации, знает, что такое СП и как пользоваться встроенной справкой). Поэтому создать рабочий пример у себя в БД не составит особых проблем. Нужно: создать константу, создать общую форму, в новую форму вставить листинги кода (ниже в публикации), создать команды на форме ( СохранитьФайл, ОткрытьФайл, УдалитьФайл ) и подвязать обработчики.

Краткое описание используемых методов (копипаст СП не делал :) ):

НачатьПомещениеФайла - Вызывается диалог выбора файла. Выбранный файл помещается во временное хранилище.
НачатьПолучениеФайлов - Выполняется получение данных файла с БД и сохранение файла в указанный пользователем каталог.
Файл - Доступ к свойствам файла по полному пути к файлу.
ПолучитьИзВременногоХранилища , ПоместитьВоВременноеХранилище - В данном примере это методы работы с двоичными данными файла.
НачатьПолучениеКаталогаДокументов (КаталогДокументов) - Получение каталога документов пользователя (аналог КаталогДокументов).
ОписаниеПередаваемогоФайла - Определение полного имени файла в ОС по которому будет сохранен файл из ИБ.
ОписаниеОповещения - Описание вызова процедуры которая будет вызвана после какого-то действия пользователя (Пример: После действия пользователя НачатьПолучениеКаталогаДокументов будет вызвана процедура, где в параметре "ИмяКаталогаДокументов" будет строка в полным адресом к каталогу документов пользоватя: "C:\Users\Имя пользователя\Documents").
НачатьЗапускПриложения - Открытие файла ассоциированным приложением.

Примечание: Основные методы используются с 8.3.3.641. А НачатьПолучениеКаталогаДокументов с 8.3.6.1760.

Листинги:

Служебная процедура (в которой выполняется проверка наличия данных константы)

теги: НачатьПомещениеФайла, НачатьПолучениеФайлов, ОписаниеПереданногоФайла

Фирма «1С» в первую очередь рекомендует использовать методику автоматического переноса данных непосредственно из исходной информационной базы, так как она обеспечивает корректный перенос учетных данных и сокращает время перехода на новую программу. Однако бывают ситуации, когда применить эту методику не представляется возможным, например, в случае существенного изменения исходной конфигурации или при переходе с базовых версий программы. В таких случаях предлагается использовать перенос данных выгрузкой и загрузкой из файла.

Выгрузка данных в файл

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

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

Рассмотрим выгрузку данных в файл на примере переноса данных из информационной базы «1С:Бухгалтерии 7.7». Порядок действий при других вариантах переноса не меняется.

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

Этап 1. Резервное копирование

Необходимо выполнить резервное копирование информационной базы конфигурации «Бухгалтерский учет» редакции 4.5.

Этап 2. Выгрузка данных

Запустить «1С:Бухгалтерию 7.7».

Перенос данных осуществляется с помощью файлов, которые находятся в подкаталоге ExtForms (1SBDB\ExtForms):

  • V77Exp.ert – обработка выгрузки данных из конфигурации «Бухгалтерский учет», редакция 4.5;
  • Acc_Acc8.xml – правила конвертации данных, используемые обработкой V77Exp.ert.

Правила переноса исходной информационной базы должны быть актуальными на момент переноса. Актуальные правила всегда следует получать из «1С:Бухгалтерии 8». Для этого нужно выполнить следующие действия:

  1. Запустить «1С:Бухгалтерию 8».
  2. Открыть форму Загрузка из 1С:Предприятия 7.7.

После обновления правил переноса можно приступать к выгрузке данных. Для этого необходимо воспользоваться помощником перехода. Требуется нажать Переход на 1С:Бухгалтерию 8 панели инструментов программы.

Шаг 1. Начало работы с помощником

Для ознакомления с преимуществами перехода нажать О преимуществах 1С:Бухгалтерии 8.

Шаг 2. Проверка обновлений

Для проверки наличия обновлений нажать Проверить наличие обновлений.

При наличии ИТС можно сразу обновить конфигурацию. Далее программу необходимо будет закрыть. При повторном запуске в режиме 1С:Предприятие работа с помощником продолжается с момента остановки.

Шаг 3. Настройка периода выгрузки

Выбрать период выгрузки.

Для этого требуется установить переключатель на одном из следующих значений:

  • Остатки на начало года – если остатки переносятся на начало года;
  • Обороты – если данные переносятся в середине года;
  • Документы– если переносятся остатки за незакрытый период текущего года.

Обязательно указывается период переноса. Например, если выгрузка формируется на 01.01.2013, то установить переключатель Остатки на начало года, и в качестве периода укажем 2013 г.

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

Шаг 4. Адрес файла выгрузки

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

Шаг 5. Выгрузка данных

Для выгрузки данных нажать Выгрузить. В результате выгрузки будет создан файл в формате XML.

Рекомендуется установить флажок Сформировать оборотно-сальдовую ведомость. В этом случае после окончания выгрузки программа автоматически сформирует отчет Оборотно-сальдовая ведомость. Необходимо использовать отчет для проверки загруженных данных.

Неполная (частичная) выгрузка данных в файл

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

Требуется открыть универсальную выгрузку (Сервис – Дополнительные возможности).

В открывшемся окне выбрать пункт Выгрузка данных для 1С:Бухгалтерии 8.

Далее нужно заполнить параметры универсальной выгрузки данных.

Необходимо указать параметры выгрузки:

  • Имя файла правил – выбрать файл правил конвертации данных;
  • Имя файла данных – указать файл, в который будут выгружены данные в формате .xml;
  • Дата начала, Дата окончания – указать период выгрузки. Если перенос осуществляется на начало года, то в полях Дата начала и Дата окончания необходимо указать одинаковую дату. Например, если перенос осуществляется на начало 2013 года, то нужно указать дату начала и дату окончания – 01.01.2013;
  • Правила выгрузки данных – нажать Загрузить правила обмена для заполнения табличной части Правила выгрузки данных. По тем разделам, по которым выгрузка не производится, снять флажки. Например, если необходимо перенести только данные справочника Банковские счета и Банки, то установить флажки Банки и Банковские счета в табличной части Правила выгрузки данных.

Нажать Выгрузить для выполнения выгрузки данных.

Загрузка данных из файла

  1. Запустить «1С:Бухгалтерию 8».
  2. Дополнительные настройки в информационной базе «1С:Бухгалтерии 8» не требуются. Настройки параметров учета для корректного переноса данных будут установлены в информационной базе по умолчанию.
  3. Необходимо воспользоваться помощником перехода (Главное – Загрузка из 1С:Предприятия 7.7).

Шаг 1. Выбор варианта загрузки данных

Выбрать пункт Загрузить данные из файла.

Шаг 2. Выбор файла загрузки

Выбрать в поле Путь к файлу данных файл загрузки.

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

Для загрузки данных нажать Загрузить данные.

Шаг 3. Загрузка

Загрузка данных и их проверка осуществляются автоматически.

  • загрузка данных,
  • проведение загруженных документов,
  • проверка загруженных документов.

В поле Выполнение отображается индикатор выполнения загрузки в процентах. Ниже приводится наименование исходной информационной базы.

Если загрузка осуществляется в программный продукт базовой версии, то ИНН и КПП организации в «1С:Бухгалтерии 8» будут заменены на ИНН/КПП организации исходной информационной базы.

Шаг 4. Результат переноса

Если перенос данных прошел успешно, выводится строка: «Перенос данных прошел успешно!».

Если используется версия ПРОФ, можно сразу приступить к переносу следующей информационной базы или данных из файла.

Читайте также: