FAQ

From 1cpp

Jump to: navigation, search

Contents

Вопросы новичков

  1. Q: Вообще ничего не понимаю. Как начать, и если можно - по шагам.
    A: Сходи в раздел Documentation, там есть хороший раздел, посвященный разным QuickStart'ам.

Где взять?

  1. Q: Где взять самую последнюю версию 1С++?
    A: Download
  2. Q: Где взять не последнюю, а другую версию 1С++?
    A: В архиве.
  3. Q: Где взять документацию к компоненте?
    A: Documentation
  4. Q: А где взять визуальный редактор классов к 1С++?
    A: Visual 1c++ и многое другое можно взять у Александра Орефкова.
  5. Q: А где можно посмотреть на реальные примеры использования 1С++?
    A: На том же Клубе профессионалов есть репозитарий 1С++, да и вообще, если в разных разделах поискать по строке 1С++ - можно найти много интересного.
    Ссылки на другие примеры всячески приветствуются
  6. Q: Документация и примеры - это конечно, хорошо, а где можно с людьми пообщаться?
    A: На официальном форуме компоненты. Раньше форум жил на itland'е, теперь там архив.

Проблемы при загрузке компоненты

  1. Q: При выполнении отчета пишет мне вот такое: "catch (_com_error& er)".
    A: Это msblast. Читать: что это такое и как от этого избавиться.
  2. Q: Установил компоненту 1С++, прописал в глобальник ЗагрузитьВнешнююКомпоненту("1cpp.dll") , а у меня теперь 1С валится, говорит, что "память не может быть read". ОС - Windows NT/2000/XP. Под '95/'98/ME все нормально.
    A: Во время первого запуска компонента регистрируется в реестре. Этот процесс должен происходить с правами администратора локальной машины.
  3. Q: У меня 100 компьютеров в сети - я не могу на каждой зайти администратором. Хочу знать, что конкретно 1С++ пишет в реестр, а дальше я как-нибудь разберусь.
    A: Эта тема обсуждалась на форуме: http://itland.ru/forum/index.php?showtopic=3627.
  4. Q: При запуске 1С-Предприятия выдается следующее сообщение: "Ошибка при создании объекта из компоненты \\Адрес_сервера\Директория_БД\1CPP.dll (отсутствует интерфейс IInitDone)"
    A: http://www.1cpp.ru/forum/YaBB.pl?num=1148543571 - там очень подробно рассказано из-за чего эта проблема возникает и предложено несколько способов ее решения.
  5. Q: При запуске 1С-Предприятия выдается следующее сообщение: "Ошибка при создании объекта из компоненты \\Адрес_сервера\Директория_БД\1CPP.dll (отсутствует CLSID)"
    A: Опять же: http://www.1cpp.ru/forum/YaBB.pl?num=1148543571
  6. Q: Я в своей конфигурации использую еще несколько внешних компонент (rainbow, vtools). И боюсь, что возникнет конфликт между именами объектов этих ВК и 1С++. Как быть?
    A: Если подгружаются несколько ВК, то 1C++ должна грузиться первой. Вообще, смеси типа Rainbow, 1C++, TurboBL - являются довольно взрывоопасными, поскольку работают через сходные механизмы подмены внутренних вызовов 1С. Старайтесь использовать только 1С++ - в ней, как правило, сосредоточен весь функционал вышеупомянутых компонент.

Классы

defcls.prm

  1. Q: Создал defcls.prm, написал там одну строку, а 1С - хоть бы хны.
    A: В старых версиях 1С++ первая строка в каждом из Ваших defcls.prm должна была быть пустой. Поди догадайся.
  2. Q: Не помогло.
    A: Если вы работаете в FAR менеджере - то обратите внимание на раскладку, в которой создается Ваш defcls.prm. Она должна быть cp1251 (Win).
  3. Q: Чем-нибудь отличается void от undefine? В каких случаях кого использовать?
    A: Примерно так:
    • Void - обозначение того, что метод не возвращает значений вообще. В терминологии 1С - Процедура, а не Функция.
    • Undefine используется для типизации тех переменных/методов/параметров, для которых тип не определен / может быть любым.
    В общем - каждому овощу свой фрукт.
  4. Q: Что-то у меня не получается создать метод со значением по умолчанию.
    A: Как правило, именно с попытки завести метод со значениями по умолчанию начинается реальное использование файлов defcls.prm. И если что-то сразу не получается, то это значит, что нужно внимательнее отнестись к синтаксису этого файла. Известных трудностей - три.
    1. Когда метод со значением по умолчанию описывается в defcls.prm, то нужно указывать типы значений не только параметров, но и возвращаемого значения самого метода
      Число TestMethod( Число Параметр_Ноль = 0 );
    2. Если метод является процедурой (не возвращает никаких значений), то нужно указывать тип "возвращаемого" значения как 'void' (обязательно с маленькой буквы).
      void TestMethod( Число Параметр_Ноль = 0 );
    3. Не забывайте ставить точки с запятыми после строк описаний методов.

Наследование

  1. Q: Объясните, плиз, на пальцах, как реализовать наследование. Есть справочник или документ определенного вида, необходимо расширить функционал, как унаследовать свойства и методы?
    A: В defcls.prm пишешь:
    класс Документ_Счет = Документ_Счет.ert : Документ.Счет
    {};

    В Документ_Счет.ert реализуешь нужные тебе дополнительные методы, при этом для ссылки на объект документа используешь конструкцию Сам(Контекст). Например:

    Функция Сам(Конт)
        Возврат Конт;
    КонецФункции
     
    Функция Оплачен() Экспорт
        Д=СоздатьОбъект("Документ");
        Д.ВыбратьПодчиненныеДокументы(,,Сам(Контекст).ТекущийДокумент());
        Пока Д.ПолучитьДокумент()=1 Цикл
            Если Д.Вид()="Выписка" Тогда
                Возврат 1;
            КонецЕсли;
        КонецЦикла;
        Возврат 0;
    КонецФункции

    И в коде клиента тогда можно написать:

    Счет=СоздатьОбъект("Документ_Счет");
    Счет.ВыбратьДокументы(); //Используешь унаследованный метод
    Пока Счет.ПолучитьДокумент()=1 Цикл
        Если Счет.Оплачен()=0 Тогда //Используешь свой метод
            Сообщить("Счет "+Счет.ТекущийДокумент()+" не оплачен.");
        КонецЕсли;
    КонецЦикла;
  2. Q: Есть класс, который является наследником от класса 1С "ТаблицаЗначений" (Назовем его "Общие.ТаблицаЗначений"). Пытаемся его использовать в следующих конструкциях.
    ТЗ = СоздатьОбъект("Общие.ТаблицаЗначений");
    Запрос.Выгрузить(ТЗ);
    Сообщить(ТипЗначенияСтр(ТЗ)); //"ТаблицаЗначений", вместо ожидаемого "Общие.ТаблицаЗначений"
    ТЗ = СоздатьОбъект("Общие.ТаблицаЗначений");
    ТЗ2 = СоздатьОбъект("ТаблицаЗначений");
    Запрос.Выгрузить(ТЗ2);
    Сообщить(ТЗ2.КоличествоСтрок()); //их больше нуля
    ТЗ2.Выгрузить(ТЗ);
    Сообщить(ТЗ.КоличествоСтрок()); // ноль


    A: Метод Выгрузить() у запроса (и аналогичный у таблицы значений), предполагает, что тип передаваемого в него параметра - ТаблицаЗначений. Тот факт, что наш класс является наследником ТЗ - ничего не значит. Это класс другого типа. Нужно писать вот так:

    ТЗ = СоздатьОбъект("Общие.ТаблицаЗначений");
    Запрос.Выгрузить(ТЗ.ПолучитьБазовыйКласс());
    Сообщить(ТипЗначенияСтр(ТЗ)); // "Общие.ТаблицаЗначений"

    Примечание Если "Общие.ТаблицаЗначений" наследует от нескольких классов, то лучше указать, какой именно базовый класс мы хотим получить:

    ТЗ = СоздатьОбъект("Общие.ТаблицаЗначений");
    Запрос.Выгрузить(ТЗ.ПолучитьБазовыйКласс("ТаблицаЗначений"));
    Сообщить(ТипЗначенияСтр(ТЗ));
  3. Q: А если у меня
    класс Наследование = classes\nasled.cls:Справочник.Номенклатура, Документ.Заявка {};

    Каким макаром наследуются одинаковые свойства и медоды? Например, Вид()?
    A: Если не переопределить Вид() в своем классе, то вызываться будет Вид() для Справочник.Номенклатура, потому как он первый в списке классов-родителей. Можешь переопределить Вид() в своем классе, и возвращай что хочешь, например "Заявка_Номенклатура".

Прочие вопросы про классы

  1. Q: Насколько полна объектная модель 1С++?
    A: Основные принципы (инкапсуляция, наследование, полиморфизм) - соблюдены. Есть ряд ограничений:
    • Нет перегрузки операторов и функций
    • Конструктор не умеет принимать параметры.
    • Нет возможности создать protected поле или метод.
    Объектная модель 1С++ очень похожа на модель, реализованную в python.
  2. Q: Подсоединяю чужой класс, а мне говорит "Форма<<?>>...; Переменная не определена"
    A: В глобальный модуль добавь строку Перем Форма Экспорт; //Для отладки классов 1С++
  3. Q: Почему когда я меняю реализацию класса в *.ert изменения не применяются до перезапуска 1С?
    A: Сервис-Параметры-1С++ - Отжать "Оптимизация".
  4. Q: Это для модулей, а как насчет описания классов?
    A: Иерархия классов считывается при загрузке 1С++, и в течении сеанса работы не меняется.
  5. Q: Как сделать, чтобы при приведении объекта в строку (СокрЛП(), Строка(), СокрЛ()) - возвращалось удобочитаемое строковое представление объекта?
    A: Необходимо определить в классе метод _ПолучитьКод / _GetCode, который должен возвращать строковое представление объекта. Пример реализации для класса "Период"
    Перем Начало  Экспорт;
    Перем Окончание  Экспорт;
     
    Функция Этот(Конт)
    	Возврат Конт;
    КонецФункции                   
     
    Функция Выбрать(Подсказка) Экспорт
    	Если ВвестиПериод(Начало, Окончание,Подсказка)<>1 Тогда
    		Возврат 0;
    	Иначе
    		Возврат 1;
    	КонецЕсли;
    КонецФункции
     
    Функция _ПолучитьКод()       
    	Попытка
    		глУстПропись(Гривня,"у");    
    	Исключение
    	КонецПопытки;
    	Возврат ПериодСтр(Начало, Окончание);
    КонецФункции
     
    Процедура Конструктор()
    	Начало = ПолучитьПустоеЗначение("Дата");
    	Окончание = Начало;
    КонецПроцедуры

    По адресу http://itland.ru/forum/index.php?showtopic=2074 можно почитать подробное обсуждение этого вопроса.

Personal tools