Ошибка при вызове метода контекста создатьфайл ошибка создания файла

Странная ошибка при работе с ДБФ

Я

  

ЧессМастер

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. Показов 4681. Ответов 4

Метки нет (Все метки)


Всем добрый день!

Пытаюсь написать обработку для выгрузки данных в dbf, нашла разные примеры. В итоге, при попытке записать обработку — выдает ошибку

1C
1
2
3
4
{Обработка.МояОбработка1.Форма.Форма.Форма(16)}: Ошибка при вызове метода контекста (СоздатьФайл)
    БД.СоздатьФайл("catalog.dbf"); //создаем файл физически
по причине:
Ошибка создания файла

Вот сама обработка

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Процедура Кнопка1Нажатие(Элемент)
    
    БД = Новый XBase;
    
    БД.Поля.Добавить("SUPPCODE", "S", 24);    
    БД.Поля.Добавить("DRUGNAME", "S", 255);
    БД.Поля.Добавить("MAKER", "S", 64);
    БД.Поля.Добавить("KOD_MORION", "S", 64);
    БД.Поля.Добавить("PRICE", "N", 6);
    
    БД.СоздатьФайл("catalog.dbf");
    БД.ЗакрытьФайл(); 
    
КонецПроцедуры

Заранее спасибо!

Добавлено через 59 минут
Решено! Нужно указывать полный путь…

0

Dethmontt

07.03.2017, 01:32

Не по теме:

Тамика, рыжий, это твой натуральный цвет волос?

0

Тамика

07.03.2017, 17:21

 [ТС]

Не по теме:

Dethmontt, увы, да :D

0

Dethmontt

07.03.2017, 18:05

Не по теме:

Цитата
Сообщение от Тамика
Посмотреть сообщение

Dethmontt, увы, да

