Имя: Пароль:
1C
1C 7.7
v7: Хранение значений
0 Sima42
 
06.06.21
23:23
Добрый день. Возникла проблема у меня есть справочник у его есть подчинённый справочник. Я пытаюсь записать с документа 5000 строк (2 поля (число и строка 70 символов)), а это происходит ооооочень медленно. Структура такая меня устраивает но скорость просто ужас. Как это можно организовать не через справочник?
1 Смотрящий
 
06.06.21
23:35
(0) Код покаж
2 Злопчинский
 
07.06.21
01:22
(1) Автор застеснялся...
3 victuan1
 
07.06.21
07:12
(0) НачатьТранзакцию()
ЗафиксироватьТранзакцию()

Через каждые, допустим, 500 элементов.
4 ДенисЧ
 
07.06.21
07:40
(3) На скуле это не очень помогает
5 Sima42
 
07.06.21
07:49
Процедура ЗагрузкаВСправочник()  
    ХранилищеКодов=СоздатьОбъект("Справочник.ХранилищеКодов");
    ХранилищеКодов.ИспользоватьВладельца(Наименование);
    ВыбратьСтроки();
    Пока ПолучитьСтроку()=1 цикл
        ХранилищеКодов.Новый();
        ХранилищеКодов.КодМ=КодыМ;
        ХранилищеКодов.Состояние=0;
        ХранилищеКодов.Записать();
    КонецЦикла;
КонецПроцедуры
6 trdm
 
07.06.21
07:50
(4) Прекрасно помогает.
7 acanta
 
07.06.21
07:51
На семёрке был в инструкции рекомендуемый лимит на количество строк в документе.
8 Андрей_Андреич
 
naïve
07.06.21
07:53
Процедура ЗагрузкаВСправочник()  
Счетчик=0;
НачатьТранзакцию();
    ХранилищеКодов=СоздатьОбъект("Справочник.ХранилищеКодов");
    ХранилищеКодов.ИспользоватьВладельца(Наименование);
    ВыбратьСтроки();
    Пока ПолучитьСтроку()=1 цикл
        ХранилищеКодов.Новый();
        ХранилищеКодов.КодМ=КодыМ;
        ХранилищеКодов.Состояние=0;
        ХранилищеКодов.Записать();
Счетчик=Счетчик+1;
Если Счетчик >=500 Тогда
Счетчик=0;
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
    КонецЦикла;
ЗафиксироватьТранзакцию();
КонецПроцедуры
9 Андрей_Андреич
 
naïve
07.06.21
07:54
(8) Забыл КонецЕсли вставить
10 acanta
 
07.06.21
07:54
А почему не оставить документ в покое если в нем все есть и при помощи адо получать из документа все что надо.
11 Mikeware
 
07.06.21
07:56
(7) (10)  вы - бот?
вроде сообщения и "в контексте", но совершенно не в тему...
12 acanta
 
07.06.21
07:58
Мне непонятно зачем нужны два справочника. Уточняю.
13 Sima42
 
07.06.21
07:59
(8) Спасибо! Другое дело)
14 Mikeware
 
07.06.21
08:00
(12) но причем тут лимит на количество строк в документе, и причем тут адо?
15 Смотрящий
 
07.06.21
08:00
(13) ХранилищеКодов.ИспользоватьВладельца(Наименование); можешь убрать
после
ХранилищеКодов.Новый();
вставь
ХранилищеКодов.Владелец = Номенклатура;
16 ДенисЧ
 
07.06.21
08:02
(15) Ага. И слови "код не уникальный" ))
17 acanta
 
07.06.21
08:03
Код можно сделать длина 0 и забыть о нём.
18 Смотрящий
 
07.06.21
08:04
(16) У него и та кне уникальные коды, судя по КодМ
Отключить код
19 Sima42
 
07.06.21
08:07
(16) Мне код вообще не нужен
20 acanta
 
07.06.21
08:12
(14) запись и проведение документа это транзакция, в которой нет возможности поделить по 500 строк. Можно замерить просто запись документа от 500 до 5000 и забыть о том для чего вообще нужна была транзакция (по частям хвостик рубить).
21 acanta
 
