Работа с Дбф в клиент серверном варианте, как через временное хранилище передать с сервера заполненную dbf?

1. zoeh 31 02.10.19 09:59 Сейчас в теме
&НаСервере
Функция Команда2НаСервере()
НашеИмяФайла= "PriceP.dbf";
НашПолныйПутьФайла = КаталогВременныхФайлов()+НашеИмяФайла;
БД.СоздатьФайл(НашПолныйПутьФайла);

Цикл
БД.Добавить()
**заполняю
БД.Записать();
КонецЦикла
БД.Записать();
	БД.ЗакрытьФайл();

АдресВХ = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(НашПолныйПутьФайла));
Возврат АдресВХ;
КонецФункции

&НаКлиенте
Процедура ПоКнВыгрузитьПрайс(Команда)
ФайлПриемник = ПолучитьИмяВременногоФайла("dbf"); //х.з. в инете нашел
Адрес = Команда2НаСервере();

ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);
ДанныеХранилища.Записать(ИмяФайла);
Показать


{ВнешняяОбработка.ВыгрузкаВDBF.Форма.Форма.Форма(396)}: Ошибка при вызове конструктора (ДвоичныеДанные)
АдресВХ = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(НашПолныйПутьФайла));
по причине:
Файл не обнаружен '/tmp/PriceP.dbf'
Найденные решения
43. zoeh 31 03.10.19 05:01 Сейчас в теме
В общем как я сделал чтоб сэкономить время, завел ТЗ с колонками соответствующими в ДБФ

БДТ = Новый ТаблицаЗначений;
	Табл.БДТ.Добавить("CODEPST");
	Табл.БДТ.Добавить("NAME");
	Табл.БДТ.Добавить("CNTR");
	Табл.БДТ.Добавить("GDATE");
	Пока Выборка.Следующий() Цикл

		БД = БДТ.Добавить();
		БД.CODEPST = СокрЛП(Выборка.Номенклатура.Код);
		Наим =  СокрЛП(Выборка.Номенклатура.НаименованиеПолное);
		Если ПустаяСтрока(Наим)=Истина Тогда
Показать


Сэкономил время, не пришлось переписывать процедуру заполения.
Далее на форме сделал такую же тз с такими же переменными(все неопределенного типа, чтоб не копаться)
после заполнения ТЗ на сервере делаю:

Объект.Реквизит1.Загрузить(БДТ);

и далее на клиенте создаю свою ДБФ из табл. все заработало.
continental; +1 Ответить
22. nomad_irk 76 02.10.19 18:55 Сейчас в теме
(20)если я не ошибаюсь, в линуксе же ж - отдельно права на запись и отдельно права на исполнение файла, нет?
Это так же как с FTP: если дать права на запись - это совсем не означает, что ты сможешь свой же файл прочитать :)
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. lefthander 02.10.19 10:14 Сейчас в теме
(1)
ФайлПриемник = ПолучитьИмяВременногоФайла("dbf"); //х.з. в инете нашел
Его наверно надо передать в Адрес = Команда2НаСервере()?
4. RocKeR_13 1366 02.10.19 10:50 Сейчас в теме
(1) а ЗакрытьФайл() делаете перед помещением во временное хранилище?
5. zoeh 31 02.10.19 11:13 Сейчас в теме
(4)
да делаю. У меня такое подозрение что права "задушены" на сервере. Похоже буду сейчас делать через ТЗ.
хотя при записи dbf ошибок не выдает.
тупо пишет dbf на своей волне где то в своем непонятном месте.
10. nomad_irk 76 02.10.19 18:24 Сейчас в теме
(1)на сервере 1с случаем темповая папка не чистится периодически? Судя по слэшам в пути - сервер 1с на линуксе? Если да, то темповая папка вообще чего-нить содержит? а то там по факту может оказаться symlink на /dev/nul :)
11. independ 1551 02.10.19 18:44 Сейчас в теме
(1) я бы сделал на клиенте массив структур, передал на сервер, и на сервере создал нужный DBF по массиву
17. nomad_irk 76 02.10.19 18:49 Сейчас в теме
(11)сериализовать файл быстрее, чем сериализовать "сырые данные" - это подтверждено мной лично в https://infostart.ru/public/1119024/
18. zoeh 31 02.10.19 18:49 Сейчас в теме
(11)
да с массивом видел варианты, но хочу разобраться почему не работает код со Временным хранилищем
3. zoeh 31 02.10.19 10:18 Сейчас в теме
ПолучитьИмяВременногоФайла("dbf")

возвращает длину более 8 символов, с ним dbf уже не может работать. поэтому я назначаю принудительно свое.

НашеИмяФайла= "PriceP.dbf";
	НашПолныйПутьФайла = КаталогВременныхФайлов()+НашеИмяФайла;
	ФайлНаДиске = Новый Файл(НашПолныйПутьФайла);
	Если ФайлНаДиске.Существует() Тогда
		УдалитьФайлы(НашПолныйПутьФайла);
	КонецЕсли;
6. VmvLer 02.10.19 11:23 Сейчас в теме
при чем тут хранилище в куче корявого кода?
имя файла на клиенте и на сервере это разные вещи

задайте путь как реквизит формы для доступа в любом контексте в виде
сетевого имени файла, например
\\fs\_.DBF
7. zoeh 31 02.10.19 11:50 Сейчас в теме
(6) зачем мне сетевая папка?
мне нужно чтоб обработка работала везде а не в каком то конкретном месте.
поэтому нужно либо через ТЗ либо через передачу временного файла.

ТЗ не передается.
временный файл не могу найти для передачи в хранилище
8. VmvLer 02.10.19 11:59 Сейчас в теме
(7) ошибка в коде очевидна и я ее осветил прожектором.
если вам нужно больше света, то ждите взрыва сверхновой поблизости.
9. zoeh 31 02.10.19 17:36 Сейчас в теме
А если без электриков и поклонников Хокинга?
Есть нормальные программные решения или советы помощи?
12. zoeh 31 02.10.19 18:45 Сейчас в теме
/tmp/v8_pRKno2_cc.tmp
/tmp/v8_pRKno2_64f.tmp
/tmp/v8_pRKno2_15.tmp
/tmp/v8lpRKno2
/tmp/v8_pRKno2_df2.tmp
13. nomad_irk 76 02.10.19 18:46 Сейчас в теме
(12)хорошо. после создания файла, он в темповой папке появляется?
16. zoeh 31 02.10.19 18:48 Сейчас в теме
(13) да мой файл в темпе есть. я проверил перебором.
НайденныеФайлы = НайтиФайлы(КаталогВременныхФайлов(), "*");

Для каждого Файл из НайденныеФайлы Цикл
Если Файл.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;

ИмяФайла = Файл.ПолноеИмя;

Сообщить(ИмяФайла);
КонецЦикла;
14. zoeh 31 02.10.19 18:47 Сейчас в теме
кстати
ниже были еще файлы, и даже мой
/tmp/Price.DBF
15. zoeh 31 02.10.19 18:47 Сейчас в теме
но вот этот код не работает
ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВремФайл), ЭтаФорма.УникальныйИдентификатор)
19. nomad_irk 76 02.10.19 18:51 Сейчас в теме
(15) эээ.....а права у пользователя, под которым работает демон 1С, имеет права на чтение содержимого темповой папки? права на запуск из темповой папки?
20. zoeh 31 02.10.19 18:53 Сейчас в теме
(19) с правами все очень непонятно, но при записи дбф, ругани нет.
если указываешь папку где конкретно нет прав, то создание дбф выводится с ошибкой.
осмелюсь предположить что создание дбф проходит как надо.
22. nomad_irk 76 02.10.19 18:55 Сейчас в теме
(20)если я не ошибаюсь, в линуксе же ж - отдельно права на запись и отдельно права на исполнение файла, нет?
Это так же как с FTP: если дать права на запись - это совсем не означает, что ты сможешь свой же файл прочитать :)
23. zoeh 31 02.10.19 18:57 Сейчас в теме
Хотелось чтоб бы чик мык пык жик, пару строк кода и модуль, который работал на файловой версии взлетел на клиенте.
(22) сейчас я попробую прочитать обратно записанный dbf ради интереса
24. nomad_irk 76 02.10.19 18:58 Сейчас в теме
(23)вы правильно все делаете, проблемы именно с доступом к файлу - с этим просто нужно разобраться один раз и навсегда.
25. zoeh 31 02.10.19 19:01 Сейчас в теме
(24) ха и точно! я не могу его прочитать!
28. nomad_irk 76 02.10.19 19:03 Сейчас в теме
(25)Sudo chmod 777 /tmp или меня поправят более сильные линуксойды :)
21. zoeh 31 02.10.19 18:55 Сейчас в теме
т.е. оптимальный и самый быстрый для меня вариант не мучить Временную папку а перейти на массив?
26. zoeh 31 02.10.19 19:03 Сейчас в теме
{ВнешняяОбработка.ВыгрузкаВDBF.Форма.Форма.Форма(340)}: Ошибка при вызове метода контекста (Первая)
БДФ.Первая(); // перешли к первой записи
по причине:
Перед выполнением операции нужно открыть базу
29. nomad_irk 76 02.10.19 19:04 Сейчас в теме
(26)ээээ....а БДФ.Открыть(ИмяФайла) сделано?
27. zoeh 31 02.10.19 19:03 Сейчас в теме
Админы жулики, из за них день под хвост!
30. zoeh 31 02.10.19 19:05 Сейчас в теме
БД.ЗакрытьФайл();
	
	БДФ= Новый XBase;
	БДФ.ОткрытьФайл(ВремФайл,,Истина);
	БДФ.Первая(); // перешли к первой записи
	Пока Не БДФ.ВКонце() Цикл
		Сообщить(БДФ.NAME);
		БДФ.Следующая();
	КонецЦикла;
Показать
31. nomad_irk 76 02.10.19 19:05 Сейчас в теме
(30)Да, все верно. Прочитать не может....вернее, думает, что файл не открыт.
32. zoeh 31 02.10.19 19:06 Сейчас в теме
БД.АвтоСохранение=Истина;
	БД.СоздатьФайл(ВремФайл);
	БД.ОчиститьФайл();
33. zoeh 31 02.10.19 19:06 Сейчас в теме
ну и в конце само собой БД.ЗакрытьФайл()
34. zoeh 31 02.10.19 19:06 Сейчас в теме
Ладно понял спасибо, пошел штудировать просторы массивов
36. nomad_irk 76 02.10.19 19:07 Сейчас в теме
(34)Админов лучше попросите сделать доступ - так вернее будет, а массивы - это костыль.
37. zoeh 31 02.10.19 19:08 Сейчас в теме
(36) Боюсь что в будущем проблема возникнет вновь у другого пользователя.
35. zoeh 31 02.10.19 19:07 Сейчас в теме
Ведь можно сделать проще и строку выборки передавать через форму?
38. nomad_irk 76 02.10.19 19:09 Сейчас в теме
ээээ.....на форме сделайте реквизит с типом "ТаблицаЗначений", напихайте в нее нужные колонки и загружайте сразу весь результат запроса.
Если задача именно сделать DBF, то на клиенте его, однако, не создать от слова совсем.
Т.е. у вас выбора нет, кроме как просить админов настроить правильно доступ.
39. zoeh 31 02.10.19 19:13 Сейчас в теме
(38) вот примерно это я сегодня и видел. только по моему туда всю выборку помещали.
40. nomad_irk 76 02.10.19 19:14 Сейчас в теме
(39)Не, выборку - не получится, нужна именно ТЗ, т.е.
ТаблицаЗначенийНаФорме.Загрузить(Запрос.Выполнить().Выгрузить())
41. zoeh 31 02.10.19 19:26 Сейчас в теме
В любом случае спасибо за дельные советы!
42. zoeh 31 02.10.19 19:26 Сейчас в теме
43. zoeh 31 03.10.19 05:01 Сейчас в теме
В общем как я сделал чтоб сэкономить время, завел ТЗ с колонками соответствующими в ДБФ

БДТ = Новый ТаблицаЗначений;
	Табл.БДТ.Добавить("CODEPST");
	Табл.БДТ.Добавить("NAME");
	Табл.БДТ.Добавить("CNTR");
	Табл.БДТ.Добавить("GDATE");
	Пока Выборка.Следующий() Цикл

		БД = БДТ.Добавить();
		БД.CODEPST = СокрЛП(Выборка.Номенклатура.Код);
		Наим =  СокрЛП(Выборка.Номенклатура.НаименованиеПолное);
		Если ПустаяСтрока(Наим)=Истина Тогда
Показать


Сэкономил время, не пришлось переписывать процедуру заполения.
Далее на форме сделал такую же тз с такими же переменными(все неопределенного типа, чтоб не копаться)
после заполнения ТЗ на сервере делаю:

Объект.Реквизит1.Загрузить(БДТ);

и далее на клиенте создаю свою ДБФ из табл. все заработало.
continental; +1 Ответить
44. continental 02.11.21 14:49 Сейчас в теме
(1) Может кому пригодиться:
Переделывал обработку .dbf под sql, взял за пример ОбменДаннымиXML.epf (там есть возможность выбора работы на клиенте/сервере, с правами к временным файлам у меня было всё нормально)

&НаСервере 
Функция СформироватьDBF(

Таблица = Новый XBase;
Таблица.Кодировка = КодировкаXBase.OEM;
Таблица.Поля.Добавить("DocNumber","S",100,);

//*****
ПутьКНовомуDBF  = КаталогВременныхФайлов()+Лев(Новый УникальныйИдентификатор(),4)+".dbf";  
Объект.ИмяФайлаОбмена = ПутьКНовомуDBF; 	
Таблица.СоздатьФайл(ПутьКНовомуDBF,);
//**********
Таблица.ЗакрытьФайл();	

АдресФайлаДанных = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(Объект.ИмяФайлаОбмена), УникальныйИдентификатор);
УдалитьФайлы(Объект.ИмяФайлаОбмена); 	

Возврат АдресФайлаДанных;
КонецФункции

&НаКлиенте
Процедура СохранитьФайл(ИмяСохраняемогоФайла,АдресФайлаДанных)	
	ПолучитьФайл(АдресФайлаДанных, ИмяСохраняемогоФайла);
КонецПроцедуры
Показать
45. triera2000 8 21.06.24 00:00 Сейчас в теме
Добрый день.
Имя DBF файла и его расширение должны быть заглавными в линуксе. Тогда проблем с поиском в каталоге временных файлов не возникает.
В виндоус работает в любом регистре.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот