Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как найти причину вылета 1С++? (число прочтений - 14964 )
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Как найти причину вылета 1С++?
27. Ноября 2012 :: 08:21
Печать  
Стала вылетать 1С++ при работе на сервере в терминальном режиме при выполнении обработки.

Проявляется это в том, что 1С-ка просто исчезает.
В журнале событий появляется сообщение:

Код
Выбрать все
Event Type:	Error
Event Source:	Application Error
Event Category:	(100)
Event ID:	1000
Date:		27.11.2012
Time:		8:23:34
User:		N/A
Computer:	ROZSERVER
Description:
Faulting application 1cv7.exe, version 7.70.0.27, faulting module 1CPP.dll, version 3.2.3.20, fault address 0x0001f845.
 



Можно ли как-то определить причину вылета?
По моим предположениям возможно не хватает оперативки... Как это можно проверить?
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #1 - 27. Ноября 2012 :: 08:47
Печать  
Поделка запускается несколько раз и в какой то момент вылет ?
Или запускается одноразово и вылет ?

Если первое, то с большой вероятностью есть обращение к атрибутам формы в операторах основной программы (например, установка заголовку формы), на 3-4 открытие вылет гарантирован.

  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #2 - 27. Ноября 2012 :: 09:12
Печать  
Eprst писал(а) 27. Ноября 2012 :: 08:47:
Поделка запускается несколько раз и в какой то момент вылет ?
Или запускается одноразово и вылет ?

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

Eprst писал(а) 27. Ноября 2012 :: 08:47:
Если первое, то с большой вероятностью есть обращение к атрибутам формы в операторах основной программы (например, установка заголовку формы), на 3-4 открытие вылет гарантирован.

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


а какая есть стабильная версия?
в плане работы с ИндексированнойТаблицей и прямыми запросами через OLEDB?
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как найти причину вылета 1С++?
Ответ #3 - 27. Ноября 2012 :: 09:14
Печать  
Eprst писал(а) 27. Ноября 2012 :: 08:47:
Если первое, то с большой вероятностью есть обращение к атрибутам формы в операторах основной программы (например, установка заголовку формы), на 3-4 открытие вылет гарантирован.

Что за довольно серьезный баг? поясни, пожалуйста.
кто виноват? 1С или 1с++
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #4 - 27. Ноября 2012 :: 09:41
Печать  
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #5 - 27. Ноября 2012 :: 09:43
Печать  
es3000 писал(а) 27. Ноября 2012 :: 09:12:
обращение к атрибутам формы конечно есть, но установки заголовка нету.
просто выполняется чтение значений реквизитов формы и установка их значений: элемент справочника, флажки



Это в операторах основной программы, или в ПриОткрытии ?
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #6 - 27. Ноября 2012 :: 09:53
Печать  
Eprst писал(а) 27. Ноября 2012 :: 09:43:
es3000 писал(а) 27. Ноября 2012 :: 09:12:
обращение к атрибутам формы конечно есть, но установки заголовка нету.
просто выполняется чтение значений реквизитов формы и установка их значений: элемент справочника, флажки



Это в операторах основной программы, или в ПриОткрытии ?


В модуле обработки,
а потом в процедурах типа "УправлениеВидимостью" добавляются или прячутся колонки ТаблицыЗначений.

ПриОткрытии не используется
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #7 - 27. Ноября 2012 :: 09:55
Печать  
Но я все-таки думаю, что ошибка либо в прямом запросе либо в ИТ.
Так как количество вылетов меньше, если меньше объем обрабатываемых данных.

Например, если при выполнении обработки я делаю фильтр только по одной номенклатуре - то чаще всего обработка отрабатывает нормально.
А если фильтр не устанавливать, т.е. сделать обработку по всей номенклатуре - вероятность вылета приближается к 90%
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #8 - 27. Ноября 2012 :: 10:14
Печать  
Цитата:
В модуле обработки,


