Работа с Дбф в клиент серверном варианте, как через временное хранилище передать с сервера заполненную dbf?
&НаСервере
Функция Команда2НаСервере()
НашеИмяФайла= "PriceP.dbf";
НашПолныйПутьФайла = КаталогВременныхФайлов()+НашеИмяФайла;
БД.СоздатьФайл(НашПолныйПутьФайла);
Цикл
БД.Добавить()
**заполняю
БД.Записать();
КонецЦикла
БД.Записать();
БД.ЗакрытьФайл();
АдресВХ = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(НашПолныйПутьФайла));
Возврат АдресВХ;
КонецФункции
&НаКлиенте
Процедура ПоКнВыгрузитьПрайс(Команда)
ФайлПриемник = ПолучитьИмяВременногоФайла("dbf"); //х.з. в инете нашел
Адрес = Команда2НаСервере();
ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);
ДанныеХранилища.Записать(ИмяФайла); Показать{ВнешняяОбработка.ВыгрузкаВDBF.Форма.Форма.Форма(396)}: Ошибка при вызове конструктора (ДвоичныеДанные)
АдресВХ = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(НашПолныйПутьФайла));
по причине:
Файл не обнаружен '/tmp/PriceP.dbf'
Найденные решения
В общем как я сделал чтоб сэкономить время, завел ТЗ с колонками соответствующими в ДБФ
Сэкономил время, не пришлось переписывать процедуру заполения.
Далее на форме сделал такую же тз с такими же переменными(все неопределенного типа, чтоб не копаться)
после заполнения ТЗ на сервере делаю:
и далее на клиенте создаю свою ДБФ из табл. все заработало.
БДТ = Новый ТаблицаЗначений;
Табл.БДТ.Добавить("CODEPST");
Табл.БДТ.Добавить("NAME");
Табл.БДТ.Добавить("CNTR");
Табл.БДТ.Добавить("GDATE");
Пока Выборка.Следующий() Цикл
БД = БДТ.Добавить();
БД.CODEPST = СокрЛП(Выборка.Номенклатура.Код);
Наим = СокрЛП(Выборка.Номенклатура.НаименованиеПолное);
Если ПустаяСтрока(Наим)=Истина Тогда ПоказатьСэкономил время, не пришлось переписывать процедуру заполения.
Далее на форме сделал такую же тз с такими же переменными(все неопределенного типа, чтоб не копаться)
после заполнения ТЗ на сервере делаю:
Объект.Реквизит1.Загрузить(БДТ);
и далее на клиенте создаю свою ДБФ из табл. все заработало.
(20)если я не ошибаюсь, в линуксе же ж - отдельно права на запись и отдельно права на исполнение файла, нет?
Это так же как с FTP: если дать права на запись - это совсем не означает, что ты сможешь свой же файл прочитать :)
Это так же как с FTP: если дать права на запись - это совсем не означает, что ты сможешь свой же файл прочитать :)
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)на сервере 1с случаем темповая папка не чистится периодически? Судя по слэшам в пути - сервер 1с на линуксе? Если да, то темповая папка вообще чего-нить содержит? а то там по факту может оказаться symlink на /dev/nul :)
ПолучитьИмяВременногоФайла("dbf")возвращает длину более 8 символов, с ним dbf уже не может работать. поэтому я назначаю принудительно свое.
НашеИмяФайла= "PriceP.dbf";
НашПолныйПутьФайла = КаталогВременныхФайлов()+НашеИмяФайла;
ФайлНаДиске = Новый Файл(НашПолныйПутьФайла);
Если ФайлНаДиске.Существует() Тогда
УдалитьФайлы(НашПолныйПутьФайла);
КонецЕсли;
при чем тут хранилище в куче корявого кода?
имя файла на клиенте и на сервере это разные вещи
задайте путь как реквизит формы для доступа в любом контексте в виде
сетевого имени файла, например
\\fs\_.DBF
имя файла на клиенте и на сервере это разные вещи
задайте путь как реквизит формы для доступа в любом контексте в виде
сетевого имени файла, например
\\fs\_.DBF
(6) зачем мне сетевая папка?
мне нужно чтоб обработка работала везде а не в каком то конкретном месте.
поэтому нужно либо через ТЗ либо через передачу временного файла.
ТЗ не передается.
временный файл не могу найти для передачи в хранилище
мне нужно чтоб обработка работала везде а не в каком то конкретном месте.
поэтому нужно либо через ТЗ либо через передачу временного файла.
ТЗ не передается.
временный файл не могу найти для передачи в хранилище
/tmp/v8_pRKno2_cc.tmp
/tmp/v8_pRKno2_64f.tmp
/tmp/v8_pRKno2_15.tmp
/tmp/v8lpRKno2
/tmp/v8_pRKno2_df2.tmp
/tmp/v8_pRKno2_64f.tmp
/tmp/v8_pRKno2_15.tmp
/tmp/v8lpRKno2
/tmp/v8_pRKno2_df2.tmp
(13) да мой файл в темпе есть. я проверил перебором.
НайденныеФайлы = НайтиФайлы(КаталогВременныхФайлов(), "*");
Для каждого Файл из НайденныеФайлы Цикл
Если Файл.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
ИмяФайла = Файл.ПолноеИмя;
Сообщить(ИмяФайла);
КонецЦикла;
НайденныеФайлы = НайтиФайлы(КаталогВременныхФайлов(), "*");
Для каждого Файл из НайденныеФайлы Цикл
Если Файл.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
ИмяФайла = Файл.ПолноеИмя;
Сообщить(ИмяФайла);
КонецЦикла;
но вот этот код не работает
ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВремФайл), ЭтаФорма.УникальныйИдентификатор)
ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВремФайл), ЭтаФорма.УникальныйИдентификатор)
(20)если я не ошибаюсь, в линуксе же ж - отдельно права на запись и отдельно права на исполнение файла, нет?
Это так же как с FTP: если дать права на запись - это совсем не означает, что ты сможешь свой же файл прочитать :)
Это так же как с FTP: если дать права на запись - это совсем не означает, что ты сможешь свой же файл прочитать :)
{ВнешняяОбработка.ВыгрузкаВDBF.Форма.Форма.Форма(340)}: Ошибка при вызове метода контекста (Первая)
БДФ.Первая(); // перешли к первой записи
по причине:
Перед выполнением операции нужно открыть базу
БДФ.Первая(); // перешли к первой записи
по причине:
Перед выполнением операции нужно открыть базу
БД.ЗакрытьФайл();
БДФ= Новый XBase;
БДФ.ОткрытьФайл(ВремФайл,,Истина);
БДФ.Первая(); // перешли к первой записи
Пока Не БДФ.ВКонце() Цикл
Сообщить(БДФ.NAME);
БДФ.Следующая();
КонецЦикла; Показать
ээээ.....на форме сделайте реквизит с типом "ТаблицаЗначений", напихайте в нее нужные колонки и загружайте сразу весь результат запроса.
Если задача именно сделать DBF, то на клиенте его, однако, не создать от слова совсем.
Т.е. у вас выбора нет, кроме как просить админов настроить правильно доступ.
Если задача именно сделать DBF, то на клиенте его, однако, не создать от слова совсем.
Т.е. у вас выбора нет, кроме как просить админов настроить правильно доступ.
В общем как я сделал чтоб сэкономить время, завел ТЗ с колонками соответствующими в ДБФ
Сэкономил время, не пришлось переписывать процедуру заполения.
Далее на форме сделал такую же тз с такими же переменными(все неопределенного типа, чтоб не копаться)
после заполнения ТЗ на сервере делаю:
и далее на клиенте создаю свою ДБФ из табл. все заработало.
БДТ = Новый ТаблицаЗначений;
Табл.БДТ.Добавить("CODEPST");
Табл.БДТ.Добавить("NAME");
Табл.БДТ.Добавить("CNTR");
Табл.БДТ.Добавить("GDATE");
Пока Выборка.Следующий() Цикл
БД = БДТ.Добавить();
БД.CODEPST = СокрЛП(Выборка.Номенклатура.Код);
Наим = СокрЛП(Выборка.Номенклатура.НаименованиеПолное);
Если ПустаяСтрока(Наим)=Истина Тогда ПоказатьСэкономил время, не пришлось переписывать процедуру заполения.
Далее на форме сделал такую же тз с такими же переменными(все неопределенного типа, чтоб не копаться)
после заполнения ТЗ на сервере делаю:
Объект.Реквизит1.Загрузить(БДТ);
и далее на клиенте создаю свою ДБФ из табл. все заработало.
(1) Может кому пригодиться:
Переделывал обработку .dbf под sql, взял за пример ОбменДаннымиXML.epf (там есть возможность выбора работы на клиенте/сервере, с правами к временным файлам у меня было всё нормально)
Переделывал обработку .dbf под sql, взял за пример ОбменДаннымиXML.epf (там есть возможность выбора работы на клиенте/сервере, с правами к временным файлам у меня было всё нормально)
&НаСервере
Функция СформироватьDBF(
Таблица = Новый XBase;
Таблица.Кодировка = КодировкаXBase.OEM;
Таблица.Поля.Добавить("DocNumber","S",100,);
//*****
ПутьКНовомуDBF = КаталогВременныхФайлов()+Лев(Новый УникальныйИдентификатор(),4)+".dbf";
Объект.ИмяФайлаОбмена = ПутьКНовомуDBF;
Таблица.СоздатьФайл(ПутьКНовомуDBF,);
//**********
Таблица.ЗакрытьФайл();
АдресФайлаДанных = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(Объект.ИмяФайлаОбмена), УникальныйИдентификатор);
УдалитьФайлы(Объект.ИмяФайлаОбмена);
Возврат АдресФайлаДанных;
КонецФункции
&НаКлиенте
Процедура СохранитьФайл(ИмяСохраняемогоФайла,АдресФайлаДанных)
ПолучитьФайл(АдресФайлаДанных, ИмяСохраняемогоФайла);
КонецПроцедуры Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот