Введение
Всем привет! Идея написания очередной статьи - это как возникшая необходимость решения одной небольшой задачки - написать обмен-перенос бинарных данных из одной старой конфигурации в другую современную типовую. Чтобы сократить время разработки, я решил использовать стандартный функционал работы с файлами подсистемы "Работа с файлами" - Библиотеки стандартных подсистем (БСП). Поэтому, возникло желание рассмотреть основные возможности БСП в плане работы с файлами здесь на портале.
Для разработки примеров будем использовать платформу 1С:Предприятия 8.3.21.1484 и новую "тестовую" БСП - 3.1.8.45. Отмечу, что данная версия библиотеки стандартных подсистем является версией для ознакомления (на момент написания статьи - начало сентября 2022 г). Хотя, подсистема работы с файлами существует давно.
В статье приведены примеры - функционал основных процедур и функций данной подсистемы (особенно углубляться я не буду). Статья будет полезна для разработчиков, администраторов и любых пользователей программы 1с, желающих получить информацию о "встроенных" возможностях типовых конфигураций, в основе которых лежит БСП.
Отмечу, что тема достаточно заезженная и, я бы сказал, что простая, но я попробую подытожить и создать очередную "выжимку" полезного функционала в данном материале:
Самые "ходовые" и "типовые" возможности подсистемы работы с файлами - ДобавитьФайл(), ДобавитьФайлы() и ДобавитьФайлСДиска()
Один из самых частых вопросов - как правильно добавить файл в конфигурацию в справочник присоединенные файлы. Делается это вот таким кодом - процедура ДобавитьФайл():
// работаем стандартным методом через ОписаниеОповещения
&НаКлиенте
Процедура ДобавитьФайл(Команда)
ОбработчикРезультата = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
ПараметрыДобавления = Новый Структура("МаксимальныйРазмер,ФильтрДиалогаВыбора,НеОткрыватьКарточку");
ПараметрыДобавления.МаксимальныйРазмер = 0; // без учета размера
ПараметрыДобавления.ФильтрДиалогаВыбора = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
ПараметрыДобавления.НеОткрыватьКарточку = Истина;
РежимСоздания = 2;
РаботаСФайламиКлиент.ДобавитьФайл(ОбработчикРезультата,ЭтаФорма.Номенклатура,ЭтотОбъект.ЭтаФорма,РежимСоздания,ПараметрыДобавления);
КонецПроцедуры
&НаСервере
Процедура ПослеВыбораФайла(Результат, ДополнительныеПараметры) Экспорт
//Результат
//* ТекстОшибки - строка
//* ФайлДобавлен - булево
//* ФайлСсылка - присоединенныефайлы
КонецПроцедуры
Выполнение данного примера - приводит к таком результату:
Рис.1 Результат правильного добавления файла (прикрепления) через диалог пользователя "ДобавитьФайл".
Далее, добавим несколько файлов сразу вот таким кодом:
&НаКлиенте
Процедура ДобавитьФайлы(Команда)
ОбработчикРезультата = Новый ОписаниеОповещения("ПослеВыбораФайлов", ЭтотОбъект);
Фильтр = "Картинки (*.jpg;*.jpeg)|*.jpg;*.jpeg";
РаботаСФайламиКлиент.ДобавитьФайлы(ЭтаФорма.Номенклатура, ЭтаФорма.УникальныйИдентификатор, Фильтр, ,ОбработчикРезультата)
КонецПроцедуры
&НаСервере
Процедура ПослеВыбораФайлов(Результат, ДополнительныеПараметры) Экспорт
//Результат - Массив - ссылки на добавленные файлы. Если файлы не были добавлены, пустой массив
КонецПроцедуры
В форме выбора нужно отметить несколько файлов:
Рис.2 Массовый выбор файлов для загрузки в конфигурацию
Данные методы автоматически правильно по-типовому добавляют выбранные файлы в "субсправочник" присоединенных файлов. В примерах приведен справочник "Номенклатуры".
Если я хочу автоматом загружать файлы (например по расписанию и определенного места) - такая возможность загрузки файла без "диалога выбора", делается вот этим кодом - функцией ДобавитьФайлСДиска():
// прикрепить файл без диалога выбора
&НаКлиенте
Процедура ДобавитьФайлБезДиалога(Команда)
ДобавитьФайлБезДиалогаПоПути();
КонецПроцедуры
&НаСервере
Процедура ДобавитьФайлБезДиалогаПоПути()
// Если передаете файл с клиента на сервер - используйте хранилище
АА = РаботаСФайлами.ДобавитьФайлСДиска(ЭтаФорма.Номенклатура,"c:\Bases2022\Sep2022\pack.xml");
Сообщить(АА); // ссылка на файл
КонецПроцедуры
Достаточно знать эти три метода, чтобы сохранить выбранные файлы (любого) формата в конфигурации. Далее, перейдем к разделу получения базовой информации о загруженных файлах.
Функции получения данных файлов - ДвочныеДанныеФайла() и ДанныеФайла()
После того, как мы добавили файлы в конфигурацию, можем получить информацию о них. Для этого воспользуемся встроенными функциями подсистемы ДвочныеДанныеФайла() и ДанныеФайла(). Пример кода представлен ниже:
ДанныеФайлаДв = РаботаСФайлами.ДвоичныеДанныеФайла(ЭтаФорма.ПрисоединенныеФайлыНоменклатура, Ложь);
ДанныеФайлаДв.Записать("c:\Bases2022\Sep2022\1.jpeg");
Здесь, получаем двоичные данные файла и сохраняем их на диск методом "Записать" в качестве файла - получается картинка. Можно и не сохранять на диск - а добавить в любой реквизит.
Функция этой подсистемы - ДанныеФайла() возвращает мне вот такую структуру описания прикрепленного файла в базе:
Рис.3 Структура возврата описания прикрепленного файла. Данная структура позволяет получить достаточную информацию о загруженном файле.
Код примера использования ДанныеФайла() вот такой:
&НаСервере
Процедура ПолучитьДанныеСервером()
//Конструктор параметров файла
ПараметрыДанныхФайла = РаботаСФайламиКлиентСервер.ПараметрыДанныхФайла();
СтруктураВозврата = РаботаСФайлами.ДанныеФайла(ЭтаФорма.ПрисоединенныеФайлыНоменклатура, ПараметрыДанныхФайла);
КонецПроцедуры
Где, "ПараметрыДанныхФайлов()" - это типовой конструктор параметров данных файла из БСП:
Функция ПараметрыДанныхФайла() Экспорт
ПараметрыДанных = Новый Структура;
ПараметрыДанных.Вставить("ДляРедактирования", Ложь);
ПараметрыДанных.Вставить("ИдентификаторФормы", Неопределено);
ПараметрыДанных.Вставить("ВызыватьИсключение", Истина);
ПараметрыДанных.Вставить("ПолучатьСсылкуНаДвоичныеДанные", Истина);
Возврат ПараметрыДанных;
КонецФункции
Этих двух базовых функций будет достаточно, чтобы получить информацию о загруженном файле. Далее, рассмотрим базовый функционал открытия файлов.
Базовый функционал - "Открытие файлов" и "Сохранить как".
Рассмотрим также подобный базовый функционал - как "открытие" и "сохранение файла". Для этого я воспользуюсь типовой процедурой для клиента открытия файла. Код открытия вот такой:
&НаКлиенте
Процедура ОткрытьФайл1(Команда)
ДанныеФайла = ПолучимДанныеФайла();
РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, Истина);
КонецПроцедуры
&НаСервере
Функция ПолучимДанныеФайла()
ПараметрыДанныхФайла = РаботаСФайламиКлиентСервер.ПараметрыДанныхФайла();
Возврат РаботаСФайлами.ДанныеФайла(ЭтаФорма.ПрисоединенныеФайлыНоменклатура,ПараметрыДанныхФайла);
КонецФункции
Результат выполнения данного кода будет вот такой (здесь я открываю загруженный текстовый файл readme.txt в форме для редактирования) - могу сохранить изменения (здесь я намекаю на использование внешних шаблонов документов).
Рис.4. Результат использования процедуры "ОткрытьФайл" на клиенте. Открыт текстовый файл. Картинка будет открыта в соответствующем приложении клиента.
Также приведу небольшой код функционала "Сохранить как" выглядит вот так:
Процедура СохранитьФайл()
ОбработчикСохранения = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
ПараметрыДанныхФайла = РаботаСФайламиКлиентСервер.ПараметрыДанныхФайла();
РаботаСФайлами.СохранитьФайлКак(ПараметрыДанныхФайла, ОбработчикСохранения);
КонецПроцедуры
&НаСервере
Процедура ПослеСохраненияФайла(ПутьКФайлу, ДополнительныеПараметры) Экспорт
// ПутьКФайлу - строка
КонецПроцедуры
Здесь присутствует типовой обработчик оповещения - после сохранения файла входящим параметром - строка "Путь к файлу". На мой взгляд, вообще использование "обработчиков событий после" - просто гениальная идея в платформе. Но, и значительно усложняет разработку - этот функционал не для новичков.
Итак, я привел несколько "пару-тройку" рабочих примеров использования возможностей типовой подсистемы "Работа с файлами" библиотеки стандартных подсистем. Среди них:
- Добавление файлов в базу (в режиме диалога или без него);
- Получение информации о файле или о файлах из базы (бинарные данные или данные файла);
- Получение (открытие) самого файла, сохраненного в базе;
- Сохранение файла на диск, используя "Сохранить как";
Уверен, что на первом этапе разработки под БСП - вам этого хватит. Примеры в статье все рабочие. У кого есть желание получить код примеров (одна обработка) - может написать мне в личный профиль этого ресурса. Переходим к заключению и сделаем выводы.
Заключение и выводы
Как я написал ранее, этот материал затрагивает основной базовый типовой функционал конфигураций, на этот раз, - подсистемы "Работы с файлами". Приведены простые практические примеры использования основных функций и процедур данной подсистемы - добавление файлов, открытие файлов и получение информации о файле. В 90% случаев необходимо использовать именно эти методы для потребностей решения задачи. Статья дает понимание как сделать это "по стандарту", не изобретая очередной велосипед. Еще раз повторю фразу - взял и используй в любой конфигурации, в основе которой лежит БСП.
Уверен, что этот материал будет вам интересен и полезен на практике - новичкам для "поднятия уровня программирования", продвинутым - как "шпаргалка" - всего в голове не уместить, к сожалению.
Изучение использования описываемое подсистемы "работы с файлами" оставляю на вашу фантазию и усмотрение. Отмечу, что я затронул, наверное, процентов 5 или 7 от ее возможностей.
Также, обратите ваше внимание на мои статьи по применению на практике готового функционала библиотеки стандартных подсистем.
Одни из наиболее актуальных из них:
Оценка производительности с помощью БСП
Печать макета MS Word в любом документе с помощью БСП
Базовые принципы работы с регламентными заданиями подсистем БСП
Ну и в заключении статьи напишу:
Для тех, кого интересуют мои статьи по стандартам программирования, а также мои разработки (платные и бесплатные), - всегда вы можете связаться со мой через личку этого профиля, а так же мой телеграмм-канал. Любая поддержка будет приветствоваться и повлечет более интересные и сложные, а главное - необходимые материалы для вашей профессиональной деятельности на портале. Готов к любому взаимовыгодному профессиональному сотрудничеству.