18.10.10 — 10:05
Всем доброе утро! Помогите, пожалуйста!
Пытаюсь создать программно файл DBF.
Делаю примерно следующее:
ДБФ = Новый XBase();
ДБФ.поля.Добавить(«A», «S», 30);
ДБФ.поля.Добавить(«B», «S», 30);
ДБФ.поля.Добавить(«C», «S», 30);
ДБФ.поля.Добавить(«D», «S», 30);
ДБФ.поля.Добавить(«E», «S», 30);
ДБФ.поля.Добавить(«F», «S», 30);
ДБФ.поля.Добавить(«G», «S», 30);
ДБФ.АвтоСохранение = Истина;
ИмяФайла = «b73056» + Прав(Основание.Номер, 2);
ИмяФайлаБазы = «\E:ShareВнешниеОбработкиДляКАЭлектронный реестр Сбербанка» + ИмяФайла + «.dbf»;
ДБФ.СоздатьФайл(ИмяФайлаБазы);
ДБФ.Кодировка = КодировкаXBase.OEM;
ДБФ.АвтоСохранение = Истина;
ДБФ.ОткрытьФайл(ИмяФайлаБазы);
// 1-я строка
ДБФ.Добавить();
…….
ДБФ.Записать();
ДБФ.ЗакрытьФайл();
Сообщить(«Формирование DBF-файла завершено»);
Сообщить(«Путь к файлу: » + ИмяФайлаБазы);
Выдает ошибку:{Форма.Форма.Форма(35)}: Ошибка при вызове метода контекста (Добавить)
ДБФ.Добавить();
по причине:
Перед выполнением операции нужно открыть базу
Я так понимаю, что не открывает, потому что не создает. Смотрю в обработчике при методах СоздатьФайл(), ОткрытьФайл() и Добавить() пишет: Обращение к процедуре к процедуре объекта как к функции.
Находила на форумах подобные ошибки, но так и не разобралась.
Помогите, пожалуйста. Заранее всем спасибо.
1 — 18.10.10 — 10:15
попробуй убрать строчку
ДБФ.ОткрытьФайл(ИмяФайлаБазы);
2 — 18.10.10 — 10:18
Убрала. Ничего не изменилось (((
3 — 18.10.10 — 10:22
ФайлБТ.ОткрытьФайл(«X:CASHLOADPluCash1.dbf»);
Если Не ФайлБТ.Открыта() Тогда
ФайлБТ.СоздатьФайл(«X:CASHLOADPluCash1.dbf»);
Иначе
//ФайлБТ.ОчиститьФайл();
КонецЕсли;
это кусок из обработки выгрузки на кассу…под рукой вот была…
далее, кодировку указывал я после открытия/создания файла, и работает нормально это…да и автосохранение убрать после открытия надо
4 — 18.10.10 — 10:23
далее, имя файла не более 8 символов!!!!! для dbf
и все на латинице…кирилицу нельзя использовать
5 — 18.10.10 — 10:23
(3) Спасибо. Сейчас попробую
6 — 18.10.10 — 10:25
еще вопрос, выполняется на клиенте или на сервере?
сервер когда выполняет может не видеть доступ через сеть, есть там проблемы разные с этим…
да и клиент не всегда видит доступ, попробую пока название файла локальное, на том же компе, где идет работа с 1Ской
7 — 18.10.10 — 10:30
(6) пока всё на клиенте.
Попробовала (3) тоже самое:
{Форма.Форма.Форма(40)}: Ошибка при вызове метода контекста (Добавить)
ДБФ.Добавить();
по причине:
Перед выполнением операции нужно открыть базу
Для (4) там ровно 8 символов: латинская «b» и ещё 7 цифр
8 — 18.10.10 — 10:32
(7) в чем работаете вообще? что за платформа и конфигурация?
9 — 18.10.10 — 10:36
(8) Комплексная автоматизация (редакция 1.1)
10 — 18.10.10 — 10:38
файл уже есть хоть какой то? проверьте в месте выгрузки, есть ли файл уже созданный с таким названием
11 — 18.10.10 — 10:39
бывает ошибка такая, если файл есть созданный, но как то неправильно заполненный…либо файл dbf в этот момент открыт кем то (например в Excel)…
12 — 18.10.10 — 10:43
(10-11) дело в том, что файла созданного как раз и нет. Пробовала даже так: не создавала файл программно, а пыталась открыть уже готовый файл, не открывает, выдает ту же ошибку
13 — 18.10.10 — 10:44
(12) Путь менять пробовала, на локальный. Может с шарой проблемы?
14 — 18.10.10 — 10:44
ошибка идет на «ДБФ.ОткрытьФайл(ИмяФайлаБазы);» ? (если смотреть пошагово)
15 — 18.10.10 — 10:46
(14) нет, на ДБФ.Добавить()
Ругается, что база не открыта
16 — 18.10.10 — 10:48
+ (15) {Форма.Форма.Форма(41)}: Ошибка при вызове метода контекста (Добавить)
ДБФ.Добавить();
по причине:
Перед выполнением операции нужно открыть базу
17 — 18.10.10 — 10:51
сделай так попробуй:
ДБФ = Новый XBase();
ДБФ.поля.Добавить(«A», «S», 30);
ДБФ.поля.Добавить(«B», «S», 30);
ДБФ.поля.Добавить(«C», «S», 30);
ДБФ.поля.Добавить(«D», «S», 30);
ДБФ.поля.Добавить(«E», «S», 30);
ДБФ.поля.Добавить(«F», «S», 30);
ДБФ.поля.Добавить(«G», «S», 30);
ИмяФайла = «b11111»;
ИмяФайлаБазы = КаталогВременныхФайлов() + ИмяФайла + «.dbf»;
ФайлБТ.ОткрытьФайл(ИмяФайлаБазы);
Если Не ФайлБТ.Открыта() Тогда
ФайлБТ.СоздатьФайл(ИмяФайлаБазы);
КонецЕсли;
ДБФ.Кодировка = КодировкаXBase.OEM;
ДБФ.АвтоСохранение = Истина;
// 1-я строка
ДБФ.Добавить();
…….
ДБФ.Записать();
ДБФ.ЗакрытьФайл()
18 — 18.10.10 — 10:51
стоп…
первая строка не ДБФ = Новый XBase();
а ДБФ = Новый XBase;
у меня без скобок работает все
19 — 18.10.10 — 10:51
(17) сейчас попробую
20 — 18.10.10 — 10:52
(18) ок
21 — 18.10.10 — 10:59
вот сейчас в 1С 8.1 УТ 10.3.6.8 сделал и все сработало, файл создался без ошибок:
ФайлБТ = Новый XBase();
ФайлБТ.поля.Добавить(«A», «S», 30);
ФайлБТ.поля.Добавить(«B», «S», 30);
ФайлБТ.поля.Добавить(«C», «S», 30);
ФайлБТ.поля.Добавить(«D», «S», 30);
ФайлБТ.поля.Добавить(«E», «S», 30);
ФайлБТ.поля.Добавить(«F», «S», 30);
ФайлБТ.поля.Добавить(«G», «S», 30);
ИмяФайла = «b11111»;
ИмяФайлаБазы = КаталогВременныхФайлов() + ИмяФайла + «.dbf»;
ФайлБТ.ОткрытьФайл(ИмяФайлаБазы);
Если Не ФайлБТ.Открыта() Тогда
ФайлБТ.СоздатьФайл(ИмяФайлаБазы);
КонецЕсли;
Если Не ФайлБТ.Открыта() Тогда
Сообщить («Нет доступа к серверу Crystal Set, проверьте соединение. Выгрузка цен не возможна! Выгрузку цен необходимо осуществить в ручном режиме.»);
Отказ=Истина;
КонецЕсли;
ФайлБТ.Кодировка = КодировкаXBase.OEM;
ФайлБТ.АвтоСохранение = Истина;
// 1-я строка
ФайлБТ.Добавить();
ФайлБТ.A = «первый»;
ФайлБТ.B = «второй»;
ФайлБТ.C = «третий»;
ФайлБТ.D = «четвертый»;
ФайлБТ.Записать();
ФайлБТ.ЗакрытьФайл();
22 — 18.10.10 — 11:01
Ура!!! Создался! ))) Но почему-то не заполнился… может я его не через то, что надо смотрю… Через дэжавю можно смотреть?
23 — 18.10.10 — 11:02
ФайлБТ.Добавить();
…..
ФайлБТ.Записать();
это надо в цикле делать, при каждой новой строке…
т.е. записывать файл после добавление каждой строки
24 — 18.10.10 — 11:09
если что, пиши в аську…если будут по dbf вопросы…
я сейчас на обед ушел))
25 — 18.10.10 — 11:11
(24) ок )))
26 — 18.10.10 — 11:41
У меня после каждого добавления строки стоит ДБФ.Записать().
Открываю через Дэжавю и ничего не вижу… По отладчику всё записывается
НевестаПрограмМИСТА
27 — 18.10.10 — 12:41
огромное спасибо за помощь! У меня всё получилось )))
-
Здравствуйте! Создаю DBF файл по данным из документа
Запрос = Новый Запрос; Запрос.Текст ="ВЫБРАТЬ | ПаспортныеДанныеФизЛицСрезПоследних.ДокументСерия, | ПаспортныеДанныеФизЛицСрезПоследних.ДокументНомер, | ФИОФизЛицСрезПоследних.Фамилия, | ФИОФизЛицСрезПоследних.Имя, | ФИОФизЛицСрезПоследних.Отчество, | ПеречислениеПодотчетныхСуммРаботникиОрганизации.НомерЛицевогоСчета, | ПеречислениеПодотчетныхСуммРаботникиОрганизации.Сумма, | ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо |ИЗ | Документ.ПеречислениеПодотчетныхСумм.РаботникиОрганизации КАК ПеречислениеПодотчетныхСуммРаботникиОрганизации | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПаспортныеДанныеФизЛиц.СрезПоследних КАК ПаспортныеДанныеФизЛицСрезПоследних | ПО ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо = ПаспортныеДанныеФизЛицСрезПоследних.ФизЛицо | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц.СрезПоследних КАК ФИОФизЛицСрезПоследних | ПО ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо = ФИОФизЛицСрезПоследних.ФизЛицо |ГДЕ | ПеречислениеПодотчетныхСуммРаботникиОрганизации.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", СсылкакНаДокумент); Выборка = Запрос.Выполнить().Выбрать(); Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда Предупреждение("Не указан путь к файлу DBF!"); Возврат; КонецЕсли; ДБФ = Новый XBase; ДБФ.ОткрытьФайл(ПутьКФайлу); ДБФ.ОчиститьФайл(); ДБФ.Кодировка =КодировкаXBase.OEM; ДБФ.АвтоСохранение=Истина; Пока Выборка.Следующий() Цикл ДБФ.Добавить(); ДБФ.FIOOWNER = ОбщегоНазначения.ПолучитьФамилиюИмяОтчество(Выборка.Фамилия, Выборка.Имя, Выборка.Отчество, Ложь); ДБФ.PASPORT = Строка(Выборка.ДокументСерия)+ " "+Строка(Выборка.ДокументНомер); ДБФ.ADDRESS = ПолучитьАдресИзКонтактнойИнформации(Выборка.ФизЛицо); ДБФ.INDEX = ""; ДБФ.PHONENM = ПолучитьТелефонИзКонтактнойИнформации(Выборка.ФизЛицо); ДБФ.VTYPE = "370"; ДБФ.ACCOUNT = Выборка.НомерЛицевогоСчета; ДБФ.CASHVAL = Выборка.Сумма; КонецЦикла; ДБФ.ЗакрытьФайл();
выскакивает ошибка
{Документ.ПеречислениеПодотчетныхСумм.Форма.ФормаВыгрузкиВДБФ.Форма(142)}: Ошибка при вызове метода контекста (ОчиститьФайл)
ДБФ.ОчиститьФайл();
по причине:
Перед выполнением операции нужно открыть базув чем дело? Путь указан (ПутьКФайлу — D:Файл.dbf, запись на диск разрешена)
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.890
- Симпатии:
- 1.030
- Баллы:
- 204
Файла может не существовать вообще.
-
т.е. эта процедура открывает уже готовый dbf очищает и добавляет туда записи?
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.890
- Симпатии:
- 1.030
- Баллы:
- 204
-
Так и подумал…всё же спасибо большое!
-
Offline
pavl_vs
Профессионал в 1С- Регистрация:
- 18 июн 2011
- Сообщения:
- 507
- Симпатии:
- 42
- Баллы:
- 54
Фрагмент кода создания и записи в ДБФ должен быть таким:
ДБФ = Новый XBase; ДБФ.Кодировка = КодировкаXBase.OEM; ДБФ.АвтоСохранение = Истина; ДБФ.СоздатьФайл(ПутьКФайлу); ДБФ.Записать(); ДБФ.ОчиститьФайл(); Пока Выборка.Следующий() Цикл ДБФ.Добавить(); ДБФ.FIOOWNER = ОбщегоНазначения.ПолучитьФамилиюИмяОтчество(Выборка.Фамилия, Выборка.Имя, Выборка.Отчество, Ложь); ДБФ.PASPORT = Строка(Выборка.ДокументСерия)+ " "+Строка(Выборка.ДокументНомер); ДБФ.ADDRESS = ПолучитьАдресИзКонтактнойИнформации(Выборка.ФизЛицо); ДБФ.INDEX = ""; ДБФ.PHONENM = ПолучитьТелефонИзКонтактнойИнформации(Выборка.ФизЛицо); ДБФ.VTYPE = "370"; ДБФ.ACCOUNT = Выборка.НомерЛицевогоСчета; ДБФ.CASHVAL = Выборка.Сумма; ДБФ.Записать(); КонецЦикла; ДБФ.ЗакрытьФайл();
Помимо ошибки, связанной с очисткой файла, в оригинале есть ошибка в цикле обработки выборки — запись каждой строки начинается с «Добавить» и заканчивается «Записать».
Тамика Котовчанин 942 / 482 / 200 Регистрация: 16.02.2010 Сообщений: 3,338 Записей в блоге: 37 |
||||||||
1 |
||||||||
06.03.2017, 13:32. Показов 5249. Ответов 4 Метки нет (Все метки)
Всем добрый день! Пытаюсь написать обработку для выгрузки данных в dbf, нашла разные примеры. В итоге, при попытке записать обработку — выдает ошибку
Вот сама обработка
Заранее спасибо! Добавлено через 59 минут
0 |
Dethmontt |
07.03.2017, 01:32
|
Не по теме: Тамика, рыжий, это твой натуральный цвет волос?
0 |
Тамика |
07.03.2017, 17:21 [ТС] |
Не по теме: Dethmontt, увы, да
0 |
Dethmontt |
07.03.2017, 18:05
|
Не по теме:
Dethmontt, увы, да а мне нравиться… :-[
0 |
Тамика |
07.03.2017, 22:18 [ТС] |
Не по теме:
а мне нравиться… Рада слышать, спасибо :-[
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
07.03.2017, 22:18 |
5 |
Есть файл соответствия .DBF и индексы в .cdx. Есть цикл
На итерации 4110 строка БД_ТС.Следующая; перестает работать, не переходит к следующей строке xBase, цикл становется бесконечным
1. в какой строке ошибка 2. описание ошибки
Ошибки нет, просто цикл уходит в бесконечность
а если использвать БД.КоличествоЗаписей и БД.Перейти(НомерЗаписи) ?
Я открыл файл Excel’ем с таблицей вроде все в порядке, строка 4110 ничем не отличается, если пройти отладкой до этой строки данные меняются, т. е. есть переход к следующей строке, а после данные не меняются
Пробовал восстановить файл несколькими программками, все сказали что проблем нет. У Xbase есть метод переиндексировать. он выдает ошибку создания файла, директория без символов, руских букв и пробелов и доступна для записи из 1С
тогда что-то в базе не то… для начала попробуй пройтись по файлу CDBF потом можно попробовать пропатчить реестр [HKEY_LOCAL_MACHINESOFTWAREMicrosoftJet4.0EnginesXbase] «DataCodePage»=»ANSI» «BDE»=dword:00000002
Дело точно в файле соответствия или в cdx, так как у меня есть старая копия этих файлов и с ними загрузка проходит
это патч драйвера, выравнивание границы записи на 2 байта и присвоение кодировки по дефолту… патч позволяет корректно работать со старыми форматами дбф созданных драйверами фокса и 1с
Прости за наглость, можешь перевести в текст батника?
сохрани в файле с расширением reg, и пкм…
Идея БД.Перейти(НомерЗаписи) на строке 4110 сработала, но что это было?
Могут быть проблемы при добавлении этих записей?
на всякий случай сохрани старое из реестра… на 10 винде не юзал… и еще, изменения вступают в силу после перезагрузки драйвера (гарантировано при перезргрузки компа)
суть вместо цикла с проверкой «на конец файла/последнюю запись» проще использовать позиционирование по номеру записи это надежнее и проще
как бы не проще [1C] КолЗап = БД.КоличествоЗаписей; Для НомЗап = 1 По КолЗап Цикл БД.Перейти(НомЗап); … КонецЦикла; [1C]
И индекс не открывать, раз он все равно битый. А сортировать уже потом ВременнуюТС.
Вроде все сработало, но что там было не поянтно
Тэги:
Комментарии доступны только авторизированным пользователям
Содержание:
1. Создание файла dbf в 1С
2. Редактирование и чтение dbf
3. Процесс поиск и удаления строк в файле dbf 1С
Сегодня рассмотрим работу с одним из самых популярных форматов для обмена данными с 1С.
Этот формат обмена данными с 1С представляет собой подобие таблицы Excel и используется для хранения данных в различных СУБД. Также есть его модификации, всех их называют xBase.
В 1С для работы с таким форматом предусмотрен объект xBase. С его помощью можно создавать, читать и редактировать файлы dbf в 1С.
Важно чтобы имя файла соответствовало критериям 1С. Его длина не может превышать восемь символов.
Теперь разберем, как работать с xBase.
1. Создание файла dbf в 1С
Обращаю внимание, что запись нужно производить после каждой введенной строки.
Файл можно открыть специализированным приложением типа DBFView или с помощью MS Excel.
В итоге у нас получится такой файл:
2. Редактирование и чтение dbf
После выполнения кода в 1С суммы в файле изменятся на отрицательные:
3. Поиск и удаление строк в файле dbf 1С
Видим, что работать с файлами формата dbf достаточно просто. И работать с xBase можно как на сервере, так и на клиенте – это очень удобно.
Специалист компании ООО «Кодерлайн»
Хоменко Вадим