Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Создание элементов справочника через СОМ соединение
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
bizisoft
Здравствуйте.
Подскажите пожалуйста как через СОМ соединение можно создавать элементы в справочниках.
Пробовал так:
СпрПр = Подключение.NewObject("СправочникСсылка.Производители");
    СпрПр.Наименование = пвПроизводитель.Наименование;
    СпрПр.СтранаПроисхождения = пвПроизводитель.СтранаПроисхождения;
    СпрПр.Записать();


{Форма.ПроверкаИнтернетЗаказов.Форма(4932)}: Ошибка при установке значения атрибута контекста (Наименование)
СпрПр.Наименование = пвПроизводитель.Наименование;
по причине:
Метод не найден


Так тоже не выходит.
СпрПр = Подключение.Справочники.Производители.СоздатьЭлемент();
    СпрПр.Наименование = пвПроизводитель.Наименование;
    СпрПр.СтранаПроисхождения = пвПроизводитель.СтранаПроисхождения;
    СпрПр.Записать();



{Форма.ПроверкаИнтернетЗаказов.Форма(4938)}: Ошибка при вызове метода контекста (Записать)
СпрПр.Записать();
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.2.19.130): Не удалось записать: "Производители"!

Стала закрадываться мысль, что через СОМ нельзя создавать объекты, но на просторах интернета уже несколько раз встречал, что якобы можно проводить документ, хоть и более детальной информации так и не нашел.

Помогите с информацией по этому вопросу, или успокойте, если создавать объекты через СОМ нельзя.
denis84
bizisoft @ Сегодня, 0:19 необходимо зарегистрироваться для просмотра ссылки ,
Доброе утро! Все можно делать, по крайней мере у меня в 1С8: УТП получалось. Вот пример создания контрагентов. Подключение по ОЛЕ к 1С:7.7

Процедура ЗагрузитьКонтрагента()
СпрОЛЕ = V77.CreateObject("Справочник.Контрагенты");
СпрОЛЕ.ВыбратьЭлементы();
Пока СпрОЛЕ.ПолучитьЭлемент()=1 Цикл
Если СпрОле.ЭтоГруппа() Тогда
Группа = Справочники.Номенклатура.СоздатьГруппу();
Группа.Код = СпрОле.Код;
Группа.Наименование = СпрОле.Наименование;
Группа.Записать();
КонецЕсли;

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

denis84 @ Сегодня, 8:21 необходимо зарегистрироваться для просмотра ссылки ,
Вот пример по ТМЦ:

СпрОЛЕ = V77.CreateObject("Справочник.ТМЦ");
СпрОЛЕ.ВыбратьЭлементы();
Пока СпрОЛЕ.ПолучитьЭлемент()=1 Цикл
Если СпрОле.ЭтоГруппа() Тогда
Группа = Справочники.Номенклатура.НайтиПоКоду(СпрОЛЕ.Код);
Если Группа.Пустая() Тогда
Группа = Справочники.Номенклатура.СоздатьГруппу();
Группа.Код = СпрОле.Код;
Группа.Наименование = СпрОле.Наименование;
Группа.Записать();
КонецЕсли;
КонецЕсли;

ЭлементПоиска = Справочники.Номенклатура.НайтиПоКоду(СпрОЛЕ.Код);
Если ЭлементПоиска.Пустая() Тогда
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Родитель = Группа.Ссылка;
НовыйЭлемент.НоменклатурнаяГруппа = СпрОЛЕ.Наименование;
НовыйЭлемент.Код = СпрОЛЕ.Код;
сообщить(СпрОЛЕ.Код);
НовыйЭлемент.Наименование = СпрОЛЕ.Наименование;
НовыйЭлемент.НаименованиеПолное = СпрОЛЕ.ПолнНаименование;
НовыйЭлемент.Записать();
КонецЕсли;
КонецЦикла;
Petre
bizisoft @ Today, 0:19 необходимо зарегистрироваться для просмотра ссылки ,
Обратите внимание на данный код:
СпрПр.СтранаПроисхождения = пвПроизводитель.СтранаПроисхождения;

Вы пытаетесь присвоить полю записи в одной базе данных значение (ссылку) из совсем другой базы данных.
stark
bizisoft @ Сегодня, 0:19 необходимо зарегистрироваться для просмотра ссылки ,
Делаю просто

Спр=Соединение.Справочники[ИмяСправочника].СоздатьЭлемент();


В догонку
необходимо зарегистрироваться для просмотра ссылки
mut
Попробуйте те поля, которые предопределены указывать в английском варианте, не "Наименование" а "Description" и т.п.
bizisoft
Цитата(Petre @ 25.02.20, 10:10) необходимо зарегистрироваться для просмотра ссылки
Вы пытаетесь присвоить полю записи в одной базе данных значение (ссылку) из совсем другой базы данных.

Как-то совсем забыл, что СОМ соединение не дружит с ссылками.
А как тогда быть с такой ситуацией, когда заполняемый реквизит является ссылкой, как его заполнять в СОМ?

Цитата(denis84 @ 25.02.20, 9:30) необходимо зарегистрироваться для просмотра ссылки
Доброе утро! Все можно делать, по крайней мере у меня в 1С8: УТП получалось. Вот пример создания контрагентов. Подключение по ОЛЕ к 1С:7.7

Если я правильно понял ваш код, то вы через подключаетесь через OLE (хотя очень похоже на СОМ), через СОМ делаете выборку и полученные данные записываете в базу из которой подключались.

Это немного не то, что мне нужно.
Мне нужно создать запись в базе, к которой я подключаюсь через СОМ.

Т.е. суть такова - например в Основной базе создается элемент справочника и нужно продублировать этот элемент в другой базе, подключившись к ней через СОМ соединение.
sava1
Цитата(bizisoft @ 25.02.20, 23:07) необходимо зарегистрироваться для просмотра ссылки
вы через подключаетесь через OLE (хотя очень похоже на СОМ)


эт какая разница ? ОЛЕ это реализация СОМ
denis84
bizisoft @ Вчера, 23:07 необходимо зарегистрироваться для просмотра ссылки ,
При подключении по ОЛЕ запускается отдельный процесс 1с8,а при com нет. Из пустой базы подключаюсь к основной и из нее получаю данные и пишу в новую базу.
Petre
QUOTE (bizisoft @ 25.02.20, 23:07) необходимо зарегистрироваться для просмотра ссылки
А как тогда быть с такой ситуацией, когда заполняемый реквизит является ссылкой, как его заполнять в СОМ?

В подключенной же базе и ищите нужную ссылку и присваивайте значению.
Т. е. что-то типа того:
СпрПр = Подключение.Справочники.Производители.СоздатьЭлемент();

СпрПр.Наименование = пвПроизводитель.Наименование;

СпрСт = Подключение.Справочники.Страны.НайтиПоНаименованию(пвПроизводитель.СтранаПроисхождения.Наименование);

СпрПр.СтранаПроисхождения = СпрСт;

СпрПр.Записать();


QUOTE (denis84 @ 26.02.20, 8:17) необходимо зарегистрироваться для просмотра ссылки
При подключении по ОЛЕ запускается отдельный процесс 1с8,а при com нет.

Вы немного путаете. В терминологии 1с, есть COMСоединитель и AplicationСервер. И то и другое - COM- (или по-старому, OLE-) технология.
denis84
Petre @ Сегодня, 9:29 необходимо зарегистрироваться для просмотра ссылки ,
Да,согласен. Делаю так Соединение = Новый COMОбъект("V82.Application");
bizisoft
Решил поэксперементировать со справочником попроще.
КлассификаторСтранМира
Та же петрушка.

Есть подозрение, что обязательный реквизит "Код" автоматически не присваивается.
Попробовал код выполнить без СОМ, просто в базе - таки да, ругается на Код не заполнен.

Тогда не понятно, как тогда присвоить ему нужное значение?
Наверное функция УстановитьНовыйКод() через СОМ работать не будет.
Petre
QUOTE (bizisoft @ 26.02.20, 10:18) необходимо зарегистрироваться для просмотра ссылки
Наверное функция УстановитьНовыйКод() через СОМ работать не будет.

QUOTE
УстановитьНовыйКод (SetNewCode)
...
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер).
bizisoft
bizisoft @ Сегодня, 11:18 необходимо зарегистрироваться для просмотра ссылки ,
Я ошибался. УстановитьНовыйКод() работает однако.

Это хорошо, тогда буду пробовать дальше.

Цитата(Petre @ 26.02.20, 10:29) необходимо зарегистрироваться для просмотра ссылки
В подключенной же базе и ищите нужную ссылку и присваивайте значению.
Т. е. что-то типа того:

А я думал, что объект полученный через СОМ имеющий тип Ссылка невозможно использовать и нужно пользовать только простые типы, т.к. если например запросом получить данные то ссылочный реквизит содержит СОМОбъект.

Petre, а если например я в ОбщииМодули добавлю свой модуль, в котором пропишу свою функцию (например которая ищет Товар по двум параметрам Артикул и Производитель и возвращает результат), и запущу ее через СОМ соединение, в каком контексте она отработает, в контексте текущей базы или в контексте базы к которой подключился?
sava1
Цитата(bizisoft @ 26.02.20, 10:41) необходимо зарегистрироваться для просмотра ссылки
пропишу свою функцию (например которая ищет Товар по двум параметрам Артикул и Производитель и возвращает результат), и запущу ее через СОМ соединение, в каком контексте она отработает


в контексте подключенной базы и вернет СОМ-объект, поэтому в таких случаях возвращает примитивные типы
mut
Если связь между базами более-менее постоянная, я, обычно в базе-приемнике, в модуле Внешнего соединения, пишу необходимые методы для формирования данных и вызываю их из исходной базы. Получается проще - получили простые данные - названия или коды и пр., потом уже в контексте принимающей БД делаем поиск, создание и прочее.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.