Ошибка при вызове конструктора структура

Проекты и консалтинг. Внедрение и доработка. Сопровождение 1С. Обучение.

Содержание:

1. Почему может возникнуть ошибка при вызове конструктора (COM-объект 1С)?

2. С помощью чего можно исправить ошибку при вызове конструктора (COM-объект 1С)?

3. Параметры при вызове конструктора (COM-объект 1С), которые регистрируют компоненты строки кода перед регистрируемым dll-файлом    

1.      Почему может возникнуть ошибка при вызове конструктора (COM-объект 1С)?

Когда ты начинающий специалист 1С, то иногда приходится чувствовать себя шаманом с бубном, так как не знаешь причин ошибки и как её исправить тоже.

Сегодня мы разберем одну из ошибок, которые появляются при работе с базой, а именно ошибку при вызове конструктора (COM-объект 1С).

Ситуацию такую, мы можем наблюдать при загрузке с Excel при использовании (COM-объекта 1С), при обмене между базами. Ситуаций, когда возникает данное сообщение с возникшей проблемой довольно много при работе с программой.

Как правило, данная ошибка возникает из-за того, что при установке платформы1С не произошла автоматическая регистрация 64-х разрядной компоненты, которая отвечает за использование COM-соединения 1С 8.3. А почему это произошло, спросите? Все очень просто и в то же время сложно, если не знаешь, в чем все ядро проблемы. А причина в том, что те, у кого выдаются такие ошибки, используют 32(86) – разрядную операционную систему и ставят вместо платформы необходимой разрядности их системы, платформу 1С предназначенную для совсем другой системы.   

2. С помощью чего можно исправить ошибку при вызове конструктора (COM-объект 1С)?

Исправить данную ошибку, довольно легко. Для этого необходимо всего лишь зарегистрировать библиотеку dll в реестре при помощи командной строки или программы PowerShell, в зависимости от того, что любите использовать, и команды regsvr32.

Для того чтобы выполнить команду, достаточно будет в строке написать такой текст команды «regsvr32 «C:Program Files1cv88.3.ХХ.ХХХХbincomcntr.dll»». Вместо «ХХ.ХХХХ» необходимо указать необходимый релиз платформы, библиотеку которой, необходимо зарегистрировать в реестре системы.

Если все выполнено правильно и регистрация произошла успешно, то должно выдать сообщение, как на скриншоте, об успешной регистрации библиотеки.

Администратор: Командная строка   

3. Параметры при вызове конструктора (COM-объект 1С), которые регистрируют компоненты строки кода перед регистрируемым dll-файлом

Также есть некоторые особенности команды, которая регистрирует компоненты.

На данный момент я знаю только 4 параметра (которые при написании строки кода указываются перед регистрируемым dll-файлом):

·        /u — параметр, отменяет регистрацию

·        /i — параметр, который позволяет при необходимости, в зависимости от библиотеки.

·        /n —параметр используется только для установки компоненты 1С, в основном пишется вместе с предыдущим (/I);

·        /s – возможность отключить все сообщения при регистрации;

Существует, также, один немаловажный момент, что в зависимости от версии командной строки, иногда приходится прописывать путь к самой утилите.

Кстати, существуют специальные программы-инструменты, которые помогают регистрировать компоненты, без знания команд и утилит администрирования, зарегистрировать библиотеку и продолжить работать дальше.

Таких программ достаточно много и писать, какое-то одно название смысла нет.

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

Специалист компании «Кодерлайн»

Олег Мороз

NyanXiho

0 / 0 / 0

Регистрация: 12.03.2022

Сообщений: 2

1

Ошибка при создании конструктора структуры

12.03.2022, 16:30. Показов 512. Ответов 1

Метки c++ (Все метки)


Добрый день, при создании конструктора структуры у меня появляется ошибка
No matching constructor for initialization of ‘sessionResult’
Насколько я понимаю, не правильно создается конструктор из-за того, что одно из полей структуры так же структура.
Кто-нибудь сталкивался с подобной проблемой? Что тут можно сделать?
Спасибо.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <iomanip>
 
using namespace std;
 
struct Marks
{
    int exellent;
    int good;
    int satisfactory;
    int fail;
};
 
struct sessionResult{
public:
    int numbGroup;
    int numbStudents;
    Marks numMarks;
 
    sessionResult(int group, int students, Marks marks){
        numbGroup = group;
        numbStudents = students;
        numMarks = marks;
    }
 
};
 
int main()
{
    sessionResult a(15, 28,4, 2, 1,6);
    return 0;
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Nishen

1172 / 833 / 359

Регистрация: 26.02.2015

Сообщений: 3,743

12.03.2022, 16:45

2

Лучший ответ Сообщение было отмечено NyanXiho как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <iomanip>
 
using namespace std;
 
struct Marks
{
    int exellent;
    int good;
    int satisfactory;
    int fail;
};
 
struct sessionResult {
public:
    int numbGroup;
    int numbStudents;
    Marks numMarks;
 
    sessionResult(int group, int students, Marks marks) {
        numbGroup = group;
        numbStudents = students;
        numMarks = marks;
    }
 
};
 
int main()
{
    sessionResult a(15, 28, { 4, 2, 1, 6 });
    return 0;
}



1



Первая статья в новом 2021 году будет посвящена программе 1С. Это связанна с тем что данное ПО очень распространено. Так как альтернативы пока что нет. К типовым конфигурация претензий практически нет, в них не появляются ошибки, при обновлении, переносе и других манипуляциях. Что нельзя сказать о самопысных конфигурациях или измененных типовых. Как правило занимаются этим программисты не высокого уровня, так как час разработки профессионала стоить достаточно дорого. В результате конечный пользователь получаем огромные проблемы которые возникают после каких либо манипуляций либо с базой или клиентами. Сегодня поговорим об одной интересной ошибки которая появляется при попытке распечатать какой либо документ «Ошибка при вызове конструктора (COMOбъект) класс не зарегистрирован».

Использование COMOбъектов в 1С это прошлый век, сейчас уже ни кто так не пишет. Раньше с его помощью реализовали печать документов. Они выгружались в OpenLibre Office и от туда уже печатались.

Появиться такая ошибка может после

1 Обновления платформы

2 Переустановки ОС и 1С

3 Обновление конфигурации

4 Проблем с офисными пакетами

5 и т.д.

Это самые распространенные.

У меня есть еще несколько статей в которых я рассказывал как можно исправить различные ошибки 1С рекомендую прочитать.

Ошибка при отправке запроса на сервер

При появлении ошибки в 1С нет кнопки подробнее

Как настроить сортировку в отчете

Как сохранить обработку (как внешнюю)

Как указать версию платформы

Как посмотреть изменения в конфигурации

Три способа избавиться от ошибки «Ошибка при вызове конструктора…»

И так после каких либо манипуляций с 1С у вас стала появляться ошибка.

Ошибка при вызове конструктора (COMOбъект): -2147221164(0x80040154) класс не зарегистрирован

Ошибка при вызове конструктора (COMOбъект) класс не зарегистрирован
Ошибка при вызове конструктора (COMOбъект): -2147221164(0x80040154) класс не зарегистрирован

Первый способ

Самое простое это переустановить офисные пакеты OpenLibre, так же как вариант если у вас стоял Open поставить Libre и на оборот. Это нужно для того чтобы обновить специальный компонент.

Второй способ

Попробовать зарегистрировать самостоятельно, для этого запускаем командную строку от имени администратора, переходим в каталог введя команду.

cd windowssyswow64

И регистрируем

regsvr32 «C:Program Files (x86)1cv88.3.16.18.14comcntr.dll»

-2147221164(0x80040154) класс не зарегистрирован

Кстати данную манипуляцию нужно проводить на сервере.

Третий способ

Установить 32 битную версию клиента 1С, можно даже поверх х64. В итоге у вас появиться два ярлычка для запуска, один для х32 второй х64.

Ошибка при вызове конструктора (COMOбъект)

Версию можно указать и в ярлыке запуска 1С.

Ошибка при вызове конструктора (COMOбъект):  класс не зарегистрирован

Можно еще попробовать самостоятельно создать COM + , но лично из своего опыта могу сказать это не помогает. Самый действенный вариант это установка х32 клиента. Так как компонента которая необходимо работает только с х32.

Так же проблема может быть непосредственно в самом коде.

Ramzes7000
06.12.2011 17:29 Прочитано: 7411

{ОбщийМодуль.СтандартныеОтчеты.Модуль(4132)}: Ошибка при вызове конструктора (ХранилищеЗначения)
НастройкиДляИстории = XMLСтрока(Новый ХранилищеЗначения(СтруктураНастроек));
по причине:
Переданное значение не может быть помещено в ХранилищеЗначения, поскольку не сериализуется или содержит вложенный несериализуемый элемент

как исправить?

Yandex
Возможно, вас также заинтересует

Реклама на портале

E_Migachev
06.12.2011 18:21 Ответ № 1

смотри что в СтруктураНастроек, видимо оно неправильно формируется

Ramzes7000
07.12.2011 11:15 Ответ № 2

этого не было пока я не увеличил длину номера документов создав нумератор и присвоив его нескольким документам

E_Migachev
07.12.2011 11:20 Ответ № 3

смотри как формируется СтруктураНастроек

Ramzes7000
07.12.2011 12:50 Ответ № 4

структура формируется нормально отрабатывает без ошибок или может нужно обратить на что-то внимание?

Ramzes7000
07.12.2011 13:40 Ответ № 5

Ура поборол!

нормально работает в релизе 8.2.15

необходимо просто установить режаи совместимости в самой конфигурации (выбрать совместимость с 8.2.13)


Изменено 07.12.11 14:17:10

E_Migachev
07.12.2011 15:04 Ответ № 6

(5) Ramzes7000, поздравляю *13

Linx
16.02.2017 13:06 Ответ № 7

Сейчас тоже столкнулся, при переходе на 8.3, отключил режим совместимости. Пока нашел такое:

http://pro1c.org.ua/index.php?showtopic=6543

Код 1C v 8.х

 

//Я вышел из сложившейся ситуации следующим образом с использованием функций ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр:

СтрокаВнутр1 = ЗначениеВСтрокуВнутр(НеСериализующийсяЭлемент1);
Хранилище = новый ХранилищеЗначений(СтрокаВнутр1);

//И дальше уже получал это значение:

СтрокаВнутр2 = Хранилище.Получить();
НеСериализующийсяЭлемент2 = ЗначениеИзСтрокиВнутр(СтрокаВнутр2);

Вроде, более логичное решение, чем режим совместимости. Но нужно еще погуглить.

Подсказка: Вы можете добавить любую страничку в Избранное щелкнув по значку

Структура в 1С

В языке программирования 1С, есть несколько коллекций (множеств) значений. Каждые из них имеют свои возможности и предназначение, хотя иногда имеют одинаковые методы (например Количество()).

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

Какие особенности имеет структура

  • Имя (Ключ) значения всегда строка, которое не может начинаться на цифру и содержать некоторые символы (пробел,%,?,>,< и другие);
  • ключ не может быть пустым;
  • значение может быть произвольного типа, в том числе «Неопределенно» или же Структура(вложенная);
  • ключ уникален во всей структуре;
  • регистр ключа имеет значение («Ключ» не равно «ключ»);
  • структура может быть пустой(не содержать значений);
  • значения могут быть инициализированы при создании, либо заполнены поочередно;
  • является универсальным транспортным значением для всех платформ 1с и видов исполнения (не мутабельное);
  • возможно использование в системной процедуре ЗаполнитьЗначения();
  • тип «Структура» не хранится в базе данных (это рабочее, промежуточное значение или свойство объекта);
  • ключ нельзя изменить (переименовать);
  • скоростью обращения к значению обычно пренебрегают при небольших коллекциях, но структура не является индексированной таблицей (скорость опредяеляется скоростью памяти, перебора значений до искомого).

Приемы работы со структурой

//Создание структуры:
Структура = Новый Структура;
Структура = Новый Структура("Ключ1,Ключ2","Значение1",2);

//Обращение к значению структуры
Значение1 = Структура.Ключ1;
Значение2 = Структура["Ключ2"];

//Добавление значения
Структура.Вставить("Ключ3", Дата(1,1,1));

//Замена значения - если "Ключ3" существует, значение заменяется, иначе добавляется
Структура.Вставить("Ключ3", Дата(2020,11,1));

//Удаление одного значения
Структура.Удалить("Ключ2");

//Удаление всех значений
Структура.Очистить();

//Перебор значений
Для каждого ЭлементСтруктуры из Структура Цикл
Сообщить(ЭлементСтруктуры.Ключ);
Сообщить(ЭлементСтруктуры.Значение);
КонецЦикла;

//Копирование значений структуры
Структура = Новый Структура("Ключ1,Ключ2","Значение1",2);
СтруктураПриемник = Новый Структура("Ключ1,Ключ2");

ЗаполнитьЗначенияСвойств(СтруктураПриемник,Структура);

//Проверка наличия значения с определенным ключом в структуре

Если Структура.Свойство(«Ключ») = Ложь Тогда //Используется как функция

       Структура.Вставить(«Ключ»,»Теперь ключ есть»);

       Значение = Неопределено;

      Структура.Свойство(«Ключ»,Значение); //Используется как процедура

      Сообщить(Значение); //Значение стало «Теперь ключ есть»

КонецЕсли;

//У объекта есть служебное свойство: ДополнительныеСвойства
Документ = Документы.РеализацияТоваровИУслуг.СоздатьОбъект();
Документ.ДополнительныеСвойства.Вставить("Ключ1",2);

У структуры есть объект-потомок  — «ФиксированнаяСтруктура», ее значения нельзя поменять: вставить, удалить, остальные методы у них одинаковы, поэтому она и называется фиксированной.

Фиксированную структуру можно инициализировать при создании на основании структуры.

Структура = Новый Структура("ИмяЗначения",0);
Фикс = Новый ФиксированнаяСтруктура(Структура);
Сообщить(Фикс.ИмяЗначения);

Никакая реклама не поможет продать то, что продать невозможно.

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове метода контекста установитьдействие
  • Ошибка при вызове конструктора сомобъект 2147221164 0x80040154 класс не зарегистрирован
  • Ошибка при вызове метода контекста создать
  • Ошибка при вызове конструктора сомобъект 2147221005 0x800401f3
  • Ошибка при вызове метода контекста свойство задано неправильное имя атрибута структуры