|
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 Тогда ЗафиксироватьТранзакцию(); Иначе ОтменитьТранзакцию(); КонецЕсли; Возврат КвоОшибок; КонецФункции // ПересчитатьРегистр |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |