1. aEx_gor 10.06.19 20:20 Сейчас в теме

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

Здравствуйте, опыта программирования не имею, хотелось бы получить помощь

Есть внешняя база данных 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 624 14.06.19 19:27 Сейчас в теме
26. aEx_gor 14.06.19 19:30 Сейчас в теме
(25Если вы говорите про ODBC драйвер то да, уже половину кода написали общими усилиями, осталось разобраться с тонкостями
28. Xershi 624 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 99 11.06.19 06:06 Сейчас в теме
Хотелось бы расшифровки, что означает "получилось - результат не очень" и "записать не получается"
3. aEx_gor 11.06.19 07:07 Сейчас в теме
(2)
Результат не очень - приходится записывать информацию о каждом клиентем самостоятельно и сама процедура вывода на основании не нравится.

Записать не получается - после составления запроса, после выборки получилось вывести запрашиваем данные сообщением, но они почему-то не записываются в справочник
4. catena 99 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 99 11.06.19 07:58 Сейчас в теме
(5)В приведенном коде записи нет. Откуда ошибка - непонятно, так как ошибочный код вы скрыли. Не ведите себя, как разведчик, гораздо больше шансов, что вам поправят ошибочный код, чем напишут за вас с нуля.
7. aEx_gor 11.06.19 08:31 Сейчас в теме
(6)
Извиняюсь забыл, что удалил не нужные строчки кода.

Перефразирую вопрос, как мне записать информацию после запроса выше в справочник?
8. catena 99 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 99 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) в данном случае
Записать
вызывает запись из формы. Сделайте обработку и в ней уже создавайте элементы справочника, заполняйте и записывайте
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Бобров
зарплата от 100 000 руб. до 150 000 руб.
Временный (на проект)

Студент (стажер) 1С
Нижний Новгород
зарплата от 25 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 120 000 руб.
Полный день

Программист 1С
Нижний Новгород
зарплата до 100 000 руб.
Полный день

Программист 1С
Новосибирск
зарплата от 80 000 руб.
Полный день