В операторах основной программы есть что ? Или нет ?
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #9 - 27. Ноября 2012 :: 10:29
Печать  
Eprst писал(а) 27. Ноября 2012 :: 10:14:
Цитата:
В модуле обработки,


В операторах основной программы есть что ? Или нет ?


Да.
Говоря в "модуле обработки", я имел ввиду "в операторах основной программы" обработки.
Здесь у меня создаются колонки для ТаблицыЗначений и устанавливаются начальные значения флажков.
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #10 - 27. Ноября 2012 :: 10:30
Печать  
Вот это всё воткни в ПриОткрытии и проверь, для начала.
Потом ужо с ИТЗ будешь разбираться
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #11 - 27. Ноября 2012 :: 10:51
Печать  
Eprst писал(а) 27. Ноября 2012 :: 10:30:
Вот это всё воткни в ПриОткрытии и проверь, для начала.
Потом ужо с ИТЗ будешь разбираться


ОК. Попробую.

А все-таки какая версия будет постабильнее для ИТ и прямых запросов?
На 1cpp.ru упоминаются только стабильные релизы версии 2.ххх:

Код
Выбрать все
Рекомендованный стабильный релиз с раздельной загрузкой FormEx: 2.5.0.7
Рекомендованный стабильный релиз c включенным FormEx: 2.0.3.7 

  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #12 - 27. Ноября 2012 :: 11:05
Печать  
Забудь про них как страшный сон..
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #13 - 27. Ноября 2012 :: 12:01
Печать  
Eprst писал(а) 27. Ноября 2012 :: 11:05:
Забудь про них как страшный сон..


а что же делать?
пользоваться той которая сейчас?
3.2.3.20?
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #14 - 27. Ноября 2012 :: 12:26
Печать  
лучше эту
http://www.1cpp.ru/forumfiles/Attachments/icpp-3-2-4-0-rc2.rar

+ какие еще есть ВК , каких они версий и какая последовательность их загрузки ?

+ запрос сколько строк в ИТЗ возвращает ?
+ может, заместо ИТЗ в качестве поставщика сам запрос лепить ?
Нафига ИТЗ там ?

  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #15 - 27. Ноября 2012 :: 13:35
Печать  
Eprst писал(а) 27. Ноября 2012 :: 12:26:

а ничего что это "release candidate"? типа до конца не проверена?

Eprst писал(а) 27. Ноября 2012 :: 12:26:
+ какие еще есть ВК , каких они версий и какая последовательность их загрузки ?


только это:
Код
Выбрать все
		Рез = ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "ExtDlls\1cpp.dll");
		УправлениеНастройками = СоздатьОбъект("УправлениеНастройками");
		УправлениеНастройками.Включить("EnableTurboBL");
 



Eprst писал(а) 27. Ноября 2012 :: 12:26:
+ запрос сколько строк в ИТЗ возвращает ?


230тыс.строк

Eprst писал(а) 27. Ноября 2012 :: 12:26:
+ может, заместо ИТЗ в качестве поставщика сам запрос лепить ?
Нафига ИТЗ там ?

ИТЗ потом обрабатывается, и промежуточные результаты тоже потом нужны, писать это все запросами - тяжко
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #16 - 27. Ноября 2012 :: 13:44
Печать  
на такой тз, скорее всего тупо памяти не хватает.
вот и валится при её обработке..
поди, группировать еще в итз применяешь потом ?

Посмотри в диспетчере, сколько ест памяти 1с-ина сразу после выполнения запроса.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #17 - 27. Ноября 2012 :: 19:11
Печать  
Eprst писал(а) 27. Ноября 2012 :: 13:44:
на такой тз, скорее всего тупо памяти не хватает.
вот и валится при её обработке..

так ведь по-правильному должна не валиться, а вернуть код ошибки, сказать типа "...невозможно выполнить запрос..." и т.д.
чего валиться-то?

Eprst писал(а) 27. Ноября 2012 :: 13:44:
поди, группировать еще в итз применяешь потом ?

ага

Eprst писал(а) 27. Ноября 2012 :: 13:44:
Посмотри в диспетчере, сколько ест памяти 1с-ина сразу после выполнения запроса.

около 200Мб
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #18 - 27. Ноября 2012 :: 19:16
Печать  
в 1С++ можно занятую память получить?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #19 - 27. Ноября 2012 :: 20:19
Печать  
ТЗ и ИТ с одними и теми же данными занимают разное место в памяти:
для 230 тыс. строк ТЗ занимает 300Мб, ИТ - 400 Мб.

Это нормально?
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #20 - 28. Ноября 2012 :: 06:24
Печать  
нормально, в ИТЗ еще и индексы есть.
ТЗ можно еще "уменьшить", если явно типизировать все колонки.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как найти причину вылета 1С++?
Ответ #21 - 28. Ноября 2012 :: 06:32
Печать  
es3000 писал(а) 27. Ноября 2012 :: 20:19:
ТЗ и ИТ с одними и теми же данными занимают разное место в памяти:
для 230 тыс. строк ТЗ занимает 300Мб, ИТ - 400 Мб.

Это нормально?

если база ms sql то вместо таких огромных таблиц  ТЗ,ИТЗ гораздо эфективене во всех отношениях
использовать временные таблицы #tabl_1 ( и индексы на них)
на самом ms sql сервере.

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #22 - 28. Ноября 2012 :: 06:38
Печать  
Ему группировать ИТЗ потом надо, для вывода..
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как найти причину вылета 1С++?
Ответ #23 - 28. Ноября 2012 :: 06:54
Печать  
Eprst писал(а) 28. Ноября 2012 :: 06:38:
Ему группировать ИТЗ потом надо, для вывода..

ну вообще не очень понятно,
зачем нужен отчет на 200 000 строк.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #24 - 28. Ноября 2012 :: 07:03
Печать  
Алкогольная декларация, к примеру..
У нас (если б её печатали) почти мульт строк.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #25 - 28. Ноября 2012 :: 08:36
Печать  
Выяснилось: ИТ не при чем, ИТ отрабатывает нормально,
вылеты происходят когда выполняется:
КомандаОЛЕ.УложитьСписокОбъектов(лСписокНом, ВремТабл);

в списке около 6 тыс. наименований


И есть предположение с чем это связано.
Недавно на сервере вирус операционку повредил. Возможно повредились какие-то системные библиотеки связанные с OLEDB.
Возможно такое?

Ну тогда вылеты не были бы связаны с объемом данных.
А у меня на маленьких объемах (по одной номенклатуре) отрабатывает хорошо.
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #26 - 28. Ноября 2012 :: 08:59
Печать  
оледб ?
У тя дбф что ли ?
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #27 - 28. Ноября 2012 :: 09:06
Печать  
Eprst писал(а) 28. Ноября 2012 :: 08:59:
оледб ?
У тя дбф что ли ?

да
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #28 - 28. Ноября 2012 :: 09:08
Печать  
А если попробовать прямые запросы 1С++ заменить на 1SQLite?
1SQLite использует какие-нибудь системные библиотеки?
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #29 - 28. Ноября 2012 :: 09:15
Печать  
переустанови vfp

если запрос правильно построен с учетом использования индексов, то sqllite ему проигрывает в разы на некоторых запросах (особенно, где group by есть)
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #30 - 28. Ноября 2012 :: 09:44
Печать  
Eprst писал(а) 28. Ноября 2012 :: 09:15:
переустанови vfp

уже пробовал - не помогло,
наверно драйвера VFP используют какие-то системные библиотеки,
а системные можно только пере-установкой ОС исправить

Eprst писал(а) 28. Ноября 2012 :: 09:15:
если запрос правильно построен с учетом использования индексов, то sqllite ему проигрывает в разы на некоторых запросах (особенно, где group by есть)

да бог с ней с производительностью...
главное чтоб работало.
  
Наверх
ICQ  
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Как найти причину вылета 1С++?
Ответ #31 - 29. Ноября 2012 :: 06:42
Печать  
es3000 писал(а) 28. Ноября 2012 :: 08:36:
Выяснилось: ИТ не при чем, ИТ отрабатывает нормально,
вылеты происходят когда выполняется:
КомандаОЛЕ.УложитьСписокОбъектов(лСписокНом, ВремТабл);


ну так и реализуй свою функцию создания фильтрующей времТЗ (или создание условия вида In(, , , , ...) при малых количествах фильтрующих значений).
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #32 - 29. Ноября 2012 :: 08:02
Печать  
Satans Claws писал(а) 29. Ноября 2012 :: 06:42:
ну так и реализуй свою функцию создания фильтрующей времТЗ (или создание условия вида In(, , , , ...) при малых количествах фильтрующих значений).

не понял что значит "реализуй свою функцию создания фильтрующей времТЗ"?
как ее реализовать?
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #33 - 30. Ноября 2012 :: 05:30
Печать  
своим инсёртом во временную табличку..
вот только группы разворачивать придётся до полной иерархии.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Как найти причину вылета 1С++?
Ответ #34 - 30. Ноября 2012 :: 10:11
Печать  
Eprst писал(а) 30. Ноября 2012 :: 05:30:
своим инсёртом во временную табличку..
вот только группы разворачивать придётся до полной иерархии.


Функция пишется за 15 минут.
Если угореть по хардкору и прикрутить на справочник тригер, который будет в отдельной табличке писать иерархию - то там вообще все становится сочне-сочне.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Как найти причину вылета 1С++?
Ответ #35 - 30. Ноября 2012 :: 10:18
Печать  
Вот кусок из функции, написанной 2 года назад, когда я "с нуля" писал набор классов на новой (в тот момент) работе


Код
Выбрать все
	ИначеЕсли ТипЗначения(ЗначениеФильтра) = 11 Тогда
		Если ЗначениеФильтра.ЭтоГруппа() = 0 Тогда
			Если фДекларативныеФильтры = 0 Тогда
				стрЗначение = "'" + РадугаСервис.ЗначениеВСтрокуБД(ЗначениеФильтра) + "'";
			Иначе
				текст_Декларация = текст_Декларация + "
				|Declare " + стрЗначение + " Char(9)
				|Set " + стрЗначение + " = '" + РадугаСервис.ЗначениеВСтрокуБД(ЗначениеФильтра) + "'";
			КонецЕсли;
		Иначе
			ИмяВремТаблицы	= ИмяВременнойТаблицы(, 0);

			ТекстЗапроса = "
			|SELECT '" + РадугаСервис.ЗначениеВСтрокуБД(ЗначениеФильтра) + "' ID Into " + ИмяВремТаблицы + "
			|
			|While @@RowCount > 0
			|INSERT INTO " + ИмяВремТаблицы + "
			|SELECT
			|	Спр.ID
			|FROM
			|	$Справочник." + ЗначениеФильтра.Вид() + " Спр (NoLock)
			|WHERE
			|	ParentID In (SELECT ID FROM " + ИмяВремТаблицы + " (NoLock))
			|	And ID Not In (SELECT ID FROM " + ИмяВремТаблицы + " (NoLock))
			|
			|If (SELECT Count(*) From " + ИмяВремТаблицы + " (NoLock)) > 100
			|	Create Clustered Index " + СтрЗаменить(ИмяВремТаблицы, "[#", "[#IX_") + " on " + ИмяВремТаблицы + " (ID)
			|";

			Если фЗаполняемВремТаблицыОтдельнымЗапросом = 1 Тогда
				ЗапросСКЛ.Выполнить("Set NoCount ON
				|" + ТекстЗапроса);
			Иначе
				текст_Префикс = текст_Префикс + ТекстЗапроса;
			КонецЕсли;

			текст_Постфикс = текст_Постфикс + "
			|Drop Table " + ИмяВремТаблицы;
		КонецЕсли;

	ИначеЕсли ТипЗначенияСтр(ЗначениеФильтра) = "СписокЗначений" Тогда
		фИспользоватьВТ = 0;
		Если ЗначениеФильтра.РазмерСписка() > 10 Тогда
			фИспользоватьВТ = 1;
		Иначе
			Для й = 1 По ЗначениеФильтра.РазмерСписка() Цикл
				ОдноИзЗначений = ЗначениеФильтра.ПолучитьЗначение(й);
				Если ТипЗначения(ОдноИзЗначений) = 11 Тогда
					Если ОдноИзЗначений.ЭтоГруппа() = 1 Тогда
						фИспользоватьВТ = 1;
						Прервать;
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;

		Если фИспользоватьВТ = 0 Тогда
			Для й = 1 По ЗначениеФильтра.РазмерСписка() Цикл
				ОдноИзЗначений = ЗначениеФильтра.ПолучитьЗначение(й);
				Если ПустоеЗначение(ОдноИзЗначений) = 1 Тогда
					Продолжить;
				КонецЕсли;
				СписокЗначений = СписокЗначений + ", '" + РадугаСервис.ЗначениеВСтрокуБД(ОдноИзЗначений) + "'";
			КонецЦикла;

			Если (СтрДлина(СписокЗначений) = 0) И (фФильтрПоПустомуЗначению = 0) Тогда
				Возврат "";
			ИначеЕсли СтрДлина(СписокЗначений) = 0 Тогда
				СписокЗначений = ", ''";
			КонецЕсли;
			СписокЗначений = "(" + Сред(СписокЗначений, 2) + ")";
		Иначе
			ИмяВремТаблицы	= ИмяВременнойТаблицы(, 0);

			ТекстЗапроса = "
			|CREATE TABLE " + ИмяВремТаблицы + " (ID Char(9))";

			фЭтоСправочник = 0;
			Для й = 1 По ЗначениеФильтра.РазмерСписка() Цикл
				ОдноИзЗначений = ЗначениеФильтра.ПолучитьЗначение(й);
				Если ПустоеЗначение(ОдноИзЗначений) = 1 Тогда
					Продолжить;
				КонецЕсли;
				ТекстЗапроса = ТекстЗапроса + "
				|INSERT INTO " + ИмяВремТаблицы + " Values('" + РадугаСервис.ЗначениеВСтрокуБД(ОдноИзЗначений) + "')";

				Если ТипЗначения(ОдноИзЗначений) = 11 Тогда
					фЭтоСправочник = 1;
					ВидСпр = ОдноИзЗначений.Вид();
				КонецЕсли;
			КонецЦикла;

			Если фЭтоСправочник = 1 Тогда
				МетаСпр = Метаданные.Справочник(ВидСпр);
				Если МетаСпр.КоличествоУровней > 1 Тогда
					ТекстЗапроса = ТекстЗапроса + "
					|
					|While @@RowCount > 0
					|INSERT INTO " + ИмяВремТаблицы + "
					|SELECT
					|	Спр.ID
					|FROM
					|	$Справочник." + ВидСпр + " Спр (NoLock)
					|WHERE
					|	ParentID In (SELECT ID FROM " + ИмяВремТаблицы + " (NoLock))
					|	And ID Not In (SELECT ID FROM " + ИмяВремТаблицы + " (NoLock))
					|";
				КонецЕсли;
			КонецЕсли;

			ТекстЗапроса = ТекстЗапроса + "
			|If (SELECT Count(*) From " + ИмяВремТаблицы + " (NoLock)) > 100
			|	Create Clustered Index " + СтрЗаменить(ИмяВремТаблицы, "[#", "[#IX_") + " on " + ИмяВремТаблицы + " (ID)
			|";

			Если фЗаполняемВремТаблицыОтдельнымЗапросом = 1 Тогда
				ЗапросСКЛ.Выполнить("Set NoCount ON
				|" + ТекстЗапроса);
			Иначе
				текст_Префикс = текст_Префикс + ТекстЗапроса;
			КонецЕсли;

			текст_Постфикс = текст_Постфикс + "
			|Drop Table " + ИмяВремТаблицы;
		КонецЕсли;
 



Это функция класса ТОтчет.Запрос, отвечающая за построение фильтра по переданному значению.
Есть еще вторая функция, которая готовит фильтр char(13) - она немного сложнее, но принципиально ничем не отличается.

Таблицы деревьев появились относительно недавно, переписать под них фильтры - как-то пока даже надобности не возникало. Устраивает и то, как они сейчас работают.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #36 - 30. Ноября 2012 :: 10:21
Печать  
Всё это хорошо, но у автора вроде как дбф.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Как найти причину вылета 1С++?
Ответ #37 - 03. Декабря 2012 :: 02:37
Печать  
С ДБФом прямыми запросами не приходилось, да.
Там нет возможности покрутить цикл прямо на драйвере?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Как найти причину вылета 1С++?
Ответ #38 - 03. Декабря 2012 :: 07:53
Печать  
Eprst писал(а) 30. Ноября 2012 :: 10:21:
Всё это хорошо, но у автора вроде как дбф.

похожий  код и ДБФ через FoxPro
вместо
Код
Выбрать все
|Declare " + стрЗначение + " Char(9)
|Set " + стрЗначение + " = '" + РадугаСервис.ЗначениеВСтрокуБД(ЗначениеФильтра) + "'"; 


Код
Выбрать все
PUBLIC " + стрЗначение + "
STORE  '" + РадугаСервис.ЗначениеВСтрокуБД(ЗначениеФильтра) + "'" TO  " + стрЗначение + ""  


вместо
Код
Выбрать все
CREATE TABLE " + ИмяВремТаблицы + " (ID Char(9)) 


Код
Выбрать все
CREATECURSOR  " + ИмяВремТаблицы + "(ID Character(9) NOT NULL) ') 



ну так как выполняеься программа , а не запрос  в конце
Код
Выбрать все
ОлеДБКоманда.Выполнить("EXEC('+ТекстЗапроса+"" ')"); 


подробнее
http://www.1cpp.ru/forum/YaBB.pl?num=1188673318
синтаксис языка
http://www.foxclub.ru/rhproject/project/
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #39 - 03. Декабря 2012 :: 08:01
Печать  
Да это всё равно ему не нужно..
имхо
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Как найти причину вылета 1С++?
Ответ #40 - 03. Декабря 2012 :: 08:09
Печать  
Никогда не использовал УложитьСписокОбъектов, на живой базе всегда делал вставку во временную таблицу,
правда код был другой? ,больше похожий на
http://www.1cpp.ru/forum/YaBB.pl?num=1188673318#11
никаких вылетов
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #41 - 03. Декабря 2012 :: 08:12
Печать  
kiruha писал(а) 03. Декабря 2012 :: 08:09:
Никогда не использовал УложитьСписокОбъектов, на живой базе всегда делал вставку во временную таблицу,
правда код был другой? ,больше похожий на
http://www.1cpp.ru/forum/YaBB.pl?num=1188673318#11
никаких вылетов


Ну дык.. не универсально как-то... особенно, через кучу лефт джоинов
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Как найти причину вылета 1С++?
Ответ #42 - 03. Декабря 2012 :: 08:30
Печать  
Универсальность добавить не проблема - вместо 5 уровней - количество уровней в справочнике,
определить через метаданные

Для красоты можно переписать то что для SQL выше написали - если не лень
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как найти причину вылета 1С++?
Ответ #43 - 03. Декабря 2012 :: 08:38
Печать  
Чорт , я слишком ленивый для этого Улыбка , да и.. по 20000 элементов в список не укладываю, так что и с уложитьсписокОбъектов проблем и вылетов (и тормозов) замечено не было.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Как найти причину вылета 1С++?
Ответ #44 - 03. Декабря 2012 :: 09:01
Печать  
Eprst писал(а) 03. Декабря 2012 :: 08:38:
по 20000 элементов в список не укладываю, так что и с уложитьсписокОбъектов проблем и вылетов (и тормозов) замечено не было.


если такое большое количество, в Fox строки больше 255 символов не поддерживаются, поэтому надо добавлять
через каждые 10 вставляемых элементов "+CHR(13)+" - символ переноса строки
ну и вставку делать элементов по 100 в цикле - так как на длину запроса тоже есть какое то ограничение
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #45 - 05. Декабря 2012 :: 19:51
Печать  
Полечили операционку на сервере: просто полностью переустановили.

Вылеты 1С++ остались, только теперь в системных сообщениях больше информации: сначала идет сообщение:
Код
Выбрать все
Faulting application 1cv7s.exe, version 7.70.0.27,
faulting module 1CPP.dll, version 3.2.3.20,
fault address 0x0001f845.
 



а следом:
Код
Выбрать все
The application, c:\program files\1cv77\bin\1cv7s.exe,
generated an application error
The error occurred on 12/05/2012 @ 14:33:50.423
The exception generated was c0000005 at address 2401F845
(1cpp!OleDb::CResultDirectAccessProxy::CResultDirectAccessProxy)
 



И в 90% вылетает как я и говорил на "УложитьСписокОбъектов".
Завтра буду испытывать свою функцию вместо "УложитьСписокОбъектов".
По результатам отпишусь.

Если есть какие мысли - буду рад...

Может быть дело в драйвере OLEDB FoxPro?
Что-то их много разных, толком не ясно какой лучше использовать:
1. Есть MSI-установщик драйвера
2. Есть отдельно DLL-ка вроде как из SP2
3. Есть та же DLL-ка, но модифицированная

Какой из них лучше использовать? И как убедиться что скачанный файл - это тот что мне нужен?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #46 - 05. Декабря 2012 :: 20:10
Печать  
es3000 писал(а) 05. Декабря 2012 :: 19:51:
Завтра буду испытывать свою функцию вместо "УложитьСписокОбъектов".
По результатам отпишусь.


Теперь код, который я написал вместо "УложитьСписокОбъектов" выполняется,
но вылетает следующая команда "ВыполнитьИнструкцию"!

  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #47 - 05. Декабря 2012 :: 20:32
Печать  
Похоже, что глючный драйвер OLEDB.

Сравнил папки C:\Program Files\Common Files\System\OleDB на локальном компьютере (здесь запросы работают нормально) и на сервере.
Оказалось файлы различаются!
Хотя устанавливал с одного и того же дистрибутива!
Дистрибутив VFPOLEDBSetup.msi как я понимаю содержит один файл vfpoledb.dll?
Как такое может быть?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как найти причину вылета 1С++?
Ответ #48 - 05. Декабря 2012 :: 20:41
Печать  
Похоже понял в чем дело:

На серваке я после установки драйвера подсунул модифицированный вариант vfpoledb.dll.
А на локальном компе я этого не делал, стоит оригинальный vfpoledb.dll.
Значит, этот модифицированный vfpoledb.dll - глючный.
Поработаю пока с оригинальным - посмотрю на его поведение
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Как найти причину вылета 1С++?
Ответ #49 - 07. Декабря 2012 :: 07:44
Печать  
Естественно, как и миллионы юзеров Fox - надо пользоваться последним с официального сайта Microsoft
Там два установщика - с визуальной формой установки(msi) и без, но содержание dll не отличается
Библиотека закрыта, поэтому о корректной правке речи не идет

В свое время Ужас правил dll чтобы пользоваться в модуле документа
Потом выяснилось, что просто по умолчанию Fox блокирует заголовки, и чтобы пользоваться в модуле документа - ничего править в dll не надо - а только в параметре подключения указать не блокировать. Ну или вызвать команду
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Как найти причину вылета 1С++?
Ответ #50 - 07. Декабря 2012 :: 08:26
Печать  
подправил FAQ , так как от hogik были похожие сообщения
http://www.1cpp.ru/forum/YaBB.pl?num=1230361378
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать