Введение
Всем привет! Идея написания очередной статьи - это как возникшая необходимость решения одной небольшой задачки - написать обмен-перенос бинарных данных из одной старой конфигурации в другую современную типовую. Чтобы сократить время разработки, я решил использовать стандартный функционал работы с файлами подсистемы "Работа с файлами" - Библиотеки стандартных подсистем (БСП). Поэтому, возникло желание рассмотреть основные возможности БСП в плане работы с файлами здесь на портале.
Для разработки примеров будем использовать платформу 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 в любом документе с помощью БСП
Базовые принципы работы с регламентными заданиями подсистем БСП
Ну и в заключении статьи напишу:
Для тех, кого интересуют мои статьи по стандартам программирования, а также мои разработки (платные и бесплатные), - всегда вы можете связаться со мой через личку этого профиля, а так же мой телеграмм-канал. Любая поддержка будет приветствоваться и повлечет более интересные и сложные, а главное - необходимые материалы для вашей профессиональной деятельности на портале. Готов к любому взаимовыгодному профессиональному сотрудничеству.
Вступайте в нашу телеграмм-группу Инфостарт
 
                                     
                                     
                                     
                                    