Имя: Пароль:
1C
1C 7.7
v7: Создание и заполнение нового оборотного регистра 1С 7
0 pofigos
 
11.02.16
12:23
Добрый день!

Подскажите, какие варианты есть при создании нового регистра (обороты)?

Если можно, то как это сделать прямыми запросами без проведения документов? :(
1 ObjectRelation Model
 
11.02.16
12:28
через набор записей, например
2 Ёпрст
 
11.02.16
12:30
Можно и прямым, можни и штатно заполнить только 1 регистр
3 Aleksey
 
11.02.16
12:35
(1) В 7-ке?

(2) Прописать параметр в обработке проведения?
4 ObjectRelation Model
 
11.02.16
12:35
(3) ах в 7.7, тогда звиняйте
5 pofigos
 
11.02.16
12:38
(2) как прямым сделать? Штатно, только перепроведение?
6 pofigos
 
11.02.16
12:38
(3) Перепроведение документа не подойдет. период с 2012 года. Документов уйма
7 mikecool
 
11.02.16
12:40
(6) если не знаешь - как прямым, то проще штатно с параметром
имхо - так быстрее
8 Mikeware
 
11.02.16
12:40
(6) по аналогии с допроведением.
Но прямым запросом - быстрее и проще. имхо, конечно
9 Mikeware
 
11.02.16
12:41
можно вообще сделать в копии перепроведение, а потом тупо в рабочую один регистр скопировать...
10 pofigos
 
11.02.16
12:44
(7) хотелось бы прямым сделать. Я понимаю, что необходимо выбрать жрунал с фильтром по типу документов.. а вот дальше.. читаю про insert into. но опасаюсь, что не то.
11 Mikeware
 
11.02.16
12:48
(10) не знаю, зачем тебе "жрунал" (хорошее слово, кстати. емкое). Но про инсерт читаешь правильно.
Пиши в RA, а итоги потом пересчитаешь отдельно по этому регистру обработкой
12 pofigos
 
11.02.16
12:51
(11) Спасибо ) буду пытаться сделать. Видать иду в верном направлении :)
13 Mikeware
 
11.02.16
13:01
(12) справшивай, поможет. подопнем.
обработка по выборочному пересчету на инфостарте лежит...
14 Mikeware
 
11.02.16
13:06
15 pofigos
 
11.02.16
13:08
(14) Спасибо. дальше буду руками ) старт уже дан...
16 Mikeware
 
11.02.16
13:11
Рекордсет.Prepare("INSERT INTO $Регистр.ПартииПоСреднему (
|IDDOC,LINENO_,ACTNO,DEBKRED,IDDOCDEF,DATE_TIME_IDDOC,SP11077,SP11278,SP11081,SP11083,SP11084,SP11085,SP11086,SP11087
|) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
//F=IDDOC                 |ID Document's       |C   |9     |0        
//F=LINENO_               |LineNo              |S   |0     |0        
//F=ACTNO                 |Action No           |I   |0     |0        
//F=DEBKRED               |Flag Debet/Kredit   |L   |0     |0        
//F=IDDOCDEF              |ID Def Document     |I   |0     |0        
//F=DATE_TIME_IDDOC       |Date+Time+IDDoc     |C   |23    |0        
//F=SP11077               |(P)Номенклатура     |C   |9     |0        
//F=SP11081               |(P)Количество       |N   |14    |5        
//F=SP11083               |(P)СуммаРуб         |N   |14    |2        
//F=SP11084               |(P)СуммаБезНДС      |N   |14    |2        
//F=SP11085               |(P)КодОперации      |C   |9     |0        
//F=SP11086               |(P)ПродСтоимость    |N   |17    |2        
//F=SP11087               |(P)Выручка          |N   |14    |2        
//DDOC,LINENO_,ACTNO,DEBKRED,IDDOCDEF,DATE_TIME_IDDOC,SP11077,SP11081,SP11083,SP11084,SP11085,SP11086,SP11087
17 pofigos
 
