Имя: Пароль:
1C
1С v8
Не записывается набор регистра накоплений
,
0 pessok
 
09.12.12
12:13
Коллеги, доброго воскресенья! :)

Тут затык случился. Есть файловая база (1cd весит 6 с гаком ГБ). Пытаюсь запись набор регистра накопления в 2000 строк. Долго думает, потом отжирает огромное количество рамы и падает с "Недостаточно памяти". chkdbfl делал, ТИИ делал, выгрузку-загрузку пробовал. 8.2.17.143, УТ 10.3.18.5. Шоделоц?
1 DrShad
 
09.12.12
12:23
проверяй что пытаешься записать, имхо в данных набора лажа
2 pessok
 
09.12.12
12:27
(1) нормально там в данных. я ж идиот, забыл сказать, что это ТоварыНаСкладах.
upd: щас пока не вываливается, но пишет уже минут 5...
3 pessok
 
09.12.12
12:29
попробую щас на постгри сделать...
4 DrShad
 
09.12.12
12:29
[нормально там в данных] откуда инфа?
5 pessok
 
09.12.12
12:31
(4) потому что заполнение я писал сам :) да и отладчиком просмотрел. как еще можно проверить, что в наборе?
6 pessok
 
09.12.12
12:32
+(5) ощущение, что если окно эсины сернуто, то ничего не происходит, как только разворачиваю, сразу начинается отжор рамы 0_0
7 DrShad
 
09.12.12
12:32
(5) вот поэтому и говорю, чтоб проверил свое заполнение
8 DrShad
 
09.12.12
12:33
при записи набора еще много чего происходит и индексы строятся и остатки пересчитываются
9 pessok
 
09.12.12
12:34
ну есди ты о коде, то это я первым делом просмотрел раз 100500.
10 pessok
 
09.12.12
12:35
+(9) щас проверил.. набор на 100 строк тоже не пишется...
11 DrShad
 
09.12.12
12:36
говорю же что лажу ему подсовываешь
12 pessok
 
09.12.12
12:36
(10) конфа не типовая, пойду проверять что там с регистром могли наворотить. а то кобыла не моя
13 pessok
 
09.12.12
12:37
(11) как, блин, проверить, что я ему подсовываю то, что надо :) а то я не проснулся еще
14 DrShad
 
09.12.12
12:38
ты же бил ся пяткой в грудь, что 100500 раз все проверил :))))
не хорошо старших обманывать!
15 ShoGUN
 
09.12.12
12:39
(13) Если набор небольшой - можно прямо в отладчике посмотреть.
16 pessok
 
09.12.12
12:40
(14) я проверял, но ты меня так уверяешь, что я верблюд, что я почти сам поверил :)

(15) смотрел, вроде все ок. грешу на то, что что-то наворотили с индексами самого объекта метаданных
17 DrShad
 
09.12.12
12:40
звездун! ни хрена ты не проверял
18 pessok
 
09.12.12
12:41
+(16) просто недавно было обновление на 10 релизов
19 pessok
 
09.12.12
12:43
ну что не так можно записать в товары на складах?
20 ShoGUN
 
09.12.12
12:46
(19) Может код покажешь уже? Или сотни постов ждать?
21 pessok
 
09.12.12
12:50
(20) дык никто не просил код :)

   Если Не ЗначениеЗаполнено(Склад) Тогда
       Предупреждение("Выберите склад поставщика!");
       возврат;
   КонецЕсли;
       
   ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   
   ДиалогВыбораФайла.Заголовок = "Прочитать табличный документ из файла";
   ДиалогВыбораФайла.Фильтр    = "Лист Excel (*.xls)|*.xls|";
   Если ДиалогВыбораФайла.Выбрать() Тогда
       
       ФайлНаДиске = Новый Файл(ДиалогВыбораФайла.ПолноеИмяФайла);
       
       Excel     = Новый COMОбъект("Excel.Application");
       Док         = Excel.Workbooks.Open(ДиалогВыбораФайла.ПолноеИмяФайла);

       Если Не ПустаяСтрока(Док.Sheets(1).Cells(8,1).Value) Тогда    
           
           Оприходование = Документы.ОприходованиеТоваров.НайтиПоНомеру("АБВГД678910", '00010101000001');
           Если Оприходование = Неопределено ИЛИ Не ЗначениеЗаполнено(Оприходование) Тогда
               Оприходование = Документы.ОприходованиеТоваров.СоздатьДокумент();
               Оприходование.Дата = '00010101000001';
               Оприходование.Номер = "АБВГД678911";
               Оприходование.Записать();
               Оприходование = Оприходование.Ссылка;
           КонецЕсли;
                       
           НаборЗаписейТовары = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
           НаборЗаписейТовары.Отбор.Регистратор.Установить(Оприходование);
           НаборЗаписейТовары.Прочитать();

           Счетчик = 8;
           Лист = Док.Sheets(1);
           
           ТаблицаИзЭксель = Новый ТаблицаЗначений;
           ТаблицаИзЭксель.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(0, 0, ДопустимыйЗнак.Любой)));
           ТаблицаИзЭксель.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
           ТаблицаИзЭксель.Колонки.Добавить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
           ТаблицаИзЭксель.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная)));
           ТаблицаИзЭксель.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(0, 0, ДопустимыйЗнак.Любой)));
           Текст = Новый ТекстовыйДокумент;
           ТаблицаНабора = НаборЗаписейТовары.Выгрузить();
           НеНайдено = 0;
           НомерСтроки = 1;
           Состояние("Обработка EXCEL - документа.");
           Пока Не ПустаяСтрока(Лист.Cells(Счетчик,1).Value) Цикл
               Состояние("Обработка EXCEL - документа. Строка "+Строка(Счетчик-7));
               Артикул = Лист.Cells(Счетчик, 1).Value;
               Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("АртикулПоставщика", Артикул);
               Характеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
               Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда
                   
                   Характеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоРеквизиту("АртикулПоставщика", Артикул);

                   Если Характеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() Тогда
                       
                       Текст.ДобавитьСтроку(Артикул);
                       Счетчик=Счетчик+1;
                       НеНайдено = НеНайдено + 1;
                       Продолжить;
                       
                   Иначе
                       
                       Номенклатура = Характеристика.Владелец;                
       
                   КонецЕсли;
                   
               КонецЕсли;
               НовСтр = ТаблицаИзЭксель.Добавить();
               НовСтр.НомерСтроки = НомерСтроки;
               НовСтр.Номенклатура = Номенклатура;
               НовСтр.Характеристика = Характеристика;
               НовСтр.Артикул = Лист.Cells(Счетчик, 1).Value;
               НовСтр.Остаток = Лист.Cells(Счетчик, 8).Value;
               
               Счетчик = Счетчик + 1;
               НомерСтроки = НомерСтроки + 1;
           КонецЦикла;
           Сообщить("В базе не найдено "+НеНайдено+" позиций из файла");
           Текст.Показать("Не найденные в базе артикулы");
           Док.Application.Quit();
           
           Для Каждого ТекСтр Из ТаблицаИзЭксель Цикл
               Состояние("Обработка строки "+ТекСтр.НомерСтроки+" из "+ТаблицаИзЭксель.Количество());
               НоменклатураНайденаВНаборе = Ложь;
               
               Для Каждого ТекСтрНабор Из НаборЗаписейТовары Цикл
                   
                   Если ТекСтр.Артикул = ТекСтрНабор.Номенклатура.АртикулПоставщика Тогда
                       
                       ТекСтрНабор.Количество = ТекСтр.Остаток;
                       НоменклатураНайденаВНаборе = Истина;
                       
                   КонецЕсли
                   
               КонецЦикла;
               Если Не НоменклатураНайденаВНаборе Тогда
                   
                   Запись = НаборЗаписейТовары.Добавить();
                   Запись.Склад = Склад;
                   Запись.Номенклатура = ТекСтр.Номенклатура;
                   Запись.Количество = ТекСтр.Остаток;
                   Запись.ХарактеристикаНоменклатуры = ТекСтр.Характеристика;
                   Запись.ВидДвижения = ВидДвиженияНакопления.Приход;
                   Запись.Период = '20010101000001';
                   
               КонецЕсли;
           КонецЦикла;
                                   
       КонецЕсли;
       
       НаборЗаписейТовары.Записать();
       
       КонецЕсли;


знаю, что в конечном цикле копрокод, но он работал так давным давно, потому менять не стал
22 pessok
 
09.12.12
12:54
телепатируя вопрос "Зачем?" отвечаю сразу - ХЗ. Они так вроде как остатки заносят и считают, что это правильно. Кобыла не моя
23 DrShad
 
09.12.12
12:54
пизнец, это что за адский отжиг?
24 ShoGUN
 
09.12.12
12:55
Ёптыть, а регистратор-то где?
25 DrShad
 
09.12.12
12:55
у тя документ с датой от рождества христова! сколько остатков будет пересчитано?
26 pessok
 
09.12.12
12:55
НаборЗаписейТовары = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
           НаборЗаписейТовары.Отбор.Регистратор.Установить(Оприходование);
           НаборЗаписейТовары.Прочитать();
27 ShoGUN
 
09.12.12
12:57
(26) А, увидел... А период записи - 2001 год не смущает?
28 pessok
 
09.12.12
12:57
(25) во, вот в этом, скорее всего основной затык
29 pessok
 
09.12.12
12:58
(27) 2001 - это уже изменено. писалось на дату от рождества христова, потому и написал (22)
30 pessok
 
09.12.12
12:58
короче механизм проще по-человечески переписать с нуля, да?
31 DrShad
 
09.12.12
12:58
а сц-ука говорил что проверил все
32 DrShad
 
09.12.12
12:59
(30) предварительно прострелив коленку, чтоб больше таких МЕГА алгоритмов не рождалось
33 pessok
 
09.12.12
13:00
(31) я даже не подумал насчет рождества христова, не сталкивался с таким никогда :)

(32) писал мой бывший начальник, кстати :) видимо в расширенной сознании
34 ShoGUN
 
09.12.12
13:01
(33) Видимо, это писалось как ОДНОКРАТНЫЙ алгоритм, для ввода остатков на пустой базе.
35 ShoGUN
 
09.12.12
13:02
+(34) Хотя остатки рождеством христовым вводить - тож неправильно, таблица итогов будет охренеть какая.
36 pessok
 
09.12.12
13:03
(35) вот как раз о таблице итогов я и не подумал грешным делом. утро воскресенья, блджад!

спасибо, коллеги!
37 DrShad
 
09.12.12
13:03
(35) ага по одной только записи остатков будет 2013 * 12 =
38 DrShad
 
09.12.12
13:04
24156
39 DrShad
 
09.12.12
13:05
+ по ним еще индексы нужно построить
40 DrShad
 
09.12.12
13:06
и вообще накуя тут набор записей? пиши в ТЧ документа и проводи его
41 pessok
 
09.12.12
13:06
(39) колотить. ну в общем на мой вкус надо сделать так - получить таблицу остатков, положить во временную таблицу, потом положить во временную таблицу данные из экселя, соединить внутренним, и у того, что получится в результате поменять количество, а регистратор текущей датой. по идее взлетит нормально же?
42 pessok
 
09.12.12
13:07
(40) тоже верно, кстати
43 pessok
 
09.12.12
13:09
(42) не, неверно, тут остатки надо именно исправить, а не оприходовать :(
44 ShoGUN
 
09.12.12
13:09
(41) Смотря, что тебе надо. Одно только изменение даты на дату начала ведения учёта в программе - даст прирост быстродействия на несколько порядков, исходя из (37).
45 DrShad
 
09.12.12
13:09
(43) исправлять остатки нужно Инвентаризацией, а не наборами записей, блеать!
46 pessok
 
09.12.12
13:11
(45) ыыыы. нельзя работать в выходные :)
47 ShoGUN
 
09.12.12
13:16
(45) Респект и уважуха :) У меня голова трещит чё-то, хотя я не пью. Так что ты оплот трезвомыслия на сегодня)))
48 pessok
 
09.12.12
13:19
(47) во-во. я вчера вроде тоже только бутылку пива, но все равно мозг отказывается думать :)
49 DrShad
 
09.12.12
13:32
учу пользоваться мозгом на выходных - дорого!
50 pessok
 
09.12.12
13:56
(49) ну на самом деле для меня инвентаризация не совсем подходит, потому как надо двинуть только п товарам на складах, ну да дофейхоа, поставил цену 1, пусть так живут :)
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший