Персональная страница Федора Езеева
Главная
Download
Ссылки
MS SQL
Обмен данными
Новости
Статьи
О себе
Крупные разделы...
Коллективная разработка
1С++, OOP, XP
FuncTest
FAQ
Структура 1cv7.md
Дальше Назад Содержание

Содержимое страницы перенесено на официальный сайт компоненты

FAQ по 1С++.

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

Q. При выполнении отчета пишет мне вот такое: "catch (_com_error& er)".
A. Это msblast. Что это такое и как от этого избавиться - читать тут:
http://www.viruslist.com/viruslist.html?id=2727712
http://www.microsoft.com/technet/security/bulletin/MS03-026.mspx


Q. Вообще ничего не понимаю. Как начать, и если можно - по шагам.
A. Сходи на http://www.snif.ru/pages/len_1cpp.htm, там есть хороший QuickStart.


Q. Подсоединяю чужой класс, а мне говорит "Форма<<?>>...; Переменная не определена"
A. В глобальный модуль добавь строку

Перем Форма Экспорт; //Для отладки классов 1С++


Общие вопросы

Q. Где скачать самую последнюю версию 1С++?
A. http://www.1cpp.ru.


Q. Где взять документацию к компоненте?
A. http://www.1cpp.ru/docum/.


Q. А где взять визуальный редактор к 1С++?
A1. Visual 1c++ и многое другое можно взять у Александра Орефкова. Внимание!!! Данный сайт рубит Оперу на корню, так что сюда ходим Эксплорером.. Примечание. По последним агентурным данным - Opera 7.20 и выше такой болезнью не страдает.
A2. Самая последняя версия vis1cpp (1.0.0.13) на данный момент (06.12.2007) у Александра на сайте отсутствует. Зато она есть у меня. :)


Q. Пытаюсь установить Visual 1C++, все делаю по инструкции, а мне сообщается, что не хватает какого-то config.tlb. Где его взять?
A. Этот файл входит в состав дистрибутива openconf (на основе openconf работает и Visual 1c++). На момент написания (20/08/2004), последнюю версию openconf можно взять тут: http://openconf.itland.ru/beta/ocb1011.zip.


Q. Скачал свежую версию 1С++, а там als документация от версии 1.5.0.3 (или вообще нет). Почему так, и где взять свежую?
A. У Дмитрия Гусева в свое время слетел винт, а вместе с ним ушла и документация. Увы.


Q. Установил компоненту 1С++, прописал в глобальник

ЗагрузитьВнешнююКомпоненту("1cpp.dll")
, а у меня теперь 1С валится, говорит, что "память не может быть read". ОС - Windows NT/2000/XP. Под '95/'98/ME все нормально.
A. Во время первого запуска компонента регистрируется в реестре. Этот процесс должен происходить с правами администратора локальной машины.


Q. Я загружаю одну версию 1С++ (смотрю в свойствах файла), а загружается другая (смотрю в настройках 1С). Кто виноват и что делать?
A. Дело в том, что внешние компоненты могут лежать в разных местах. 1С ищет их и в КаталогИБ(), и в %ProgramFiles%/1cv77/bin и чуть ли не в каталоге пользователя. Так вот в поиске компоненты она обходит эти пути в определенном порядке, и пытается загрузить первую попавшуюся. А совсем не самую стабильную (самую последнюю).


Q. Я удалил ненужную мне версию компоненты и теперь при запуске 1С-Предприятия выдается следующее сообщение: "Ошибка при создании объекта из компоненты \\Адрес_сервера\Директория_БД\1CPP.dll (отсутствует интерфейсIInitDone)". Что делать теперь?
A. Тут проблема в том, что если раньше компонента была зарегистрирована по одному пути, а мы переложили ее в другой, то 1С пытается перерегистрировать компоненту по новому пути. И если в этот момент у 1С вдруг не хватает прав на запись соответствующих изменений в реестр, то выводится вот такая ошибка. Запуск 1С под администратором решит Вашу проблему.


Q. У меня 100 компьютеров в сети - я не могу на каждой зайти администратором. Хочу знать, что конкретно 1С++ пишет в реестр, а дальше я как-нибудь разберусь.
A. Эта тема обсуждалась на форуме: http://itland.ru/forum/index.php?showtopic=3627.


Q. А где можно посмотреть на реальные примеры использования 1С++?
A. На том же
Клубе профессионалов есть репозитарий 1С++, да и вообще, если в разных разделах поискать по строке 1С++ - можно найти много интересного.


Q. Документация и примеры - это конечно, хорошо, а где можно с людьми пообщаться?
A. Среди многих замечательных форумов на itland.ru есть так же и форум, посвященный 1С++. Заходите почаще.


Q. Насколько полна объектная модель 1С++?
A. Основы ООП - имеются. Инкапсуляция, наследование, полиморфизм. Однако синтаксические возможности языка 1С накладывают массу ограничений. А именно:

  • Нет перегрузки операторов
  • Нет перегрузки функций
  • Конструктор не умеет принимать параметры.
  • Нет возможности создать protected поле или метод.


Специализированные вопросы

Q. Создал defcls.prm, написал там одну строку, а 1С - хоть бы хны.
A. Первая строка в каждом из Ваших defcls.prm должна быть пустой. Поди догадайся.


Q. Добавил пустую строчку - а все равно, ничего не произошло.
A. Если вы работаете в FAR менеджере - то обратите внимание на раскладку, в которой создается Ваш defcls.prm. Она должна быть cp1251 (Win).


Q. Чем-нибудь отличается void от undefine? В каких случаях кого использовать?
A.

  • Void - обозначение того, что метод не возвращает значений вообще. В терминологии 1С - Процедура, а не Функция.
  • Undefine используется для типизации тех переменных/методов/параметров, для которых тип не определен / может быть любым.
В общем - каждому овощу свой фрукт.


Q. Я в своей конфигурации использую еще несколько внешних компонент (rainbow, vtools). И боюсь, что возникнет конфликт между именами объектов этих ВК и 1С++. Как быть?
A. Если подгружаются несколько ВК, то 1C++ должна грузиться первой. Вообще, смеси типа Rainbow, 1C++, ExtForms и TurboBL - являются довольно взрывоопасными. Поскольку работают через сходные механизмы подмены внутренних вызовов 1С. Старайтесь использовать только 1С++ - в ней, как правило, сосредоточен весь функционал вышеупомянутых компонент.


Q. Что-то у меня не получается создать метод со значением по умолчанию.
A. Как правило, именно с попытки завести метод со значениями по умолчанию начинается реальное использование файлов defcls.prm. И если что-то сразу не получается, то это значит, что нужно внимательнее отнестись к синтаксису этого файла. Известных трудностей - три.
1. Когда метод со значением по умолчанию описывается в defcls.prm, то нужно указывать типы значений не только параметров, но и возвращаемого значения самого метода (во всех примерах нужное место выделено полужирным шрифтом).

class TestClass = Test.ert
{
Число TestMethod( Число Параметр_Ноль = 0 );
};

2. Если метод - процедура (не возвращает никаких значений), то нужно указывать тип значения 'void' (обязательно с маленькой буквы).
class TestClass = Test.ert
{
void TestMethod( Число Параметр_Ноль = 0 );
};

3. Не забывайте ставить точки с запятыми после строк описаний методов.
class TestClass = Test.ert
{
void TestMethod( Число Параметр_Ноль = 0 );
};


Q. Есть класс, который является наследником от класса 1С "ТаблицаЗначений" (Назовем его "Общие.ТаблицаЗначений").
Пытаемся его использовать в следующих конструкциях.

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

A. Метод Выгрузить() у запроса (и аналогичный у таблицы значений), предполагает, что тип передаваемого в него параметра - ТаблицаЗначений. Тот факт, что наш класс является наследником ТЗ - ничего не значит. Это класс другого типа. Нужно писать вот так:
ТЗ = СоздатьОбъект("Общие.ТаблицаЗначений");
Запрос.Выгрузить(ТЗ.ПолучитьБазовыйКласс());
Сообщить(ТипЗначенияСтр(ТЗ)); // "Общие.ТаблицаЗначений"
Примечание Если "Общие.ТаблицаЗначений" наследует от нескольких классов, то лучше указать, какой именно базовый класс мы хотим получить:
ТЗ = СоздатьОбъект("Общие.ТаблицаЗначений");
Запрос.Выгрузить(ТЗ.ПолучитьБазовыйКласс("ТаблицаЗначений"));
Сообщить(ТипЗначенияСтр(ТЗ));


Q. Почему когда я меняю реализацию класса в *.ert изменения не применяются до перезапуска 1С?
A. Сервис-Параметры-1С++ - Отжать "Оптимизация"


Q. Это для модулей, а как насчет описания классов?
A. Иерархия классов считывается при загрузке 1С++, и в течении сеанса работы не меняется.


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

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

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


Q. А если у меня

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


Q. Как сделать, чтобы при приведении объекта в строку (СокрЛП(), Строка(), СокрЛ()) - возвращалось удобочитаемое строковое представление объекта?
A. Необходимо определить в классе метод _ПолучитьКод / _GetCode, который должен возвращать строковое представление объекта.
Пример реализации для класса "Период"

Перем Начало  Экспорт;
Перем Окончание  Экспорт;

Функция Этот(Конт)
	Возврат Конт;
КонецФункции                   

Функция Выбрать(Подсказка) Экспорт
	Если ВвестиПериод(Начало, Окончание,Подсказка)<>1 Тогда
		Возврат 0;
	Иначе
		Возврат 1;
	КонецЕсли;
КонецФункции

Функция _ПолучитьКод()       
	Попытка
		глУстПропись(Гривня,"у");    
	Исключение
	КонецПопытки;
	Возврат ПериодСтр(Начало, Окончание);
КонецФункции

Процедура Конструктор()
	Начало = ПолучитьПустоеЗначение("Дата");
	Окончание = Начало;
КонецПроцедуры

Процедура ПриОткрытии()
	Форма.Параметр._ПриОткрытии();
КонецПроцедуры
По адресу http://itland.ru/forum/index.php?showtopic=2074 можно почитать подробное обсуждение этого вопроса.


Дальше Назад Содержание
Rambler's Top100 1C:TOP-100

© 1998-2004 Fedor Ezeev.

Last updated: 2007-12-06