НевестаПрограмМИСТА
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)}: Ошибка при вызове метода контекста (Добавить)
ДБФ.Добавить();
по причине:
Перед выполнением операции нужно открыть базу
Я так понимаю, что не открывает, потому что не создает. Смотрю в обработчике при методах СоздатьФайл(), ОткрытьФайл() и Добавить() пишет: Обращение к процедуре к процедуре объекта как к функции.
Находила на форумах подобные ошибки, но так и не разобралась.
Помогите, пожалуйста. Заранее всем спасибо.
Ajbolitov
18.10.10
✎
10:15
попробуй убрать строчку
ДБФ.ОткрытьФайл(ИмяФайлаБазы);
НевестаПрограмМИСТА
18.10.10
✎
10:18
Убрала. Ничего не изменилось (((
dragonIMV
18.10.10
✎
10:22
ФайлБТ.ОткрытьФайл(«X:\CASHLOAD\PluCash1.dbf»);
Если Не ФайлБТ.Открыта() Тогда
ФайлБТ.СоздатьФайл(«X:\CASHLOAD\PluCash1.dbf»);
Иначе
//ФайлБТ.ОчиститьФайл();
КонецЕсли;
это кусок из обработки выгрузки на кассу…под рукой вот была…
далее, кодировку указывал я после открытия/создания файла, и работает нормально это…да и автосохранение убрать после открытия надо
dragonIMV
18.10.10
✎
10:23
далее, имя файла не более 8 символов!!!!! для dbf
и все на латинице…кирилицу нельзя использовать
НевестаПрограмМИСТА
18.10.10
✎
10:23
(3) Спасибо. Сейчас попробую
dragonIMV
18.10.10
✎
10:25
еще вопрос, выполняется на клиенте или на сервере?
сервер когда выполняет может не видеть доступ через сеть, есть там проблемы разные с этим…
да и клиент не всегда видит доступ, попробую пока название файла локальное, на том же компе, где идет работа с 1Ской
НевестаПрограмМИСТА
18.10.10
✎
10:30
(6) пока всё на клиенте.
Попробовала (3) тоже самое:
{Форма.Форма.Форма(40)}: Ошибка при вызове метода контекста (Добавить)
ДБФ.Добавить();
по причине:
Перед выполнением операции нужно открыть базу
Для (4) там ровно 8 символов: латинская «b» и ещё 7 цифр
dragonIMV
18.10.10
✎
10:32
(7) в чем работаете вообще? что за платформа и конфигурация?
НевестаПрограмМИСТА
18.10.10
✎
10:36
(8) Комплексная автоматизация (редакция 1.1)
dragonIMV
18.10.10
✎
10:38
файл уже есть хоть какой то? проверьте в месте выгрузки, есть ли файл уже созданный с таким названием
dragonIMV
18.10.10
✎
10:39
бывает ошибка такая, если файл есть созданный, но как то неправильно заполненный…либо файл dbf в этот момент открыт кем то (например в Excel)…
НевестаПрограмМИСТА
18.10.10
✎
10:43
(10-11) дело в том, что файла созданного как раз и нет. Пробовала даже так: не создавала файл программно, а пыталась открыть уже готовый файл, не открывает, выдает ту же ошибку
Salvador Limones
18.10.10
✎
10:44
(12) Путь менять пробовала, на локальный. Может с шарой проблемы?
dragonIMV
18.10.10
✎
10:44
ошибка идет на «ДБФ.ОткрытьФайл(ИмяФайлаБазы);» ? (если смотреть пошагово)
НевестаПрограмМИСТА
18.10.10
✎
10:46
(14) нет, на ДБФ.Добавить()
Ругается, что база не открыта
НевестаПрограмМИСТА
18.10.10
✎
10:48
+ (15) {Форма.Форма.Форма(41)}: Ошибка при вызове метода контекста (Добавить)
ДБФ.Добавить();
по причине:
Перед выполнением операции нужно открыть базу
dragonIMV
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-я строка
ДБФ.Добавить();
…….
ДБФ.Записать();
ДБФ.ЗакрытьФайл()
dragonIMV
18.10.10
✎
10:51
стоп…
первая строка не ДБФ = Новый XBase();
а ДБФ = Новый XBase;
у меня без скобок работает все
НевестаПрограмМИСТА
18.10.10
✎
10:51
(17) сейчас попробую
НевестаПрограмМИСТА
18.10.10
✎
10:52
(18) ок
dragonIMV
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 = «четвертый»;
ФайлБТ.Записать();
ФайлБТ.ЗакрытьФайл();
НевестаПрограмМИСТА
18.10.10
✎
11:01
Ура!!! Создался! ))) Но почему-то не заполнился… может я его не через то, что надо смотрю… Через дэжавю можно смотреть?
dragonIMV
18.10.10
✎
11:02
ФайлБТ.Добавить();
…..
ФайлБТ.Записать();
это надо в цикле делать, при каждой новой строке…
т.е. записывать файл после добавление каждой строки
dragonIMV
18.10.10
✎
11:09
если что, пиши в аську…если будут по dbf вопросы…
я сейчас на обед ушел))
НевестаПрограмМИСТА
18.10.10
✎
11:11
(24) ок )))
НевестаПрограмМИСТА
18.10.10
✎
11:41
У меня после каждого добавления строки стоит ДБФ.Записать().
Открываю через Дэжавю и ничего не вижу… По отладчику всё записывается
НевестаПрограмМИСТА
18.10.10
✎
12:41
огромное спасибо за помощь! У меня всё получилось )))
Странная ошибка при работе с ДБФ |
Я |
ЧессМастер
05.07.18 — 17:16
Всем доброе время суток !
Столкнулся со странной ошибкой при работе с ДБФ.
При попытке программной переиндексации средствами 1С выдает ошибку
Error #: -20
Creating File
Temporary Working File
При этом сам файл ДБФ прекрасно открывается ДБФ редактором.
В файле 225 500 записей.
Кто сталкивался с подобной ошибкой — в чем может быть дело ?
hogik
1 — 05.07.18 — 17:47
Надо бы глянуть текст программы. :-)
А вообще:
-20
Creating File
This error could be caused by specifying an illegal file name, attempting to create a file which is open, having a full directory, or by having a disk problem.
ЧессМастер
2 — 05.07.18 — 18:29
(1) В тексте программы ничего необычного
Состояние("Ждите. Идет переиндексация файла таблицы соответствия ...");
Попытка
БД_ТС.Переиндексировать();
Исключение
Сообщить("ВНИМАНИЕ! Не удалось переиндексировать
таблицу соответствия: " + ИмяФайлаТС + "
| " +
ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
КонецПопытки;
Ошибка возникает при разных именах файлов, разных каталогах и разных компьютерах.
Может проблема в том что при создании индекса не нравится содержимое поля записи ? Но ведь редактором файл открывается.
hogik
3 — 05.07.18 — 20:30
Покажите текст про создание БД_ТС.
Lama12
4 — 05.07.18 — 20:46
(0) Имя файла должно быть в формате 8.3 и желательно английскими буквами.
Lama12
5 — 05.07.18 — 20:47
(4) 8.3 это не версия 1с.
DES
6 — 05.07.18 — 20:54
имена полей (индексируемых) должны быть в верхнем регистре
ice777
7 — 05.07.18 — 21:04
(0) индексный файл и дбф это два разные файлы, если что )
первый только ключи для поиска, второй- данные, которые у тебя «прекрасно открываются».
по тексту ошибки нет места на диске для индексного
ice777
8 — 05.07.18 — 21:06
по жизни видал ситуации, когда индексный больше файла с данными, в выражение для поиска можно было включать и функции. Да и вообще- индексный- это дерево.
ЧессМастер
9 — 06.07.18 — 09:33
(4) Имя файла ts.dbf
Имя индексного файла ts.cdx
ЧессМастер
10 — 06.07.18 — 09:41
(3)
код создания ДБФ
БД_ТС = Новый XBase; ФайлБД_ТС = Новый Файл(ФайлТС); ФайлИндексовБД_ТС = Новый Файл(ИмяФайлаИндексовТС); Если ФайлБД_ТС.Существует() Тогда Если НЕ БД_ТС.Открыта() Тогда БД_ТС.индексы.Добавить("IndSource", "TRIM(ID_Source)", Истина); Если ФайлИндексовБД_ТС.Существует() Тогда БД_ТС.ОткрытьФайл(ФайлТС, ИмяФайлаИндексовТС, Ложь); Иначе БД_ТС.ОткрытьФайл(ФайлТС,, Ложь); Если НЕ БД_ТС.СоздатьИндексныйФайл(ИмяФайлаИндексовТС) Тогда Сообщить("ВНИМАНИЕ! Не удачная попытка создания индексного файла таблицы соответствия: | " + ИмяФайлаИндексовТС, СтатусСообщения.ОченьВажное); Возврат Ложь; КонецЕсли; КонецЕсли; КонецЕсли; Иначе БД_ТС.поля.Добавить("ID_Source", "S", 50); БД_ТС.поля.Добавить("ID_Receive", "S", 50); БД_ТС.поля.Добавить("Manager", "S", 100); БД_ТС.поля.Добавить("DateAct", "D", 8); БД_ТС.поля.Добавить("File", "S", 20); БД_ТС.поля.Добавить("Update", "N", 2); БД_ТС.поля.Добавить("Direct", "N", 2); БД_ТС.поля.Добавить("ManagerRar", "S", 100); БД_ТС.индексы.Добавить("IndSource", "TRIM(ID_Source)", Истина); Попытка БД_ТС.СоздатьФайл(ФайлТС, ИмяФайлаИндексовТС); Исключение Сообщить("ВНИМАНИЕ! Нет возможности открыть файл таблицы соответствия: " + ФайлТС + " | " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное); Возврат Ложь; КонецПопытки; КонецЕсли;
ЧессМастер
11 — 06.07.18 — 09:48
(7) «(0) индексный файл и дбф это два разные файлы, если что )
первый только ключи для поиска, второй- данные, которые у тебя "прекрасно открываются". "
Я это знаю.
У меня в файле ДБФ 225 500 записей (225 ТЫСЯЧ).ЮБез индексного файла поиск записей будет долго идти.
Вопрос почему стала возникать ошибка при переиндексации если места на диске полно, в названии файла все нормально, и ошибка возникает именно с этим файлом на разных компах.
ЧессМастер
12 — 06.07.18 — 09:50
(8) "по жизни видал ситуации, когда индексный больше файла с данными" Файл ДБФ чуть больше 73 Мб, файл индекса (при переиндексации он создается и дорастает до определенного размера а потом выскакивает ошибка в (0) - 18 Мб
ЧессМастер
13 — 06.07.18 — 11:09
Какая то реально странность.
В каталоге оставляю только файл ДБФ. CDX удаляю.
Делаю переиндексацию.
Выскакивает ошибка
"Ошибка при вызове метода контекста (Переиндексировать): ошибка создания файла"
При этом в каталоге где лежит ДБФ появляется файл CDX (до переиндексации его не было).
Как может быть ошибка «ошибка создания файла» если файл CDX создается ?
olegves
14 — 06.07.18 — 12:29
не знаю как в 8ке, но в клюшках помнится заголовок файла CDX, сформированного 1С, отличался от заголовка такого же в FoxPro. При этом Лис принимал 1Ский файл, но не мог по нему производить поиск.
olegves
15 — 06.07.18 — 12:35
+ (14) как вариант, откажись от индексов в пользу Х+1 дбф. 1 — главная, там сделай имя таблицы (всего их будет Х). поиск будет в 2 таблицах: в Главной по ключевому полю находишь имя таблицы, в которой продолжишь поиск
ЧессМастер
16 — 06.07.18 — 13:07
(15) Вопрос решился.
Индекс убивался конструкцией БД_ТС.Сжать(); Всем спасибо за помощь !
hogik
17 — 06.07.18 — 16:29
(15)
«Индекс убивался конструкцией БД_ТС.Сжать();»(с)
А где этот оператор в тексте, который Вы показываете? :-) "Вопрос решился."(с) Не решился. :-)
Вопрос решится после убирания TRIM в индексном выражении.
Т.к. длина ключей в xBase должна быть одинакова для ВСЕХ ключей.
hogik
18 — 06.07.18 — 16:38
(16)
«Индекс убивался конструкцией БД_ТС.Сжать();»(с)
А где этот оператор в тексте, который Вы показываете? :-) "Вопрос решился."(с) Не решился. :-)
Вопрос решится после убирания TRIM в индексном выражении.
Т.к. длина ключей в xBase должна быть одинакова для ВСЕХ ключей.
hogik
19 — 06.07.18 — 19:38
(16)
Поясню своё предыдущее сообщение в данной теме.
Есть странная информация, что «FoxPro не поддерживает переменную длину индексного ключа. Если вы попытаетесь построить индекс с ключом, который имеет различные длины, то ключ будет дополнен пробелами.»(с) Например, тут: http://www.foxclub.ru/rhproject/project/html/576a2953-04ff-4a66-9e38-3a3d9c990b72.hhtm
Но, движок из 1С для поддержки DBF не делает этого. Ну, до какой длины надо дополнять пробелы? И возникает ошибка или строится «битый» индекс. Это очень старая ошибка в движке…
hogik
20 — 06.07.18 — 21:36
Злопчинский
21 — 18.07.18 — 03:26
(16) тебе hogik дал реальную причину сбоя
Но реакции — нету.
Проблема решена?
ЧессМастер
22 — 20.07.18 — 11:43
(19) Поясните пожалуйста один момент.
Вы пишите "Если вы попытаетесь построить индекс с ключом, который имеет различные длины, то ключ будет дополнен пробелами" Смотрим программыный текст создания индекса. // данные БД_ТС.поля.Добавить("ID_Source", "S", 50); // индекс БД_ТС.индексы.Добавить("IndSource", "TRIM(ID_Source)", Истина); Что мы имеем в реальности при использовании ДБФ ?
В колонке «ID_Source» в ДБФ у меня хранится ГУИД объекта. У него фиксированная длина у всех объектов.
По этому полю выстроен индекс.
В результате получается 1. Данные - фиксированная строка
2. Индекс строится по фиксированной строке.
Почему в таком случае при конструкции БД_ТС.Сжать()
происходило падение индекса ?
ЧессМастер
23 — 20.07.18 — 11:45
(21) Извиняюсь что долго не отвечал. Сильно был занят, не было времени ответить.
Острота проблемы спала, теперь можно спокойно подумать в чем была причина.
Я нашел метод устранения ошибки
//Индекс убивался конструкцией БД_ТС.Сжать();
но остались вопросы в причине возникновения
hogik
24 — 21.07.18 — 19:08
(22)
Дмитрий.
Сделайте индекс как: «IndSource», «ID_Source»
Обязательно с предварительным удалением CDX файла.
Попробуйте свою обработку. Включая БД_ТС.Сжать().
А потом будем обсуждать «вопросы в причине возникновения»(с).
hogik
25 — 22.07.18 — 19:19
(22)
Дмитрий.
Я попытался промоделировать проблему/сбой.
При фиксированной длине значений всех ключей сбоя не происходит.
Мало того. Движок DBF-ов из 1С 8.х нормально отрабатывает индексное выражение с TRIM и разной длиной значений ключей. Устанавливается фиксированная длина ключа в 50 байт — равная длине поля «аргумента» функции TRIM.
Если Вам интересно выяснить причину сбоя, то высылайте мне DBF файл.
Надо его смотреть, а не моё тестовое содержание файла…
hogik
26 — 24.07.18 — 00:42
(22)
Дмитрий.
Пока пытался моделировать проблему/сбой обнаружил замечательное явление.
Если индекс имеет признак уникальности и производится запись/обновление строк DBF с повторяющимся значением поля входящего в индексное выражение, то всё может выглядеть нормальным. А иногда возникает ошибка -310 или заваливается вся сессия 1С-а. Реакция движка DBF-а мало предсказуема и зависит от многих факторов — размера поля, количества записей с повторяющимся значением поля, количества записей/обновлений за одно открытие файлов и т.д.
При любом исходе — индекс становится «битым» с массой случайных эффектов.
И вопрос к Вам.
В Ваших алгоритмах обеспечивается уникальное значение поля по которому строится индекс с признаком уникальности?
Тамика Котовчанин 942 / 482 / 200 Регистрация: 16.02.2010 Сообщений: 3,338 Записей в блоге: 37 |
||||||||
1 |
||||||||
06.03.2017, 13:32. Показов 4647. Ответов 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 файл по данным из документа
Запрос = Новый Запрос; Запрос.Текст ="ВЫБРАТЬ | ПаспортныеДанныеФизЛицСрезПоследних.ДокументСерия, | ПаспортныеДанныеФизЛицСрезПоследних.ДокументНомер, | ФИОФизЛицСрезПоследних.Фамилия, | ФИОФизЛицСрезПоследних.Имя, | ФИОФизЛицСрезПоследних.Отчество, | ПеречислениеПодотчетныхСуммРаботникиОрганизации.НомерЛицевогоСчета, | ПеречислениеПодотчетныхСуммРаботникиОрганизации.Сумма, | ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо |ИЗ | Документ.ПеречислениеПодотчетныхСумм.РаботникиОрганизации КАК ПеречислениеПодотчетныхСуммРаботникиОрганизации | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПаспортныеДанныеФизЛиц.СрезПоследних КАК ПаспортныеДанныеФизЛицСрезПоследних | ПО ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо = ПаспортныеДанныеФизЛицСрезПоследних.ФизЛицо | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц.СрезПоследних КАК ФИОФизЛицСрезПоследних | ПО ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо = ФИОФизЛицСрезПоследних.ФизЛицо |ГДЕ | ПеречислениеПодотчетныхСуммРаботникиОрганизации.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", СсылкакНаДокумент); Выборка = Запрос.Выполнить().Выбрать(); Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда Предупреждение("Не указан путь к файлу 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 = Выборка.Сумма; ДБФ.Записать(); КонецЦикла; ДБФ.ЗакрытьФайл();
Помимо ошибки, связанной с очисткой файла, в оригинале есть ошибка в цикле обработки выборки — запись каждой строки начинается с «Добавить» и заканчивается «Записать».
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
2017-12-19T00:25:27+00:00<<< XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент
Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать test.dbf, который используется в примерах ниже.
Оглавление (нажмите, чтобы раскрыть)
/// Как прочитать записи файла в формате dbf из 1с 8.3, 8.2 &НаКлиенте Процедура КакПрочитатьЗаписиФайлаВФорматеDBFНаКлиенте(ПутьКФайлуDBF) // О формате dbf - https://ru.wikipedia.org/wiki/DBF Таблица = Новый XBase; Таблица.ОткрытьФайл( ПутьКФайлуDBF, // путь к базе , // путь к индексу Истина // только чтение ); Сообщить("В таблице " + Таблица.КоличествоЗаписей() + " записей."); Сообщить("Таблица имеет кодировку: " + Таблица.Кодировка); Таблица.Первая(); // перешли к первой записи Пока Не Таблица.ВКонце() Цикл Если Не Таблица.ЗаписьУдалена() Тогда Сообщить( Строка(Таблица.EMPLOYEEID) + " " + Таблица.LASTNAME + " " + Таблица.TITLE + " " + Таблица.ADDRESS ); КонецЕсли; Таблица.Следующая(); // переходим к следующей записи КонецЦикла; Таблица.ЗакрытьФайл(); КонецПроцедуры /// Как найти нужную запись в файле в формате dbf из 1с 8.3, 8.2 &НаКлиенте Процедура КакНайтиНужнуюЗаписьВФайлеВФорматеDBFНаКлиенте(ПутьКФайлуDBF) // О формате dbf - https://ru.wikipedia.org/wiki/DBF // Файлы dbf могут быть очень большими и содержать сотни // тысяч записей. В этом случае полный перебор всех записей, // чтобы найти одну - не очень хорошая идея. Таблица = Новый XBase; Таблица.ОткрытьФайл( ПутьКФайлуDBF, // путь к базе , // путь к индексу Ложь // открываем на запись ); // Но для того, чтобы искать по ключу - нужен индексный файл, // включающий нужные нам поля. Если бы этот файл уже был у нас, // то мы бы передали его при открытии файла вышле, но у нас его // нет, а потому - займёмся его созданием. // создадим индекс только по полю EMPLOYEEID Таблица.Индексы.Добавить( "INDEX_EMPLOYEEID", // имя индекса "EMPLOYEEID", // выражение индекса Истина // уникальность создаваемого индекса ); КаталогДляЭкспериментов = КаталогДокументов() + "helpme1s.ru"; СоздатьКаталог(КаталогДляЭкспериментов); ПутьКФайлуИндекса = КаталогДляЭкспериментов + "test.cdx"; Таблица.СоздатьИндексныйФайл(ПутьКФайлуИндекса); Таблица.ЗакрытьФайл(); // Заново открываем таблицу, уже на чтение и с индексным файлом, // который мы только что создали. Таблица = Новый XBase; Таблица.ОткрытьФайл( ПутьКФайлуDBF, // путь к базе ПутьКФайлуИндекса, // путь к индексу Истина // только чтение ); // Найдём среди записей ту, у которой поле EMPLOYEEID равно 3. // В таблице всего один индекс INDEX_EMPLOYEEID. Таблица.ТекущийИндекс = Таблица.Индексы.Получить(0); Таблица.Ключ.EMPLOYEEID = "3"; ЗаписьНайдена = Таблица.НайтиПоКлючу("="); Если ЗаписьНайдена Тогда Сообщить("Запись найдена"); Сообщить( Строка(Таблица.EMPLOYEEID) + " " + Таблица.LASTNAME + " " + Таблица.TITLE + " " + Таблица.ADDRESS ); Иначе Сообщить("Запись не найдена"); КонецЕсли; Таблица.ЗакрытьФайл(); КонецПроцедуры /// Как добавить новые записи в уже существующий файл в /// формате dbf из 1с 8.3, 8.2 &НаКлиенте Процедура КакДобавитьНовыеЗаписиВФайлВФорматеDBFНаКлиенте(ПутьКФайлуDBF) // О формате dbf - https://ru.wikipedia.org/wiki/DBF // Добавим в уже знакомый нам test.dbf 2 новые записи о работниках. Таблица = Новый XBase; Таблица.ОткрытьФайл( ПутьКФайлуDBF, // путь к базе , // путь к индексу Ложь // открываем на запись ); Таблица.Добавить(); Таблица.EMPLOYEEID = "100"; Таблица.LASTNAME = "Милькин"; Таблица.TITLE = "Программист"; Таблица.ADDRESS = "Владивосток"; Таблица.Записать(); Таблица.Добавить(); Таблица.EMPLOYEEID = "101"; Таблица.LASTNAME = "Милькина"; Таблица.TITLE = "Биолог"; Таблица.ADDRESS = "Владивосток"; Таблица.Записать(); Таблица.ЗакрытьФайл(); КонецПроцедуры /// Как удалить определенные записи в файле в формате /// dbf из 1с 8.3, 8.2 &НаКлиенте Процедура КакУдалитьОпределенныеЗаписиИзФайлаВФорматеDBFНаКлиенте(ПутьКФайлуDBF) // О формате dbf - https://ru.wikipedia.org/wiki/DBF // Удалим записи с LASTNAME Милькин и Милькина Таблица = Новый XBase; Таблица.ОткрытьФайл( ПутьКФайлуDBF, // путь к базе , // путь к индексу Ложь // открываем на запись ); Таблица.Первая(); Пока Не Таблица.ВКонце() Цикл Если СокрЛП(Таблица.LASTNAME) = "Милькин" Или СокрЛП(Таблица.LASTNAME) = "Милькина" Тогда Таблица.Удалить(); КонецЕсли; Таблица.Следующая(); КонецЦикла; // Но Удалить() только ставит пометку на // удаление, а чтобы реально удалить помеченные // на удаление записи нужно вызвать метод Сжать(). Таблица.Сжать(); Таблица.ЗакрытьФайл(); КонецПроцедуры /// Как создать файл в формате dbf с нужными /// полями из 1с 8.3, 8.2 &НаКлиенте Процедура КакСоздатьФайлВФорматеDBFНаКлиенте() // О формате dbf - https://ru.wikipedia.org/wiki/DBF НоваяТаблица = Новый XBase; НоваяТаблица.Кодировка = КодировкаXBase.ANSI; // Описываем колонки таблицы. НоваяТаблица.Поля.Добавить( "FIRSTNAME", // имя колонки "S", // тип 100, // длина ); НоваяТаблица.Поля.Добавить( "AGE", "N", 10, 0 // точность ) ; // Типы ещё бывают: // N - число // S - строка // D - дата // L - булево // F - число КаталогДляЭкспериментов = КаталогДокументов() + "helpme1s.ru"; СоздатьКаталог(КаталогДляЭкспериментов); ПутьКНовомуDBF = КаталогДляЭкспериментов + "new.dbf"; НоваяТаблица.СоздатьФайл( ПутьКНовомуDBF, // путь к базе // путь к индексу ); НоваяТаблица.ЗакрытьФайл(); Сообщить("Новый файл создан в '" + ПутьКНовомуDBF + "'."); // И уже теперь можем его открыть и добавить данные. Таблица = Новый XBase; Таблица.ОткрытьФайл( ПутьКНовомуDBF, // путь к базе , // путь к индексу Ложь // открываем на запись ); Таблица.Добавить(); Таблица.FIRSTNAME = "Вова"; Таблица.AGE = 31; Таблица.Записать(); Таблица.Добавить(); Таблица.FIRSTNAME = "Алёна"; Таблица.AGE = 24; Таблица.Записать(); Таблица.ЗакрытьФайл(); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере
Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать test.dbf, который используется в примерах ниже.
Чтение и запись DBF в языке 1С 8.3, 8.2 (в примерах)
<<< XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Нажмите одну из кнопок, чтобы поделиться:
44889
Руководитель Центра
сопровождения 1С
25 июля 2019
Интеграция
Актуальность проверена: 26.01.2023
Получить консультацию
Бесплатно
Консультации по 1С
Протестируйте качество нашей работы — получите первую консультацию в подарок.
Одним из самых распространенных форматов баз данных до сих пор остается формат DBF. И неумение работать с ним из 1С – серьезное ограничение профессиональных навыков для любого специалиста. Тем более изучение теории и практика по этому вопросу потребует совсем немного времени. К тому же работа с DBF файлом никаких дополнительных библиотек не требует – все инструменты встроены в платформу 1С 8.3.
Вся работа с DBF в 1С происходит с помощью специального объекта – xBase. Рассмотрим основные действия с файлами, начав с чтения из конкретного DBF. В первую очередь необходимо расположить файл базы данных в каталоге, куда есть доступ у пользователя. Код для считывания данных в 1С достаточно прост:
- Указываем путь к базе в формате DBF;
ПутьКФайлу = "D:Nom.DBF";
- Создаем объект для взаимодействия с файлом, открываем его и устанавливаем указатель на первую строку с данными;
ФайлDBF = Новый XBase; ФайлDBF.ОткрытьФайл(ПутьКФайлу,,Истина);
- В цикле обходим всю базу и производим действия с элементами. В данном случае просто отражаем их на экране пользователя;
Пока НЕ ФайлDBF.ВКонце() Цикл Сообщить("" + ФайлDBF.NAIM +" - "+ФайлDBF.ARTI); ФайлDBF.Следующая(); КонецЦикла;
- Закрываем файл.
ФайлDBF.ЗакрытьФайл();
Вторая часто встречающаяся задача по взаимодействию с объектом – выгрузка DBF из 1С 8.3. Здесь намного легче создать конечный файл нужного формата программно, чем использовать дополнительно программное обеспечение. Этот алгоритм в 1С тоже достаточно прост и состоит из нескольких строк кода:
- Создаем объект XBase;
НовыйФайл = Новый XBase;
- Определяем кодировку нового файла. Существует кодировка для Windows – ANSI и OEM предназначенная для DOS;
НовыйФайл.Кодировка = КодировкаXBase.ANSI;
- Необходимо описать все колонки будущего файла DBF, указав их тип;
НовыйФайл.Поля.Добавить("Naim","S",100); НовыйФайл.Поля.Добавить("KOD","N",10);
- Укажем каталог, в котором будет происходить создание DBF и запишем итоговый файл.
Путь = "D:Clients.DBF"; НовыйФайл.СоздатьФайл(Путь); НовыйФайл.Записать();
После того как мы создали файл нужного формата, потребуется выгрузка в DBF данных. Программируя этот процесс, помните о том, что данные ИБ находятся на сервере. Чтобы записать имеющиеся данные из 1С необходимо к предыдущему коду добавить следующий алгоритм:
- Получаем информацию из справочника;
Контрагенты = Справочники.Контрагенты.Выбрать();
- В цикле последовательно добавляем по 1строчке и записываем;
Пока Контрагенты.Следующий() Цикл НовыйФайл.Добавить(); НовыйФайл. Naim = Контрагенты.Наименование; НовыйФайл. KOD = Контрагенты.Код; НовыйФайл.Записать(); КонецЦикла;
- Закрываем файл и проверяем, что запись прошла удачно.
НовыйФайл.ЗакрытьФайл();
Это основы работы с данным форматом. Существуют и другие способы открыть из 1С DBF, но xBase остается самым простым по синтаксису и пониманию. Поняв, как осуществляется простейшая выгрузка и загрузка из DBF, можно приступать к более сложным элементам, например, использованию индексов для поиска, удалению или изменению конкретных записей в DBF, а также применению технологии ADO.
Другие статьи по теме
Конфликт блокировок при выполнении транзакции в 1С
Для большинства пользователей сообщение о конфликте блокировок 1С означает лишь ошибку, мешающую им выполнять свою работу. Они хотят поскорее избавиться от этой проблемы и осаждают IT-отдел жалобами на…
Бесшовная интеграция с 1С:Документооборот
Ведение основной и дополнительной деятельности компанией требуется сопровождать процессом обработки документов, который в свою очередь требует не только использования систем бухгалтерского учета или к…
Первоначальная настройка параметров в 1С Управление торговлей 11.4
Настройку 1С можно выполнить в процессе работы, но правильнее реализовать данный шаг до момента создания основных документов и проводок, поскольку от корректности настройки параметров в системе зависи…
Ошибка подключения внешних метаданных по причине: Файл не обнаружен. При расшифровке внешнего отчета
Описание ошибки:
Ошибка возникает при попытке использования штатного механизма расшифровки для внешних отчетов, подключенных в базе типовой конфигурации 1С: Управление торговлей 8, ред. 10.3 в справочник «Внешние отчеты и обработки».
Найденные решения:
Ошибка при вызове метода контекста (Создать)
НовыйОтчет = ВнешниеОтчеты.Создать(ОтчетОбъект.ИспользуемоеИмяФайла);
по причине:
Ошибка подключения внешних метаданных
по причине:
Файл не обнаружен ‘C:\Users\<имя_пользователя>\AppData\Local\Temp\v8_F572_57.tmp’
При открытии файла внешнего отчета отдельно через меню «Файл» — «Открыть» и попытке расшифровки — работа механизма расшифровки не нарушается возникновением какой-либо похожей ошибки.
Обращение за помощью к мировой паутине дало прямую подсказку в виде конкретных ответов на поисковый запрос:
Ошибка подключения внешних метаданных по причине: Файл не обнаружен
Через нее был совершен переход в другое обсуждение по теме форума forum.mista.ru:
v8: Расшифровка во внешнем отчете
Получается, что при попытке расшифровки в отчете, который хранится в справочнике «Вешние отчеты и обработки», в коде происходит удаление временного файла-обработки прежде, чем закончится выполнение кода, отвечающего за расшифровку отчета.
Как не печально, но приходится констатировать тот факт, что для типовых решений придется их поставить на частичную поддержку, чтобы закомментировать участок кода, который отвечает за преждевременное удаление файла внешней обработки.
Для конфигурации 1С: Управление торговлей 8, ред. 10.3 пример такого места в коде — это модуль «Формы списка» справочника «ВнешниеОбработки», процедура «СправочникСписокВыбор», комментируем исполняемую строку кода:
УдалитьФайлы(ИмяФайла);
Нажатие на изображении увеличит его
Оцените, помогло ли Вам предоставленное описание решения ошибки?
© www.azhur-c.ru 2014-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.
14-06-2019
Журавлев А.С.
(Сайт azhur-c.ru)
0
— 09.02.2015 — 11:41
делаю на 8.3.5 (8.3.5.1383) и ниже
xB = новый XBase;
xB.Поля.Добавить(«COST», «N», 14, 2);
xB.СоздатьФайл(«c:\test.dbf»);
Ошибка инициализации модуля: ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта
по причине:
{ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта( 3)**: Ошибка при вызове метода контекста (СоздатьФайл)
по причине:
Неправильная информация
на 8. 2 работает
кто-нибудь разбирался с такой проблемой?
1
— 09.02.2015 — 11:46
если у кого работает создание дбф файлов на 8.3 напишите плиз.
2
— 09.02.2015 — 12:02
(0) Попробуй без структуры создать и с индексом.
xB = новый XBase;
ИмяФайлаБазы = «C:\test.dbf»;
ИмяФайлаИндекса = «C:\test.cdx»;
xB.СоздатьФайл(ИмяФайлаБазы, ИмяФайлаИндекса);
3
— 09.02.2015 — 12:12
(0) гы, могу еще предположить )))))
<Имя> (обязательный)
Тип: Строка.
Имя добавляемого поля. Поддерживаются только латинские имена полей длиной до 10 символов.
букофки не мог случаем перепутать?
4
— 09.02.2015 — 12:29
Хм… Кусочек документации (для клиент-сорверного режима):
Для доступа к файловым ресурсам сервера применяются виртуальные каталоги. Это означает, что в рамках профиля безопасности существует некоторая виртуальная файловая система, в которой создаются каталоги. Каждый виртуальный каталог имеет отражение на реальную файловую систему по определенным правилам. В тот момент, когда прикладному решению необходимо выполнить файловую операцию, в параметре соответствующей функции указывается путь к файлу, расположенному в виртуальной файловой системе. «1С:Предприятие» транслирует виртуальный каталог в реальный и формирует реальный путь к файлу, с которым и выполняется реальная работа. Прикладное решение не может получить информацию о том, в какой физический путь будет отражен виртуальный каталог.
Если в профиле безопасности указаны несколько виртуальных каталогов, то прикладное решение может осуществлять доступ только к этим ресурсам. Попытка доступа к любому другому каталогу (как реальному, так и виртуальному) – невозможна.
5
— 09.02.2015 — 12:58
Немного еще повангую: обычно серверы ставятся под разными пользователями.
Пользователю, под которым запускается 8.2, разрешено производить чтение. Пользователю сервера 8.3 — нет.
6
— 09.02.2015 — 13:17
Может, есть смысл попробовать таки РабочийКаталогДанныхПользователя() ?
7
— 09.02.2015 — 13:33
1це 8.хрень — совместимость вперед/назад разработчиками НЕ ГАРАНТИРОВАНА
8
— 09.02.2015 — 14:34
(5) нет, файловая, под одним пользователем.
9
— 09.02.2015 — 14:36
(2) Ошибка инициализации модуля: ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта
по причине:
{ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта( 9)**: Ошибка при вызове метода контекста (СоздатьФайл)
по причине:
Не определена структура базы
10
— 09.02.2015 — 14:38
на сервере и на клиенте не смотрел ?
11
— 09.02.2015 — 14:38
(3) нет, имя латинское
12
— 09.02.2015 — 14:39
(10) обычные формы
(6) VZ ВЫИГРЫВАЕТ ВЕЧНУЮ БЛАГОДАРНОСТЬ
13
— 09.02.2015 — 14:41
+12 вот как так, запускаются же даже с одного ярлыка…
14
— 09.02.2015 — 14:47
вынужден признать что это я тупой, я сделал поле для выбора файла, и не записывал файл с выбранным путём. то есть 8.2 сохраняет где-то внутри последний выбранный каталог и по умолчанию если не указывать путь пишет туда. 8.3 надо указывать по любому. наверное это хорошо
Сделала внешний отчет — формируется все хорошо, но когда пытаешься сделать расшифровку какой-либо строки выдает следующее: {Отчет.УниверсальныйОтчет(5748)}: Ошибка при вызове метода контекста (Создать): Файл не обнаружен ‘C:Documents and SettingsuserLocal SettingsTempv8_12_19.tmp’ ОтчетРасшифровка = ВнешниеОтчеты.Создать(Отчет.ИспользуемоеИмяФайла); по причине: Файл не обнаружен ‘C:Documents and SettingsuserLocal SettingsTempv8_12_19.tmp’ Если делать расшифровку через открытие формы настройки, то все хорошо. Также ошибка не выходит, если делать через Файл-Открыть. В чем ошибка? То же самое происходит, если полностью типовой отчет сохранить как внешний, а потом прикрепить к базе через внешние обработки и отчеты. В некоторых случаях удобнее пользоваться быстрым вызовом расшифровки
Temp в корень диска вынеси.
Кто-нить может проверить у себя, на любом отчете?
Вообщем проблема в том, что если ты сохраняешь отчет как внешний в конфе, то типовой механизм внешних отчетов/обработок при его открытии создает временный файл, сохраняет туда ХранилищеЗначения, затем открывает форму, затем !удаляет файл!. Но, временное имя внешнего отчета уже сохранилось в открытом отчете и соотв. при вызове расшифровки этого файла не будет и расшифровка не выполнится … ЗЫ Это я в поледней УПП посмотрел.
да это везде в типовых так…
Наверное. Раньше я туда не лазил, а вот теперь появился повод С СКД таких проблем нет.
Тэги:
Комментарии доступны только авторизированным пользователям