Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Не могу записать DBF после переделки на прямой запрос (число прочтений - 3847 )
OnePrg
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 66
Зарегистрирован: 07. Октября 2019
Не могу записать DBF после переделки на прямой запрос
12. Октября 2019 :: 15:15
Печать  
Был такой рабочий 1С-ный код
Код (C++)
Выбрать все
ТекстЗапроса="
		|Период С КонПериода По КонПериода;
		|Обрабатывать НеПомеченныеНаУдаление;
		|Товар = Регистр.Остатки.Товар, Справочник.Товар.ТекущийЭлемент;
		|Склад = Регистр.Остатки.МестоХранения, Справочник.МестаХранения.ТекущийЭлемент;
		|Фирма = Регистр.Остатки.Фирма;
		|Количество= Регистр.Остатки.Кво;
		|Функция КонКол=КонОст(Количество);
		|Группировка Товар Без Групп Без Упорядочивания;
		|Группировка Склад Без Групп Без Упорядочивания;
		|Условие (Склад В ТаблНастроек.Склады);
		|Условие (Фирма В ТаблНастроек.Фирмы);
		|";
	Запрос=СоздатьОбъект("Запрос");
	//выполнить запрос с проверкой
	Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
		ДобавитьВЛогФайл("","Ошибка запроса по клиентам",0);
		Возврат;
	КонецЕсли;
	Пока Запрос.Группировка(1) = 1 Цикл
		Пока Запрос.Группировка(2) = 1 Цикл
			КэшОстатков.Добавить();
			КэшОстатков.Firm 	= Запрос.Фирма.Код;
			КэшОстатков.Stock 	= Запрос.Склад.Код;
			КэшОстатков.Good 	= Запрос.Товар.Код;
			КэшОстатков.Rest 	= Запрос.КонКол;
			КэшОстатков.Записать();
		КонецЦикла;
	КонецЦикла;
 



после переделки на прямой запрос код выглядит так

Код (C++)
Выбрать все
ТекстЗапроса =
	"SELECT
	|     Данные.Firm			as Firm,
	|     Данные.Good			as Good,
	|     Данные.Stock			as Stock,
	|     SUM(Данные.Rest) 		as Rest
	|FROM (SELECT
	|     Фирмы.Code			as Firm,
	|     Товары.Code			as Good,
	|     МестаХранения.Code	as Stock,
	|     Ост.КвоОстаток  		as Rest
	|FROM
	|    $РегистрОстатки.Остатки(:КонПериода,,,
    |                               (Фирма,Товар,МестоХранения), (Кво)) as Ост
	|LEFT JOIN
	|    $Справочник.Фирмы AS Фирмы
	|  ON Фирмы.ID = Ост.Фирма
	|LEFT JOIN
	|    $Справочник.МестаХранения AS МестаХранения
	|  ON МестаХранения.ID = Ост.МестоХранения
	|LEFT JOIN
	|    $Справочник.Товар AS Товары
	|  ON Товары.ID = Ост.Товар) as Данные
	|
	|GROUP BY
	|    Firm,
	|    Good,
	|    Stock";

	RS.УстановитьТекстовыйПараметр("КонПериода", КонПериода);

	тб = RS.ВыполнитьИнструкцию(ТекстЗапроса);
	тб.ВыбратьСтроки();
	инд = 0;
	Пока тб.ПолучитьСтроку() = 1 Цикл
		КэшОстатков.Добавить();
		КэшОстатков.Firm 	= Число(тб.Firm);
		КэшОстатков.Stock 	= Число(тб.Stock);
		КэшОстатков.Good 	= Число(тб.Good);
		КэшОстатков.Rest 	= Число(тб.Rest);
		КэшОстатков.Записать();
		инд = инд + 1;
		глПрогрессор("Обработано записей",тб.КоличествоСтрок(),инд);
	КонецЦикла;
 



переделанный код не работает, запрос выполняется, DBF начинает заполняться, но где-то на 8% заполнения выскакивает такая ошибка



подскажите, что не так
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Не могу записать DBF после переделки на прямой запрос
Ответ #1 - 12. Октября 2019 :: 16:21
Печать  
А  сложно было погуглить ошибку 1С 310?
Это переполнение записей.
Чисти базу.
  
Наверх
www  
IP записан
 
OnePrg
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 66
Зарегистрирован: 07. Октября 2019
Re: Не могу записать DBF после переделки на прямой запрос
Ответ #2 - 12. Октября 2019 :: 16:49
Печать  
Дело не в базе, тем более что она SQL, дело в одном DBF файле, в который нужно занести данные. Этот файл в модуле определяется так

Код (C++)
Выбрать все
КэшОстатков=СоздатьОбъект("XBase");
КэшОстатков.ДобавитьПоле("Firm",	"N",5,);
КэшОстатков.ДобавитьПоле("Stock",	"N",5,);
КэшОстатков.ДобавитьПоле("Good",	"N",5,);
КэшОстатков.ДобавитьПоле("Rest",	"N",12,3);
КэшОстатков.ДобавитьИндекс("INDEX","Firm+Stock+Good",1,0,"");
"Rests.cdx");
КэшОстатков.ТекущийИндекс("INDEX");
 



Во-первых, если закомментировать строки с индексом, то ошибки нет, а во-вторых, до переделки запроса, всё работало, и сейчас, если откатить, работает. Ошибку выдаёт в новом коде.
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Не могу записать DBF после переделки на прямой запрос
Ответ #3 - 13. Октября 2019 :: 05:46
Печать  
Ой, ёц... Да, уж. Вот это я вчера не заменил...

КэшОстатков.Firm      = Число(тб.Firm);
КэшОстатков.Stock      = Число(тб.Stock);
КэшОстатков.Good      = Число(тб.Good);

Там же не числа, а строки.
Из за некорректного преобразования где то сочетание всех трех становится не уникальным.
  
Наверх
www  
IP записан
 
OnePrg
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 66
Зарегистрирован: 07. Октября 2019
Re: Не могу записать DBF после переделки на прямой запрос
Ответ #4 - 13. Октября 2019 :: 07:13
Печать  
Djelf писал(а) 13. Октября 2019 :: 05:46:
Ой, ёц... Да, уж. Вот это я вчера не заменил...

КэшОстатков.Firm      = Число(тб.Firm);
КэшОстатков.Stock      = Число(тб.Stock);
КэшОстатков.Good      = Число(тб.Good);

Там же не числа, а строки.
Из за некорректного преобразования где то сочетание всех трех становится не уникальным.


Функцию Число я добавил уже после ошибки, думал что в этом причина. Если функцию Число убрать, ошибка остаётся. Насчёт не уникальности индекса тоже думал, но ведь запрос группирует по всем трём полям, значит не уникальных записей быть не должно.

Возможно нужно описание самого ДБФ поменять, чтобы все три поля были строковые. Попробую. Остаётся вопрос почему всё это работало до переделки на прямой запрос.
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Не могу записать DBF после переделки на прямой запрос
Ответ #5 - 13. Октября 2019 :: 12:15
Печать  
Ну сделай трассировку выводимых данных, перед записью строки данных в дбф, чтобы посмотреть на чем именно затыкается.
  
Наверх
www  
IP записан
 
OnePrg
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 66
Зарегистрирован: 07. Октября 2019
Re: Не могу записать DBF после переделки на прямой запрос
Ответ #6 - 13. Октября 2019 :: 15:06
Печать  
Djelf писал(а) 13. Октября 2019 :: 12:15:
Ну сделай трассировку выводимых данных, перед записью строки данных в дбф, чтобы посмотреть на чем именно затыкается.


Делал. Но каждый раз ошибка выскакивает на разных строках.
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Не могу записать DBF после переделки на прямой запрос
Ответ #7 - 13. Октября 2019 :: 15:32
Печать  
OnePrg писал(а) 13. Октября 2019 :: 15:06:
Делал. Но каждый раз ошибка выскакивает на разных строках.


Ну это уже как то совсем странно.
А дбф ты новый, чистый, пустой создаешь? Удалить его пробовал? Какой размер?

Может не создавать индекс на ходу? Скорости при записи он не добавляет, скорее совсем наоборот.

Хм, а проверь на этом, альтернативном, движке dbeng32 от Wirth https://cloud.mail.ru/public/4iqh/2i5FfEoDX
Я его уже лет 5 использую - ошибок вроде поменьше чем в 1с`овском.
Его сайт, к сожалению, давно протух, но по памяти могу сказать что этот движок и разрабатывался для обхода таких ошибок.
  
Наверх
www  
IP записан
 
vladimirmir2012
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 426
Зарегистрирован: 18. Мая 2011
Re: Не могу записать DBF после переделки на прямой запрос
Ответ #8 - 14. Октября 2019 :: 05:20
Печать  
Лучше так: КэшОстатков.ДобавитьИндекс("INDEX","STR(Firm, 5,0)+STR(Stock,5,0)+STR(Good,5,0)",1,0,"");
  
Наверх
 
IP записан
 
Arbuz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 65
Зарегистрирован: 06. Февраля 2019
Re: Не могу записать DBF после переделки на прямой запрос
Ответ #9 - 14. Октября 2019 :: 10:16
Печать  
Djelf писал(а) 13. Октября 2019 :: 15:32:
Хм, а проверь на этом, альтернативном, движке dbeng32 от Wirth


Это тот самый где он всю арифметику на 64 битные переменные перевёл? У меня такой же размер, такие же версия, автор и т.д., но содержимое отличается на 13 байт в одном месте. https://yadi.sk/d/oe0ZfcJKJHZalA
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Не могу записать DBF после переделки на прямой запрос
Ответ #10 - 14. Октября 2019 :: 10:54
Печать  
Arbuz писал(а) 14. Октября 2019 :: 10:16:
Djelf писал(а) 13. Октября 2019 :: 15:32:
Хм, а проверь на этом, альтернативном, движке dbeng32 от Wirth


Это тот самый где он всю арифметику на 64 битные переменные перевёл? У меня такой же размер, такие же версия, автор и т.д., но содержимое отличается на 13 байт в одном месте. https://yadi.sk/d/oe0ZfcJKJHZalA

А это я отключил FlushFileBuffers(), по аналогии с патчем оригинального dbeng32.
  
Наверх
www  
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 854
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Не могу записать DBF после переделки на прямой запрос
Ответ #11 - 31. Октября 2019 :: 16:40
Печать  
А можно поподробнее про dbeng32 от Wirth? А то я на web archive (http://web.archive.org/web/20170524145740/http://wirth.ru:80/) - не нашел упоминания про него.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Не могу записать DBF после переделки на прямой запрос
Ответ #12 - 01. Ноября 2019 :: 05:53
Печать  
Подзабыл уже что там было. Вроде 310ю ошибку частично удалось победить, что-то по поводу размера файла больше 2х гигов и 0% загрузки при ожидании транзакции.
  
Наверх
www  
IP записан
 
Arbuz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 65
Зарегистрирован: 06. Февраля 2019
Re: Не могу записать DBF после переделки на прямой запрос
Ответ #13 - 01. Ноября 2019 :: 12:15
Печать  
к сожалению web archive не сохранил содержимое всего форума. насколько я помню, wirth перевёл все "счётчики" в dbeng32 в qword, что позволило избавиться (сильно отодвинуть граничные условия) от архитектурных ошибок логики codebase покуроченной гениями 1с, в частности ограничение на количество записей в 16кк (2^24 ошибка #310) и размер файла таблицы (вроде стало возможно до 4гиг). плюс ожидание транзакции, плюс ещё родных ошибок по мелочи понаисправлял.

Djelf, у Вас какой наибольший файл dbf на этом движке работал? у меня ra/rg328 по 1,5 гига, больше нет, и то где-то с партиями накосячено, не закрываются, рвутся, всё руки не дойдут.
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Не могу записать DBF после переделки на прямой запрос
Ответ #14 - 01. Ноября 2019 :: 14:00
Печать  
Вроде бы на форуме Wirth писал что больше 2х гигов у него в бухгалтерии было. У меня все пока значительно скромнее.

P.S. Не закрытые итоги можно грохнуть с помощью 1sqlite и
потом сжать таблицы из конфигуратора.
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать