Всем привет. Задача переписать файл с расширением dbf в справочник
Файл dbf на клиенте в цикле считываю значение столбцов и их значение ( т.е беру 1-ую строку и перебираю столбцы) и вызываю процедуру на сервере что бы записать значения ( т.е название столбца и его значение передаю в процедуру в теле цикла), а в процедуре на сервере имеется код
Справочник. Оборудование. СоздатьЭлемент();. //Вызывается только на сервере
Именно этот код и создает новую строку в цикле. То есть вместо того что бы значение столбцов из файла dbf записать в одну строку, у меня получается каждый столбец в новую строку. Если задам условие, при котором СоздаетсяЭлемент(), в случае начале перебора Столбцов файла dbf Ошибка .
Подскажите как можно записывать значение в нужную строчку справочника
&НаКлиенте
Процедура Фильтровать(Команда)
ПутьКФайлу="C:\МойПроект\BP0101.DBF";
ФайлDBF=Новый XBase;
ФайлDBF.ОткрытьФайл(ПутьКФайлу,,Истина);
ФайлDBF.Кодировка=КодировкаXBase.OEM;
Если ФайлDBF.Открыта() Тогда
ФайлDBF.Первая();
Пока Не ФайлDBF.ВКонце() Цикл
// Перебираю Название полей
СтруктураЗначенийПолей = Новый Структура;
Для Каждого Поле из ФайлDBF.поля Цикл
Значение=ФайлDBF.ПолучитьЗначениеПоля(Поле.Имя);
СтруктураЗначенийПолей.Вставить(Поле.Имя,Значение);
КонецЦикла;
ЗаписьСправочникаНаСервере(СтруктураЗначенийПолей );
ФайлDBF.Следующая();
КонецЦикла;
Иначе
Предупреждение("Не могу открыть файл dbf!");
КонецЕсли;
ФайлDBF.ЗакрытьФайл();
КонецПроцедуры
&НаСервере
Процедура ЗаписьСправочникаНаСервере(СтруктураЗначенийПолей )
СтруктураРеквезитов=Новый Структура;
СтруктураРеквезитов.Вставить("SYSNO","Сис_N");
СтруктураРеквезитов.Вставить("NAME","Наименование_");
//тут заполнить для всех нужных реквизитов
СтрокаСправочника=Справочники.ЗаводскоеОборудование.СоздатьЭлемент();
Для Каждого КлючИЗначение Из СтруктураЗначенийПолей Цикл
РеквизитСправочник = Неопределено;
Если СтруктураРеквезитов.Свойство(КлючИЗначение.Ключ,РеквизитСправочник) Тогда
СтрокаСправочника[РеквизитСправочник] = КлючИЗначение.Значение;
КонецЕсли;
КонецЦикла;
СтрокаСправочника.Записать();
КонецПроцедуры
ПутьКФайлуDBF = "C:\tmp\test.dbf";
Таблица = Новый XBase;
Таблица.ОткрытьФайл(ПутьКФайлуDBF);
Таблица.Первая(); // перешли к первой записи
Пока Не Таблица.ВКонце() Цикл
// каждый столбец в новую строку
Для каждого ПолеDBF Из Таблица.поля Цикл
ЗначениеТекПоля = Таблица.ПолучитьЗначениеПоля(ПолеDBF.Имя);
лкДанные = Новый Структура;
лкДанные.Вставить(ПолеDBF.Имя, ЗначениеТекПоля);
СоздатьОборубованиеНаСервере(лкДанные);
КонецЦикла;
Таблица.Следующая(); // переходим к следующей записи
КонецЦикла;
Таблица.ЗакрытьФайл();
Показать
Если такой, то можно СоздатьОборубованиеНаСервере(лкДанные) вынести во внешний цикл. Поставить перед Таблица.Следующая. Но вы уже, наверно, и сами разобрались.
(10)потому что на телефоне набивать большой текст - несколько проблематично, как я понимаю.
Читать с телефона и набивать код на клавиатуре ПК - заметно проще.
Воинская дисциплина обязывает каждого военнослужащего:
...
- стойко переносить все тяготы и лишения военной службы, не щадить своей крови и самой жизни при выполнении воинского долга;
...
Примерно такой вариант обработки может быть (самый простой)
&НаКлиенте
Процедура ЧтениеФайлаДБФ()
//если совпадают имена реквизитов справочника и файла ДБФ
лкПоля = "Наименование,Код,ИменаОстальныхРеквизитов";
лкДанные = Новый Структура(лкПоля);
//..как там у вас открытие и чтение файла
Для каждого СтрокаДБФ Из ДанныеДБФ Цикл
ЗаполнитьЗначенияСвойств(лкДанные, СтрокаДБФ);
СоздатьОборубованиеНаСервере(лкДанные);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура СоздатьОборубованиеНаСервере(лкДанные)
//здесь можно добавить набор проверок, например, существует ли уже такое оборудование
лкОборудование = Справочник.Оборудование.СоздатьЭлемент();. //Вызывается только на сервере
ЗаполнитьЗначенияСвойств(лкОборудование, лкДанные);
Попытка
лкОборудование.Записать();
Исключение
лкОшибка = ОписаниеОшибки();
Сообщить(лкОшибка);
КонецПопытки;
КонецПроцедуры
А он хоть правильный, что ты так в лоб его советуешь?
Весьма ярко - перекрестное опыление, инбридинг, инцухт, инцест и вырождение сообщества. А потом по вашим постам еще и ChatGPT обучаться будет, на который вы тут наяриваете.
А он хоть правильный, что ты так в лоб его советуешь?
Что и следовало доказать. Sashares в 24 привел правильный код.
Как говорил один украинский президент, не будем делать из этого трагедию. Это еще в нулевых было. Укры проводили учения ПВО и сбили гражданский самолет. 200 человек погибло.
А вот про это, как и про правильность, by design только ТС сказать может.
Отлично. ТС говорит что помогло. В чем вырождение сообщества? Если вырождение, значит автору что-то не то советуют. Если все то, то все замечательно. Вот этот кусок кода я прочитал, оценил, тоже так буду делать.
СтруктураРеквезитов=Новый Структура;
СтруктураРеквезитов.Вставить("SYSNO","Сис_N");
СтруктураРеквезитов.Вставить("NAME","Наименование_");
//тут заполнить для всех нужных реквизитов
СтрокаСправочника=Справочники.ЗаводскоеОборудование.СоздатьЭлемент();
Для Каждого КлючИЗначение Из СтруктураЗначенийПолей Цикл
РеквизитСправочник = Неопределено;
Если СтруктураРеквезитов.Свойство(КлючИЗначение.Ключ,РеквизитСправочник) Тогда
СтрокаСправочника[РеквизитСправочник] = КлючИЗначение.Значение;
КонецЕсли;
КонецЦикла;
Показать
Или ты не хочешь "лошарить" коллегу по цеху? Типа замечания по коду есть, но тогда с Sashares'ом придется поссориться? Тогда согласен, вырождение сообщества.
(20) Насчет ChatGPT. Написание кода - это на втором месте. Это ты сможешь подсказать, как показывает практика. На первом месте форум должен быть дружелюбным, должен позволять совершать ошибки и на них учиться.
Вот что умеет ChatGPT. Ему можно сказать чтобы он переформулировал фразу из поста 9 дружелюбно. И он это делает.
Вот его ответ:
Это, кажется, продолжение обсуждения на форуме, верно? Такой же секретный завод и странные вопросы. Честно говоря, я немного волнуюсь о безопасности оборудования для нашей обороны.
Может быть, стоит отправить файлы формата dbf на сервер и читать их там? Также можно записывать там же все справочные данные.
Да, звучит по-дурацки. Но если ставить на чашу весов дурацкий вид новичка и старожила форума, то я голосую за то чтобы по-дурацки звучал старожил. Тогда джуны будут приходить на такой форум и общаться. А сейчас что? Форум еле тащиться. Людей которые готовы терпеть троллинг - меньшинство. Большинство просто на такой форум не придет.
(16) да, давно уже когда-то работал с дбф-ом,
ну ладно есть не получается загрузкой воспользоваться, тогда можно использовать прямое заполние структуры
&НаКлиенте
Процедура Фильтровать(Команда)
ПутьКФайлу="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 Тогда
СтрокаСправочника=Справочники.ЗаводскоеОборудование.СоздатьЭлемент();// ВОТ ЗДЕСЬ
СЛОЖНОСТЬ ВОТ ЗДЕСЬ
КонецЕсли;
СтрокаСправочника[РеквезитСправочник]=Значение;
СтрокаСправочника.Записать();
КонецПроцедуры
&НаКлиенте
Процедура Фильтровать(Команда)
ПутьКФайлу="C:\МойПроект\BP0101.DBF";
ФайлDBF=Новый XBase;
ФайлDBF.ОткрытьФайл(ПутьКФайлу,,Истина);
ФайлDBF.Кодировка=КодировкаXBase.OEM;
Если ФайлDBF.Открыта() Тогда
ФайлDBF.Первая();
Пока Не ФайлDBF.ВКонце() Цикл
// Перебираю Название полей
СтруктураЗначенийПолей = Новый Структура;
Для Каждого Поле из ФайлDBF.поля Цикл
Значение=ФайлDBF.ПолучитьЗначениеПоля(Поле.Имя);
СтруктураЗначенийПолей.Вставить(Поле.Имя,Значение);
КонецЦикла;
ЗаписьСправочникаНаСервере(СтруктураЗначенийПолей );
ФайлDBF.Следующая();
КонецЦикла;
Иначе
Предупреждение("Не могу открыть файл dbf!");
КонецЕсли;
ФайлDBF.ЗакрытьФайл();
КонецПроцедуры
&НаСервере
Процедура ЗаписьСправочникаНаСервере(СтруктураЗначенийПолей )
СтруктураРеквезитов=Новый Структура;
СтруктураРеквезитов.Вставить("SYSNO","Сис_N");
СтруктураРеквезитов.Вставить("NAME","Наименование_");
//тут заполнить для всех нужных реквизитов
СтрокаСправочника=Справочники.ЗаводскоеОборудование.СоздатьЭлемент();
Для Каждого КлючИЗначение Из СтруктураЗначенийПолей Цикл
РеквизитСправочник = Неопределено;
Если СтруктураРеквезитов.Свойство(КлючИЗначение.Ключ,РеквизитСправочник) Тогда
СтрокаСправочника[РеквизитСправочник] = КлючИЗначение.Значение;
КонецЕсли;
КонецЦикла;
СтрокаСправочника.Записать();
КонецПроцедуры
Спасибо, помогло. Немного исправил потому что значение РеквизитСправочник выдовал название столбцов объекта Справочники.ЗаводскоеОборудование, и некоторые названия не соответствовали фактическим названиям. Помогло Условие
Если РеквизитСправочник =ФактическимСтолбцам Тогда
СтрокаСправочника[РеквизитСправочник] = КлючИЗначение.Значение;
КонецЕсли;