11.02.16
14:10
(16) Так и начал. Смущает параметр ACTNO. Как определить его значение? Или при перещете регистра все станет на свои места?
18 Mikeware
 
11.02.16
14:33
(17) Это порядковый номер движения. в принципе, он ни на что не влияет, кроме ТиИ. :-)
19 pofigos
 
11.02.16
14:34
(16) Огромное спасибо за помощь. Все получилось!
20 Mikeware
 
11.02.16
14:35
(19) "плох тот чайник, который не мечтает стать самоваром"©
21 Mikeware
 
11.02.16
14:39
Функция ПересчитатьРегистр(ВыбРегистр)
    КвоОшибок = 0;
    НачатьТранзакцию();
    ТипРегистра = ПолучитьТипРегистра(ВыбРегистр);
    
    Если ТипРегистра = "Остатки" Тогда
        НачалоПериода = мета.ПолучитьНачПериода(ВыбДата);
        КонецПериода = мета.ПолучитьКонПериода(КонДата);
    Иначе
        НачалоПериода = мета.ПолучитьНачПериодаДляРег(ВыбРегистр, ВыбДата);
        КонецПериода = мета.ПолучитьКонПериодаДляРег(ВыбРегистр, КонДата);
    КонецЕсли;
    ДобавитьВПротокол("----> Пересчет итогов регистра: " + ВыбРегистр);
    Если _ПересоздатьТаблицуИтогов = 1 Тогда
        ЗапросСкл.ВыполнитьИнструкцию("TRUNCATE TABLE $РегистрИтоги."+СокрЛП(ВыбРегистр));
    Иначе
        Т = "
        |delete from $РегистрИтоги."+ВыбРегистр+"
        |where period = convert(datetime, :Период, 112)
        |";
        Для цДата = НачалоПериода По КонецПериода Цикл
            Если ТипРегистра = "Остатки" Тогда
                КонецТекущегоПериода = мета.ПолучитьКонПериода(цДата);
            Иначе
                КонецТекущегоПериода = мета.ПолучитьКонПериодаДляРег(ВыбРегистр, цДата);
            КонецЕсли;
            Состояние("Регистр: " + ВыбРегистр + ". Удаление итогов. Период: " + цДата + " - " + КонецТекущегоПериода + ".");
            //==========================================================================
            ЗапросСкл.УстановитьТекстовыйПараметр("Период", цДата);
            ЗапросСкл.Выполнить(Т);
            Ошибка = ЗапросСкл.ПолучитьОписаниеОшибки();
            ЗапросСкл.Закрыть();
            Если Ошибка <> "" Тогда
                Сообщить(Ошибка, "!!!");
                ОтменитьТранзакцию();
                Возврат (КвоОшибок + 1);
            КонецЕсли;
            цДата = КонецТекущегоПериода;
        КонецЦикла;
    КонецЕсли;
    ДобавитьВПротокол("Удалены итоги за период: " + НачалоПериода + " - " + КонецПериода);
    
    Инсерт = ""; Измерения = ""; Селект3Ресурсов = "";
    Для цИзмерения = 1 По Метаданные.Регистр(ВыбРегистр).Измерение() Цикл
        МетаИД = мета.ИДИзмеренияРегистра(ВыбРегистр, Метаданные.Регистр(ВыбРегистр).Измерение(цИзмерения).Идентификатор);
        Инсерт = Инсерт + "
        |, sp" + МетаИД;
        Измерения = Измерения + "
        |sp" + МетаИД;
        Если цИзмерения <> Метаданные.Регистр(ВыбРегистр).Измерение() Тогда
            Измерения = Измерения + ",";
        КонецЕсли;
    КонецЦикла;
    
    Селект = Инсерт;
    СелектОбщий = Селект; ИнсертИтог = Измерения;
    УсловиеИтогов = "having ";    УсловиеИтоговОбщий = "having ";
    Для цРесурсы = 1 По Метаданные.Регистр(ВыбРегистр).Ресурс() Цикл
        МетаИД = мета.ИДРесурсаРегистра(ВыбРегистр, Метаданные.Регистр(ВыбРегистр).Ресурс(цРесурсы).Идентификатор);
        Инсерт = Инсерт + "
        |, sp" + МетаИД;
        ИнсертИтог = ИнсертИтог + "
        |, sp" + МетаИД;
        СтрТипРесурса = "";
        Для цДлина = 1 По Метаданные.Регистр(ВыбРегистр).Ресурс(цРесурсы).Длина Цикл
            СтрТипРесурса = СтрТипРесурса + "9";
        КонецЦикла;
        Если Метаданные.Регистр(ВыбРегистр).Ресурс(цРесурсы).Точность > 0 Тогда
            СтрТипРесурса = Лев(СтрТипРесурса,СтрДлина(СтрТипРесурса)-Метаданные.Регистр(ВыбРегистр).Ресурс(цРесурсы).Точность-1);
            СтрТипРесурса = СтрТипРесурса + ".";
            Для цТочность = 1 По Метаданные.Регистр(ВыбРегистр).Ресурс(цРесурсы).Точность Цикл
                СтрТипРесурса = СтрТипРесурса + "9";
            КонецЦикла;
        КонецЕсли;
        Ресурс = "sum((1 - debkred * 2) * sp" + МетаИД + ")";
        УсловиеИтоговОбщий = УсловиеИтоговОбщий + "
        |sum(sp" + МетаИД + ") <> 0 or";
        УсловиеИтогов = УсловиеИтогов + "
        |"+Ресурс+" <> 0 or";
        Селект = Селект + "
        |, case when " + Ресурс + " > "+СтрТипРесурса+" then " + СтрТипРесурса + " else " + Ресурс + " end sp" + МетаИД;
        СелектОбщий = СелектОбщий + "
        |, case when sum(sp" + МетаИД + ") > " + СтрТипРесурса + " then " + СтрТипРесурса + " else sum(sp" + МетаИД+") end sp" + МетаИД;
        Селект3Ресурсов = Селект3Ресурсов + "
        |, (1 - debkred * 2) * sp" + МетаИД + " sp" + МетаИД;
    КонецЦикла;
    УсловиеИтогов = Лев(УсловиеИтогов, СтрДлина(УсловиеИтогов) - 2);
    УсловиеИтоговОбщий = Лев(УсловиеИтоговОбщий, СтрДлина(УсловиеИтоговОбщий) - 2);
    
    ТекстЗапроса = "
    |CREATE PROCEDURE #ПересчетИтоговРегистра AS
    |SET TEXTSIZE 0
    |SET NOCOUNT ON
    |
    |insert into $РегистрИтоги." + ВыбРегистр + " (period" + Инсерт+ ")";
    Если (_ОсновыватьсяНаПредыдущихИтогах = 0) И (ТипРегистра = "Остатки") Тогда
        ТекстЗапроса = ТекстЗапроса + "
        |select convert(datetime, :Период) period" + Селект + "
        |from $Регистр." + ВыбРегистр + " ra (nolock)
        |inner join _1sjourn s (nolock) on s.iddoc = ra.iddoc
        |where s.date_time_iddoc < :ДатаДок
        |group by " + Измерения+"
        |"+УсловиеИтогов;
    Иначе
        ТекстЗапроса = ТекстЗапроса + "
        |select convert(datetime, :Период) period " + СелектОбщий + "
        |from (
        |";
        Если ТипРегистра = "Остатки" Тогда
            ТекстЗапроса = ТекстЗапроса + "
            |select " + ИнсертИтог + "
            |from $РегистрИтоги." + ВыбРегистр + " (nolock)
            |where period = :ПредыдущийПериод
            |
            |union all
            |";
        КонецЕсли;
        ТекстЗапроса = ТекстЗапроса + "
        |select " + Измерения + Селект3Ресурсов + "
        |from $Регистр." + ВыбРегистр + " ra (nolock)
        |inner join _1sjourn s (nolock) on s.iddoc = ra.iddoc
        |where s.date_time_iddoc < :ДатаДок
        |and s.date_time_iddoc > :Период
        |
        |) Общая
        |group by " + Измерения + "
        |"+УсловиеИтоговОбщий;
    КонецЕсли;
    ТекстЗапроса = ТекстЗапроса + "
    |
    |return(0)
    |";
    
    
    ЗапросСкл.Выполнить("drop procedure #ПересчетИтоговРегистра");
    ЗапросСкл.Закрыть();
    Для цДата = НачалоПериода По КонецПериода Цикл
        Если ТипРегистра = "Остатки" Тогда
            КонецТекущегоПериода = мета.ПолучитьКонПериода(цДата);
        Иначе
            КонецТекущегоПериода = мета.ПолучитьКонПериодаДляРег(ВыбРегистр, цДата);
        КонецЕсли;
        Состояние("Регистр: " + ВыбРегистр + ". Расчет итогов. Период: " + цДата + " - " + КонецТекущегоПериода);
        //==============================================================================================================
        ЗапросСкл.УстановитьТекстовыйПараметр("Период", цДата);
        Если ТипРегистра = "Остатки" Тогда
            ЗапросСкл.УстановитьТекстовыйПараметр("ПредыдущийПериод", мета.ПолучитьНачПериода(цДата - 1));
            ЗапросСкл.УстановитьТекстовыйПараметр("ДатаДок", мета.ПолучитьКонПериода(цДата) + 1);
        Иначе
            ЗапросСкл.УстановитьТекстовыйПараметр("ПредыдущийПериод", мета.ПолучитьНачПериодаДляРег(ВыбРегистр, цДата - 1));
            ЗапросСкл.УстановитьТекстовыйПараметр("ДатаДок", мета.ПолучитьКонПериодаДляРег(ВыбРегистр, цДата) + 1);
        КонецЕсли;
        ЗапросСкл.Выполнить(ТекстЗапроса);
        Если ЗапросСкл.ПолучитьОписаниеОшибки() <> "" Тогда
            Сообщить(ЗапросСкл.ПолучитьОписаниеОшибки(), "!!!");
            КвоОшибок = КвоОшибок + 1;
            Прервать;
        КонецЕсли;
        ЗапросСкл.Закрыть();
        ЗапросСкл.Выполнить("exec #ПересчетИтоговРегистра");
        Если ЗапросСкл.ПолучитьОписаниеОшибки() <> "" Тогда
            Сообщить(ЗапросСкл.ПолучитьОписаниеОшибки(), "!!!");
            КвоОшибок = КвоОшибок + 1;
            Прервать;
        КонецЕсли;
        ЗапросСкл.Закрыть();
        ЗапросСкл.Выполнить("drop procedure #ПересчетИтоговРегистра");
        Если ЗапросСкл.ПолучитьОписаниеОшибки() <> "" Тогда
            Сообщить(ЗапросСкл.ПолучитьОписаниеОшибки(), "!!!");
            КвоОшибок = КвоОшибок + 1;
            Прервать;
        КонецЕсли;
        ЗапросСкл.Закрыть();
        ДобавитьВПротокол("Рассчитаны итоги за период: " + цДата + " - " + КонецТекущегоПериода);
        цДата = КонецТекущегоПериода;
    КонецЦикла;
    Если КвоОшибок = 0 Тогда
        ЗафиксироватьТранзакцию();
    Иначе
        ОтменитьТранзакцию();
    КонецЕсли;
    Возврат КвоОшибок;
КонецФункции // ПересчитатьРегистр
2 + 2 = 3.9999999999999999999999999999999...