Версия для печати темы (https://pro1c.org.ua/index.php?s=0263a8aef7e2dfd2354b7e30d498bbfd&showtopic=19430)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Чтение РС базы источника через СОМ соединение

Автор: kosalex 20.08.14, 9:23

Добрый день! Пытаюсь читать данные из РС базы источника и загружать прочитанные данные в РС базы приемника.

Вот код:

Процедура ЗагрузитьДанныеСЮжнойЖДВесовой() Экспорт;
СОМСоединение = Новый COMОбъект("V83.ComConnector");
Сервер = "***";
ИмяБазы = "***";
Пользователь = "***";
Пароль = "***";
СтрокаПодключения = "Srvr = '" + Сервер + "';" + "Ref = '" + ИмяБазы + "';" + "Usr = '" + Пользователь + "';" + "Pwd = '" + Пароль + "';";

БазаИсточник = СОМСоединение.Connect(СтрокаПодключения);
Выборка_РС_ЮЖД    = БазаИсточник.РегистрыСведений.КФЗЮжнаяЖДВесовая.Выбрать();

Данные_РС_ЮЖД = Новый ТаблицаЗначений;
СтрокаДанных = Данные_РС_ЮЖД.Добавить();

Пока Выборка_РС_ЮЖД.Следующий() Цикл
    ЗаполнитьЗначенияСвойств(СтрокаДанных,Выборка_РС_ЮЖД,,);
КонецЦикла;

МенеджерЗаписи = РегистрыСведений.КФЗЮжнаяЖДВесовая.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(МенеджерЗаписи,Данные_РС_ЮЖД);
КонецПроцедуры


Ругается на то что в переменной "Выборка_РС_ЮЖД" не имеет метод "Следующий()"

Подскажите, как правильно читать и записывать данные?

Автор: kosalex 20.08.14, 10:34

Подумал, и написал так:
РАБОТАЕТ!

Процедура ЗагрузитьДанныеСЮжнойЖДВесовой() Экспорт;
СОМСоединение = Новый COMОбъект("V83.ComConnector");
Сервер = "***";
ИмяБазы = "***";
Пользователь = "***";
Пароль = "***";
СтрокаПодключения = "Srvr = '" + Сервер + "';" + "Ref = '" + ИмяБазы + "';" + "Usr = '" + Пользователь + "';" + "Pwd = '" + Пароль + "';";

БазаИсточник = СОМСоединение.Connect(СтрокаПодключения);
//РегИсточник    = БазаИсточник.РегистрыСведений.КФЗЮжнаяЖДВесовая;
БазаИсточник_Запрос = БазаИсточник.Newobject("Запрос");

    ТекстЗапроса = "ВЫБРАТЬ
                   |    КФЗЮжнаяЖДВесовая.Период КАК Период,
                   |    КФЗЮжнаяЖДВесовая.НомерВесов,
                   |    КФЗЮжнаяЖДВесовая.НомерВагона,
                   |    КФЗЮжнаяЖДВесовая.Грузоотправитель,
                   |    КФЗЮжнаяЖДВесовая.Грузополучатель,
                   |    КФЗЮжнаяЖДВесовая.Номенклатура,
                   |    КФЗЮжнаяЖДВесовая.Брутто,
                   |    КФЗЮжнаяЖДВесовая.Тара,
                   |    КФЗЮжнаяЖДВесовая.Нетто,
                   |    КФЗЮжнаяЖДВесовая.Фамилия,
                   |    КФЗЮжнаяЖДВесовая.Действие
                   |ИЗ
                   |    РегистрСведений.КФЗЮжнаяЖДВесовая КАК КФЗЮжнаяЖДВесовая
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |    Период";

БазаИсточник_Запрос.Текст = ТекстЗапроса;

                                
ТаблицаДанныхИсточник = БазаИсточник_Запрос.Выполнить().Выгрузить();
                            
НаборЗаписейПриемник = РегистрыСведений.КФЗЮжнаяЖДВесовая.СоздатьНаборЗаписей();
НаборЗаписейПриемник.Записывать = Истина;
НаборЗаписейПриемник.Прочитать();

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

НаборЗаписейПриемник.Записать();

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


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

Синтаксис помошник Записать(<Замещать>):
Определяет режим замещения существующей записи в соответствии с текущими установками отбора. Истина - перед записью существующие записи будут удалены. Ложь - записи будут дописаны к уже существующим в информационной базе записям.
Значение по умолчанию: Истина.

Автор: logist 20.08.14, 11:48

Цитата(kosalex @ 20.08.14, 10:34) http://pro1c.org.ua/index.php?act=findpost&pid=90386
Вопрос другой, когда записывается набор записей в приемнике

А у вас все поля не ссылочного типа?

Автор: kosalex 20.08.14, 11:51

Цитата(logist @ 20.08.14, 12:48) *
Можно заменить на
ЗаписьПриемник.Загрузить(ТаблицаДанныхИсточник.Выгрузить());


Спасибо smile.gif


А у вас все поля не ссылочного типа?



Все поля в приемнике не ссылочного типа. Типы: Строка, число. Других нет.

Автор: logist 20.08.14, 11:57

Цитата(kosalex @ 20.08.14, 11:51) *
Все поля в приемнике не ссылочного типа.

Тогда у вас попытка записать больше одной строки с одинаковыми измерениями.

Автор: kosalex 20.08.14, 12:04

Цитата(logist @ 20.08.14, 12:57) *
Тогда у вас попытка записать больше одной строки с одинаковыми измерениями.



У меня в приемнике уже есть данные, практически те же самые данные записываются из источника в приемник, т.е. была запись в приемнике и я такую же запись записываю. По идеи должно заменить старую запись на новую. Правильно?

ВОТ ЭТО ЦИКЛ:
НаборЗаписейПриемник = РегистрыСведений.КФЗЮжнаяЖДВесовая.СоздатьНаборЗаписей();
НаборЗаписейПриемник.Записывать = Истина;
НаборЗаписейПриемник.Прочитать();

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

НаборЗаписейПриемник.Записать(Истина)
;

НЕ ХОЧЕТ ЗАМЕНЯТЬСЯ ВОТ ЭТИМ:
ЗаписьПриемник = НаборЗаписейПриемник.Добавить();
ЗаписьПриемник.Загрузить(ТаблицаДанныхИсточник.Выгрузить());


Метот объекта не обнаружен.



Автор: logist 20.08.14, 12:07

Цитата(kosalex @ 20.08.14, 12:04) *
НЕ ХОЧЕТ ЗАМЕНЯТЬСЯ ВОТ ЭТИМ:

Ну вы ж как-то думайте сами, а не тупо передирайте код, додумывая еще какие-то добавки...
НаборЗаписейПриемник.Загрузить(ТаблицаДанныхИсточник.Выгрузить());

Автор: kosalex 20.08.14, 12:18

Цитата(logist @ 20.08.14, 13:07) *
Ну вы ж как-то думайте сами, а не тупо передирайте код, додумывая еще какие-то добавки...
НаборЗаписейПриемник.Загрузить(ТаблицаДанныхИсточник.Выгрузить());



НаборЗаписейПриемник.Загрузить(ТаблицаДанныхИсточник.Выгрузить());


Метод объекта не обнаружен Выгрузить(). Тип "ТаблицаДанныхИсточник" = СОМОбъект.


Автор: logist 20.08.14, 13:02

Цитата(kosalex @ 20.08.14, 12:18) *
Метод объекта не обнаружен Выгрузить(). Тип "ТаблицаДанныхИсточник" = СОМОбъект.

а, ну раз так smile.gif

уберите это: НаборЗаписейПриемник.Прочитать();

Автор: kosalex 20.08.14, 13:03

Цитата(logist @ 20.08.14, 14:02) *
а, ну раз так smile.gif

уберите это: НаборЗаписейПриемник.Прочитать();



шутку шутите?

Автор: logist 20.08.14, 13:29

Цитата(kosalex @ 20.08.14, 13:03) *
шутку шутите?

А Вы до сих пор не поняли почему у вас двоятся записи? Вы же считываете текущие, а потом ДОБАВЛЯЕТЕ новые, и пытаетесь записать и старые и новые. Уберите чтение текущих.

Автор: kosalex 20.08.14, 13:33

Цитата(logist @ 20.08.14, 14:29) *
А Вы до сих пор не поняли почему у вас двоятся записи? Вы же считываете текущие, а потом ДОБАВЛЯЕТЕ новые, и пытаетесь записать и старые и новые. Уберите чтение текущих.


))понял), а если так напишу:
НаборЗаписейПриемник = РегистрыСведений.КФЗЮжнаяЖДВесовая.СоздатьНаборЗаписей();
НаборЗаписейПриемник.Записывать = Истина;
НаборЗаписейПриемник.Прочитать();
НаборЗаписейПриемник.Очистить();


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


НаборЗаписейПриемник.Очистить() - удалит все данные с набора или с базы?

Автор: logist 20.08.14, 14:06

Цитата(kosalex @ 20.08.14, 13:33) *
удалит все данные с набора или с базы?

Из Набора, но как в этом смысл? Можно же просто не читать. Или, лишние действия - наше всё?

Автор: kosalex 20.08.14, 14:35

Цитата(logist @ 20.08.14, 15:06) *
Из Набора, но как в этом смысл? Можно же просто не читать. Или, лишние действия - наше всё?


Из набора - это из базы. мне казалось что набор и бд это две разные вещи. Перекрестился - все стало на свои места smile.gif

Автор: alex040269 20.08.14, 14:45

Цитата(kosalex @ 20.08.14, 15:35) *
Из набора - это из базы

набор - это объект.
база изменится после набор.записать();

Автор: kosalex 20.08.14, 14:49

Цитата(alex040269 @ 20.08.14, 15:45) *
набор - это объект.
база изменится после набор.записать();

Да да да smile.gif

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua