v7: Глюки внешней компоненты 1с++ (1cpp.dll)
Имеется класс, реализованный в теле внешней обработке. Внешняя обработка также содержит Таблицу, на которой находится какой-то АктивИкс (неважно какой).
Известно, что можно использовать Таблицу в классе 1С++, используя метод:
Но при этом происходит падение 1С. Если из таблицы убрать АктивИкс падения не будет.
Также его не будет если Таблица находится в файле mxl.
Есть способы решения этой проблемы?
(0) Идешь в журналы винды, наблюдаешь там что-то такое:
Запускаешь 1с-ину под отладчиком, ставишь бряк на относительный адрес 0x000a7ff4. Выполняешь действия, приводящие к падению, срабатывает бряк, смотришь откуда пришло, разбираешься как это обойти.
Запускаешь 1с-ину под отладчиком, ставишь бряк на относительный адрес 0x000a7ff4. Выполняешь действия, приводящие к падению, срабатывает бряк, смотришь откуда пришло, разбираешься как это обойти.
Мне жалоко тратить на это время при том, что поолжительного результата может и не быть. Я попробовал наудачу в вышеприведенной функции первый условный переход на безусловный заменить, но ошибка случилась в другой функции.
Ну и ты же сам нашел решение, пользуйся им:
>> Также его не будет если Таблица находится в файле mxl.
(21) Сделай исключение, потрать 10 минут времени — тест у меня минимальный — четыре строчки кода. Если сабжа у тебя не будет — возмещу потраченное время.
Решение с хмл не нравится — хочется единый файл, а не кучу хмл-ок в придачу.
(28) Нет, всё равно валится.
Перенес метод ИсходнаяТаблица в проц. ПриОткрытии класса.
Но теперь валится на методе Вывести, который оставил в «теле» класса.
Новый тест для воспроизведения ошибки: https://yadi.sk/d/Cm15VVsq3SC8YN
Какие будут следующие предложения?
Немного подумал и проблему решил — пусть таблица целиком инициализируется и выводится на печать в проц. ПриОткрытии.
Я же ведь могу ее вызывать сколь угодно и когда угодно.
По сути, получается что один и тот же файл ert используется одновременно и как класс и как обычная внешняя обработка с печ.формами.
Главное, конечная цель достигнута — решить задачу, используя один файл.
Спасибо Chieftain за мозговой штурм.
Хотелось бы еще решить проблему, описанную 1C 7.7: Ключи запуска (посты 16-18).
Есть некоторые баги в «движке», хочется поправить.
Например, падает отладчик и 1С: предприятие, если при трассировке модуля класса (реализованного в теле внешней ert) в табло отладчика укажешь имя переменной, которой не существует в текущем контексте.
При отладке обычных модулей 1С в этих случаях падения не происходит, а просто пишется:
[/quote]
Но пока не могу создать тестовый класс с минимальным кодом.
Ошибка воспроизводится на моем большом классе, на мелких тестовых этого сабжа нет. 🙁
Download
Contents
Рекомендованные релизы
Рекомендованный стабильный релиз с раздельной загрузкой FormEx: 2.5.0.7
Рекомендованный стабильный релиз c включенным FormEx: 2.0.3.7
Ночные сборки
Важно. На вопросы о том, что вошло в ночную сборку, что не вошло, как оно работает, почему работает не так, и работает ли вообще — разработчики как правило не отвечают. Причины изложены ниже. Используйте ночные сборки только и исключительно в ознакомительных целях.
- Ночная сборка производится автоматом. Сама сборка происходит в 3:10, а готовый файл выкладывается в 3:50. Соответственно, если кто-то из разработчиков 1С++ начнет в 3:00 активно коммитить файлы в репозиторий, а закончит в 3:20, то компиляция может вообще не пройти. В результате вы можете не найти файла ночной сборки.
- Сам механизм сборки только запущен — возможны ошибки и сбои. В результате вы можете не найти файла ночной сборки.
- Поскольку в процессе подготовки ночной сборки участвует две машини (виндовая, где происходит компиляция, и линуксовая, где установлен http сервер), то понятно, что вероятность падения в даун одной машины из двух — выше. В результате вы можете не найти ночной сборки.
- Поскольку линуксовая машина живет по UTC, а виновая по MSK, то вполне может быть, что я что-то напутал со временем. И сборка произойдет позже, чем выкладывание на сайт. В результате вы можете не найти ночной сборки.
- Как правило разработчики сначала пишут код. Потом его отлаживают. И только потом пишут документацию (если пишут вообще). Так что если в ночном билде что-то не работает, или работает не так, как описано в документации — это не повод сразу кидаться писать на форуме/в почту/в асю. Подобными действиями вы только замедлите работу над релизом.
Короче. Если вы нашли ночную сборку на положенном ей месте, она работает, и она сегодняшняя, то скорее всего вы что-то сделали не так
- Ежедневная ночная сборка версии 2.5.
- Ежедневная ночная сборка онлайн документации для версии 2.5.
- Ежедневная ночная сборка документации в формате chm для версии 2.5.
- Ежедневная ночная сборка файлов для Intellicense для версии 2.5.
- Ежедневная ночная сборка ветки 2.0.3.
Доступ к репозиторию
Для тех, кто умеет работать с cvs — предоставлена возможность анонимного доступа к репозиторию 1С++ на чтение.
Если вы хотите получить доступ к репозиторию на запись, то сначала попробуйте выложить предлагаемые Вами изменения на Форуме компоненты.
1С++ — это просто!
За основу данной статьи взята одноимённая статья Яровенко Игоря aka Сниф, размещённая на бывшем сайте Snif.ru.
Что такое 1С++?
1С++ — это внешняя компонента (как, например, V7plus.dll), значительно расширяющая возможности программирования средствами встроенного языка 1С. Используя эту компоненту, вы получаете механизм, который позволит вам программировать в 1С:Предприятии на принципиально ином уровне. Перечень авторов этой библиотеки вы можете узнать на официальном сайте компоненты: http://1cpp.ru/authors.html.
Библиотека является бесплатной и использовать её надо под свою ответственность. Всю информацию о компоненте и полезные ссылки вы можете получить на официальном сайте http://1cpp.ru/.
Где взять 1С++?
Скачать вместе с документацией можно на официальном сайте: http://1cpp.ru/. При первой попытке овладеть этим знанием слегка теряешься от количества информации и понимаешь, что это всерьез и надолго. Вопросу «с чего же можно начать?» и посвящается следующий раздел.
Как установить 1С++ и начать с ней работать?
Чтобы произвести первый небольшой, но впечатляющий эксперимент, выполним последовательно следующие действия по установке библиотеки:
- Найдем на своем компьютере (не будем сразу набрасываться на сервер) папку C:\Program Files\1Cv77\BIN и положим туда файл 1cpp.dll.
- Возьмём базу для экспериментов, откроем глобальный модуль и найдем в ней процедуру ПриНачалеРаботыСистемы(). Поместим в эту процедуру несколько строчек кода:
- Запустим 1С в режиме Предприятия. Кстати, регистрировать внешнюю компоненту специально не требуется, 1С сделает это сама, но при первом запуске нужно иметь права администратора (а не Гостя, например). Если получим сообщение об успешной загрузке, то закроем 1С и двинемся дальше. Примечание: чтобы при первом запуске не нужно было иметь права администратора, можно воспользоваться внешней компонентой vkloader от Орефкова Александра.
- В каталоге той базы, которую мы будем дальше мучить, сделаем папку «Классы» и в ней, с помощью Конфигуратора, создадим внешнюю обработку Проба.ert (т.е. путь к обработке будет такой: КаталогИБ/Классы/Проба.ert). На форме этой обработки оставим кнопку «Закрыть», а кнопку «Сформировать» удалим – чтобы руки к ней не тянулись. В модуле разместим такой код: Заметили ли вы что-нибудь необычное? Правильно, раньше ключевое слово «Экспорт» мы встречали только в глобальном модуле.
- Создадим текстовый файлик «КаталогИБ/Классы/proba.prm», в котором напишем:
- Cоздадим ещё один текстовый файлик «КаталогИБ/DefCls.prm», в котором будет только одна строка — путь к предыдущему файлику: Заменив, естественно, «КаталогИБ» на реальный путь к базе.
- И последнее приготовление к эксперименту: создадим где угодно обработку Тест.ert, в которой напишем: Если теперь мы выполним эту процедуру, то должны получить указанное сообщение.
Анализ результатов первого примера
Давайте попробуем понять, что же мы сейчас совершили:
- Фразой //#include «КаталогИБ\Классы\Proba.prm» мы дали знать библиотеке 1С++, что при запуске 1С в режиме Предприятия нужно прочитать содержимое файлика Proba.prm.
- В Proba.prm фразой «класс Пустячок = Проба.ert» мы сообщили 1С++, что создаем новый тип данных (класс) «Пустячок», свойства которого ОБЯЗУЕМСЯ описать в модуле обработки Проба.ert и с которым можем работать с помощью СоздатьОбъект(«Пустячок»).
- Из свойств у объекта «Пустячок» мы описали пока только два, а именно: один атрибут «ТекстСообщения» и один метод «Проба()», который проверяет определенность единственного атрибута и пытается вывести его на печать.
Визуальный редактор 1С++
Благодаря 1С++ мы получили возможность вызывать из любого модуля конфигурации процедуру Проба(), расположенную в модуле внешнего отчета Проба.ert.
Есть смысл сразу же установить и удобный «Проводник» для 1С++ — плагин для OpenConf под названием «Visual 1C++» (для этого придётся предварительно установить сам OpenConf).
После установки плагина (просто скопируйте VIS1CPP.DLL в каталог C:\Program Files\1Cv77\BIN\config) запустите 1С:Предприятие в режиме Конфигуратора, откройте конфигурацию и, если вы все сделали правильно, у вас должна появиться дополнительная закладка в нижней части экрана под названием «1С++», в которой будет отображено дерево ваших классов с удобными возможностями навигации по ним.
Примечание: вы можете сильно повысить эффективность своей работы, даже не используя возможности по написанию собственных классов, которую даёт 1С++. Используя только механизм прямых запросов к БД, который также предоставляет 1С++, вы уже будете писать ваши конфигурации на качественно ином уровне.