FAQ
From 1cpp
Contents |
Вопросы новичков
- Q: Вообще ничего не понимаю. Как начать, и если можно - по шагам.
A: Сходи в раздел Documentation, там есть хороший раздел, посвященный разным QuickStart'ам.
Где взять?
- Q: Где взять самую последнюю версию 1С++?
A: Download - Q: Где взять не последнюю, а другую версию 1С++?
A: В архиве. - Q: Где взять документацию к компоненте?
A: Documentation - Q: А где взять визуальный редактор классов к 1С++?
A: Visual 1c++ и многое другое можно взять у Александра Орефкова. - Q: А где можно посмотреть на реальные примеры использования 1С++?
A: На том же Клубе профессионалов есть репозитарий 1С++, да и вообще, если в разных разделах поискать по строке 1С++ - можно найти много интересного.
Ссылки на другие примеры всячески приветствуются - Q: Документация и примеры - это конечно, хорошо, а где можно с людьми пообщаться?
A: На официальном форуме компоненты. Раньше форум жил на itland'е, теперь там архив.
Проблемы при загрузке компоненты
- Q: При выполнении отчета пишет мне вот такое: "catch (_com_error& er)".
A: Это msblast. Читать: что это такое и как от этого избавиться. - Q: Установил компоненту 1С++, прописал в глобальник
ЗагрузитьВнешнююКомпоненту("1cpp.dll"), а у меня теперь 1С валится, говорит, что "память не может быть read". ОС - Windows NT/2000/XP. Под '95/'98/ME все нормально.
A: Во время первого запуска компонента регистрируется в реестре. Этот процесс должен происходить с правами администратора локальной машины. - Q: У меня 100 компьютеров в сети - я не могу на каждой зайти администратором. Хочу знать, что конкретно 1С++ пишет в реестр, а дальше я как-нибудь разберусь.
A: Эта тема обсуждалась на форуме: http://itland.ru/forum/index.php?showtopic=3627. - Q: При запуске 1С-Предприятия выдается следующее сообщение: "Ошибка при создании объекта из компоненты \\Адрес_сервера\Директория_БД\1CPP.dll (отсутствует интерфейс IInitDone)"
A: http://www.1cpp.ru/forum/YaBB.pl?num=1148543571 - там очень подробно рассказано из-за чего эта проблема возникает и предложено несколько способов ее решения. - Q: При запуске 1С-Предприятия выдается следующее сообщение: "Ошибка при создании объекта из компоненты \\Адрес_сервера\Директория_БД\1CPP.dll (отсутствует CLSID)"
A: Опять же: http://www.1cpp.ru/forum/YaBB.pl?num=1148543571 - Q: Я в своей конфигурации использую еще несколько внешних компонент (rainbow, vtools). И боюсь, что возникнет конфликт между именами объектов этих ВК и 1С++. Как быть?
A: Если подгружаются несколько ВК, то 1C++ должна грузиться первой. Вообще, смеси типа Rainbow, 1C++, TurboBL - являются довольно взрывоопасными, поскольку работают через сходные механизмы подмены внутренних вызовов 1С. Старайтесь использовать только 1С++ - в ней, как правило, сосредоточен весь функционал вышеупомянутых компонент.
Классы
defcls.prm
- Q: Создал defcls.prm, написал там одну строку, а 1С - хоть бы хны.
A: В старых версиях 1С++ первая строка в каждом из Ваших defcls.prm должна была быть пустой. Поди догадайся. - Q: Не помогло.
A: Если вы работаете в FAR менеджере - то обратите внимание на раскладку, в которой создается Ваш defcls.prm. Она должна быть cp1251 (Win). - Q: Чем-нибудь отличается void от undefine? В каких случаях кого использовать?
A: Примерно так:- Void - обозначение того, что метод не возвращает значений вообще. В терминологии 1С - Процедура, а не Функция.
- Undefine используется для типизации тех переменных/методов/параметров, для которых тип не определен / может быть любым.
- Q: Что-то у меня не получается создать метод со значением по умолчанию.
A: Как правило, именно с попытки завести метод со значениями по умолчанию начинается реальное использование файлов defcls.prm. И если что-то сразу не получается, то это значит, что нужно внимательнее отнестись к синтаксису этого файла. Известных трудностей - три.- Когда метод со значением по умолчанию описывается в defcls.prm, то нужно указывать типы значений не только параметров, но и возвращаемого значения самого метода
Число TestMethod( Число Параметр_Ноль = 0 ); - Если метод является процедурой (не возвращает никаких значений), то нужно указывать тип "возвращаемого" значения как 'void' (обязательно с маленькой буквы).
void TestMethod( Число Параметр_Ноль = 0 ); - Не забывайте ставить точки с запятыми после строк описаний методов.
- Когда метод со значением по умолчанию описывается в defcls.prm, то нужно указывать типы значений не только параметров, но и возвращаемого значения самого метода
Наследование
- Q: Объясните, плиз, на пальцах, как реализовать наследование. Есть справочник или документ определенного вида, необходимо расширить функционал, как унаследовать свойства и методы?
A: В defcls.prm пишешь:класс Документ_Счет = Документ_Счет.ert : Документ.Счет {};
В Документ_Счет.ert реализуешь нужные тебе дополнительные методы, при этом для ссылки на объект документа используешь конструкцию Сам(Контекст). Например:
Функция Сам(Конт) Возврат Конт; КонецФункции Функция Оплачен() Экспорт Д=СоздатьОбъект("Документ"); Д.ВыбратьПодчиненныеДокументы(,,Сам(Контекст).ТекущийДокумент()); Пока Д.ПолучитьДокумент()=1 Цикл Если Д.Вид()="Выписка" Тогда Возврат 1; КонецЕсли; КонецЦикла; Возврат 0; КонецФункции
И в коде клиента тогда можно написать:
Счет=СоздатьОбъект("Документ_Счет"); Счет.ВыбратьДокументы(); //Используешь унаследованный метод Пока Счет.ПолучитьДокумент()=1 Цикл Если Счет.Оплачен()=0 Тогда //Используешь свой метод Сообщить("Счет "+Счет.ТекущийДокумент()+" не оплачен."); КонецЕсли; КонецЦикла;
- Q: Есть класс, который является наследником от класса 1С "ТаблицаЗначений" (Назовем его "Общие.ТаблицаЗначений").
Пытаемся его использовать в следующих конструкциях.
ТЗ = СоздатьОбъект("Общие.ТаблицаЗначений"); Запрос.Выгрузить(ТЗ); Сообщить(ТипЗначенияСтр(ТЗ)); //"ТаблицаЗначений", вместо ожидаемого "Общие.ТаблицаЗначений" ТЗ = СоздатьОбъект("Общие.ТаблицаЗначений"); ТЗ2 = СоздатьОбъект("ТаблицаЗначений"); Запрос.Выгрузить(ТЗ2); Сообщить(ТЗ2.КоличествоСтрок()); //их больше нуля ТЗ2.Выгрузить(ТЗ); Сообщить(ТЗ.КоличествоСтрок()); // ноль
A: Метод Выгрузить() у запроса (и аналогичный у таблицы значений), предполагает, что тип передаваемого в него параметра - ТаблицаЗначений. Тот факт, что наш класс является наследником ТЗ - ничего не значит. Это класс другого типа. Нужно писать вот так:ТЗ = СоздатьОбъект("Общие.ТаблицаЗначений"); Запрос.Выгрузить(ТЗ.ПолучитьБазовыйКласс()); Сообщить(ТипЗначенияСтр(ТЗ)); // "Общие.ТаблицаЗначений"
Примечание Если "Общие.ТаблицаЗначений" наследует от нескольких классов, то лучше указать, какой именно базовый класс мы хотим получить:
ТЗ = СоздатьОбъект("Общие.ТаблицаЗначений"); Запрос.Выгрузить(ТЗ.ПолучитьБазовыйКласс("ТаблицаЗначений")); Сообщить(ТипЗначенияСтр(ТЗ));
- Q: А если у меня
класс Наследование = classes\nasled.cls:Справочник.Номенклатура, Документ.Заявка {};
Каким макаром наследуются одинаковые свойства и медоды? Например, Вид()?
A: Если не переопределить Вид() в своем классе, то вызываться будет Вид() для Справочник.Номенклатура, потому как он первый в списке классов-родителей. Можешь переопределить Вид() в своем классе, и возвращай что хочешь, например "Заявка_Номенклатура".
Прочие вопросы про классы
- Q: Насколько полна объектная модель 1С++?
A: Основные принципы (инкапсуляция, наследование, полиморфизм) - соблюдены. Есть ряд ограничений:- Нет перегрузки операторов и функций
- Конструктор не умеет принимать параметры.
- Нет возможности создать protected поле или метод.
- Q: Подсоединяю чужой класс, а мне говорит "Форма<<?>>...; Переменная не определена"
A: В глобальный модуль добавь строкуПерем Форма Экспорт; //Для отладки классов 1С++ - Q: Почему когда я меняю реализацию класса в *.ert изменения не применяются до перезапуска 1С?
A: Сервис-Параметры-1С++ - Отжать "Оптимизация". - Q: Это для модулей, а как насчет описания классов?
A: Иерархия классов считывается при загрузке 1С++, и в течении сеанса работы не меняется. - Q: Как сделать, чтобы при приведении объекта в строку (СокрЛП(), Строка(), СокрЛ()) - возвращалось удобочитаемое строковое представление объекта?
A: Необходимо определить в классе метод _ПолучитьКод / _GetCode, который должен возвращать строковое представление объекта. Пример реализации для класса "Период"Перем Начало Экспорт; Перем Окончание Экспорт; Функция Этот(Конт) Возврат Конт; КонецФункции Функция Выбрать(Подсказка) Экспорт Если ВвестиПериод(Начало, Окончание,Подсказка)<>1 Тогда Возврат 0; Иначе Возврат 1; КонецЕсли; КонецФункции Функция _ПолучитьКод() Попытка глУстПропись(Гривня,"у"); Исключение КонецПопытки; Возврат ПериодСтр(Начало, Окончание); КонецФункции Процедура Конструктор() Начало = ПолучитьПустоеЗначение("Дата"); Окончание = Начало; КонецПроцедуры
По адресу http://itland.ru/forum/index.php?showtopic=2074 можно почитать подробное обсуждение этого вопроса.