а мне нравиться… :-[

0

Тамика

07.03.2017, 22:18

 [ТС]


    Создание обработки для выгрузки данных в dbf: Ошибка создания файла

Не по теме:

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

а мне нравиться…

Рада слышать, спасибо :-[

0

IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

07.03.2017, 22:18

5

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 надо указывать по любому. наверное это хорошо

  1. Здравствуйте! Создаю DBF файл по данным из документа

        Запрос = Новый Запрос;
        Запрос.Текст ="ВЫБРАТЬ
                      |    ПаспортныеДанныеФизЛицСрезПоследних.ДокументСерия,
                      |    ПаспортныеДанныеФизЛицСрезПоследних.ДокументНомер,
                      |    ФИОФизЛицСрезПоследних.Фамилия,
                      |    ФИОФизЛицСрезПоследних.Имя,
                      |    ФИОФизЛицСрезПоследних.Отчество,
                      |    ПеречислениеПодотчетныхСуммРаботникиОрганизации.НомерЛицевогоСчета,
                      |    ПеречислениеПодотчетныхСуммРаботникиОрганизации.Сумма,
                      |    ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо
                      |ИЗ
                      |    Документ.ПеречислениеПодотчетныхСумм.РаботникиОрганизации КАК ПеречислениеПодотчетныхСуммРаботникиОрганизации
                      |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПаспортныеДанныеФизЛиц.СрезПоследних КАК ПаспортныеДанныеФизЛицСрезПоследних
                      |        ПО ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо = ПаспортныеДанныеФизЛицСрезПоследних.ФизЛицо
                      |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц.СрезПоследних КАК ФИОФизЛицСрезПоследних
                      |        ПО ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо = ФИОФизЛицСрезПоследних.ФизЛицо
                      |ГДЕ
                      |    ПеречислениеПодотчетныхСуммРаботникиОрганизации.Ссылка = &Ссылка";
       
        Запрос.УстановитьПараметр("Ссылка", СсылкакНаДокумент);
       
        Выборка = Запрос.Выполнить().Выбрать();
           
            Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда
                Предупреждение("Не указан путь к файлу DBF!");
                Возврат;
            КонецЕсли;
           
            ДБФ = Новый XBase;
            ДБФ.ОткрытьФайл(ПутьКФайлу);
            ДБФ.ОчиститьФайл();
            ДБФ.Кодировка =КодировкаXBase.OEM;
            ДБФ.АвтоСохранение=Истина;
            Пока Выборка.Следующий() Цикл
               
                ДБФ.Добавить();
                ДБФ.FIOOWNER = ОбщегоНазначения.ПолучитьФамилиюИмяОтчество(Выборка.Фамилия, Выборка.Имя, Выборка.Отчество, Ложь);
                ДБФ.PASPORT = Строка(Выборка.ДокументСерия)+ " "+Строка(Выборка.ДокументНомер);
                ДБФ.ADDRESS = ПолучитьАдресИзКонтактнойИнформации(Выборка.ФизЛицо);
                ДБФ.INDEX   = "";
                ДБФ.PHONENM = ПолучитьТелефонИзКонтактнойИнформации(Выборка.ФизЛицо);
                ДБФ.VTYPE = "370";
                ДБФ.ACCOUNT = Выборка.НомерЛицевогоСчета;
                ДБФ.CASHVAL = Выборка.Сумма;
            КонецЦикла;
            ДБФ.ЗакрытьФайл();
    

    выскакивает ошибка

    {Документ.ПеречислениеПодотчетныхСумм.Форма.ФормаВыгрузкиВДБФ.Форма(142)}: Ошибка при вызове метода контекста (ОчиститьФайл)
    ДБФ.ОчиститьФайл();
    по причине:
    Перед выполнением операции нужно открыть базу

    в чем дело? Путь указан (ПутьКФайлу — D:Файл.dbf, запись на диск разрешена)

  2. Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.890
    Симпатии:
    1.030
    Баллы:
    204

    Файла может не существовать вообще.

  3. т.е. эта процедура открывает уже готовый dbf очищает и добавляет туда записи?

  4. Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.890
    Симпатии:
    1.030
    Баллы:
    204
  5. Так и подумал…всё же спасибо большое!

  6. Offline

    pavl_vs
    Профессионал в 1С

    Регистрация:
    18 июн 2011
    Сообщения:
    507
    Симпатии:
    42
    Баллы:
    54

    Фрагмент кода создания и записи в ДБФ должен быть таким:

    ДБФ = Новый XBase;
    ДБФ.Кодировка = КодировкаXBase.OEM;
    ДБФ.АвтоСохранение = Истина; 
    ДБФ.СоздатьФайл(ПутьКФайлу);
    ДБФ.Записать(); 
    ДБФ.ОчиститьФайл();
    
    Пока Выборка.Следующий() Цикл 
        ДБФ.Добавить(); 
        ДБФ.FIOOWNER = ОбщегоНазначения.ПолучитьФамилиюИмяОтчество(Выборка.Фамилия, Выборка.Имя, Выборка.Отчество, Ложь); 
        ДБФ.PASPORT = Строка(Выборка.ДокументСерия)+ " "+Строка(Выборка.ДокументНомер); 
        ДБФ.ADDRESS = ПолучитьАдресИзКонтактнойИнформации(Выборка.ФизЛицо); ДБФ.INDEX = ""; 
        ДБФ.PHONENM = ПолучитьТелефонИзКонтактнойИнформации(Выборка.ФизЛицо); 
        ДБФ.VTYPE = "370"; 
        ДБФ.ACCOUNT = Выборка.НомерЛицевогоСчета; 
        ДБФ.CASHVAL = Выборка.Сумма; 
        ДБФ.Записать();
    КонецЦикла;
    
    ДБФ.ЗакрытьФайл();
    

    Помимо ошибки, связанной с очисткой файла, в оригинале есть ошибка в цикле обработки выборки — запись каждой строки начинается с «Добавить» и заканчивается «Записать».

Ponomarenko
09.04.2012 09:01 Прочитано: 4306

Здравствуйте. У нас УПП 8.2 .Программа работает в Демке, ошибок не выдает. Делает все нормально. Запускаю обработку на сервере , на сети, выдает ошибку.
{Обработка.ДозагрузкаНоменклатуры.Форма.Форма.Форма(15)}: Ошибка при вызове метода контекста (СоздатьИндексныйФайл)
ФлИБД = БД.СоздатьИндексныйФайл(«C:index.cdx»);
по причине:
Перед выполнением операции нужно открыть базу

Подскажите где у меня ошибка.

Код 1C v 8.2 УП

 
Процедура ВыполнитьЗапросСервер()
Спр = Справочники.Номенклатура.ВыбратьИерархически();
СпрВидыНоменклатуры=Справочники.ВидыНоменклатуры.Выбрать();
СпрНоменклатурныеГруппы=Справочники.НоменклатурныеГруппы.Выбрать();
БД = Новый XBase;
БД.ОткрытьФайл("C:Nomenk.DBF");
БД.Индексы.Добавить("IDXCODE", "KOD");
ФлИБД = БД.СоздатьИндексныйФайл("C:index.cdx");
БД.ТекущийИндекс = БД.Индексы.IDXCODE;
БД.Первая();
//БД.Перейти(17166);
Пока БД.Следующая() Цикл
//сообщить("текущая "+БД.KOD);

// РезультатПоиска.НаименованиеПолное=БД.POLN_NAME;
// //*************************
//РезультатПоиска.Записать();
//************************************
РезультатПоиска1 = Справочники.НоменклатурныеГруппы.НайтиПоКоду(БД.ZAKAZ);
Если РезультатПоиска1.Пустая() Тогда
// Выполнить действия, предусмотренные в случае, когда элемент не найден.
//сообщить("не нашла "+БД.KOD);
иначе
//сообщить(РезультатПоиска1);
Если РезультатПоиска1.ЭтоГруппа<>Истина Тогда
элементОбъект1 = РезультатПоиска1.ПолучитьОбъект();
КонецЕсли;
КонецЕсли;
//************************************
РезультатПоиска2 = Справочники.ВидыНоменклатуры.НайтиПоНаименованию(БД.VID_NOMEKL);
Если РезультатПоиска2.Пустая() Тогда
// Выполнить действия, предусмотренные в случае, когда элемент не найден.
//сообщить("не нашла "+БД.KOD);
иначе
Если РезультатПоиска2.ЭтоГруппа<>Истина Тогда
элементОбъект2 = РезультатПоиска2.ПолучитьОбъект();
КонецЕсли;
КонецЕсли;
//************************************
РезультатПоиска = Справочники.Номенклатура.НайтиПоКоду(БД.KOD);
Если РезультатПоиска.Пустая() Тогда
// Выполнить действия, предусмотренные в случае, когда элемент не найден.
сообщить("не нашла "+БД.KOD);
иначе
Если РезультатПоиска.ЭтоГруппа<>Истина Тогда
элементОбъект = РезультатПоиска.ПолучитьОбъект();
элементОбъект.НаименованиеПолное=БД.POLN_NAME;

элементОбъект.НоменклатурнаяГруппа=РезультатПоиска1;

элементОбъект.ВидНоменклатуры=РезультатПоиска2;
сообщить(БД.KOD+" элементОбъект= "+элементОбъект+" элементОбъект1= "+РезультатПоиска1+" элементОбъект2= "+РезультатПоиска2 );

элементОбъект.Записать();

КонецЕсли;
КонецЕсли;

КонецЦикла;
БД.ЗакрытьФайл();

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

Yandex
Возможно, вас также заинтересует

Реклама на портале

E_Migachev
09.04.2012 10:55 Ответ № 1

Вот рабочий код:
Код 1C v 8.х

 // Перекачка справочника "Подразделение" в DBF-файле

ФайлБД=КаталогИмя+"Spr_podr."; // Название файла без расширения
xБД=Новый Файл(ФайлБД+"dbf"); // Создание объекта файла в среде 1С

// Удалить, если файлы уже есть (в том числе и индексный файл)
Если xБД.Существует() Тогда
УдалитьФайлы(ФайлБД,"*");
КонецЕсли;

// Создание файлов
xБД = Новый XBase; // создание объекта файла формата xBase
// добавим поля
xБД.Поля.Добавить("Id", "S", 5);
xБД.Поля.Добавить("Name", "S", 25);
xБД.СоздатьФайл(ФайлБД+"dbf"); // создадим реальный файл из объекта
// Индексное выражение
ИндВр="Id";
xБД.индексы.Добавить("Id",ИндВр,Истина);
ИБД = xБД.СоздатьИндексныйФайл(ФайлБД+"cdx"); // создание индексного файла
xБД.АвтоСохранение=Истина;
xБД.ЗакрытьФайл();

// Выкачка данных
xБД.ОткрытьФайл(ФайлБД+"dbf",ФайлБД+"cdx");
xБД.ТекущийИндекс = xБД.индексы.Id;
Выборка=Справочники.Подразделения.Выбрать();
Пока Выборка.Следующий() Цикл
xБД.Добавить();
xБД.ID=Выборка.Код;
xБД.Name=Выборка.Наименование;
xБД.Записать();
КонецЦикла;
xБД.ЗакрытьФайл();

// проверка работы индекса
xБД.ОткрытьФайл(ФайлБД+"dbf",ФайлБД+"cdx");
xБД.ТекущийИндекс = xБД.индексы.Id;
Если xБД.Найти("00003",">=") Тогда
Сообщить(xБД.ID+" - "+xБД.NAME);
Пока xБД.Следующая() Цикл
Сообщить(xБД.ID+" - "+xБД.NAME);
КонецЦикла;
КонецЕсли;
xБД.ЗакрытьФайл();

Подсказка: Для быстрого перемещения к последнему ответу или к вопросу используйте или .

Ошибка подключения внешних метаданных по причине: Файл не обнаружен. При расшифровке внешнего отчета

Описание ошибки:
Ошибка возникает при попытке использования штатного механизма расшифровки для внешних отчетов, подключенных в базе типовой конфигурации 1С: Управление торговлей 8, ред. 10.3 в справочник «Внешние отчеты и обработки».

Найденные решения:

Ошибка при вызове метода контекста (Создать) 
            НовыйОтчет = ВнешниеОтчеты.Создать(ОтчетОбъект.ИспользуемоеИмяФайла); 
по причине: 
Ошибка подключения внешних метаданных 
по причине: 
Файл не обнаружен ‘C:Users<имя_пользователя>AppDataLocalTempv8_F572_57.tmp’

При открытии файла внешнего отчета отдельно через меню «Файл» — «Открыть» и попытке расшифровки — работа механизма расшифровки не нарушается возникновением какой-либо похожей ошибки.

Обращение за помощью к мировой паутине дало прямую подсказку в виде конкретных ответов на поисковый запрос:

Ошибка подключения внешних метаданных по причине: Файл не обнаружен

Через нее был совершен переход в другое обсуждение по теме форума forum.mista.ru:

v8: Расшифровка во внешнем отчете

Получается, что при попытке расшифровки в отчете, который хранится в справочнике «Вешние отчеты и обработки», в коде происходит удаление временного файла-обработки прежде, чем закончится выполнение кода, отвечающего за расшифровку отчета.

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

Для конфигурации 1С: Управление торговлей 8, ред. 10.3 пример такого места в коде — это модуль «Формы списка» справочника «ВнешниеОбработки», процедура «СправочникСписокВыбор», комментируем исполняемую строку кода:

УдалитьФайлы(ИмяФайла);

Нажатие на изображении увеличит его
1C 8 ошибка при попытке получить расшифровку отчета справочника внешних отчетов

Оцените, помогло ли Вам предоставленное описание решения ошибки?




© www.azhur-c.ru 2014-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.

14-06-2019

Журавлев А.С.
(Сайт azhur-c.ru)

Тамика

Котовчанин

942 / 482 / 200

Регистрация: 16.02.2010

Сообщений: 3,338

Записей в блоге: 37

1

06.03.2017, 13:32. Показов 5259. Ответов 4

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Всем добрый день!

Пытаюсь написать обработку для выгрузки данных в dbf, нашла разные примеры. В итоге, при попытке записать обработку — выдает ошибку

1C
1
2
3
4
{Обработка.МояОбработка1.Форма.Форма.Форма(16)}: Ошибка при вызове метода контекста (СоздатьФайл)
    БД.СоздатьФайл("catalog.dbf"); //создаем файл физически
по причине:
Ошибка создания файла

Вот сама обработка

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Процедура Кнопка1Нажатие(Элемент)
    
    БД = Новый XBase;
    
    БД.Поля.Добавить("SUPPCODE", "S", 24);    
    БД.Поля.Добавить("DRUGNAME", "S", 255);
    БД.Поля.Добавить("MAKER", "S", 64);
    БД.Поля.Добавить("KOD_MORION", "S", 64);
    БД.Поля.Добавить("PRICE", "N", 6);
    
    БД.СоздатьФайл("catalog.dbf");
    БД.ЗакрытьФайл(); 
    
КонецПроцедуры

Заранее спасибо!

Добавлено через 59 минут
Решено! Нужно указывать полный путь…



0



Dethmontt

07.03.2017, 01:32

Не по теме:

Тамика, рыжий, это твой натуральный цвет волос?



0



Тамика

07.03.2017, 17:21

 [ТС]

Не по теме:

Dethmontt, увы, да :D



0



Dethmontt

07.03.2017, 18:05

Не по теме:

Цитата
Сообщение от Тамика
Посмотреть сообщение

Dethmontt, увы, да

а мне нравиться… :-[



0



Тамика

07.03.2017, 22:18

 [ТС]


    Создание обработки для выгрузки данных в dbf: Ошибка создания файла

Не по теме:

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

а мне нравиться…

Рада слышать, спасибо :-[



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

07.03.2017, 22:18

5

Странная ошибка при работе с ДБФ

Я
   ЧессМастер

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-а мало предсказуема и зависит от многих факторов — размера поля, количества записей с повторяющимся значением поля, количества записей/обновлений за одно открытие файлов и т.д.

При любом исходе — индекс становится «битым» с массой случайных эффектов.

И вопрос к Вам.

В Ваших алгоритмах обеспечивается уникальное значение поля по которому строится индекс с признаком уникальности?

ДБФ файл. Ругается на длину имени

Я

Маркусс

02.10.09 — 09:10

Здравствуйте.

Для отчетности требуется создать файл дбф. Структура определена в документации. Наименование должно иметь ИНН, дату и т.д.При попытке создания пишет следующее:

Ошибка при вызове метода контекста (СоздатьФайл): Длина имени файла превысила 8 символов

   БД.СоздатьФайл(ИмяФайла);

по причине:

Длина имени файла превысила 8 символов

В документации указано, что формат должен быть DBF 4. Подскажите, плиз, как прописать в коде данный формат.

ИмяФайла = «c:465465465465461.DBF»;

   БД = Новый XBase;

БД.Поля.Добавить(«SELFKPP», «C», 10);

   БД.Поля.Добавить(«REPORTDATE», «D», 8);

   БД.Поля.Добавить(«EAN13», «C», 13);

   БД.Поля.Добавить(«AMOUNT», «C», 4);

   БД.СоздатьФайл(ИмяФайла);

Спасибо.

IronDemon

1 — 02.10.09 — 09:11

Не превышай

dragonIMV

2 — 02.10.09 — 09:12

мне вот тоже это интересно, а то приходится делать файлы с именем не более 8 символов…

Kolyasik

3 — 02.10.09 — 09:13

465465465465461 — больше восми знаков… наверное поетому :)))

ДенисЧ

4 — 02.10.09 — 09:13

Напиши так

ИмяФайла = "c:4654.DBF"
тут твой код
КомандаСистемы("ren c:4654.DBF c:465465465465461.DBF");


А потом иди на базар и купи там гУся.

dragonIMV

5 — 02.10.09 — 09:17

(4) не, это понятно что можно сделать…

а вот существует ли возможность изначально делать файл с именем длинее 8 символов?

ДенисЧ

6 — 02.10.09 — 09:18

(5) Существует. Не использовать объект XBase, например.

Или не использовать 1с.

Или не использовать компьютер.

Или…

Kolyasik

7 — 02.10.09 — 09:23

Описание:
XBase — основной объект для работы с таблицами баз данных в формате DBF. Предоставляет доступ к коллекции полей и индексов таблицы, позволяет открывать и записывать файлы таблиц, работать с записями таблицы.
При работе с файлами DBF следует иметь в виду, что имя файла должно удовлетворять ограничению 8.3.

Kolyasik

8 — 02.10.09 — 09:23

СП рулит

IKSparrow

9 — 02.10.09 — 09:26

На всякий случай перевожу написанное в (7) — не понимает DBF больше 8 символов в имени файла. И кириллицу не понимает там же. Стандарт такой. Имя должно быть как по старинке в DOS (операционка такая была). FILENAME.DBF. Всё.

SmallDog

10 — 02.10.09 — 09:28

сначала дать простое имя, потом переименовать как надо — проверено, работает

dragonIMV

11 — 02.10.09 — 09:31

(9) хорошая была операционка)))) не то что винда…

Маркусс

12 — 02.10.09 — 09:31

(4)Спасибо. только использовал move

Lama12

13 — 02.10.09 — 09:32

(12)Потом хрен откроешь пока не переименуешь обратно.

dragonIMV

14 — 02.10.09 — 09:34

(13)во во, вроде он или не даст открыть такой файл, или вроде бы только первые 8 символов названия будет читать…

ASU_Diamond

15 — 02.10.09 — 09:45

(9) эээ… а в семерке вроде как понимал…

Mikeware

16 — 02.10.09 — 09:48

(15) Нет.

  

ДенисЧ

17 — 02.10.09 — 09:48

(15) «ет» (с)

Формат dbf пока ещё встречается в современном IT. Однако, вопреки заветам MS DOS, разработчики, иногда, используют в имени файла более 8 символов.

Объект XBase в 1С8 может оперировать только с файлами, у которых имя соответствует формату 8.3. Поэтому, при попытке открыть dbf-файл с именем длиной более 8 символов, возникает системная ошибка и работа с таким файлом невозможна.

Ниже приведен пример программного кода, в котором показано решение данной проблемы средствами 1С8.

//путь к файлам с данными
ПутьКФайлам="c:";

маскаФайла="*.dbf";
дбф=Новый XBASE;
дбф.Кодировка=КодировкаXBase.ANSI;

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

   // приведение имени к формату 8.3
   //СокрЛП() на случай, если в имени появятся пробелы
   короткоеИмяФайла=СокрЛП(Лев(файл.ИмяБезРасширения, 8))+".dbf";
   полныйПутьКНовомуФайлу=КаталогВременныхФайлов()+короткоеИмяФайла;
   КопироватьФайл(файл.ПолноеИмя, полныйПутьКНовомуФайлу);

   дбф.ОткрытьФайл(полныйПутьКНовомуФайлу);
   Если дбф.Открыта() Тогда

      //...работа с файлом...

      //закрытие файла
      дбф.ЗакрытьФайл();

      //удаление временного файла с именем 8.3
      УдалитьФайлы(полныйПутьКНовомуФайлу);

   КонецЕсли;

КонецЦикла;

Здравствуйте. Для отчетности требуется создать файл дбф. Структура определена в документации. Наименование должно иметь ИНН, дату и т.д.При попытке создания пишет следующее: Ошибка при вызове метода контекста (СоздатьФайл): Длина имени файла превысила 8 символов    БД.СоздатьФайл(ИмяФайла); по причине: Длина имени файла превысила 8 символов В документации указано, что формат должен быть DBF 4. Подскажите, плиз, как прописать в коде данный формат. Спасибо.

мне вот тоже это интересно, а то приходится делать файлы с именем не более 8 символов…

465465465465461 — больше восми знаков… наверное поетому :)))

ИмяФайла = «c:4654.DBF» тут твой код А потом иди на базар и купи там гУся.

не, это понятно что можно сделать… а вот существует ли возможность изначально делать файл с именем длинее 8 символов?

Существует. Не использовать объект XBase, например. Или не использовать 1с. Или не использовать компьютер. Или…

Описание: XBase — основной объект для работы с таблицами баз данных в формате DBF. Предоставляет доступ к коллекции полей и индексов таблицы, позволяет открывать и записывать файлы таблиц, работать с записями таблицы. При работе с файлами DBF следует иметь в виду, что имя файла должно удовлетворять ограничению 8.3.

На всякий случай перевожу написанное в — не понимает DBF больше 8 символов в имени файла. И кириллицу не понимает там же. Стандарт такой. Имя должно быть как по старинке в DOS (операционка такая была). FILENAME.DBF. Всё.

сначала дать простое имя, потом переименовать как надо — проверено, работает

хорошая была операционка)))) не то что винда…

Спасибо. только использовал move

Потом хрен откроешь пока не переименуешь обратно.

во во, вроде он или не даст открыть такой файл, или вроде бы только первые 8 символов названия будет читать…

эээ… а в семерке вроде как понимал…

Тэги:

Комментарии доступны только авторизированным пользователям

Для какого банана, извиняюсь, переименовывать?
При длинном пути надо брать либо в кавычки имя файла, либо, ИмяФайла = Лев(ДлинноеИмяФайла,7)+»~.dbf»

Поясню подробней. На диске в различных каталогах находятся файлы dbf с длиной имени порядка 12-14 символов. Если длина имени не превышает 8 символов- файлы открываются нормально, если же больше — программа вылетает с ошибкой «Перед выполнением операции нужно открыть базу!» на строчках
ДБФ.Первая();
и Пока ДБФ.ВКонце() = 0 Цикл

Хотелось бы программно переименовывать длинные имена до 8 символов, обрабатывать данные, а затем возвращать исходное имя файлам. В противном случае остается только вручную переименовывать файлы, что весьма неудобно, ибо их несколько сотен и каждый день появляются новые.

Первоначальная версия процедур:

[codebox]
Процедура ВыборФайла()

КаталогЗагрузки = «»;
ФайлЗагрузки = «»;
Если ФС.ВыбратьФайл(1, ФайлЗагрузки, КаталогЗагрузки, «Выберите файл», «*.dbf|*.dbf», , ) = 1 Тогда
ФайлЗагрузки = КаталогЗагрузки + ФайлЗагрузки;
КонецЕсли;

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

Процедура ПриВыбореИмениФайла()
Поз=Найти(ФайлЗагрузки,».»);
Если (Поз=0) Или (Поз>8) Тогда
ФайлЗагрузки=СокрП(Лев(СокрЛ(ФайлЗагрузки),12))+».DBF»;
Иначе
ФайлЗагрузки=СокрЛП(Лев(ФайлЗагрузки,Поз)+»DBF»);
КонецЕсли;
КонецПроцедуры

Процедура Сформировать()

ИмФайл=СокрЛП(ФайлЗагрузки);
Док1 = СоздатьОбъект(«Документ.РеестрСчетовВходящийЛПУ»);
ДБФ = СоздатьОбъект(«XBase»);
ДБФ.ОткрытьФайл(ИмФайл,,1);
Док1.Новый();
ДБФ.Первая();
Пока ДБФ.ВКонце() = 0 Цикл
Док1.НоваяСтрока();
// и т.д.
[/codebox]

Решил сделать возможной загрузку файлов и с длинными именами. Алгоритм следующий:
1) long = 0;
2) пытаемся открыть файл, если длина больше 8 символов Тогда
а) усекаем имя до 8 символов;
б) переименовываем файл на диске в короткое имя;
в) присваиваем переменной long значение 1;
Иначе
ничего не делаем
Далее создаем объект типа XBase, создаем новый документ, открываем наш файл DBF и начинаем заполнять документ значениями полей файла. Если у нас был длинный файл (long=1), то после окончания всех действий вновь переименовываем файл (возвращаем ему исходное имя).

[codebox]
Перем КороткоеИмяФайла,ПолноеИмяФайла;
Процедура ВыборФайла()

КаталогЗагрузки = «»;
ФайлЗагрузки = «»;
Если ФС.ВыбратьФайл(0, ФайлЗагрузки, КаталогЗагрузки, «Выберите файл», «*.dbf|*.dbf», , ) = 1 Тогда
ПолноеИмяФайла = КаталогЗагрузки + ФайлЗагрузки;
КонецЕсли;

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

Процедура ПриВыбореИмениФайла()
long=0;
Поз=Найти(ФайлЗагрузки,».»);
Если (Поз>8) Тогда // длинное имя файла
КороткоеИмяФайла=СокрП(Лев(СокрЛ(ФайлЗагрузки),8))+».DBF»;;
long = 1;
ФС.УстТекКаталог(КаталогЗагрузки);
Результат = «»;
Результат = ФС.НайтиПервыйФайл(ФайлЗагрузки);
Если Результат<>»» Тогда
ФС.ПереименоватьФайл(СокрЛП(КаталогЗагрузки)+»»+ Результат,СокрЛП (КаталогЗагрузки)+»» + КороткоеИмяФайла,1);//теперь наш файл называется R91000.dbf
КонецЕсли;
Иначе
КороткоеИмяФайла=СокрЛП(Лев(ФайлЗагрузки,Поз)+»DBF»);
КонецЕсли;
КонецПроцедуры

Процедура Сформировать()
ИмФайл=СокрЛП(КороткоеИмяФайла);
Док1 = СоздатьОбъект(«Документ.РеестрСчетовВходящийЛПУ»);
ДБФ = СоздатьОбъект(«XBase»);
ФС.УстТекКаталог(КаталогЗагрузки);
ДБФ.ОткрытьФайл(ИмФайл,,1);
Док1.Новый();
ДБФ.Первая();
Пока ДБФ.ВКонце() = 0 Цикл
Док1.НоваяСтрока();
//и т.д.
[/codebox]

В новом варианте обработка файлов с длинными именами все равно невозможна, программа вылетает с теми же ошибками. Подскажите, возможно ли реализовать мою задумку в 1С?

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 надо указывать по любому. наверное это хорошо

  • Ошибка при вызове метода контекста прочитатьxml ошибка преобразования данных xdto
  • Ошибка при вызове метода контекста получитьфункциональнуюопцию
  • Ошибка при вызове метода контекста создатьначальныйобраз
  • Ошибка при вызове метода контекста прочитатьxml записанноезначение прочитатьxml чтениеxml
  • Ошибка при вызове метода контекста получитьформуновогодокумента