Переключение на Главную Страницу Страницы: 1 [2] 3 4  ОтправитьПечать
Очень популярная тема (более 25 ответов) Ускорение работы документа с большой ТЗ при помощи 1С++ (число прочтений - 11218 )
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #15 - 20. Августа 2010 :: 04:35
Печать  
Z1 писал(а) 20. Августа 2010 :: 04:35:
(es3000) Урбд есть или нет ?

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #16 - 20. Августа 2010 :: 05:01
Печать  
Тогда как бы два Варианта как было предложено  выше справочник
но это тебе придеться переписать все что сейчас и пользователям придеться перестраиваться.
Второй вариант через документ но по другому работать с табличной частью
Предположим сейчас в табличной части поля
Клиент Справочник.Контагенты
Поле1  Строка 300
Поле2  Строка 300
Поле3  Строка 300
Табличная часть в sql  dt100.

Заводим в той же базе еще одну таблицу x_dt100. В ней и будем
хранить Табличную часть документа.
Т.е. в оригинальной таблице dt100 всегда нет строк. все храним
в  x_dt100.
Два подварианта при записи писать таблицу целиком ( это хуже так как данных много и описывать нечего так как все понятно).
Записываем только измененные строки.

ПриОткрытии документа из x_dt100 читаем все в Табличную часть.
Далее при любом изменении данных в строке каким либо образом
помечаем что строка была изменена.

В модуле при записи
пишем update на те строки которые были изменены.

После этого в табличной части удаляем все строки.

Далее для вставки новой строки помечаем эту строку что строка не измененная а новая и для нее при записи вместо update делаем insert.

При удалении строки легче всего сделать сначала записываем все изменения в базу и снимаем маркеры измененных строк
после удаляем строку в x_dt100 и удаляем ее из Табличной части.
можно сделать и вариант учета удаления и в Конце ПриЗаписи но он потребует больше кода и стоит ли его делать тебе решать.

Также можно сделать маркер не на строку а маркер на каждое поле строки тогда если  всего лишь в пятой строке поменяли поле Клиент то update только для этого поля

update x_dt100 set Клиент = <НовЗначКлиент>
where IDDOC = <КонкретныйДокумент> and ИдентСтроки=5



Ну вообщем как-то так.




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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #17 - 20. Августа 2010 :: 05:50
Печать  
спасибо. идея понятна.

возникли вопросы:
1) почему нельзя писать в таблицу dt100?
2) если писать в x_dt100, не затрется ли она при обновлении базы? в случае изменения структуры этого документа.
3) имена колонок в x_dt100 задавать точно такими же как и в dt100 или можно прямо так и назвать: "Клиент", "Строка1"?
4) как правильно написать запрос при создании нового документа? Все строки новые, они должны добавляться.
Такой код правильный?
Код
Выбрать все
В процедуре ПриЗаписи:

ТЗ = СоздатьОбъект("ТаблицаЗначений");
ВыгрузитьТабличнуюЧасть(ТЗ);
УдалитьСтроки();

рс=СоздатьОбъект("ODBCRecordset");
рс.Подготовить("insert into x_dt100 (Клиент, Строка1, Строка2, Строка3) values (?, ?, ?, ?)");
рс.ДобПараметр(1,4,10,0);
рс.ДобПараметр(1,15,200,0);
рс.ДобПараметр(1,15,200,0);
рс.ДобПараметр(1,15,200,0);
рс.ВыполнитьSQL_ИзТЗ(ТЗ); 



  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #18 - 20. Августа 2010 :: 06:14
Печать  
es3000 писал(а) 20. Августа 2010 :: 04:35:
Обмен выполняется ежемесячно,

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

Короче очевидно что сам факт обмена должен быть оформлен документом.

Для меня вообще не очевидно.
Навскидку.
Добавляем Справочник.Обмен, которому добавляем все нужные тебе реквизиты (строк загружено, выгружено, дата и время выгрузки и т.д.)
Добавляем Справочник.СоставОбмена подчиненный справочнику "Обмен". Добавляем здесь реквизиты с нужным тебе типом ( "на справочник контрагентов и строковые реквизиты, которые имеют отношение только к конкретному обмену).

В форме элемента Справочника.Обмен добавляем ТП, состоящая из всех подчиненных элементов справочника "СоставОбмена" (если использовать класс "ПоставщикДанных", то там вообще несколько строк в модуль добавил и всё)

И никакой проблемы долгой записи ТЧ нет. И уж тем более сделать на основе этих данных печатную форму.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #19 - 20. Августа 2010 :: 06:24
Печать  
JohnyDeath писал(а) 20. Августа 2010 :: 06:14:
es3000 писал(а) 20. Августа 2010 :: 04:35:
Обмен выполняется ежемесячно,

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

Короче очевидно что сам факт обмена должен быть оформлен документом.

Для меня вообще не очевидно.

Ну обычно, если надо зафиксировать факт с датой и временем - то это документ.

JohnyDeath писал(а) 20. Августа 2010 :: 06:14:
Навскидку.
Добавляем Справочник.Обмен, которому добавляем все нужные тебе реквизиты (строк загружено, выгружено, дата и время выгрузки и т.д.)
Добавляем Справочник.СоставОбмена подчиненный справочнику "Обмен". Добавляем здесь реквизиты с нужным тебе типом ( "на справочник контрагентов и строковые реквизиты, которые имеют отношение только к конкретному обмену).

В форме элемента Справочника.Обмен добавляем ТП, состоящая из всех подчиненных элементов справочника "СоставОбмена" (если использовать класс "ПоставщикДанных", то там вообще несколько строк в модуль добавил и всё)

И никакой проблемы долгой записи ТЧ нет.

В принципе нормальный вариант, только у меня уже все под документы заточено. Остался только вопрос с запросом INSERT.
Конечно, если не заработает после некоторых усилий, то придется переделывать.

Создал таблицу dt471_x, при помощи сгенерированного скрипта от таблицы dt471. При выполнении запроса выдается ошибка:
Код
Выбрать все
Invalid object name 'dbo.dt471_x'. 


Что не правильно
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #20 - 20. Августа 2010 :: 06:27
Печать  
1 потому что в 1с вся табличная часть сначала затирается потом пишеться заново целиком
т.к. у тебя большие размеры это не оптимально.

2.нет чужие таблицы в родной базе 1с не трогает.
1с проверяет только свои таблицы.

3. как назвать поля в x_dt100 не принципиально главное чтобы тебе было удобно и понятно.

4. Давай я еще раз опишу.
Предположим  что для конкретного документа у нас 5015 строк
ПриОткрытии загружаем их в Табличную часть

далее в модуле ПриОткрытии()
ТзМаркерСтрок = СоздатьОбъект("ТаблицаЗначений");
ТзМаркерСтрок.НоваяКолонка("ЭтоНоваяСтрока","число",1,0);
ТзМаркерСтрок.НоваяКолонка("ИзменилиСтроку","число",1,0);
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
  ТзМаркерСтрок.НоваяСтрока();
КонецЦикла;



Когда добавляем новую строку то нужен код
  ТзМаркерСтрок.НоваяСтрока();
  ТзМаркерСтрок.ЭтоНоваяСтрока = 1;
т.е в ТзМаркерСтрок появиться строка с номером = 5016

Когда изменяем что либо в строке то код
  ТзМаркерСтрок.УстановитьЗначение(НомерСтроки,"ИзменилиСтроку",1);


Процедура ПриЗаписи()
  ....
  ТзМаркерСтрок.ВыбратьСтроки();
  Пока ТзМаркерСтрок.ПолучитьСтроку() = 1 Цикл
      Если ТзМаркерСтрок.ЭтоНоваяСтрока = 1 Тогда
// Одиночный insert на одну текущую строку
      ИначеЕсли ТзМаркерСтрок.ЭтоНоваяСтрока = 1 Тогда
// Одиночный update на одну  текущую  строку
      КонецЕсли;
  КонецЦикла;
  ....

PS в таблице x_dt100 должен быть маркер и документа IDDOC
и маркер строки документа.



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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #21 - 20. Августа 2010 :: 06:29
Печать  
Invalid object name 'dbo.dt471_x'.

Стоп, Это мой косяк! Сейчас поправлю
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #22 - 20. Августа 2010 :: 06:31
Печать  
es3000 писал(а) 20. Августа 2010 :: 06:24:
Ну обычно, если надо зафиксировать факт с датой и временем - то это документ.

Справочник с реквизитом типа "Дата" с установленным отбором и сортировкой.

Я тебя не принуждаю, но я не понимаю, зачем лезть с прямыми апдейтами и инсертами табличек там, где всё это можно сделать штатными средствами (причем получится эффективнее, чем с "прямыми апдейтами"). У справочника есть еще один большой плюс: можно установить индекс(отбор) на любой из его реквизитов.

Ладно, всё, умолкаю Подмигивание
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #23 - 20. Августа 2010 :: 06:35
Печать  
JohnyDeath писал(а) 20. Августа 2010 :: 06:31:
es3000 писал(а) 20. Августа 2010 :: 06:24:
Ну обычно, если надо зафиксировать факт с датой и временем - то это документ.

Справочник с реквизитом типа "Дата" с установленным отбором и сортировкой.

Я тебя не принуждаю, но я не понимаю, зачем лезть с прямыми апдейтами и инсертами табличек там, где всё это можно сделать штатными средствами (причем получится эффективнее, чем с "прямыми апдейтами"). У справочника есть еще один большой плюс: можно установить индекс(отбор) на любой из его реквизитов.

Ладно, всё, умолкаю Подмигивание

на свою таблицу можно тоже установить какие хочешь индексы(а значит и отборы).
Автору предложено два варианта, что выбрать зависит от многих факторов пусть автор сам и решает.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #24 - 20. Августа 2010 :: 06:38
Печать  
Z1 писал(а) 20. Августа 2010 :: 06:35:
на свою таблицу можно тоже установить какие хочешь индексы(а значит и отборы).

Ну как бы она не совсем "своя". И штатно это никак не сделаешь.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #25 - 20. Августа 2010 :: 06:42
Печать  
JohnyDeath, Z1


Не спорьте, я все понял.
Просто действительно уже для справочника переделывать лень. Даже не лень, а время поджимает

Помогите с INSERT-ом.
Можно ли в этом INSERT-е обратиться к колонке как к имени реквизита в документе?

То есть написать не:
Код
Выбрать все
"insert into x_dt100 (SP1746, SP1747, SP1748, SP1749) values (?, ?, ?, ?)" 



а
Код
Выбрать все
"insert into x_dt100 (Клиент, Строка1, Строка2, Строка3) values (?, ?, ?, ?)" 



сейчас для второго варианта выдается ошибка:
Код
Выбрать все
Invalid column name 'Клиент' 


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



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #26 - 20. Августа 2010 :: 06:44
Печать  
В варианте со справочником есть еще один плюс: с его элементами смогут одновременно работать несколько человек, а с табличной частью документа - только один.
  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #27 - 20. Августа 2010 :: 06:46
Печать  
es3000 писал(а) 20. Августа 2010 :: 06:42:
Просто действительно уже для справочника переделывать лень. Даже не лень, а время поджимает

Быстрее переделать всё на справочник, чем мудохаться с прямым апдейтом сейчас и ловить непонятные ошибки в дальнейшем.

Млни, чё-т опять распирает. Пятница? )
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #28 - 20. Августа 2010 :: 06:48
Печать  
вместо вопросов надо значения

Код
Выбрать все
ТекстЗАпроса = "insert into x_dt100 (SP1746, SP1747, SP1748, |SP1749) values (
|'     0   '
|, 'Значение Строки 1'
|, 'Значение Строки 2'
|, 'Значение Строки 3'
|)";
rc.ВыполнитьСкалярный(ТекстЗАпроса);
 

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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Ускорение работы документа с большой ТЗ при помощи 1С++
Ответ #29 - 20. Августа 2010 :: 07:00
Печать  
Z1 писал(а) 20. Августа 2010 :: 06:48:
вместо вопросов надо значения

Код
Выбрать все
ТекстЗАпроса = "insert into x_dt100 (SP1746, SP1747, SP1748, |SP1749) values (
|'     0   '
|, 'Значение Строки 1'
|, 'Значение Строки 2'
|, 'Значение Строки 3'
|)";
rc.ВыполнитьСкалярный(ТекстЗАпроса);
 



Это если я одну запись вставляю.
А я хочу при записи нового документа, когда все строки новые сделать ВыполнитьSQL_ИзТЗ.

Переделал команду так:
Код
Выбрать все
	рс.Подготовить("insert into dt1741_x ($Документ.Загрузка.Клиент, $Документ.Загрузка.Строка1, $Документ.Загрузка.Строка2, $Документ.Загрузка.Строка3) values (?, ?, ?, ?)");
 


Так на реквизиты не ругается, но 1С-ка вываливается вообще.
Я так понимаю возможно что из-за преобразования типов.
Какой тип преобразования мне надо указывать в ТЗ для длинных строк?
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 4 
ОтправитьПечать