Запрос из 1с к MySQL

1. aEx_gor 10.06.19 20:20 Сейчас в теме
Здравствуйте, опыта программирования не имею, хотелось бы получить помощь

Есть внешняя база данных MySQL, которая хранит инфомарцию, нужно построить запрос к этой базе данных на вывод и запись информации сразу в справочники, пробовал подключать базу, как внешний источник базы данных и делал вывод на основании, получилось - результат не очень.
Второй раз, сделал из формы справочника, получилось сделать запрос, вывести через выборку сообщением, а записать не получается.

Хотелось бы узнать как построить запрос к этой базе данных и записать информацию напрямую из базы данных в справочник по нажатию одной кнопки.
По теме из базы знаний
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
12. user1226414 11.06.19 12:25 Сейчас в теме
(1) У меня сложилось впечатление, что вы хотите перенести информацию из таблицы внешней базы в справочник. Если это так и нет дополнительных условий, то можно сделать как-то так, - создаете внешнюю обработку, у нее форму, на форме команду, в модуле обработчик, как написано у вас, только добавляем создание и запись элемента справочника.
&НаКлиенте
Процедура Подкл(Команда) 
	ПодклНаСервере(); 
КонецПроцедуры 

&НаСервере 
Процедура ПодклНаСервере() 
	Запрос = Новый Запрос; 
	Запрос.Текст = "ВЫБРАТЬ 
		| customer_company.name КАК ИМЯ, 
		| customer_company.INN КАК ИНН, 
		| customer_company.OGRN КАК ОГРН 
		|ИЗ 
		| ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Таблица.customer_company КАК customer_company"; 
	Результат = Запрос.Выполнить().Выбрать(); 
	Пока Результат.Следующий() Цикл 
		НовыйЭлемент = Справочники.КомпанииПокупатели.СоздатьЭлемент();
		НовыйЭлемент.Наименование = Результат.ИМЯ; 
		НовыйЭлемент.ИНН = Результат.ИНН; 
		НовыйЭлемент.ОГРН = Результат.ОГРН; 
		НовыйЭлемент.Записать();
		Сообщить("записан Имя: " + Результат.ИМЯ + "ИНН: " + Результат.ИНН + "ОГРН " + Результат.ОГРН); 
	КонецЦикла; 
КонецПроцедуры
Показать

