Некорректная запись в справочник

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

СтрокаСправочника.Записать();
КонецПроцедуры 
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
9. user1936667 04.10.23 09:25 Сейчас в теме
(1) Это продолжение темы https://forum.infostart.ru/forum63/topic303873/ что-ли? Тот же суперсекретный завод, те же странные вопросы. Что-то ссыкотно мне за учет оборудования нашей оборонки.

Отправляй dbf на сервер и читай там. И справочники записывай там же.
17. Torin57 38 04.10.23 12:04 Сейчас в теме
(1) Вот такой у вас код криво работает?

ПутьКФайлуDBF = "C:\tmp\test.dbf";
	
	Таблица = Новый XBase;
	Таблица.ОткрытьФайл(ПутьКФайлуDBF);
	
	Таблица.Первая(); // перешли к первой записи
	Пока Не Таблица.ВКонце() Цикл
		
		// каждый столбец в новую строку
		Для каждого ПолеDBF Из Таблица.поля Цикл
			ЗначениеТекПоля = Таблица.ПолучитьЗначениеПоля(ПолеDBF.Имя);
 			лкДанные = Новый Структура;
			лкДанные.Вставить(ПолеDBF.Имя, ЗначениеТекПоля);
			СоздатьОборубованиеНаСервере(лкДанные);
		КонецЦикла;
		
		Таблица.Следующая(); // переходим к следующей записи
		
	КонецЦикла;    
	
	Таблица.ЗакрытьФайл();
Показать


Если такой, то можно СоздатьОборубованиеНаСервере(лкДанные) вынести во внешний цикл. Поставить перед Таблица.Следующая. Но вы уже, наверно, и сами разобрались.
18. Sashares 33 04.10.23 12:19 Сейчас в теме
(17)В каком смысле можно? Нужно!
И объявление структуры тоже за цикл.
user1936667; +1 Ответить
2. user5300 1077 04.10.23 08:11 Сейчас в теме
Дилетанты )
Код в студию
3. user1979322 04.10.23 08:28 Сейчас в теме
(2)с этим сложности я на заводе оборонном доступа к интернету нет, через телефон общаюсь. Код критичен?
4. nomad_irk 81 04.10.23 08:36 Сейчас в теме
(3)подключить телефон к компутеру в качестве модема не предлагать?
6. user620512 04.10.23 08:48 Сейчас в теме
(4) поверь, лучше не надо)
5. glek 119 04.10.23 08:37 Сейчас в теме
(3) Код критичен. Не видя кода (причем и клиентской процедуры и серверной) сказать, в чем ошибка не возьмется никто.
8. ZergKRSK 130 04.10.23 09:10 Сейчас в теме
(3) сфотай код на телефон и выложи скрин хотя бы
10. user1936667 04.10.23 09:27 Сейчас в теме
(3)
доступа к интернету нет, через телефон общаюсь.
Вот интересно.
Тебе сейчас код напишут, ты ж его в 1С вручную перебивать будешь?
А почему обратное сделать не можешь?
11. nomad_irk 81 04.10.23 09:31 Сейчас в теме
(10)потому что на телефоне набивать большой текст - несколько проблематично, как я понимаю.
Читать с телефона и набивать код на клавиатуре ПК - заметно проще.
12. user1936667 04.10.23 09:37 Сейчас в теме
(11)
несколько проблематично
Ну, что ж поделать-то?

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

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

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

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

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

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

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

Мне так, уровень твой понять, насколько глубоко тебе объяснять надо.
19. Torin57 38 04.10.23 12:22 Сейчас в теме
(16) Я не работал. Скопировал код из интернета.
20. user1936667 04.10.23 12:28 Сейчас в теме
(19)
Скопировал код из интернета
А он хоть правильный, что ты так в лоб его советуешь?

Весьма ярко - перекрестное опыление, инбридинг, инцухт, инцест и вырождение сообщества. А потом по вашим постам еще и ChatGPT обучаться будет, на который вы тут наяриваете.
21. Torin57 38 04.10.23 12:30 Сейчас в теме
(20)
А он хоть правильный, что ты так в лоб его советуешь?

Не факт. Надо будет вечером проверить что работает.

Но у меня есть веский веский контраргумент :) Ты знаешь как работать с dbf и можешь указать на ошибку в моем коде.
27. Torin57 38 04.10.23 16:13 Сейчас в теме
(20)
А он хоть правильный, что ты так в лоб его советуешь?

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

Даже мой код можно минуснуть. Не вижу проблемы.
28. user1936667 04.10.23 18:54 Сейчас в теме
(27)
привел правильный код.
А как ты это определил?
29. Torin57 38 04.10.23 19:19 Сейчас в теме
(28) Поверил на слово. Какие замечания по коду Sashares'а?
30. user1936667 04.10.23 19:26 Сейчас в теме
(29)
Какие замечания
А вот про это, как и про правильность, by design только ТС сказать может.
32. Torin57 38 05.10.23 09:42 Сейчас в теме
(30)
А вот про это, как и про правильность, by design только ТС сказать может.

Отлично. ТС говорит что помогло. В чем вырождение сообщества? Если вырождение, значит автору что-то не то советуют. Если все то, то все замечательно. Вот этот кусок кода я прочитал, оценил, тоже так буду делать.

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

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


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

Может быть, стоит отправить файлы формата dbf на сервер и читать их там? Также можно записывать там же все справочные данные.

Да, звучит по-дурацки. Но если ставить на чашу весов дурацкий вид новичка и старожила форума, то я голосую за то чтобы по-дурацки звучал старожил. Тогда джуны будут приходить на такой форум и общаться. А сейчас что? Форум еле тащиться. Людей которые готовы терпеть троллинг - меньшинство. Большинство просто на такой форум не придет.
35. user1936667 05.10.23 20:28 Сейчас в теме
(34)
форум должен быть
Кому должен? Доржи вон говорит, что денег должен приносить. Врет?
36. Torin57 38 05.10.23 20:30 Сейчас в теме
(35)
Кому должен? Доржи вон говорит, что денег должен приносить. Врет?

И что? Приносит? При такой слабой посещаемости? Эх, Доржи здесь нет. А то бы прокомментировал.
22. soft_wind 04.10.23 12:37 Сейчас в теме
(16) да, давно уже когда-то работал с дбф-ом,
ну ладно есть не получается загрузкой воспользоваться, тогда можно использовать прямое заполние структуры

ВЦикле - разбора строки таблицы дбф
лкДанные.Наименование = ДанныеДБФ(ПолеСНаименованием);
лкДанные.Код = ДанныеДБФ(ПолеСКодом);
.....
КонецЦикла
СоздатьОборубованиеНаСервере(лкДанные);
23. user1979322 04.10.23 13:25 Сейчас в теме
Вот код

&НаКлиенте
Процедура Фильтровать(Команда)
	ПутьКФайлу="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 Тогда 
		СтрокаСправочника=Справочники.ЗаводскоеОборудование.СоздатьЭлемент();// ВОТ ЗДЕСЬ 
                                                                                                                 СЛОЖНОСТЬ ВОТ ЗДЕСЬ 
	КонецЕсли;	
	СтрокаСправочника[РеквезитСправочник]=Значение;
	СтрокаСправочника.Записать();
КонецПроцедуры
Показать
24. Sashares 33 04.10.23 13:38 Сейчас в теме
(23)
Вам уже написали как исправить.

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

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

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

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

КонецЦикла;

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

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

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

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

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

СтрокаСправочника.Записать();
КонецПроцедуры 
Показать
31. user1979322 05.10.23 07:05 Сейчас в теме
(24)
РеквизитСправочник

Спасибо, помогло. Немного исправил потому что значение РеквизитСправочник выдовал название столбцов объекта Справочники.ЗаводскоеОборудование, и некоторые названия не соответствовали фактическим названиям. Помогло Условие
Если РеквизитСправочник =ФактическимСтолбцам Тогда
        СтрокаСправочника[РеквизитСправочник] = КлючИЗначение.Значение;
КонецЕсли;
33. Sashares 33 05.10.23 09:56 Сейчас в теме
(31)
Заполняйте правильными значениями структуру, будет вам щастье.

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



Ключ - имя столбца, значение - имя реквизита в справочнике.
25. user1992989 04.10.23 15:06 Сейчас в теме
Оборубование, Признок, Реквезитов

Не зря, ох не зря на оборонном заводе секретность разводят. Уровень скрывают.
26. Torin57 38 04.10.23 16:10 Сейчас в теме
(25)
Не зря, ох не зря на оборонном заводе секретность разводят. Уровень скрывают.

Да ладно придираться. Он же не учитель русского языка и литературы.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот