Всем привет. Задача переписать файл с расширением dbf в справочник
Файл dbf на клиенте в цикле считываю значение столбцов и их значение ( т.е беру 1-ую строку и перебираю столбцы) и вызываю процедуру на сервере что бы записать значения ( т.е название столбца и его значение передаю в процедуру в теле цикла), а в процедуре на сервере имеется код

 Справочник. Оборудование. СоздатьЭлемент();. //Вызывается только на сервере

Именно этот код и создает новую строку в цикле. То есть вместо того что бы значение столбцов из файла dbf записать в одну строку, у меня получается каждый столбец в новую строку. Если задам условие, при котором СоздаетсяЭлемент(), в случае начале перебора Столбцов файла dbf Ошибка .
Подскажите как можно записывать значение в нужную строчку справочника
---
Вам уже написали как исправить.

```1c
    &НаКлиенте
    Процедура Фильтровать(Команда)
    ПутьКФайлу="C:\МойПроект\BP0101.DBF";
    ФайлDBF=Новый XBase;
    ФайлDBF.ОткрытьФайл(ПутьКФайлу,,Истина);
    ФайлDBF.Кодировка=КодировкаXBase.OEM;
    Если ФайлDBF.Открыта() Тогда
    ФайлDBF.Первая();
    Пока Не ФайлDBF.ВКонце() Цикл
    // Перебираю Название полей

    СтруктураЗначенийПолей = Новый Структура;

    Для Каждого Поле из ФайлDBF.поля Цикл

    Значение=ФайлDBF.ПолучитьЗначениеПоля(Поле.Имя);
    СтруктураЗначенийПолей.Вставить(Поле.Имя,Значение);

    КонецЦикла;

    ЗаписьСправочникаНаСервере(СтруктураЗначенийПолей );

    ФайлDBF.Следующая();
    КонецЦикла;
    Иначе
    Предупреждение("Не могу открыть файл dbf!");
    КонецЕсли;
    ФайлDBF.ЗакрытьФайл();

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

    &НаСервере
    Процедура ЗаписьСправочникаНаСервере(СтруктураЗначенийПолей )
    СтруктураРеквезитов=Новый Структура;
    СтруктураРеквезитов.Вставить("SYSNO","Сис_N");
    СтруктураРеквезитов.Вставить("NAME","Наименование_");
    //тут заполнить для всех нужных реквизитов

    СтрокаСправочника=Справочники.ЗаводскоеОборудование.СоздатьЭлемент();
    Для Каждого КлючИЗначение Из СтруктураЗначенийПолей Цикл
    РеквизитСправочник = Неопределено;
    Если СтруктураРеквезитов.Свойство(КлючИЗначение.Ключ,РеквизитСправочник) Тогда
    СтрокаСправочника[РеквизитСправочник] = КлючИЗначение.Значение;
    КонецЕсли;
    КонецЦикла;

    СтрокаСправочника.Записать();
    КонецПроцедуры
```
---
Это продолжение темы https://forum.infostart.ru/forum63/topic303873/ что-ли? Тот же суперсекретный завод, те же странные вопросы. Что-то ссыкотно мне за учет оборудования нашей оборонки.

Отправляй dbf на сервер и читай там. И справочники записывай там же.
---
Вот такой у вас код криво работает?

```1c
    ПутьКФайлуDBF = "C:\tmp\test.dbf";

    Таблица = Новый XBase;
    Таблица.ОткрытьФайл(ПутьКФайлуDBF);

    Таблица.Первая(); // перешли к первой записи
    Пока Не Таблица.ВКонце() Цикл

    // каждый столбец в новую строку
    Для каждого ПолеDBF Из Таблица.поля Цикл
    ЗначениеТекПоля = Таблица.ПолучитьЗначениеПоля(ПолеDBF.Имя);
    лкДанные = Новый Структура;
    лкДанные.Вставить(ПолеDBF.Имя, ЗначениеТекПоля);
    СоздатьОборубованиеНаСервере(лкДанные);
    КонецЦикла;

    Таблица.Следующая(); // переходим к следующей записи

    КонецЦикла;

    Таблица.ЗакрытьФайл();
```

Если такой, то можно СоздатьОборубованиеНаСервере(лкДанные) вынести во внешний цикл. Поставить перед Таблица.Следующая. Но вы уже, наверно, и сами разобрались.
---
В каком смысле можно? Нужно!
И объявление структуры тоже за цикл.
---
Дилетанты )
Код в студию
---
с этим сложности я на заводе оборонном доступа к интернету нет, через телефон общаюсь. Код критичен?
---
подключить телефон к компутеру в качестве модема не предлагать?
---
поверь, лучше не надо)
---
Код критичен. Не видя кода (причем и клиентской процедуры и серверной) сказать, в чем ошибка не возьмется никто.
---
сфотай код на телефон и выложи скрин хотя бы
---
доступа к интернету нет, через телефон общаюсь.Вот интересно.
Тебе сейчас код напишут, ты ж его в 1С вручную перебивать будешь?
А почему обратное сделать не можешь?
---
потому что на телефоне набивать большой текст - несколько проблематично, как я понимаю.
Читать с телефона и набивать код на клавиатуре ПК - заметно проще.
---
несколько проблематичноНу, что ж поделать-то?

Дисциплинарный Устав ВС СССР, глава 1, пункт 3:Воинская дисциплина обязывает каждого военнослужащего:
...
- стойко переносить все тяготы и лишения военной службы, не щадить своей крови и самой жизни при выполнении воинского долга;
...
---
Ну либо хоть ошибку выложи.

Вот тут пример - Как прочитать записи файла в формате dbf из 1с 8.3, 8.2

https://helpme1s.ru/chtenie-i-zapis-dbf-v-yazyke-1s-8-3-8-2-v-primerax

Значения столбцов складываются в одну строку, тебе останется ее записать.
---
Примерно такой вариант обработки может быть (самый простой)

```1c
    &НаКлиенте
    Процедура ЧтениеФайлаДБФ()

    //если совпадают имена реквизитов справочника и файла ДБФ
    лкПоля = "Наименование,Код,ИменаОстальныхРеквизитов";
    лкДанные = Новый Структура(лкПоля);
    //..как там у вас открытие и чтение файла
    Для каждого СтрокаДБФ Из ДанныеДБФ Цикл
    ЗаполнитьЗначенияСвойств(лкДанные, СтрокаДБФ);
    СоздатьОборубованиеНаСервере(лкДанные);
    КонецЦикла;

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

    &НаСервере
    Процедура СоздатьОборубованиеНаСервере(лкДанные)

    //здесь можно добавить набор проверок, например, существует ли уже такое оборудование
    лкОборудование = Справочник.Оборудование.СоздатьЭлемент();. //Вызывается только на сервере
    ЗаполнитьЗначенияСвойств(лкОборудование, лкДанные);
    Попытка
    лкОборудование.Записать();
    Исключение
    лкОшибка = ОписаниеОшибки();
    Сообщить(лкОшибка);
    КонецПопытки;

    КонецПроцедуры
```
---
//если совпадают имена реквизитов справочника и файла ДБФВесьма интересно, как ты назовешь в DBF поле как "Наименование".
---
а это что, ключевое слово в ДБФ-е: Наименование ?
(кажется те-же правила действую по наименованию полей что и в 1с)
---
кажетсяВот скажи вот честно. Ты с dbf вообще работал?

Мне так, уровень твой понять, насколько глубоко тебе объяснять надо.
---
Я не работал. Скопировал код из интернета.
---
Скопировал код из интернетаА он хоть правильный, что ты так в лоб его советуешь?

Весьма ярко - перекрестное опыление, инбридинг, инцухт, инцест и вырождение сообщества. А потом по вашим постам еще и ChatGPT обучаться будет, на который вы тут наяриваете.
---
А он хоть правильный, что ты так в лоб его советуешь?
Не факт. Надо будет вечером проверить что работает.

Но у меня есть веский веский контраргумент :) Ты знаешь как работать с dbf и можешь указать на ошибку в моем коде.
---
А он хоть правильный, что ты так в лоб его советуешь?
Что и следовало доказать. Sashares в 24 привел правильный код.
Как говорил один украинский президент, не будем делать из этого трагедию. Это еще в нулевых было. Укры проводили учения ПВО и сбили гражданский самолет. 200 человек погибло.

Даже мой код можно минуснуть. Не вижу проблемы.
---
привел правильный код.А как ты это определил?
---
Поверил на слово. Какие замечания по коду Sashares'а?
---
Какие замечанияА вот про это, как и про правильность, by design только ТС сказать может.
---
А вот про это, как и про правильность, by design только ТС сказать может.
Отлично. ТС говорит что помогло. В чем вырождение сообщества? Если вырождение, значит автору что-то не то советуют. Если все то, то все замечательно. Вот этот кусок кода я прочитал, оценил, тоже так буду делать.

```1c
    СтруктураРеквезитов=Новый Структура;
    СтруктураРеквезитов.Вставить("SYSNO","Сис_N");
    СтруктураРеквезитов.Вставить("NAME","Наименование_");
    //тут заполнить для всех нужных реквизитов

    СтрокаСправочника=Справочники.ЗаводскоеОборудование.СоздатьЭлемент();
    Для Каждого КлючИЗначение Из СтруктураЗначенийПолей Цикл
    РеквизитСправочник = Неопределено;
    Если СтруктураРеквезитов.Свойство(КлючИЗначение.Ключ,РеквизитСправочник) Тогда
    СтрокаСправочника[РеквизитСправочник] = КлючИЗначение.Значение;
    КонецЕсли;
    КонецЦикла;
```

Или ты не хочешь "лошарить" коллегу по цеху? Типа замечания по коду есть, но тогда с Sashares'ом придется поссориться? Тогда согласен, вырождение сообщества.
---
Насчет ChatGPT. Написание кода - это на втором месте. Это ты сможешь подсказать, как показывает практика. На первом месте форум должен быть дружелюбным, должен позволять совершать ошибки и на них учиться.
Вот что умеет ChatGPT. Ему можно сказать чтобы он переформулировал фразу из поста 9 дружелюбно. И он это делает.
Вот его ответ:
Это, кажется, продолжение обсуждения на форуме, верно? Такой же секретный завод и странные вопросы. Честно говоря, я немного волнуюсь о безопасности оборудования для нашей обороны.

Может быть, стоит отправить файлы формата dbf на сервер и читать их там? Также можно записывать там же все справочные данные.
Да, звучит по-дурацки. Но если ставить на чашу весов дурацкий вид новичка и старожила форума, то я голосую за то чтобы по-дурацки звучал старожил. Тогда джуны будут приходить на такой форум и общаться. А сейчас что? Форум еле тащиться. Людей которые готовы терпеть троллинг - меньшинство. Большинство просто на такой форум не придет.
---
форум должен бытьКому должен? Доржи вон говорит, что денег должен приносить. Врет?
---
Кому должен? Доржи вон говорит, что денег должен приносить. Врет?
И что? Приносит? При такой слабой посещаемости? Эх, Доржи здесь нет. А то бы прокомментировал.
---
да, давно уже когда-то работал с дбф-ом,
ну ладно есть не получается загрузкой воспользоваться, тогда можно использовать прямое заполние структуры

```1c
    ВЦикле - разбора строки таблицы дбф
    лкДанные.Наименование = ДанныеДБФ(ПолеСНаименованием);
    лкДанные.Код = ДанныеДБФ(ПолеСКодом);
    .....
    КонецЦикла
    СоздатьОборубованиеНаСервере(лкДанные);
```
---
Вот код

```1c
    &НаКлиенте
    Процедура Фильтровать(Команда)
    ПутьКФайлу="C:\МойПроект\BP0101.DBF";
    ФайлDBF=Новый XBase;
    ФайлDBF.ОткрытьФайл(ПутьКФайлу,,Истина);
    ФайлDBF.Кодировка=КодировкаXBase.OEM;
    Если ФайлDBF.Открыта() Тогда
    ФайлDBF.Первая();
    Пока Не ФайлDBF.ВКонце() Цикл
    // Перебираю Название полей
    ПризнокНовойСтроки=1;//Для записи создаю новую строку или нет
    Для Каждого Поле из ФайлDBF.поля Цикл
    //
    НазваниеСтолбца=Поле.Имя;
    Если ((НазваниеСтолбца="SYSNO") Или (НазваниеСтолбца="NAME")) Тогда
    Значение=ФайлDBF.ПолучитьЗначениеПоля(НазваниеСтолбца);

    ЗаписьСправочникаНаСервере(НазваниеСтолбца,Значение,ПризнокНовойСтроки);
    ПризнокНовойСтроки=0;//Для записи создаю новую строку или нет
    КонецЕсли;
    // Сообщить(НазваниеСтолбца);
    КонецЦикла;
    ПризнокНовойСтроки=1;
    ФайлDBF.Следующая();
    КонецЦикла;
    Иначе
    Предупреждение("Не могу открыть файл dbf!");
    КонецЕсли;
    ФайлDBF.ЗакрытьФайл();

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

    &НаСервере
    Процедура ЗаписьСправочникаНаСервере(НазваниеСтолбца,Значение,ПризнокНовойСтроки)
    СтруктураРеквезитов=Новый Структура;
    СтруктураРеквезитов.Вставить("SYSNO","Сис_N");
    СтруктураРеквезитов.Вставить("NAME","Наименование_");

    РеквезитСправочник=СтруктураРеквезитов[НазваниеСтолбца];
    Если ПризнокНовойСтроки=1 Тогда
    СтрокаСправочника=Справочники.ЗаводскоеОборудование.СоздатьЭлемент();// ВОТ ЗДЕСЬ
    СЛОЖНОСТЬ ВОТ ЗДЕСЬ
    КонецЕсли;
    СтрокаСправочника[РеквезитСправочник]=Значение;
    СтрокаСправочника.Записать();
    КонецПроцедуры
```
---
Вам уже написали как исправить.

```1c
    &НаКлиенте
    Процедура Фильтровать(Команда)
    ПутьКФайлу="C:\МойПроект\BP0101.DBF";
    ФайлDBF=Новый XBase;
    ФайлDBF.ОткрытьФайл(ПутьКФайлу,,Истина);
    ФайлDBF.Кодировка=КодировкаXBase.OEM;
    Если ФайлDBF.Открыта() Тогда
    ФайлDBF.Первая();
    Пока Не ФайлDBF.ВКонце() Цикл
    // Перебираю Название полей

    СтруктураЗначенийПолей = Новый Структура;

    Для Каждого Поле из ФайлDBF.поля Цикл

    Значение=ФайлDBF.ПолучитьЗначениеПоля(Поле.Имя);
    СтруктураЗначенийПолей.Вставить(Поле.Имя,Значение);

    КонецЦикла;

    ЗаписьСправочникаНаСервере(СтруктураЗначенийПолей );

    ФайлDBF.Следующая();
    КонецЦикла;
    Иначе
    Предупреждение("Не могу открыть файл dbf!");
    КонецЕсли;
    ФайлDBF.ЗакрытьФайл();

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

    &НаСервере
    Процедура ЗаписьСправочникаНаСервере(СтруктураЗначенийПолей )
    СтруктураРеквезитов=Новый Структура;
    СтруктураРеквезитов.Вставить("SYSNO","Сис_N");
    СтруктураРеквезитов.Вставить("NAME","Наименование_");
    //тут заполнить для всех нужных реквизитов

    СтрокаСправочника=Справочники.ЗаводскоеОборудование.СоздатьЭлемент();
    Для Каждого КлючИЗначение Из СтруктураЗначенийПолей Цикл
    РеквизитСправочник = Неопределено;
    Если СтруктураРеквезитов.Свойство(КлючИЗначение.Ключ,РеквизитСправочник) Тогда
    СтрокаСправочника[РеквизитСправочник] = КлючИЗначение.Значение;
    КонецЕсли;
    КонецЦикла;

    СтрокаСправочника.Записать();
    КонецПроцедуры
```
---
РеквизитСправочник
Спасибо, помогло. Немного исправил потому что значение РеквизитСправочник выдовал название столбцов объекта Справочники.ЗаводскоеОборудование, и некоторые названия не соответствовали фактическим названиям. Помогло Условие

```1c
    Если РеквизитСправочник =ФактическимСтолбцам Тогда
    СтрокаСправочника[РеквизитСправочник] = КлючИЗначение.Значение;
    КонецЕсли;
```
---
Заполняйте правильными значениями структуру, будет вам щастье.

```1c
    СтруктураРеквезитов=Новый Структура;
    СтруктураРеквезитов.Вставить("SYSNO","Сис_N");
    СтруктураРеквезитов.Вставить("NAME","Наименование_");
```

Ключ - имя столбца, значение - имя реквизита в справочнике.
---
Оборубование, Признок, Реквезитов
Не зря, ох не зря на оборонном заводе секретность разводят. Уровень скрывают.
---
Не зря, ох не зря на оборонном заводе секретность разводят. Уровень скрывают.
Да ладно придираться. Он же не учитель русского языка и литературы.