Название справочника "КомпанииПокупатели" и его поля - выдуманные, вам надо указать те, которые у вас в базе.
13. aEx_gor 12.06.19 15:48 Сейчас в теме
(12)
Спасибо большое, все работает, еще хотел бы спросить, если делать как обработку, в справочнике записана информация с прошлого раза, при повторной записи выпадает ошибка, что значение поля код не уникально, можно ли сделать как-то, чтоб выводилось сообщение о том, что такая запись уже есть и предоставлялся выбор, обновить остальные поля или нет, буду очень благодарен
15. user1226414 13.06.19 06:37 Сейчас в теме
(13) Вместо того, чтобы сразу создавать новый объект можно проверить, есть ли такой уже в справочнике
СтарыйЭлемент = Справочники.КомпанииПокупатели.НайтиПоКоду(Результат.КОД);
Если НЕ ЗначениеЗаполнено(СтарыйЭлемент) Тогда
... создаем новый элемент
Иначе
... изменяем старый элемент, для этого его надо получить как объект
СтарыйЭлементОбъект = СтарыйЭлемент.ПолучитьОбъект();
потом у этого объекта изменить нужные свойства и записать.
По поводу того, чтобы задавать вопрос на каждый элемент - это уже сложнее, поскольку процедура выполняется на сервере, а чтобы спросить надо лезть на клиент. Вам надо определиться, стоит ли задавать вопрос каждый раз, или можно просто вывести на форму параметр, вроде "ОбновлятьСтарыеЭлементы" типа Булево и передавать его в процедуру. Если же все-таки решили задолбать пользователя вопросами по каждому элементу, - вам придется придумывать хитрый план.
16. aEx_gor 13.06.19 13:39 Сейчас в теме
(15)Наверное не так выразился, мне не нужно выводить запрос на каждый элемент. По вашему коду получилось вынести все нужные записи в справочник,НО при повторном использовании данной обработки он записывает эти данные еще раз ( то есть получается два клиента с одинаковыми данными в справочнике), вопрос стоит в том, как сделать чтоб обработка отбирала по ИНН и если есть уже запись с таким ИНН она спрашивала разрешние и обновляла остальные поля, то есть ОГРН КПП ОКАТО и т.д., а если такого ИНН нет, она просто добавляла еще одну запись в справочник.
17. user1226414 14.06.19 06:45 Сейчас в теме
(16) Не, все понятно, но посудите сами, при втором запуске обработки количество записей, которые уже есть будет... "почти все", поскольку первым запуском был перенесен весь справочник. Тоесть если в справочнике было 100 записей в первый раз и 101 во второй, - вы получите 100 вопросов, которые пользователь должен будет прокликать. За такую автоматизацию обычно руки отрывают ) Поэтому и возникает повод задуматься - а вам действительно нужно именно вопрос задать пользователю, а не сделать выбор между "перезаписью" и "пропуском" каким-то другим способом? Вам как студенту могли поставить задачу именно так для обучения, но у меня есть сомнения, поскольку судя по вашим вопросам задача "задать пользователю вопрос с сервера" немного не вашего уровня.
А для проверки, есть ли такой ИНН в справочнике можно в цикле вместо записи вставить код с условием:
		РезультатПоиска = Справочники.КомпанииПокупатели.НайтиПоРеквизиту("ИНН", Результат.ИНН);
		Если РезультатПоиска = Справочники.КомпанииПокупатели.ПустаяСсылка() Тогда
			НовыйЭлемент = Справочники.КомпанииПокупатели.СоздатьЭлемент();
			НовыйЭлемент.Наименование = Результат.ИМЯ; 
			НовыйЭлемент.ИНН = Результат.ИНН; 
			НовыйЭлемент.ОГРН = Результат.ОГРН; 
			НовыйЭлемент.Записать();
			Сообщить("записан Имя: " + Результат.ИМЯ + "ИНН: " + Результат.ИНН + "ОГРН " + Результат.ОГРН); 
		ИначеЕсли ПерезаписыватьЭлемент Тогда 
			СтарыйЭлемент = РезультатПоиска.ПолучитьОбъект();
			СтарыйЭлемент.Наименование = Результат.ИМЯ; 
			СтарыйЭлемент.ОГРН = Результат.ОГРН; 
			СтарыйЭлемент.Записать();
			Сообщить("перезаписан Имя: " + Результат.ИМЯ + "ИНН: " + Результат.ИНН + "ОГРН " + Результат.ОГРН); 
		Иначе 
			Сообщить("пропущен Имя: " + Результат.ИМЯ + "ИНН: " + Результат.ИНН + "ОГРН " + Результат.ОГРН); 			
		КонецЕсли; 
Показать

где ПерезаписыватьЭлемент это параметр, который передается в процедуру с формы и определяет, будет обработка перезаписывать элементы или пропускать.
18. aEx_gor 14.06.19 11:17 Сейчас в теме
(17) Сделал по вашему вчерашнему примеру, получилось чуть-чуть не так

&НаСервере
Процедура ЗаписатьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| customer_company.name КАК ПолноеНаименование,
| customer_company.INN КАК ИНН,
| customer_company.OGRN КАК ОГРН,
| customer_company.KPP КАК КПП,
| customer_company.OKATO КАК ОКАТО,
| customer_company.OKPO КАК ОКПО,
| customer_company.bank КАК Филиал,
| customer_company.CheckACC КАК РасчетныйСчет,
| customer_company.BIC КАК БИК,
| customer_company.CorACC КАК КорСчет
|ИЗ
| ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Таблица.customer_company КАК customer_company";

Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
ПолноеНаименование = Результат.ПолноеНаименование;
ИНН = Результат.ИНН;
ОГРН = Результат.ОГРН;
КПП = Результат.КПП;
ОКАТО = Результат.ОКАТО;
ОКПО = Результат.ОКПО;
Филиал = Результат.Филиал;
РасчетныйСчет = Результат.РасчетныйСчет;
БИК = Результат.БИК;
КорСчет = Результат.КорСчет;

//Сообщить("ПолноеНаименование: " + ПолноеНаименование + "ИНН: " + ИНН );

РезультатПоиска = Справочники.Контрагент.НайтиПоРеквизиту("ИНН", Результат.ИНН);
Если РезультатПоиска = Справочники.Контрагент.ПустаяСсылка() Тогда
НовыйЭлемент = Справочники.Контрагент.СоздатьЭлемент();
НовыйЭлемент.ПолноеНаименование = ПолноеНаименование;
НовыйЭлемент.ИНН = ИНН ;
НовыйЭлемент.ОГРН = ОГРН;
НовыйЭлемент.КПП = КПП;
НовыйЭлемент.ОКАТО = ОКАТО;
НовыйЭлемент.ОКПО = ОКПО;
НовыйЭлемент.Записать();
Сообщить("ПолноеНаименование: " + ПолноеНаименование + "ИНН: " + ИНН );
Иначе
СтарыйЭлемент = РезультатПоиска.ПолучитьОбъект();
СтарыйЭлемент.ПолноеНаименование = Результат.ПолноеНаименование;
СтарыйЭлемент.ИНН = Результат.ИНН ;
СтарыйЭлемент.ОГРН = Результат.ОГРН;
СтарыйЭлемент.КПП = Результат.КПП;
СтарыйЭлемент.ОКАТО = Результат.ОКАТО;
СтарыйЭлемент.ОКПО = Результат.ОКПО;
СтарыйЭлемент.Записать();
КонецЕсли
//НовыйЭлемент = Справочники.Банки.СоздатьЭлемент();
//НовыйЭлемент.Филиал = Филиал;
//НовыйЭлемент.РасчетныйСчет = РасчетныйСчет;
//НовыйЭлемент.БИК = БИК;
//НовыйЭЛемент.КорСчет = КорСчет;
//НовыйЭлемент.Записать();
КонецЦикла;
КонецПроцедур
Показать



Хотел уточнить, а вместо перезаписи можно ли сделать по другому, а именно чтоб когда он сравнил ИНН он не перезаписывал, а оставил данные как есть, то есть увидел он ИНН компании, остальные данные не перезаписывал, а оставлял как есть.
И второй вопросик, добавил еще один справочник, в котором хранятся Филиал,расчетныйсчет, бик и кор.счет, они у меня в бд прописаны для каждого клиента свои, можно ли как-то после их записи в справочник, при открытии справочника контрагенты просмотреть именно его реквизиты( не весь справочник, а чтоб он подтянул к нужному контрагенту, его реквизиты из второго справочника), как я понял надо указать справочник контрагент владельцем справочника Банки, но не понял как к отдельному контрагенту привязать отдельные реквизиты.

И хочу сказать огромное вам спасибо, за помощь и наглядные примеры, которых так не хватает. Еще раз спасибо огромное
19. user1226414 14.06.19 13:23 Сейчас в теме
(18) Конечно, не перезаписывать еще проще - все, что в блоке "Иначе" (работа со СтарымЭлементом) убрать или закомментировать, тоесть успокаиваемся на том, что элемент найден.
Если вы создаете подчиненный справочник, то чтобы привязать его записи к владельцу надо в них заполнить поле "Владелец".
При загрузке из вашего запроса это будет выглядеть как-то так:
НовыйЭлемент = Справочники.Контрагент.СоздатьЭлемент();
НовыйЭлемент.ПолноеНаименование = ПолноеНаименование;
...
НовыйЭлемент.Записать();
НовыйПодчиненныйЭлемент = Справочники.БанковскиеСчета.СоздатьЭлемент();
НовыйПодчиненныйЭлемент.Владелец = НовыйЭлемент; // это связь
НовыйПодчиненныйЭлемент.Филиал = Результат.Филиал;
НовыйПодчиненныйЭлемент.РасчетныйСчет = Результат.РасчетныйСчет;
НовыйПодчиненныйЭлемент.БИК = Результат.БИК;
НовыйПодчиненныйЭлемент.КорСчет = Результат.КорСчет;
НовыйПодчиненныйЭлемент.Записать();
Показать

где БанковскиеСчета - справочник, у которого во владельцах указан справочник Контрагент.

Пожалуйста )
20. aEx_gor 14.06.19 14:29 Сейчас в теме
(19)
РезультатПоиска = Справочники.Контрагент.НайтиПоРеквизиту("ИНН", Результат.ИНН);
Если РезультатПоиска = Справочники.Контрагент.ПустаяСсылка() Тогда
НовыйЭлемент = Справочники.Контрагент.СоздатьЭлемент();
НовыйЭлемент.ПолноеНаименование = ПолноеНаименование;
НовыйЭлемент.ИНН = ИНН ;
НовыйЭлемент.ОГРН = ОГРН;
НовыйЭлемент.КПП = КПП;
НовыйЭлемент.ОКАТО = ОКАТО;
НовыйЭлемент.ОКПО = ОКПО;
НовыйЭлемент.Записать();
Сообщить("ПолноеНаименование: " + ПолноеНаименование + "ИНН: " + ИНН );
КонецЕсли;
НовыйПодчиненыйЭлемент = Справочники.Банки.СоздатьЭлемент();
НовыйПодчиненыйЭлемент.Владелец = НовыйЭлемент;
НовыйПодчиненыйЭлемент.Филиал = Результат.Филиал;
НовыйПодчиненыйЭлемент.РасчетныйСчет = Результат.РасчетныйСчет;
НовыйПодчиненыйЭлемент.БИК = Результат.БИК;
НовыйПодчиненыйЭлемент.КорСчет = Результат.КорСчет;
НовыйПодчиненыйЭлемент.Записать();
КонецЦикла;
Показать



НовыйПодчиненыйЭлемент.Владелец = НовыйЭлемент; Ошибка "Значение поля Владелец не заполнено или заполнено неверно"
НовыйПодчиненыйЭлемент.Владелец = НовыйЭлемент.ПолноеНаименование; Ошибка: "Значение не является значением объектного типа"
21. user1226414 14.06.19 16:29 Сейчас в теме
(20) Не, скорее
НовыйПодчиненыйЭлемент.Владелец = НовыйЭлемент.Ссылка;
не всегда помню когда оно ссылку само берет, а когда надо указывать
22. aEx_gor 14.06.19 16:57 Сейчас в теме
(21)Получилось записать при пустом справочнике, если в справочнике есть информация запись не происходит выдает ошибку "Значение не является значением объектного типа (Ссылка).
Записывает только первые реквизиты(для записи нужно опять построить цикл, правильно?) и владелец справочника указывается как <> и более ничего, а если смотреть из справочника контрагент при переходе на вкладку банки он почему-то пустой=(, хотя информация есть в справочнике банки.
23. user1226414 14.06.19 18:48 Сейчас в теме
(22) А, так понятно, я на ваш код невнимательно посмотрел ) Если элемент уже найден, то НовыйЭлемент вообще не заполняется. Давайте перед созданием записи в Банки еще раз найдем контрагента, так вернее будет
… тут поискали и создали если нет
КонецЕсли;
Контрагент = Справочники.Контрагент.НайтиПоРеквизиту("ИНН", Результат.ИНН); //теперь он уже в любом случае должен быть
НовыйПодчиненыйЭлемент = Справочники.Банки.СоздатьЭлемент();
НовыйПодчиненыйЭлемент.Владелец = Контрагент;
...

а цикл может и не понадобится, если у вас в запросе контрагент соединен с реквизитами
24. aEx_gor 14.06.19 19:24 Сейчас в теме
(23) Ошибка пропала, но он так же берет только один реквизит и оставляет поле владельца <> вот таким и при выборе клиента из справочника Контрагент -> Вкладка банки остается пустой

При добавлении в цикл, он начинает дублировать банковские реквизиты, как будто не хватает связи между ИНН и этими реквизитами

&НаКлиенте
Процедура Записать(Команда)
ЗаписатьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаписатьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| customer_company.name КАК ПолноеНаименование,
| customer_company.INN КАК ИНН,
| customer_company.OGRN КАК ОГРН,
| customer_company.KPP КАК КПП,
| customer_company.OKATO КАК ОКАТО,
| customer_company.OKPO КАК ОКПО,
| customer_company.bank КАК Филиал,
| customer_company.CheckACC КАК РасчетныйСчет,
| customer_company.BIC КАК БИК,
| customer_company.CorACC КАК КорСчет
|ИЗ
| ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Таблица.customer_company КАК customer_company";

Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
ПолноеНаименование = Результат.ПолноеНаименование;
ИНН = Результат.ИНН;
ОГРН = Результат.ОГРН;
КПП = Результат.КПП;
ОКАТО = Результат.ОКАТО;
ОКПО = Результат.ОКПО;
Филиал = Результат.Филиал;
РасчетныйСчет = Результат.РасчетныйСчет;
БИК = Результат.БИК;
КорСчет = Результат.КорСчет;


РезультатПоиска = Справочники.Контрагент.НайтиПоРеквизиту("ИНН", Результат.ИНН);
Если РезультатПоиска = Справочники.Контрагент.ПустаяСсылка() Тогда
НовыйЭлемент = Справочники.Контрагент.СоздатьЭлемент();
НовыйЭлемент.ПолноеНаименование = ПолноеНаименование;
НовыйЭлемент.ИНН = ИНН ;
НовыйЭлемент.ОГРН = ОГРН;
НовыйЭлемент.КПП = КПП;
НовыйЭлемент.ОКАТО = ОКАТО;
НовыйЭлемент.ОКПО = ОКПО;
НовыйЭлемент.Записать();
Сообщить("ПолноеНаименование: " + ПолноеНаименование + "ИНН: " + ИНН );
КонецЕсли;
Контрагент = Справочники.Контрагент.НайтиПоРеквизиту("ИНН", Результат.ИНН);
НовыйПодчиненыйЭлемент = Справочники.Банки.СоздатьЭлемент();
НовыйПодчиненыйЭлемент.Владелец = Контрагент;
НовыйПодчиненыйЭлемент.Филиал = Результат.Филиал;
НовыйПодчиненыйЭлемент.РасчетныйСчет = Результат.РасчетныйСчет;
НовыйПодчиненыйЭлемент.БИК = Результат.БИК;
НовыйПодчиненыйЭлемент.КорСчет = Результат.КорСчет;
НовыйПодчиненыйЭлемент.Записать();
КонецЦикла;


// Контрагент = Справочники.Контрагент.НайтиПоРеквизиту("ИНН", Результат.ИНН);
//НовыйПодчиненыйЭлемент = Справочники.Банки.СоздатьЭлемент();
// НовыйПодчиненыйЭлемент.Владелец = Контрагент;
// НовыйПодчиненыйЭлемент.Филиал = Результат.Филиал;
// НовыйПодчиненыйЭлемент.РасчетныйСчет = Результат.РасчетныйСчет;
// НовыйПодчиненыйЭлемент.БИК = Результат.БИК;
// НовыйПодчиненыйЭлемент.КорСчет = Результат.КорСчет;
// НовыйПодчиненыйЭлемент.Записать();


КонецПроцедуры
Показать



Сейчас код выглядит вот так, вопросов появляется большем чем ответов=(
Как сделать условия записи в справочник банки так же по ИНН, ведь определенные реквизиты связанны с определенным клиентом, ну и связь справочника банки и справочника контрагент, я так понимаю если он укажет правильно владельца в справочнике банки, то он и правильно отобразит в справочнике контрагент во вкладки банки все реквизиты?
27. user1226414 15.06.19 13:59 Сейчас в теме
(24) Код у нас корявый, но владельца заполнять должен, странно, почему он пустой. У справочника "Банки" точно стоит во владельцах "Справочник.Контрагент" и Использование подчинения - Элементам?
Да, если будет правильный Владелец, то реквизиты появятся во вкладке банки.
Чтобы реквизиты не дублировались их тоже надо будет проверить перед созданием. По расчетному счету я думаю, он уникальный должен быть.
Реквизит = Справочники.Банки.НайтиПоРеквизиту("РасчетныйСчет", Результат.РасчетныйСчет,,Контрагент); //как-то так, добавляется условие по владельцу через две запятых
и дальше по той-же схеме, не нашелся - создаем.
Главное найти почему Владелец не заполняется.
29. aEx_gor 15.06.19 15:25 Сейчас в теме
(27)О получилось, поле Владелец кажется напрямую связанно с полем Наименование, я выставлял поле наименование и поле код равное 0, а наименование компании записывал в ПолноеНаименование, Переделав код примерно вот так:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
//| customer_company.name КАК ПолноеНаименование,
| customer_company.name КАК Наименование,
| customer_company.INN КАК ИНН,
| customer_company.OGRN КАК ОГРН,
| customer_company.KPP КАК КПП,
| customer_company.OKATO КАК ОКАТО,
| customer_company.OKPO КАК ОКПО,
| customer_company.bank КАК Филиал,
| customer_company.CheckACC КАК РасчетныйСчет,
| customer_company.BIC КАК БИК,
| customer_company.CorACC КАК КорСчет
|ИЗ
| ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Таблица.customer_company КАК customer_company";

Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
//ПолноеНаименование = Результат.ПолноеНаименование;
Наименование = Результат.Наименование;
ИНН = Результат.ИНН;
ОГРН = Результат.ОГРН;
КПП = Результат.КПП;
ОКАТО = Результат.ОКАТО;
ОКПО = Результат.ОКПО;
Филиал = Результат.Филиал;
РасчетныйСчет = Результат.РасчетныйСчет;
БИК = Результат.БИК;
КорСчет = Результат.КорСчет;


РезультатПоиска = Справочники.Контрагент.НайтиПоРеквизиту("ИНН", Результат.ИНН);
Если РезультатПоиска = Справочники.Контрагент.ПустаяСсылка() Тогда
НовыйЭлемент = Справочники.Контрагент.СоздатьЭлемент();
НовыйЭлемент.Наименование = Наименование;
//НовыйЭлемент.ПолноеНаименование = ПолноеНаименование;
НовыйЭлемент.ИНН = ИНН ;
НовыйЭлемент.ОГРН = ОГРН;
НовыйЭлемент.КПП = КПП;
НовыйЭлемент.ОКАТО = ОКАТО;
НовыйЭлемент.ОКПО = ОКПО;
НовыйЭлемент.Записать();
Сообщить("Наименование: " + Наименование + "ИНН: " + ИНН )
Показать


Все получилось все работает, все супер, моя главная ошибка, что я указывал реквизиты неограниченные, если я вам еще не надоел, не подскажите что вы имели ввиду под фразу "Код корявый"

Финальная Версия кода выглядит вот так:
&НаКлиенте
Процедура Записать(Команда)
ЗаписатьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаписатьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| customer_company.name КАК Наименование,
| customer_company.INN КАК ИНН,
| customer_company.OGRN КАК ОГРН,
| customer_company.KPP КАК КПП,
| customer_company.OKATO КАК ОКАТО,
| customer_company.OKPO КАК ОКПО,
| customer_company.bank КАК Филиал,
| customer_company.CheckACC КАК РасчетныйСчет,
| customer_company.BIC КАК БИК,
| customer_company.CorACC КАК КорСчет
|ИЗ
| ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Таблица.customer_company КАК customer_company";

Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
Наименование = Результат.Наименование;
ИНН = Результат.ИНН;
ОГРН = Результат.ОГРН;
КПП = Результат.КПП;
ОКАТО = Результат.ОКАТО;
ОКПО = Результат.ОКПО;
Филиал = Результат.Филиал;
РасчетныйСчет = Результат.РасчетныйСчет;
БИК = Результат.БИК;
КорСчет = Результат.КорСчет;


РезультатПоиска = Справочники.Контрагент.НайтиПоРеквизиту("ИНН", Результат.ИНН);
Если РезультатПоиска = Справочники.Контрагент.ПустаяСсылка() Тогда
НовыйЭлемент = Справочники.Контрагент.СоздатьЭлемент();
НовыйЭлемент.Наименование = Наименование;
НовыйЭлемент.ИНН = ИНН ;
НовыйЭлемент.ОГРН = ОГРН;
НовыйЭлемент.КПП = КПП;
НовыйЭлемент.ОКАТО = ОКАТО;
НовыйЭлемент.ОКПО = ОКПО;
НовыйЭлемент.Записать();
Сообщить("Наименование: " + Наименование + "ИНН: " + ИНН );
КонецЕсли;
Контрагент = Справочники.Контрагент.НайтиПоРеквизиту("ИНН", Результат.ИНН);
РезультатПоискаа = Справочники.Банки.НайтиПоРеквизиту("РасчетныйСчет", Результат.РасчетныйСчет);
Если РезультатПоискаа = Справочники.Банки.ПустаяСсылка() Тогда
НовыйПодчиненыйЭлемент = Справочники.Банки.СоздатьЭлемент();
НовыйПодчиненыйЭлемент.Владелец = Контрагент;
НовыйПодчиненыйЭлемент.Филиал = Результат.Филиал;
НовыйПодчиненыйЭлемент.РасчетныйСчет = Результат.РасчетныйСчет;
НовыйПодчиненыйЭлемент.БИК = Результат.БИК;
НовыйПодчиненыйЭлемент.КорСчет = Результат.КорСчет;
НовыйПодчиненыйЭлемент.Записать();
КонецЕсли;
КонецЦикла;

КонецПроцедуры
Показать
30. user1226414 15.06.19 17:33 Сейчас в теме
(29) Да мелочи, самое некрасивое два поиска контрагента по инн, сделали пока непонятно было где ошибка, но лучше от второго избавиться, поскольку у нас и без него данные есть. Как-то так сделать
Если РезультатПоиска = Справочники.Контрагент.ПустаяСсылка() Тогда
... // тут добавление
Контрагент = НовыйЭлемент.Ссылка;
Иначе
Контрагент = РезультатПоиска;
КонецЕсли;
// второй поиск выкидываем, чтобы базу не напрягать
и дальше как есть по коду.
И в начале куча присваиваний зачем, лишние движения по сути, можно сразу Результат. использовать.

А если совсем красиво то разбить на процедуры, сделать что-то вроде ЗаписьКонтрагента(ДанныеКонтрагента), ЗаписьБанка(ДанныеБанка) внутри которых только соответствующими вещами и заниматься. Но это уже кто как привык работать )
25. Xershi 1479 14.06.19 19:27 Сейчас в теме
26. aEx_gor 14.06.19 19:30 Сейчас в теме
(25Если вы говорите про ODBC драйвер то да, уже половину кода написали общими усилиями, осталось разобраться с тонкостями
28. Xershi 1479 15.06.19 14:52 Сейчас в теме
(26) чтение:
Функция GetTable(СтрокаСоединения, ТекстЗапроса) Экспорт
	
	Подключение = Новый COMОбъект("ADODB.Connection"); 
	Подключение.Open(СтрокаСоединения);
	Таблица = Новый ТаблицаЗначений;
	
	НаборЗаписей = Новый COMОбъект("ADODB.Recordset"); 
	НаборЗаписей.CursorType = 3;
	НаборЗаписей.ActiveConnection = Подключение;
	НаборЗаписей.Open(ТекстЗапроса);	
	
	Попытка
		НаборЗаписей.MoveFirst();
	Исключение
		Возврат Таблица;	
	КонецПопытки;
	     	
	Для Каждого Поле Из НаборЗаписей.Fields Цикл
		ИмяПоля = СтрЗаменить(Поле.Name, "-", "_");
		Таблица.Колонки.Добавить(ИмяПоля);
	КонецЦикла;
	
	Пока Не НаборЗаписей.EOF() Цикл
		НоваяСтрока = Таблица.Добавить();
		Для Каждого Поле Из НаборЗаписей.Fields Цикл
			ИмяПоля = СтрЗаменить(Поле.Name, "-", "_");
			НоваяСтрока[ИмяПоля] = НаборЗаписей.Fields(Поле.Name).Value;
		КонецЦикла;
		НаборЗаписей.MoveNext();    
	КонецЦикла;
	
	НаборЗаписей.Close();
	Подключение.Close();
	Возврат Таблица;
	
КонецФункции
Показать

Запись:
Процедура ExecuteQuery(СтрокаСоединения, ТекстЗапроса) Экспорт
	
	Подключение = Новый COMОбъект("ADODB.Connection"); 
	Подключение.Open(СтрокаСоединения);	
	Подключение.Execute(ТекстЗапроса);
	Подключение.Close();	
	
КонецПроцедуры

Показать

Все эелементарно на ИС же кажись статьи есть или нужно запилить?
2. catena 110 11.06.19 06:06 Сейчас в теме
Хотелось бы расшифровки, что означает "получилось - результат не очень" и "записать не получается"
3. aEx_gor 11.06.19 07:07 Сейчас в теме
(2)
Результат не очень - приходится записывать информацию о каждом клиентем самостоятельно и сама процедура вывода на основании не нравится.

Записать не получается - после составления запроса, после выборки получилось вывести запрашиваем данные сообщением, но они почему-то не записываются в справочник
4. catena 110 11.06.19 07:16 Сейчас в теме
(3)
Записать не получается - после составления запроса, после выборки получилось вывести запрашиваем данные сообщением, но они почему-то не записываются в справочник
Надо видеть код, которым вы записываете объект. Не записываются с какими симптомами? Ошибку выдает или ничего не происходит? Как проверяли, что не записывается? Сама запись в коде есть?
5. aEx_gor 11.06.19 07:56 Сейчас в теме
(4)
&НаКлиентеПроцедура Подкл(Команда)
ПодклНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПодклНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| customer_company.name КАК ИМЯ,
| customer_company.INN КАК ИНН,
| customer_company.OGRN КАК ОГРН
|ИЗ
| ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Таблица.customer_company КАК customer_company";

Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
ИМЯ = Результат.ИМЯ;
ИНН = Результат.ИНН;
ОГРН = Результат.ОГРН;
Сообщить("Имя: " + ИМЯ + "ИНН: " + ИНН + "ОГРН " + ОГРН);
КонецЦикла;

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

Делаю в учебной версии 1с.Предприятие, так как студент.
Проверял код с помощью отладки (если так можно сказать), пробовал команду записать результат, получил ошибку "Несоответствие Типов(1)"
6. catena 110 11.06.19 07:58 Сейчас в теме
(5)В приведенном коде записи нет. Откуда ошибка - непонятно, так как ошибочный код вы скрыли. Не ведите себя, как разведчик, гораздо больше шансов, что вам поправят ошибочный код, чем напишут за вас с нуля.
7. aEx_gor 11.06.19 08:31 Сейчас в теме
(6)
Извиняюсь забыл, что удалил не нужные строчки кода.

Перефразирую вопрос, как мне записать информацию после запроса выше в справочник?
8. catena 110 11.06.19 08:34 Сейчас в теме
(7)Создать объект
Заполнить реквизиты
Записать
9. aEx_gor 11.06.19 09:19 Сейчас в теме
(8)Процедура Подкл(Команда)
ПодклНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПодклНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| customer_company.name КАК ИМЯ,
| customer_company.INN КАК ИНН,
| customer_company.OGRN КАК ОГРН
|ИЗ
| ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Таблица.customer_company КАК customer_company";
Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
ИМЯ = Результат.ИМЯ;
ИНН = Результат.ИНН;
ОГРН = Результат.ОГРН;
Сообщить("Имя: " + ИМЯ + "ИНН: " + ИНН + "ОГРН " + ОГРН);
Записать(Результат);
КонецЦикла;

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

Поробовал добавить строку Записать(Результат); Получил ошибку - Несоответствие типов (параметр номер '1')
10. catena 110 11.06.19 11:06 Сейчас в теме
(9)Я же написала: Создать объект, заполнить реквизиты, записать. А вы выполнили только один пункт из трех. Куда записать? Платформа должна телепатировать, какой именно справочник вы хотите заполнить?
В системе есть достаточно подробная справка с примерами, рекомендую заглядывать.

СправочникМенеджер.<Имя справочника>.СоздатьЭлемент (CatalogManager.<Имя справочника>.CreateItem)
СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)
СоздатьЭлемент (CreateItem)
Синтаксис:

СоздатьЭлемент()
Возвращаемое значение:

Тип: СправочникОбъект.<Имя справочника>.

Описание:

Создает новый элемент справочника.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:

Использование метода не приводит к записи созданного объекта в базу данных.
Пример:

НовыйОбъект = Справочники.Валюты.СоздатьЭлемент();
НовыйОбъект.Код = "840";
НовыйОбъект.Наименование = "USD";
НовыйОбъект.ПолноеНаименование = "Доллары США";
НовыйОбъект.Записать();
Показать
14. aEx_gor 12.06.19 15:48 Сейчас в теме
(10)
Спасибо вам за совет и за пример, все получилось.
11. tvm 11.06.19 11:14 Сейчас в теме
(9) в данном случае
Записать
вызывает запись из формы. Сделайте обработку и в ней уже создавайте элементы справочника, заполняйте и записывайте
Оставьте свое сообщение

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