07.06.21
08:16
Если sql есть, создать длп.индекс на поля и пилить запрос в sql к таб.части документа.
22 Мимохожий Однако
 
07.06.21
08:34
(0) Как вариант, создать несколько документов по 500 строк
23 Мимохожий Однако
 
07.06.21
08:36
Только не понятно, зачем из документа записывать данные в справочник. Или документ оставить в покое, беря информацию из него, или сразу писать в справочник данные, которые записаны в документ.
24 Bigbro
 
07.06.21
08:38
поддержу (23)
зачем дублировать информацию в базе?
25 acanta
 
07.06.21
08:40
А интерфейс с подчиненными справочниками в виде адо запросов это последний писк моды)
26 MWWRuza
 
гуру
07.06.21
09:37
(8)
Если Счетчик >=500 Тогда
Счетчик=0;

А я обычно так делаю, в одно действие:
Если Счетчик%500 = 0 Тогда
27 1Сергей
 
07.06.21
10:00
(23) (24) Это импровизированный РС :)
28 Bigbro
 
07.06.21
10:26
я не уверен что от копирования информации из строк документа в справочник будет выгода.
если запросами строки документа дергать конечно.
29 Злопчинский
 
07.06.21
13:24
(26) "Счетчик%500" - очень ресурсожрущая операция. когда объектов немного - то несущественно. если объектов много - то сравнение на пороговое значение дает ощутимый выигрыш
30 ДедМорроз
 
07.06.21
13:32
(29) просто,те кто имеют представление о работе процессора,помнят,что целочисленное деление - это одна команда процессора,но все забывают,что числа в 1с хранятся в достаточно странном виде,и все операции с ними идут через специальную библиотеку,а не напрямую.
Сравнение,кстати,тоже будет занимать не одну инструкцию процессора,но с ним проще.

А на Си действительно Aint % Bint это одна команда процессора.
31 Злопчинский
 
07.06.21
13:36
ну и попутно (ранее писал) массовые операции с периодическими значениями при использовании объекта "периодический" дают не менее 25% выигрыша
32 Смотрящий
 
07.06.21
15:06
(31) Все верно. Только 1с это байт-код....
33 Mikeware
 
07.06.21
16:37
(28) строки документа ты не проиндексируешь. со справочником попроще.
34 ДенисЧ
 
07.06.21
16:38
(33) А что, с сегодняшнего дня доступ к скулю запрещён под угрозой расстрела?
35 Bigbro
 
08.06.21
04:34
(33) зачем мне индексировать строки?
я получаю запросом сразу то что мне нужно по условию и все.
регулярная запись по 5000 элементов не предполагает перебор этих элементов - должны быть реквизиты по которым можно сделать отбор необходимых данных.
36 acanta
 
08.06.21
04:44
Логично будет два справочника - владелец вместо шапки документа и подчиненный вместо табличной части. Тогда транзакция в любых объемах и проведение простая запись реквизита владельца. Любые индексы. И все бакапы sql.
37 acanta
 
08.06.21
04:47
А пользователи в каком нибудь сайте или екселе пусть работают, документ 1с не работает в режиме запись построчно.
38 acanta
 
08.06.21
04:54
Как это в sap/аксапте/фузине/дбф надо смотреть.
39 acanta
 
08.06.21
05:02
Или независимый регистр сведений.
40 acanta
 
08.06.21
05:28
А еще можно сделать редактирование независимого регистра сведений в форме документа. И пусть проводится без каких либо движений.
В любом случае, смысла заключать в транзакцию 5000 строк нет.
41 Bigbro
 
08.06.21
07:29
какие в пень регистры сведений на 7ке
42 Mikeware
 
08.06.21
09:18
(34) "день сегодня обычный, скоромный"©Жеглов
но те, кто может добавить индексы - обычно не задают таких вопросов, правда?
(35) затем, что запрос "в индексе" работает быстрее, чем запрос без индекса.
(41) эмуляция на справочниках.
43 Злопчинский
 
08.06.21
12:06
регистры сведений в т.ч. эмулируются и на обычных регистрах без измерений, только с реквизитами
44 victuan1
 
09.06.21
04:19
(43) Но нужно для них иметь какой-то док-регистратор. Один док на всю братию пойдет?
Ошибка? Это не ошибка, это системная функция.