Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 сен 2024, 06:24

Сохранить файл изображения

Автор vvs_1979, 13 сен 2023, 19:19

0 Пользователей и 1 гость просматривают эту тему.

vvs_1979

Розница 3.
В справочнике Номенклатура  есть ссылка на справочник НоменклатураПрисоединенныеФайлы. В котором, в свою очередь, есть поле ФайлХранилище (список). Но подскажете, как програмно сохранить файл из этого списка на диск ?
Читал все советы по такой задаче, ничего не помогло.
(или расскажите где почитать про такое).

antoneus

В рознице данные файлов хранятся в регистре сведений ДвоичныеДанныеФайлов. То есть,

&НаСервере
Функция ДанныеФайла(Ссылка)
    Менеджер = РегистрыСведений.ДвоичныеДанныеФайлов.СоздатьМенеджерЗаписи();
    Менеджер.Файл = Ссылка;
    Менеджер.Прочитать();
    Возврат Новый Структура("Данные, Расширение", Менеджер.ДвоичныеДанныеФайла.Получить(), Ссылка.Расширение);
КонецФункции

где-то на клиенте

//Ссылка - ссылка на элемент справочника НоменклатураПрисоединенныеФайлы
стрДанные = ДанныеФайла(Ссылка);
стрДанные.Данные.Записать(ИмяФайлаБезРасширения + стрДанные.Расширение)

vvs_1979

А как мне эту ссылку получать ? Что-то я почитал про ссылки и всё так размыто было. Это что, запись  в таблице ?
(Пардон, что всё в одном вопросе. Только учусь.)

antoneus

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

vvs_1979

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

antoneus

Вот, куда-то движемся. Но все равно пока непонятно - делать это надо из формы накладной или из внешней обработки, где выбирается РН в поле на форме, т.к. код будет разный в первом и втором случае. We need to go deeper.

vvs_1979

Добавил кнопку на новую/редактирование приходной  накладно, в событие на нажатие Описал цикл по строчкам накладной.
Теперь мне надо сделать, то что я описывал.
Пытался сделать сам, не получилось. Потому и задаю вопрос.
&НаСервере
Функция Расш1_Найти(Имя_Т)   

Запрос = Новый Запрос;   
Q="ВЫБРАТЬ
| НоменклатураПрисоединенныеФайлы.Ссылка КАК Ссылка,
| НоменклатураПрисоединенныеФайлы.ПутьКФайлу КАК ПутьКФайлу,
| НоменклатураПрисоединенныеФайлы.ТипХраненияФайла КАК ТипХраненияФайла,
| НоменклатураПрисоединенныеФайлы.Том КАК Том,
| НоменклатураПрисоединенныеФайлы.ФайлХранилище КАК ФайлХранилище
|ИЗ
| Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
|ГДЕ
| НоменклатураПрисоединенныеФайлы.ВладелецФайла.Ссылка = &ном" ;
Запрос.Текст = Q;
Запрос.УстановитьПараметр("ном", Имя_Т);
файлы=Запрос.Выполнить().Выбрать();
n=0;
Пока файлы.Следующий() Цикл
Выборка = Справочники.НоменклатураПрисоединенныеФайлы.Выбрать();     

Пока Выборка.Следующий() Цикл
ВладелецФайла = Выборка.ВладелецФайла ;   
Если ВладелецФайла=Имя_Т ТОГДА     
// ФХ=Выборка.ФайлХранилище.Получить(); Вот из этого хранилища хотел сохранять, а ошибка
Сообщить(" найдено");     
КонецЕсли;
КонецЦикла;
n=n+1;
конеццикла;
КонецФункции

&НаКлиенте
Процедура Расш1_всТоварыОчиститьПосле(Команда)       

Для каждого СтрокаТовар Из Объект.Запасы Цикл
N=СтрокаТовар.Номенклатура;
А="Название: "+СтрокаТовар.Номенклатура+" Цена: "+СтрокаТовар.Цена+" Количество: "+СтрокаТовар.Количество;

B=Расш1_Найти(СтрокаТовар.Номенклатура);   
КонецЦикла;

КонецПроцедуры


antoneus

ну с минимальными изменениями будет так

&НаСервере
Функция Расш1_Найти(Имя_Т)   

    Запрос = Новый Запрос;   
    Q="ВЫБРАТЬ
| ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла КАК ДвоичныеДанныеФайла
|ИЗ
| РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов
|ГДЕ
| ДвоичныеДанныеФайлов.Файл.ВладелецФайла = &Ном"    ;
     Запрос.Текст = Q;
     Запрос.УстановитьПараметр("ном", Имя_Т);                   
     файлы=Запрос.Выполнить().Выбрать();   
     Пока файлы.Следующий() Цикл       
         ФХ=Выборка.ДвоичныеДанныеФайла.Получить();//ФХ - это и есть данные файла, делаем с ними че хотим
     конеццикла;
КонецФункции

&НаКлиенте
Процедура Расш1_всТоварыОчиститьПосле(Команда)       

    Для каждого СтрокаТовар Из Объект.Запасы Цикл
        N=СтрокаТовар.Номенклатура;
        А="Название: "+СтрокаТовар.Номенклатура+" Цена: "+СтрокаТовар.Цена+" Количество: "+СтрокаТовар.Количество;
   
        B=Расш1_Найти(СтрокаТовар.Номенклатура);   
    КонецЦикла;

КонецПроцедуры

vvs_1979


vvs_1979

Если даже в sql консоли 1с запускаешь
ВЫБРАТЬ
ДвоичныеДанныеФайлов.ДвоичныеДанныеФайла КАК ДвоичныеДанныеФайла
ИЗ
    РегистрСведений.ДвоичныеДанныеФайлов КАК ДвоичныеДанныеФайлов
ГДЕ
    ДвоичныеДанныеФайлов.Файл.ВладелецФайла = "Пиво";

Даёт ошибку: Недопустимый тип реквизита: ДвоичныеДанныеФайла.
Соответственно и в процедуре не работает запрос.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск