Здравствуйте. Пишу обработку для обмена между Альфа-Авто 4.1 и Бухгалтерия 1.2
Подключаться к базе научился, делаю это так:
Функция ПодключитьсяКИБ() Соединение = Новый COMОбъект("V82.COMConnector"); СтрокаСоединения = "File = ""D:\ALPHA\AA_4_1_13_1""; Usr = GAL; Pwd = gal"; Попытка Подключение = Соединение.Connect(СтрокаСоединения); базаОткрытаУспешно=проверкаОткрытия(); Возврат базаОткрытаУспешно; Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не удалось подключиться к базе" + ОписаниеОшибки(); Сообщение.Сообщить(); Возврат Ложь; КонецПопытки; КонецФункции
//проверка на открытие базы Альфа-Авто функция проверкаОткрытия() Попытка Подключение.NewObject("Запрос"); ЭлементыФормы.КнопкаОТКРЫТЬбазу.Доступность = ложь; ЭлементыФормы.Состояние.Заголовок="База открыта"; Возврат Истина; Исключение базаОткрытаУспешно = ложь; ЭлементыФормы.КнопкаОТКРЫТЬбазу.Доступность = истина; ЭлементыФормы.Состояние.Заголовок="База закрыта"; Возврат Ложь; КонецПопытки; КонецФункции
Теперь пробую прочитать справочник таким образом:
Процедура Кнопка1Нажатие(Элемент) СпрНоменклатура = Подключение.Справочники.Номенклатура; СпрПроизводитель = Подключение.Справочники.Производители; Товар = СпрНоменклатура.Выбрать(); Пока Товар.Следующий() Цикл Если Товар.ПометкаУдаления = Истина Тогда Продолжить; КонецЕсли; Сообщить(Строка(Товар.Артикул)+Символы.Таб+ Строка(Товар.Наименование)+Символы.Таб+ Строка(Товар.НаименованиеПолное)+Символы.Таб+ Строка(Товар.Производитель)+Символы.Таб+ Строка(Товар.Модель)); ОбработкаПрерыванияПользователя(); КонецЦикла; КонецПроцедуры
В окно сообщения выводятся данные нормально для Товар.Артикул, Товар.Наименование, Товар.НаименованиеПолное, Товар.Модель А вот для реквизита Товар.Производитель выводится непонятное значение COMОбъект.
Подскажите пожалуйста этот COMОбъект это так выводится объект ссылка или что, и как можно это обработать, чтобы можно было это записать в базу приемник?
Группа: Пользователи
Сообщений: 2
Спасибо сказали: 0 раз
Рейтинг: 0
bizisoft @ Сегодня, 19:33 , Здравствуйте. Да будут нормально выводится в сообщении только примитивные типы данных(строка, число и т.д.). Если конфигурация на поддержке тогда поиск и создание по наименованию или коду в базе приемнике, если измененная тогда я использую регистр сведений соответствия уникальный идентификатор источника и ссылка приемника, как то так.
Я пытаюсь понять как работает СОМ в данном случае на примере чтения справочника и документов, пока до перечислений не дошел. Значение Товар.Производитель в справочнике Номенклатура является ссылкой на справочник Производители.
Цитата(ruslan3183 @ 31.01.16, 21:15)
Здравствуйте. Да будут нормально выводится в сообщении только примитивные типы данных(строка, число и т.д.). Если конфигурация на поддержке тогда поиск и создание по наименованию или коду в базе приемнике, если измененная тогда я использую регистр сведений соответствия уникальный идентификатор источника и ссылка приемника, как то так.
Конфигурация Источник (Альфа-Авто), она измененная, а конфигурация Приемник (Бухгалтерия) находится на поддержке. Обработка запускается в Бухгалтерии и через СОМ соединение подключается к Альфе.
Пробую получить выборку по документам:
ДокВыб = Подключение.Документы.РеализацияТоваров.Выбрать(НачалоДня(НачПериода),КонецДня(КонПериода)); Пока ДокВыб.Следующий() Цикл Если ДокВыб.ПометкаУдаления = Истина Тогда Продолжить; КонецЕсли; Сообщить(Строка(ДокВыб)+Символы.Таб+Строка(ДокВыб.Номер)+Символы.Таб+Строка(ДокВыб.Дата)+Символы.Таб+Строка(ДокВыб.ХозОперация)+Символы.Таб+Строка(ДокВыб.СуммаДокумента)); Для каждого СтрТов из ДокВыб.Товары Цикл Сообщить(Символы.Таб+Символы.Таб+Строка(СтрТов.Номенклатура.Артикул)+Символы.Таб+Строка(СтрТов.Количество)+Символы.Таб+Строка(СтрТов.Цена)+Символы.Таб+Строка(СтрТов.Сумма)); КонецЦикла; КонецЦикла;
ДокВыб.Номер, ДокВыб.Дата, ДокВыб.СуммаДокумента - все нормально, номер, дата и сумма документа выводится как есть. ДокВыб.ХозОперация - выводится в сообщении как СОМОбъект ДокВыб - также выводится как СОМОбъект, видимо это типа ссылка на документ, но не пойму почему через ДокВыб можно получить Номер, Дату и другие реквизиты (не ссылочные), и даже получилось получить доступ к табличной части документа, а именно Артикул, Наименование, НаименованиеПолное, Количество, Цена, Сумма. Единственно если попробовать вывести СтрТов.Номенклатура - выдаст СОМОбъект.
Т.е. я понял, что все поля/реквизиты являющиеся ссылочными объектами будут выводиться как СОМОбъект, но как тогда можно получить его значение? Если я пробую прочитать реквизит табличной части документа СтрТов.СтавкаНДС - выдает СОМОбъект, а если СтрТов.СтавкаНДС.Наименование - выдает наименование ставки. В случае со справочником Номенклатура я пробую получить Производителья Товар.Производитель - СОМОбъект, а так Товар.Производитель.Наименование выдает ошибку Значение не является значением объектного типа (Наименование).
Группа: Местный
Сообщений: 2908
Из: Київ, Україна
Спасибо сказали: 1159 раз
Рейтинг: 1244.5
Цитата(bizisoft @ 31.01.16, 18:33)
Подскажите пожалуйста этот COMОбъект это так выводится объект ссылка или что, и как можно это обработать, чтобы можно было это записать в базу приемник?
Все, что не является примитивным типом, будет COMОбъект-ом.
Допрацьовую: - "Бухгалтерія для України 2.1"; - "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".
Все, что не является примитивным типом, будет COMОбъект-ом.
И что прочитать этот COMОбъект никак нельзя? Я нашел обработку, которая подключается через СОМ из 1С8 к 1С77 и считывает данные, но там как-то по другому подключение организовано.
Функция СформироватьСчет(док77,СообщитьОСоздании = Ложь) ИскомыйДокумент = Документы.СчетНаОплатуПокупателю.ПустаяСсылка(); Если Док77.Вид() <> "Счет" Тогда Возврат ИскомыйДокумент; КонецЕсли; ИскомыйДокумент = Документы.СчетНаОплатуПокупателю.НайтиПоНомеру(док77.НомерДок, док77.ДатаДок); ... ДокСчет.Контрагент = НайтиСоздатьКонтрагента(Док77.Контрагент); Док77.ВыбратьСтроки(); Пока Док77.ПолучитьСтроку()>0 Цикл Если ПустаяСтрока(Строка(Док77.Товар.Наименование)) = Ложь Тогда НоваяСтрока.Номенклатура = НайтиСоздатьТМЦ(Док77.Товар);//НайденаНоменклатура.Ссылка; НоваяСтрока.ЕдиницаИзмерения = НоваяСтрока.Номенклатура.БазоваяЕдиницаИзмерения; НоваяСтрока.Количество = док77.Количество; ... КонецЕсли; КонецЦикла; ДокСчет.Записать(); Возврат ДокСчет.Ссылка; КонецФункции
Функция НайтиСоздатьТМЦ(Ссылка77) Найден = 0; ТаблицаРодителей = Новый ТаблицаЗначений; ТаблицаРодителей.Колонки.Добавить("НомерПП"); ТаблицаРодителей.Колонки.Добавить("Родитель"); Уровень = Ссылка77.Уровень(); ТекРодитель = Ссылка77; Для ии = 1 По Уровень-1 Цикл СтрТаблицы = ТаблицаРодителей.Добавить(); СтрТаблицы.НомерПП = ии; СтрТаблицы.Родитель = ТекРодитель.Родитель; ТекРодитель = СтрТаблицы.Родитель; КонецЦикла; ТаблицаРодителей.Сортировать("НомерПП убыв"); ТекРодитель = Справочники.Номенклатура.ПустаяСсылка(); Для Каждого Стр Из ТаблицаРодителей Цикл ИскомыйРодитель = Справочники.Номенклатура.НайтиПоНаименованию(Стр.Родитель.Код+";"+Стр.Родитель.Наименование); Если ИскомыйРодитель.Пустая() Тогда ИскомыйРодитель = Справочники.Номенклатура.СоздатьГруппу(); Дл = ИскомыйРодитель.Метаданные().ДлинаНаименования; Если Дл>0 Тогда ИскомыйРодитель.Наименование = Стр.Родитель.Код+";"+Стр.Родитель.Наименование; КонецЕсли; ИскомыйРодитель.Родитель = ТекРодитель.Ссылка; ИскомыйРодитель.Записать(); КонецЕсли; ТекРодитель = ИскомыйРодитель; КонецЦикла; //ищем по артикулу, чтобы спозиционироваться именно на элементе Если (Найден = 0) Тогда Товар = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",СокрЛП(Ссылка77.КодТ)); Если Товар.Пустая() = Ложь Тогда Найден = 1; Сообщить("Найден " + СокрЛП(Ссылка77.КодТ)); Если ОбновлятьСправочники = Ложь Тогда Возврат Товар.Ссылка; Иначе Товар = Товар.ПолучитьОбъект(); КонецЕсли; КонецЕсли; КонецЕсли; //создаем новый товар, т.к. запись не найдена Если Найден = 0 Тогда Сообщить("Товар добавляется " + СокрЛП(Ссылка77.КодТ)); Товар = Справочники.Номенклатура.СоздатьЭлемент(); КонецЕсли; //если транспортная услуга Если Ссылка77.Транспорт = 1 Тогда Товар.ТранспортнаяУслуга = Истина; КонецЕсли; Товар.БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796"); Попытка Товар.НаименованиеПолное = ?(СокрЛП(Ссылка77.НаименованиеУкр)="",СокрЛП(Ссылка77.Наименование),СокрЛП(Ссылка77.НаименованиеУкр)); Исключение Товар.НаименованиеПолное = СокрЛП(Ссылка77.Наименование); КонецПопытки; Товар.Наименование = Товар.НаименованиеПолное; Товар.Артикул = СокрЛП(Ссылка77.КодТ); Товар.КодУКТВЭД = НайтиСоздатьКТВЭД(Ссылка77); Товар.СтавкаНДС = ПолучитьСтавкуНДС(Ссылка77.СтавкаНДС.Получить().Идентификатор()); Если Ссылка77.ВидТовара.Идентификатор() = "Услуга" Тогда Товар.Услуга = Истина; КонецЕсли; Товар.Родитель = ТекРодитель.Ссылка; Товар.Записать(); Возврат Товар.Ссылка; КонецФункции
Из этой обработки я понял, что перебираются документы по номеру производится поиск если не найден - создается, если найден и стоит флаг обновлять, то обновляется табличная часть. При обработке табличной части производится поиск товара по артикулу в номенклатуре, если найден, то добавляется в ТЧ, иначе создается новый товар, а после добавляется в ТЧ. Но в 7.7 например УКТВЭД являлся строковым реквизитом Номенклатуры, а в Альфе это уже ссылочный реквизит НоменклатурыГТД и далее КодУКТВЭД - как в таком случае его получить, ну и все ссылочные реквизиты справочника/документа, тогда не понятно.
Группа: Основатель
Сообщений: 13983
Из: Киев
Спасибо сказали: 4553 раз
Рейтинг: 3682.7
Ссылки нужно искать по соответствию каких-то простых реквизитов: по наименованию, по коду, по какому-то специальному реквизиту. Например, документы, можно искать по дате и номеру, справочники искать по коду. Я лично для установки соответствий в разных базах использую УИД.
Ссылки нужно искать по соответствию каких-то простых реквизитов
Без получения хотя-бы Наименования производителя, я не могу даже к поиску приступить, т.к. СОМОбъект мне не дает даже получить этот самый простой реквизит. Жаль.
Может быть у меня подход неверный, т.е. сейчас я подключаюсь из Бухгартерии к Альфа-Авто, а нужно наоборот из Альфа-Авто к Бухгалтерии, и уже в Бухгалтерии искать соответствующие объекты, и если их нет, то создавать?
Группа: Основатель
Сообщений: 13983
Из: Киев
Спасибо сказали: 4553 раз
Рейтинг: 3682.7
Цитата(bizisoft @ 01.02.16, 11:15)
Без получения хотя-бы Наименования производителя, я не могу даже к поиску приступить, т.к. СОМОбъект мне не дает даже получить этот самый простой реквизит.
Процедура Кнопка1Нажатие(Элемент) СпрНоменклатура = Подключение.Справочники.Номенклатура; СпрПроизводитель = Подключение.Справочники.Производители; Товар = СпрНоменклатура.Выбрать(); Пока Товар.Следующий() Цикл Сообщить(Товар.Артикул); Сообщить(Товар.Производитель); /// в этом случае возвращает СОМОбъект Сообщить(Товар.Производитель.Наименование); /// а так ошибку Значение не является значением объектного типа (Наименование) КонецЦикла; КонецПроцедуры
Сообщить(Товар.Производитель.Наименование); выдает ошибку. Но в случае, когда я через СОМ читаю ТЧ документа, на пример СтавкаНДС, то тут позволяет получить наименование "Основная ставка НДС" если написать СтрТов.СтавкаНДС.Наименование Почему тут можно, а в случае со справочником нет, ведь реквизиты являются ссылками на справочники?
Группа: Местный
Сообщений: 2908
Из: Київ, Україна
Спасибо сказали: 1159 раз
Рейтинг: 1244.5
Цитата(bizisoft @ 01.02.16, 11:15)
Может быть у меня подход неверный, т.е. сейчас я подключаюсь из Бухгартерии к Альфа-Авто, а нужно наоборот из Альфа-Авто к Бухгалтерии, и уже в Бухгалтерии искать соответствующие объекты, и если их нет, то создавать?
Вообще-то, соответствие необходимо где-то хранить. Типовая рарусовская обработка выгрузки из АА в БПУ так и делает - хранит в ДБФ-файле соответствия ссылок.
Допрацьовую: - "Бухгалтерія для України 2.1"; - "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".
Petre @ Сегодня, 12:35 , Да, но типовая обработка работает не через СОМ, а выгрузил в файл - загрузил из файла.
Цитата(Acid @ 01.02.16, 12:39)
Подключение.Справочники.Производители.Ссылка
Не совсем понял в каком контексте. Если в контексте чтения справочника Производители
Произв = СпрПроизводитель.Выбрать(); Пока Произв.Следующий() Цикл Сообщить(Произв.Ссылка); // возвращает как СОМОбъект , т.е. не работает Сообщить(Произв.Наименование); // возвращает Наименование производителя КонецЦикла;
Если в контексте чтения справочника Номенклатура, то мне не понятно как это применить.
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!