Как отправить файл 1с
(обязательный). Тип - Строка. Адрес ресурса на сервере.
(обязательный). Тип - Строка. Имя файла на диске, в который
помещаются данные, полученные от сервера (ответ сервера).
(необязательный). Тип - Строка. Заголовки, добавляемые к запросу на сервер.
Текстовые пары вида :, разделенные комбинацией ВК + ПС.
(подробнее о заголовках будет сказано ниже).
Рассмотрим параметры процедуры Получить() более подробно:
В поле ИмяВыходногоФайла указывает имя файла на диске, в который будут сохранены данные, полученные от сервере в результате запроса. Так, например, если сервер возвращает список пользователей в формате XML, то на диск в указанный файл будет сохранен XML файл со списком пользователей.
О заголовках более подробно будет сказано ниже.
Так же, при запросе к веб-серверу зачастую передаются дополнительные данные (параметры) для этого запроса. Параметры от адреса источника отделяются символом "?". Каждый параметр задается в формате =. Параметры от адреса источника отделяются символом "?". Сами же параметры отделяются друг от друга символом "&". В результате строка адреса источника может выглядеть следующим образом: getUsers.php?owner_id=263544&count=100.
Ниже приведен пример, поясняющий все выше сказанное.
Код 1C v 8.х
Все заголовки разделяются на четыре основных группы:
От себя лишь добавлю, что, если это явно не указано в требованиях к отправке данных веб-серверу заголовки HTTP для метода GET можно не указывать. Для метода POST обычно нужно указать заголовки Content-Type (тип передаваемых данных, например: "Content-Type: text/html;charset=utf-8") и Content-Length (размер передаваемых данных в байтах, например: "Content-Length: 1348").
Напомню, что HTTP заголовки в 1С указываются строкой в виде текстовых пар ":", разделенных комбинацией символов ВК+ПС.
Также заголовки можно задать типом Соответствие, где в качестве ключа указывается заголовок, а в качестве значения - значение заголовка.
Ниже приведены поясняющие примеры:
Код 1C v 8.х
Поле АдресРесурса аналогично полю Источник процедуры Получить(), т.е. указывается строка с адресом запроса, идущая после имени домена и символа "/".
Поле ИмяВыходногоФайла также аналогично одноименному полю процедуры Получить(), т.е. содержит имя файла, в котором будут сохранены данные, полученные от сервера в результате обработки исходных данных.
О заголовках было упомянуто выше. Напомню лишь, что для метода POST обычно указываются заголовки Content-Type и Content-Length. В качестве параметра заголовка Content-Length указывается размер файла-источника, преобразованный с помощью функции XMLСтрока().
Ниже приведен пример, поясняющий все выше сказанное.
Код 1C v 8.х
где:
- id пользователя на сайте, от имени которого добавляется комментарий;
- id материала на сайте, к которому добавляется комментарий;
- текст комментария.
Предположим, что нам уже известны id пользователя и материала и они хранятся в переменных user_id и post_id. Ниже приведен пример, решающий нашу задачу.
Код 1C v 8.х
Загрузка файлов (изображений, документов и т.п.) на веб-сервер методом POST.
Зачастую возникает необходимость загрузки файлов на веб-сервер. Это может быть, например, изображение к статье на сайте, или фотография для альбома, или архив для файлообменника. Ранее мы рассматривали передачу методом POST параметров или просто файлов. Таким же образом можно и передавать двоичные файлы. Но как быть, если файлы необходимо отправлять вместе с параметрами? Для возможности отправки файлов в этом случае используется HTTP заголовок ContentType:multipart/form-data. Следует заметить, что обычно таким способом передаются файлы через веб-браузеры. Т.е. когда на сайте вы выбираете файл и нажимаете кнопку "Загрузить", то файл передается способом описанным ниже. При таком способе сам файл также задается как переменная, т.е., например, файл передается через параметр file или image. Однако, мы не можем просто передать file=. А вот как все таки передать файл мы и рассмотрим ниже.
Bounday можно сформировать, например, таким образом
Код 1C v 8.х
Все данные отделяются друг от друга разделителем boundary. Начинать разделитель нужно с "--":
Код
В конце данных нужно закрыть разделитель, добавили в конце разделителя "--", т.е. вид будет "----".
Итак, например, нам нужно передать на веб-сервер текстовый файл через параметр "text", его описание через параметр "desc" и id пользователя через параметр "uid", для которого будет загружен наш файл.
Предположим, что файл содержит следующий текст:
Мороз и солнце; день чудесный!
Еще ты дремлешь, друг прелестный -
Пора, красавица, проснись:
Открой сомкнуты негой взоры
Навстречу северной Авроры,
Звездою севера явись!
Описание должно содержать "Стих А.С. Пушкина", а id пользователя равно "0123456". Тогда файл должен быть сформирован следующим образом (для упрощения предположим, что bounday мы уже сформировали и он равен "ccf8111910")
Код
--ccf8111910
Content-Disposition: form-data; name="uid"
0123456
--ccf8111910
Content-Disposition: form-data; name="desc"
Стих А.С. Пушкина
--ccf8111910
Content-Disposition: form-data; name="text"; filename="stih.txt"
Content-Type: text/plain
Мороз и солнце; день чудесный!
Еще ты дремлешь, друг прелестный -
Пора, красавица, проснись:
Открой сомкнуты негой взоры
Навстречу северной Авроры,
Звездою севера явись!
--ccf8111910--
А теперь перейдем непосредственно к 1С. Пусть у нас будет форма с реквизитами "Пользователь", "Описание" и "ИмяФайла". Реализуем отправку данных, описанным выше способом
Код 1C v 8.х
Передача текстовых файлов таким способом проблем не вызывает. Сложнее дело обстоит с файлами, содержащими двоичные данные (изображения, архивы и т.п.). Все дело в том, что в 1С просто нет методов для чтение двоичных файлов в строку. Если мы делаем обмен со своим сайтом, которые сами и разрабатывали, то можно просто преобразовать файл в строку Base64 при помощи процедуры Base64Строка(), а на стороне сервера преобразовать строку Base64 обратно.
Код 1C v 8.х
А как же быть если мы загружаем файл на сторонний сервер, который принимает файл как есть без преобразование его в строку Base64(). В это случае можно пойти на хитрость. В 1С есть процедура ОбъединитьФайлы(), которая объединяет несколько файлов на диске в один результирующий файл
Код 1C v 8.х
(обязательный). Тип - Массив. Массив имен частей файлов, которые
требуется объединить. Объединение будет происходить в порядке, в котором заданы
имена файлов в массиве.
(обязательный). Тип - Строка. Имя файла, который будет
создан в результате объединения файлов.
Т.е. мы можем сформировать текстовый файл с запросом, объединить его с файлом(-ами), которые необходимо передать на веб-сервер и передать уже файл, получившийся в результате объединения исходных файлов. Ниже демонстрируется процесс передачи двух zip архивов на сервер с дополнительными параметрами user_id и post_id.
Код 1C v 8.х
Ну вот, вроде бы, и все, что я хотел рассказать о способах передачи файлов и данных на веб-сервер из 1С. Если что-то не понятно, что-то хотите уточнить или нашли ошибки - пишите в комментариях.
Автор: Павел
(обязательный). Тип - Строка. Адрес ресурса на сервере.
(обязательный). Тип - Строка. Имя файла на диске, в который
помещаются данные, полученные от сервера (ответ сервера).
(необязательный). Тип - Строка. Заголовки, добавляемые к запросу на сервер.
Текстовые пары вида :, разделенные комбинацией ВК + ПС.
(подробнее о заголовках будет сказано ниже).
Рассмотрим параметры процедуры Получить() более подробно:
В поле ИмяВыходногоФайла указывает имя файла на диске, в который будут сохранены данные, полученные от сервере в результате запроса. Так, например, если сервер возвращает список пользователей в формате XML, то на диск в указанный файл будет сохранен XML файл со списком пользователей.
О заголовках более подробно будет сказано ниже.
Так же, при запросе к веб-серверу зачастую передаются дополнительные данные (параметры) для этого запроса. Параметры от адреса источника отделяются символом "?". Каждый параметр задается в формате =. Параметры от адреса источника отделяются символом "?". Сами же параметры отделяются друг от друга символом "&". В результате строка адреса источника может выглядеть следующим образом: getUsers.php?owner_id=263544&count=100.
Ниже приведен пример, поясняющий все выше сказанное.
Код 1C v 8.х
Все заголовки разделяются на четыре основных группы:
От себя лишь добавлю, что, если это явно не указано в требованиях к отправке данных веб-серверу заголовки HTTP для метода GET можно не указывать. Для метода POST обычно нужно указать заголовки Content-Type (тип передаваемых данных, например: "Content-Type: text/html;charset=utf-8") и Content-Length (размер передаваемых данных в байтах, например: "Content-Length: 1348").
Напомню, что HTTP заголовки в 1С указываются строкой в виде текстовых пар ":", разделенных комбинацией символов ВК+ПС.
Также заголовки можно задать типом Соответствие, где в качестве ключа указывается заголовок, а в качестве значения - значение заголовка.
Ниже приведены поясняющие примеры:
Код 1C v 8.х
Поле АдресРесурса аналогично полю Источник процедуры Получить(), т.е. указывается строка с адресом запроса, идущая после имени домена и символа "/".
Поле ИмяВыходногоФайла также аналогично одноименному полю процедуры Получить(), т.е. содержит имя файла, в котором будут сохранены данные, полученные от сервера в результате обработки исходных данных.
О заголовках было упомянуто выше. Напомню лишь, что для метода POST обычно указываются заголовки Content-Type и Content-Length. В качестве параметра заголовка Content-Length указывается размер файла-источника, преобразованный с помощью функции XMLСтрока().
Ниже приведен пример, поясняющий все выше сказанное.
Код 1C v 8.х
где:
- id пользователя на сайте, от имени которого добавляется комментарий;
- id материала на сайте, к которому добавляется комментарий;
- текст комментария.
Предположим, что нам уже известны id пользователя и материала и они хранятся в переменных user_id и post_id. Ниже приведен пример, решающий нашу задачу.
Код 1C v 8.х
Загрузка файлов (изображений, документов и т.п.) на веб-сервер методом POST.
Зачастую возникает необходимость загрузки файлов на веб-сервер. Это может быть, например, изображение к статье на сайте, или фотография для альбома, или архив для файлообменника. Ранее мы рассматривали передачу методом POST параметров или просто файлов. Таким же образом можно и передавать двоичные файлы. Но как быть, если файлы необходимо отправлять вместе с параметрами? Для возможности отправки файлов в этом случае используется HTTP заголовок ContentType:multipart/form-data. Следует заметить, что обычно таким способом передаются файлы через веб-браузеры. Т.е. когда на сайте вы выбираете файл и нажимаете кнопку "Загрузить", то файл передается способом описанным ниже. При таком способе сам файл также задается как переменная, т.е., например, файл передается через параметр file или image. Однако, мы не можем просто передать file=. А вот как все таки передать файл мы и рассмотрим ниже.
Bounday можно сформировать, например, таким образом
Код 1C v 8.х
Все данные отделяются друг от друга разделителем boundary. Начинать разделитель нужно с "--":
Код
В конце данных нужно закрыть разделитель, добавили в конце разделителя "--", т.е. вид будет "----".
Итак, например, нам нужно передать на веб-сервер текстовый файл через параметр "text", его описание через параметр "desc" и id пользователя через параметр "uid", для которого будет загружен наш файл.
Предположим, что файл содержит следующий текст:
Мороз и солнце; день чудесный!
Еще ты дремлешь, друг прелестный -
Пора, красавица, проснись:
Открой сомкнуты негой взоры
Навстречу северной Авроры,
Звездою севера явись!
Описание должно содержать "Стих А.С. Пушкина", а id пользователя равно "0123456". Тогда файл должен быть сформирован следующим образом (для упрощения предположим, что bounday мы уже сформировали и он равен "ccf8111910")
Код
--ccf8111910
Content-Disposition: form-data; name="uid"
0123456
--ccf8111910
Content-Disposition: form-data; name="desc"
Стих А.С. Пушкина
--ccf8111910
Content-Disposition: form-data; name="text"; filename="stih.txt"
Content-Type: text/plain
Мороз и солнце; день чудесный!
Еще ты дремлешь, друг прелестный -
Пора, красавица, проснись:
Открой сомкнуты негой взоры
Навстречу северной Авроры,
Звездою севера явись!
--ccf8111910--
А теперь перейдем непосредственно к 1С. Пусть у нас будет форма с реквизитами "Пользователь", "Описание" и "ИмяФайла". Реализуем отправку данных, описанным выше способом
Код 1C v 8.х
Передача текстовых файлов таким способом проблем не вызывает. Сложнее дело обстоит с файлами, содержащими двоичные данные (изображения, архивы и т.п.). Все дело в том, что в 1С просто нет методов для чтение двоичных файлов в строку. Если мы делаем обмен со своим сайтом, которые сами и разрабатывали, то можно просто преобразовать файл в строку Base64 при помощи процедуры Base64Строка(), а на стороне сервера преобразовать строку Base64 обратно.
Код 1C v 8.х
А как же быть если мы загружаем файл на сторонний сервер, который принимает файл как есть без преобразование его в строку Base64(). В это случае можно пойти на хитрость. В 1С есть процедура ОбъединитьФайлы(), которая объединяет несколько файлов на диске в один результирующий файл
Код 1C v 8.х
(обязательный). Тип - Массив. Массив имен частей файлов, которые
требуется объединить. Объединение будет происходить в порядке, в котором заданы
имена файлов в массиве.
(обязательный). Тип - Строка. Имя файла, который будет
создан в результате объединения файлов.
Т.е. мы можем сформировать текстовый файл с запросом, объединить его с файлом(-ами), которые необходимо передать на веб-сервер и передать уже файл, получившийся в результате объединения исходных файлов. Ниже демонстрируется процесс передачи двух zip архивов на сервер с дополнительными параметрами user_id и post_id.
Код 1C v 8.х
Ну вот, вроде бы, и все, что я хотел рассказать о способах передачи файлов и данных на веб-сервер из 1С. Если что-то не понятно, что-то хотите уточнить или нашли ошибки - пишите в комментариях.
Автор: Павел
Произвольный документ можно создать:
1. Из рабочего места Текущие дела ЭДО.
Для создания произвольного документа необходимо в Текущих делах ЭДО перейти в папку «Создать» и выполнить команду «Создать произвольный документ».
В открывшемся окне необходимо выбрать организацию (отправителя электронного документа), контрагента (получателя электронного документа). После заполнения необходимых полей требуется нажать «Добавить файл» и выбрать документ из соответствующей директории Вашего компьютера.
Размер присоединяемого файла должен быть в пределах от 100 байт до 50 Мб.
Обращаем Ваше внимание, что имя присоединяемого файла автоматически преобразуется в транслит. Этот функционал создан с целью корректного переноса между различными операционными системами. Если по какой-либо причине документ должен быть отправлен без транслита, то необходимо зайти в группу команд «Ещё» и снять галочку с «Транслитировать имя присоединяемого файла» и выполнить повторное добавление файла.
После чего необходимо выбрать вид документа. Стандартными настройками вид документа определён как «Прочее».
Для каждого вида документов поддержан свой регламент ЭДО в настройках отправки электронных документов. Это позволяет выполнить более гибкие настройки запроса ответной подписи, извещения о получении и очередности подписания электронного документа.
В форме произвольного документа поддерживается возможность указания обязательных реквизитов (номер, дата, сумма).
После завершения обмена, документ будет доступен для просмотра в Архиве ЭДО с указанными ранее значениями (видом документа, номером и датой).
При необходимости можно установить связь с документом учёта.
В документе учётной системы будет отображаться состояние ЭДО по произвольному документу, а сам документ будет доступен при выполнении команды «ЭДО – Просмотреть электронный документ».
2. Из печатной формы документа учётной системы.
Начиная с версии модуля ЭДО 1.8.1, реализована возможность быстрого формирования произвольных документов на основании печатных форм. Для этого следует перейти в документ учётной системы, раскрыть группу команд «Печать» и выбрать необходимый вид печатной формы.
В открывшемся окне требуется нажать кнопку «ЭДО».
Произвольный документ связан с документом учётной системы и будет доступен при выполнении команды «ЭДО – Просмотреть электронный документ». Также в документе учётной системы будет отображаться состояние ЭДО по произвольному документу.
3. Из документа учётной системы.
Произвольный электронный документ можно создать из документа учётной системы, нажав «ЭДО – Создать произвольный документ».
Произвольный документ связан с документом учётной системы и будет доступен при выполнении команды «ЭДО – Просмотреть электронный документ». Также в документе учётной системы будет отображаться состояние ЭДО по произвольному документу.
4. Из Архива электронных документов.
Произвольный документ можно создать из Архива ЭДО. Для этого необходимо перейти в «Администрирование – Архив ЭДО» и на вкладке «Документы» выполнить команду «Создать произвольный документ».
В версиях программных продуктов, использующих модуль ЭДО версии 1.1 (Бухгалтерия предприятия 2.0, Управление торговлей 10.3, Управление производственным предприятием 1.3) отправку произвольного документа можно осуществить:
1. Из формы списка произвольных электронных документов.
Для этого необходимо перейти в меню «Сервис», развернуть группу «Обмен электронными документами» и выбрать «Произвольные электронные документы».
В открывшемся окне следует перейти на вкладку «Исходящие» и нажать «Создать».
2. Из папки «Создать» рабочего места Текущие дела ЭДО.
В ряде случаев пользователям требуется по одной сделке отправлять несколько документов контрагенту. Начиная с версии модуля ЭДО 1.9.1, появилась возможность объединять данные документы в один пакет. При этом связанные документы учётной системы и присоединённые файлы будут автоматически доступны для выбора при формировании пакета электронных документов.
Формирование пакета происходит из формы просмотра электронного документа перед его отправкой контрагенту (ЭДО – Просмотреть электронный документ). Для объединения документов требуется нажать «Добавить в пакет», а затем из выпадающего списка выбрать месторасположение необходимых документов.
- Файл с компьютера
- Файл из хранилища
Данная команда позволяет выбрать файл из ранее сформированного хранилища без обращения к директории компьютера пользователя.
Данная команда позволяет добавить в пакет электронный документ, созданный на основании связанных документов учётной системы и присоединённых файлов. В случае отсутствия электронного документа он будет сформирован на основании данных из документа учёта, представленного в списке. При этом имеется возможность добавить не только формализованный документ, но и печатную форму как PDF – вложение в исходящий произвольный документ. Формализованный документ будет сформирован в формате, который установлен в действующей настройке отправки с данным контрагентом.
Если нужный документ учёта отсутствует в окне выбора, необходимо нажать «Добавить другой» и указать соответствующий вид документа из представленного списка.
В открывшемся журнале документов учёта требуется выбрать интересующий документ, после чего он станет доступен для добавления в пакет.
После добавления второго электронного документа произойдёт их объединение в пакет. Для переключения между документами следует использовать появившиеся вкладки.
Чтобы исключить документ из пакета, следует нажать закрыть на необходимой вкладке. Добавление следующих документов осуществляется при помощи соответствующей кнопки. В одном пакете может содержаться неограниченное количество документов.
Если число документов в одном пакете превышает три, то все остальные документы доступны для просмотра по ссылке «ещё» на панели вкладок пакета.
Стандартными настройками предусмотрено пакетное отображение электронных документов в рабочем месте «Текущие дела ЭДО».
При необходимости режим просмотра можно изменить. Для этого следует перейти в «Настройки просмотра» и отключить пакетное отображение.
При данном варианте просмотра документы будут отображаться отдельно.
Независимо от настройки просмотра, при переходе в электронный документ произойдёт открытие пакета на вкладке, соответствующей выбранному документу.
2. ПОЛУЧЕНИЕ ПАКЕТА ЭЛЕКТРОННЫХ ДОКУМЕНТОВ
Все операции по обработке документов, такие как утверждение, подписание, отклонение, аннулирование можно выполнить с пакетом целиком. Для пакетной обработки следует использовать соответствующие команды.
При необходимости документы можно обработать отдельно, например, часть принять, а остальные отклонить. Для этого требуется выбрать интересующий документ, на соответствующей вкладке пакета нажать «Другие действия - Действия с документом» и выполнить необходимую команду.
От контрагентов, работающих в системе СБИС, могут поступать пакеты, по которым действия с отдельными документами недоступны. Данные пакеты можно обработать только целиком.
Во время создания очередной B2B-системы на этапе интеграции 1С: Предприятие 8.2 с web — интерфейсом возникла необходимость безопасной передачи файлов больших размеров из 1С в web.
Для решения этой задачи был выбран протокол SFTP, как надежный и не имеющий ограничений по размеру передаваемого файла.
Во встроенном языке 1С: Предприятие 8.2 отсутствуют функции для передачи данных через SFTP, поэтому пришлось искать прикладные средства. На интернет-ресурсах, посвященных программированию 1С, есть примеры удачного использования freeware утилит типа WinSCP. Для использования данного способа необходимо из встроенного языка 1С выполнить запуск утилиты с параметрами командной строки.
Пример запуска утилиты WinCSP из 1С:
Минусом такого решения является отсутствие возможности контроля ошибок запуска и выполнения из встроенного языка 1С. В связи с этим было принято решение написать внешнюю DLL компоненту для 1С: Предприятие 8.2.
Создание компоненты DLL
- IcomponentBase — реализует основные методы компоненты.
- IlanguageInterface — служит для локализации методов и свойств 1С и С++ через определения массивов соответствий и методов акцессоров GetMethodName, GetPropName.
3. Для вызова необходимой функции из компоненты используется метод CallAsFunc из интерфейса IcomponentBase. При вызове методов из компоненты 1С, вызывается этот С++ метод.
- lMethodNum – номер метода в массиве соответствий.
- pvarRetValue – указатель на выходные параметры.
- paParams — параметры из метода в 1С.
- lSizeArray – размер массива, если входной параметр массив.
4. В нашем примере из 1С можно выполнять 4 метода, которым соответствуют С++ методы в DLL компоненте.
1С (методы) | С++ методы |
---|---|
НачатьСессию() Предварительно нужно определить параметры авторизации(хост, связку логин, пароль – либо rsa ключи, путь на удалённом сервере). Поэтому функция НачатьСессию обрастает свойствами: Хост, Логин, Пароль, УдаленныйПуть | StartSSHSession(status,this->ssh_host,this->ssh_login,this->ssh_pass); StartSftpSession(status,this->sftp_path) |
ПослатьФайл(“Путь и имя файла на клиентской машине”) | WriteToServer(const char * &status, const char *loclfile) |
ЕслиСессияНачата() | isSessionStart() |
ЗакончитьСессию() | endSession() – завершает SFTP сеанс и SSH сеанс |
5. В С++ нужно определить параметры доступа(чтение/запись) к созданным свойствам за это отвечают два метода IsPropReadable и IsPropWritable.
Таблица соотношений свойств 1С и С++
1С(свойства) | С++ свойства |
---|---|
Хост | ssh_host |
Логин | ssh_login |
Пароль | ssh_pass |
УдаленныйПуть | Sftp_path |
Готовую библиотеку можно скачать тут.
Работа с компонентой во встроенном языке 1С
1. Выполняем подключение и создаем объект внешней компоненты, с помощью стандартных команд встроенного языка 1С.
2. Заполняем 4 свойства объекта компоненты Хост, Логин, Пароль, УдаленныйПуть.
3. Открываем сессию соединения
4. Отправляем файл
5. Отправляем следующий файл, с проверкой открыта ли сессия соединения.
6. После отправки файлов закрываем сессию
В результате выполнения успешно был передан файл с C:\data2.xml в /var/www/company/data/www/import/data.xml.
Вывод: данная реализация позволяет передавать файлы из 1С: Предприятие 8.2. большого размера по защищенному протоколу SFTP. Плюс появляется возможность переносить часть функционала из 1С во внешнюю компоненту, что защищает написанный код и позволяет реализовывать дополнительный, не доступный 1С функционал.
Читайте также: