Выбор файла в 1С в асинхронном режиме
Рассмотрим как асинхронно (а в управляемых формах необходимо только так) программно обработать выбор пользователем пути к файлу.
Постановка задачи
Предположим, что на форме создан реквизит ПутьКФайлу. Этот реквизит имеет тип Строка и выведен на форму. Пользователь должен указывать в этом поле путь к файлу Excel.
Решение
Для удобства свойство КнопкаВыбора элемента формы установим в значение Да и будем обрабатывать событие НачалоВыбора этого элемента.
В процедуре начала выбора элемента ПутьКФайлу необходимо написать код:
// Отказываемся от стандартной обработки процедуры
СтандартнаяОбработка = Ложь;
содержит описание процедуры, которая будет вызвана после закрытия диалога выбора. В этой процедуре должно быть два параметра:
Пример процедуры, которая будет вызвана после закрытия окна выбора файла:
Если ВыбранныеФайлы <> Неопределено Тогда
ПутьКФайлу = ВыбранныеФайлы [ 0 ];
Внимание!
Процедура, указанная в объекте ОписаниеОповещения должна иметь ключевое слово Экспорт.
Приведенный пример можно немного усовершенствовать: передать в третий параметр конструктора ОписаниеОповещения переменную Диалог.
Тогда в процедуре ВыборФайлаЗавершение будет доступно немного больше информации: из параметра ДополнительныеПараметры можно будет узнать каталог, в котором хранится выбранный файл, и фильтр, которому соответствует файл.
В конструкторе объекта ДиалогВыбораФайла в параметре указывается для чего будет открыт диалог. Возможные значения системного перечисления РежимДиалогаВыбораФайла:
Приведу еще несколько свойств объекта ДиалогВыбораФайла:
Решение средствами БСП
В конфигурациях со втроенной Библиотекой стандартных подсистем можно использовать процедуру
общего модуля ОбменДаннымиКлиент. При помощи этого метода приведенную выше задачу можно решить так:
Остались вопросы?
Спросите в комментариях к статье.
Работа с файлами в управляемых формах клиент серверной версии 8.3 и выше
Для работы с файлами требуется понимание работы платформы и некоторых новшеств.
При необходимости сохранять файлы на сервере, у пользователя, под которыми запущена служба сервера 1С, должен быть доступ на соответствующие каталоги.
Файлы будем хранить в конфигурации в клиент серверной версии 8.3.
Для хранения файлов будем использовать реквизит с типом «ХранилищеЗначения».
Особенностью данного реквизита является его недоступность на клиенте, поэтому работу с ним необходимо проводить только на сервере.
Концепция загрузки с клиента на сервер следующая:
1. Загружаем файлы от клиента на сервер помещая их во временное хранилище
2. На клиенте сохраняем адрес
3. При записи объекта на сервере сохраняем файл в базу данных
Пройдем более детально:
Загрузка файла происходит во временное хранилище на сервере и не передается с контекстом на клиент.
Для передачи адреса файла создадим отдельную переменную формы типа строка, назовем ее «АдресЗагруженногоФайла».
Перед загрузкой нужно получить от пользователя разрешение на работу с его файловой системой.
У нас есть адрес файла на сервере но нет доступа к реквизиту с типом «ХранилищеЗначений» на клиенте.
Для записи в этот реквизит перед записью на сервере получим файл из временного хранилище и положим в реквизит.
Загрузка файла в базу данных готова.
Концепция выгрузки с сервера на клиента следующая:
1. Файл достаем с реквизита и ложим во временное хранилище
2. Передаем с сервера на клиент адрес
3. Сохраняем файл на клиенте
Для работы с файлами на клиенте нужно получить от пользователя разрешение на работу с его файловой системой.
На сервере готовим метод который вытащит файл из реквизита и положит во временное хранилще
Используем типовой метод «НачатьПолучениеФайлов» для передачи файла с сервера на клиента.
В него необходимо передать массив получаемых файлов.
В этом массиве необходимо указать адреса нахождения файлов на сервере или адреса временных хранилищ файлов.
Во время работы файлы будут загружены по этим адресам и положены в массиве «ПолученныеФайлы» во временные хранилища.
На клиенте из этих хранилищ достаем файлы и сохраняем.
Открытие управляемой формы 1С 8.3 с измененным несохраненным объектом
В обработках часто встречается следующая логика: загрузить объект (документ или элемент справочника), изменить его программно в соответствие с логикой обработки, и открыть форму с получившимся документом пользователю, который может сохранить изменения, добавить свои либо отвергнуть изменения, вернуть «как было». В 1С8.3 (Управляемое приложение) осуществить данную логику оказалось неожиданно сложно.
Вначале за основу взял решение, найденное здесь. В целом заработало, но результат меня не устроил, многие поля в форме (в частности, в табличных частях) отображались неправильно.
В итоге (в частности по советам в обсуждениях) сделал несколько по-другому:
поместить данные объекта во временное хранилище,
ОткрытьФорму, в параметрах передать адрес во временном хранилище,
Такого в Сети не нашёл, поэтому выкладываю:
Специальные предложения
Создание нового документа
(1) Проверил, в моём случае работает, в большинстве других, думаю, тоже. И, несомненно, проще.
Тонкость, как я понял, в том, что здесь на сервере вы работаете с ОбъектФормы типа ДанныеФормыСтруктура, который хотя и дублирует по свойствам ДокументОбъект, но не полностью и не по методам. Поэтому если в обработке где-то требуется именно ДокументОбъект, то там будет ошибка.
(Например, у меня первоначально выдало ошибку на
Если ОбъектФормы.Модифицированность()
правда оно в моей обработке и не особо нужно)
УПД. Сейчас проверил внимательней. В вашем варианте у меня в форме не переустанавливается по умолчанию видимость одной из страниц (табличных частей).
Обновление 13.07.20 15:10
См. также
Аналог PIVOT в запросе 1С (как выполнить транспонирование таблицы в запросе 1С) Промо
В статье показывается простой метод реализации аналога оператора PIVOT в запросе 1С без использования соединений.
12.12.2020 4316 Eugen-S 23
Отправка ссылки на документ в обработку вызовом из формы документа, управляемая и обычная формы
По шагам рассматривается настройка открытия формы обработки из формы документа в управляемой и обычной форме. При открытии формы обработки в реквизит ДокументОснование должен автоматом проставляться документ, из которого выполнялся запуск обработки. Автоматизация выбора документа в обработке.
21.09.2021 508 etmarket 1
Программное открытие отчета СКД с параметрами и отбором
Периодически возникает задача открытия формы отчёта СКД уже со сформированным отчётом, с определёнными параметрами и отборами. В данной публикации рассматриваются способы сделать это как в обычном приложении, так и в управляемом.
07.08.2021 4694 Eugen-S 19
Полезные примеры СКД, ч.2
Еще несколько примеров решения задач в СКД.
06.04.2021 10477 Neti 8
Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)
27.01.2016 85513 Serginio 115
Неочевидные нюансы записи управляемой формы
Разберем несколько нюансов записи управляемой формы.
02.04.2021 12453 SeiOkami 54
Полезные примеры СКД, ч.1
Подборка видео по решению различных задач в отчетах на СКД.
30.03.2021 13139 Neti 19
Обзор полезных методов БСП 3.1.4
25.03.2021 39418 rayastar 51
Звуковое управление в 1С 8.3 Промо
В данной статье описано создание библиотеки для звукового управления (выполнение команд голосом) для платформы 1С 8.3. Задача была поставлена так, чтобы модуль функционировал непосредственно на клиенте 1С, осуществляя управление формами, и взаимодействовал с интерфейсом.
16.03.2021 7084 velemir 33
Расширенный автоподбор при вводе по строке в поле ввода в управляемых формах
21.01.2021 3492 herfis 7
Программное копирование узла/строки дерева значений на управляемой форме (УФ, ДанныеФормыДерево, ДанныеФормыЭлементДерева) в вариантах на клиенте и на сервере
11.01.2021 1288 SizovE 0
Ускоряем медленный/долгий и тормозной стандартный поиск по динамическому списку, настраиваем его под себя
14.12.2020 23045 SizovE 2
Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions Промо
28.12.2020 8786 comol 31
Программное условное оформление динамического списка, раскраска строк списка по цветам справочника или любым другим условиям (условное оформление)
30.11.2020 6140 SizovE 4
Выгрузка HTML описаний с картинками (Base64) товаров на сайт/интернет-магазин/B2B, разберем регулярное выражение получения тега body, ПолучитьHTML, ФорматированныйДокумент
24.11.2020 1264 SizovE 4
Установка отбора для поля ввода управляемой формы через ПараметрыВыбора (без переопределения событий «НачалоВыбора», «Автоподбор»)
Зачастую возникает необходимость ограничить вывод элементов какого-нибудь справочника или перечисления при редактировании поля ввода (отфильтровать доступные для выбора элементы) эта публикация показывает простой и эффективный способ реализации этого.
15.11.2020 6365 Eugen-S 9
Использование программных перечислений, ч.1: строковые константы Промо
Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?
Для начинающих: как выбрать файл в 1С?
Добавим новую форму с кнопкой, нажав на которую будет открываться окно выбора файла. Дальнейшая обработка файла в данном примере не рассматривается. Рекомендуется тренироваться на копии базы или пустой конфигурации. Пример создан на конфигурации 1С:CRM 3.0.
Сначала подготовим конфигуратор.
Заходим в конфигуратор 1С. Если конфигурация не открыта, открываем ее и снимаем с поддержки. В меню «Конфигурация» нажимаем «Открыть конфигурацию». Далее в меню «Конфигурация» нажимаем «Поддержка» и выбираем «Настройка поддержки». В окне нажимаем кнопку «Включить возможность изменения» и устанавливаем переключатели как на картинке. Нажимаем «Ок».
Теперь создадим простую обработку.
Находим в левой таблице объектов объект «Обработки», нажимаем на ней правой кнопкой мыши и выбираем «Добавить». Далее потребуется заполнить Имя обработки, указать, в какой подсистеме 1С хотите вызвать обработку, и добавить новую форму в разделе «Формы».
После создания формы появится окно как представлено ниже.
Теперь создадим команду формы «Загрузить» нажав на плюс в верхнем правом окне. Обязательно укажите свойство «Действие». Это будет название процедуры 1С.
Далее добавляем на форму кнопку «Загрузить», нажав на плюс в левом верхнем окне. Обязательно укажите свойство «ИмяКоманды». Здесь укажем название команды, которую создали на предыдущем шаге «Загрузить». В результате на форме появится кнопка «Загрузить».
Далее напишем небольшой код.
Внизу окна нажимаем на закладку «Модуль». У нас здесь уже есть пустая процедура. Добавляем в нее код.
ДиалогВыбора = новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогВыбора.Заголовок = «Выберите файл»;
ДиалогВыбора.Фильтр = «Excel документ, .xls|.xls»;
Если ДиалогВыбора.Выбрать() Тогда
В результате получится так как на рисунке ниже.
И в конце остается проверить в пользовательском режиме. Для этого нажимаем «Начать отладку» или F5. Конфигуратор спросит обновить ли конфигурацию базы данных. Отвечаем «Да» и у нас открывается 1С (режим пользователя). Далее находим подсистему, куда добавили обработку (в нашем случае это «Маркетинг») и проверяем.
На простейшем примере было показано как написать код, прикрепить его на форму и вызвать в пользовательском режиме 1С.
Выбор файла и загрузка его на сервер в асинхронном режиме
Введение
С появлением управляемого приложения и веб-клиента некоторые задачи, которые решались в обычном приложением за несколько строчек, существенно усложнились. Казалось бы такая простая и часто используемая операция, как интерактивный выбор файла, которая в обычном приложении решалась в одном методе, теперь требует создания цепочки из нескольких процедур, которые вызываются одна за другой через ОписаниеОповещения. Вот как это было с использованием модальных вызовов:
Но как эту задачу решить на веб-клиенте? В поисковике не удалось найти готового универсального решения. Поискал в типовых, но там все разбросано по модулям и как-то запутано. Посмотрел пример в консоли СКД с диска ИТС для управляемых форм. Там тоже надо вычленять по кусочкам все шаги. Кроме того там применяется одна фича, которая позволяет открывать диалог выбора файла без установленного расширения работы с файлами. Но в общем случае эта хитрость не подойдет, так как она работает только для существующих файлов, насколько я понял. Поэтому написал процедуры, которые можно просто скопировать и использовать в будущем, не тратя время на то, чтобы вспоминать, как это работает.
Диалог выбора файла
Сразу приведу код, который получился после упрощения.
Я специально привел ранее вариант для обычных форм, чтобы проще было сравнивать. Код разбился на две примитивные процедуры и практически не изменился за счет метода ВыполнитьСценарийВыбораФайла(). Этот метод скрывает все рутинные асинхронные действия:
— подключает расширение по работе с файлами
— если расширение не подключено, то задает пользователю вопрос по его подключению
— начинает установку расширения, если пользователь подтвердит это действие
— открывает диалог выбора файла
— передает результаты выбора файла назад в прикладную процедуру КаталогНачалоВыбораЗавершение()
Далее приведу код этой служебной процедуры, написанной по принципу, из этой статьи.
Загрузка файлов с клиента на сервер
Постановка задачи: пусть требуется метод, который умеет помещать на сервер выбранный на клиенте файл. Если выбранный файл является каталогом, то необходимо поместить на сервер все файлы, содержащиеся в этом каталоге (подчиненные каталоги игнорировать).
Последовательность асинхронных действий:
— определить является ли файл каталогом
— если не является, то добавить его в массив помещаемых файлов
— если является, то найти все файлы этого каталога
— каждый из найденных файлов проверить является ли он каталогом. Если не является то добавить в массив помещаемых файлов (каждая итерация цикла обхода файлов является асинхронной, потому что вместо синхронного Файл.ЭтоФайл() необходимо использовать его аналог Файл.НачатьПроверкуЭтоФайл())
— поместить файлы на сервер
— вернуть результат помещения в прикладную процедуру, которая будет выполнять обработку файлов по какому-то алгоритму
Данная задача снова решается за три простых шага
Все детали скрыты в процедуре ВыполнитьСценарийЗагрузкиФайлаНаСервер(), которая подходит как для файлов, так и для каталогов. При необходимости ее можно доработать, чтобы она покрывала больше случаев.
Файл для скачивания
К публикации прилагается пример, который можно использовать как шаблон для описанных операций. В нем реализованы несколько наиболее востребованных случаев: выбор существующего файла, выбор имени файла для сохранения, выбор каталога и множественный выбор. Для полноты картины приведены аналогичные операции для обычных форм. Тестировались процедуры на платфроме 8.3, на конфигурацях начиная с режима совместимости 8.2.13