Свертка Регистров Сведений

1. Вадим Хорошев (hvs) 27.12.16 21:49 Сейчас в теме
Здравствуйте, на днях разбирался со сверткой баз, и, скачав типовую обработку по свертке, при формировании начальных остатков по регистру сведений наткнулся на вот такой код:

Запрос = Новый Запрос();
	Запрос.Текст = "ВЫБРАТЬ
			|	ЛОЖЬ КАК Активность,
			|	&ПериодЗаписи КАК Период,";
	Для Каждого ТекИзмерение Из ТекРег.Измерения Цикл
		Запрос.Текст = Запрос.Текст + "
			|	ТабРег." + ТекИзмерение.Имя + ",";
			
	КонецЦикла;
	
	Для Каждого ТекРесурс Из ТекРег.Ресурсы Цикл
		Запрос.Текст = Запрос.Текст + "
			|	ТабРег." + ТекРесурс.Имя + " КАК " + ТекРесурс.Имя + ",";
			
	КонецЦикла;
		
	Для Каждого ТекРеквизит Из ТекРег.Реквизиты Цикл
		Запрос.Текст = Запрос.Текст + "
			|	ТабРег." + ТекРеквизит.Имя + " КАК " + ТекРеквизит.Имя + ",";
			
	КонецЦикла;
	
	Запрос.Текст = Лев(Запрос.Текст, СтрДлина(Запрос.Текст)-1);
	Запрос.Текст = Запрос.Текст + "
				   |ИЗ
				   |	РегистрСведений." + ТекРег.Имя + ".СрезПоследних(&ДатаОст, ) КАК ТабРег";
	Если (НЕ ТекРег.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.ПозицияРегистратора) Тогда			   
		Запрос.Текст = Запрос.Текст + "				   
					   |			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений." + ТекРег.Имя + ".СрезПервых(&ДатаОст, Период = НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаОст, ДЕНЬ, 1), ДЕНЬ)) КАК ТабРегСрезПервых
					   |				ПО ИСТИНА";
		Для Каждого ТекИзмерение Из ТекРег.Измерения Цикл
			Запрос.Текст = Запрос.Текст + "
					   |				И ТабРег." + ТекИзмерение.Имя + " = ТабРегСрезПервых." + ТекИзмерение.Имя;
		КонецЦикла;
				
		Запрос.Текст = Запрос.Текст + "
					   |ГДЕ
					   |	ТабРегСрезПервых.Период ЕСТЬ NULL";
					
	КонецЕсли;				   
	
	Запрос.УстановитьПараметр("ДатаОст", ДатаСвертки);
	Запрос.УстановитьПараметр("ПериодЗаписи", НачалоДня(ДатаСвертки+60*60*24));
...Показать Скрыть


Если я ставлю дату свертки, к примеру 01.07.2016 23:59:59, то "ПериодЗаписи" равен 02.07.2016 0:00:00, это понятно, вопрос по второй части запроса, если периодичность регистра сведений не равна позиции регистратора

сам вопрос:
Для чего делается это соединение и условие "ТабРегСрезПервых.Период ЕСТЬ NULL" ?
разве оно не бессмысленно?

Получается, мы берем записи среза последних только те, которых нет в срезе первых, так?
т.е. например, есть цена номенклатуры, мы берем по ней последнюю цену, но только если по ней следующим документом цена не переназначена...
а если не делать это соединение? мы просто возьмем последнюю цену и все... а дальше если по ней установлена новая цена, то при формировании, например, отчета, попадет она, а не та, которую я оставил при свертке... или я что-то не так понимаю?
собственно вопрос именно в этом, нужно ли делать это соединение? и причем только когда периодичность не равна позиции регистратора...
Найденные решения
11. Oleg Space (spacecraft) 28.12.16 09:47 Сейчас в теме
(10)
Конечно есть, я вам его привел в первом посте. Для всех регистров, подчиненных регистратору там берется срез последних. Только вот потом если периодичность не равна "По позиции регистратора" то делается соединение со срезом первых.

Как раз в первом посте не указано, что берутся только регистры подчиненные регистратору. Отсюда и путаница произошла.

Да, именно про это я и говорю, что если периодичность секунда, то в этом случае тоже нет смысла брать записи, т.к. на следующую секунду / день (02.07.2016 0:00:00) уже может быть другая цена.

Нужно добавить условие по периодичности "В пределах дня" и "В пределах секунды".

Как раз наоборот. Только с периодичностью по позициям регистратора берутся записи все, без условия и соединения.
А "Секунда", "День" и т.д. проверяются и отсекаются, если есть новые записи на начало следующего дня.
Почему именно "по позициям регистратора" не проверяются... тут сложно сказать, чем руководствовались программисты.
Единственно, чем такой период (по позициям регистратора) отличается от остальных, это возможностью в одном периоде (в пределах секунды) иметь сразу несколько записей разными документами.
Остальные ответы
2. Oleg Space (spacecraft) 27.12.16 22:10 Сейчас в теме
(1)
Получается, мы берем записи среза последних только те, которых нет в срезе первых, так?
т.е. например, есть цена номенклатуры, мы берем по ней последнюю цену, но только если по ней следующим документом цена не переназначена...

Смотрим второй параметр виртуальной таблицы среза первых.
             |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений." + ТекРег.Имя + ".СрезПервых(&ДатаОст, Период = НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаОст, ДЕНЬ, 1), ДЕНЬ)) КАК ТабРегСрезПервых
                       |                ПО ИСТИНА";

В итоге получается:
"есть цена номенклатуры, мы берем по ней последнюю цену, но только если по ней следующим на следующий день документом (только не регистратором) цена не переназначена... "
Просто нет смысла оставлять старую цену, если на начало рабочего периода после сверки уже есть другая цена.
3. Вадим Хорошев (hvs) 27.12.16 22:18 Сейчас в теме
(2) т.е. получается, что это сделано только из-за соображения "логичности"? т.е. если я не буду делать это соединение, то у меня так же будет правильный остаток, просто значение цены будет сразу затерто новым значением, верно?
тогда вопрос вот в чем... если у меня периодичность регистра день, или, например, секунда... разве в этом случае у меня она не будет так же затерта новым значением? т.е. тогда это соединение нужно делать не только когда периодичность регистра НЕ равна периодичности регистратора, а нужно делать его всегда... если следовать логике... верно?

И если делать так, то получается если я буду брать цену на дату свертки 01.07.2016 23:59:59, то у меня ее не будет... она будет только на 02.07.2016 0:00:00... это же не правильно...
4. Oleg Space (spacecraft) 27.12.16 22:56 Сейчас в теме
(3)
т.е. получается, что это сделано только из-за соображения "логичности"?

В общем-то да. Если в будущем делать запрос с отбором срез первых на дату до ведения учета (по-умолчанию), чтоб не выдавались не существующие значения в периоде ведения учета.
тогда это соединение нужно делать не только когда периодичность регистра НЕ равна периодичности регистратора, а нужно делать его всегда...

Если есть подчинение регистратору, то при удалении старых документов, такие записи сами удалятся.
И если делать так, то получается если я буду брать цену на дату свертки 01.07.2016 23:59:59, то у меня ее не будет... она будет только на 02.07.2016 0:00:00... это же не правильно...

В рабочем запросе такого происходить не должно. Это период не в периоде учета. Остатки вводятся на конец предыдущей даты, но учет считается (в том числе и значения) с начала учета периода.
Если не делать сверку, а просто вводить начальные остатки, так оно и будет.
Если необходимы данные предыдущего периода, то как правило это документы (обычно документы по НДС). И регистры с подчинением регистратору. И в данном случае они не затрагиваются.

И Цены номенклатуры, как правило, хранятся в регистре с подчинением регистратору.
5. Вадим Хорошев (hvs) 27.12.16 23:13 Сейчас в теме
(4)
И Цены номенклатуры, как правило, хранятся в регистре с подчинением регистратору.

Это все так и есть, правильно

Если есть подчинение регистратору, то при удалении старых документов, такие записи сами удалятся.

Это я понимаю, вы немного не правильно трактовали мое суждение... я говорю не о режиме записи регистра "Независимый" и "Подчинение регистратору" а о периодичности регистра... условие соединения делается когда периодичность НЕ равна периодичности регистратора (а такую можно установить только, если режим записи регистра "Подчинение регистратору") так вот тот же самый вопрос, если у меня периодичность секунда, то 01.07.2016 23:59:59 - будет одна цена а уже 02.07.2016 0:00:00 - другая цена... но в этом случае соединения не будет, так как условие только:
Если (НЕ ТекРег.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.ПозицияРегистратора) Тогда


т.е. программисты выделили в это условие только конкретную периодичность регистра... вопрос зачем? Если следовать вашей логике, то это условие нужно делать и, как минимум, для периодичности "В пределах дня" и "В пределах секунды", а не только "По позиции регистратора"...

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

Так это входит в ведение учета: я не ввожу остатки в новую базу... я делаю свертку текущей базы. Т.е. эта цена была, и по ней отгружался товар. Я лишь сворачиваю данные...
6. Oleg Space (spacecraft) 27.12.16 23:31 Сейчас в теме
(5) не путайте понятие "Периодичность регистра" и периодичность как параметр виртуальной таблицы регистра. Первый он всегда только один. Тот, что указан в свойствах регистра.
Если (НЕ ТекРег.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.ПозицияРегистратора) Тогда

этим фрагментом кода отсекаются все регистры, с установленным свойством регистра "Подчинение регистратору".
Уже далее в параметрах виртуальной таблицы СрезаПервых регистра (тех регистров, которые не "Подчинение регистратору") указывается отбор по Периоду на Начало дня периода ведения учета.

Найдите хорошего бухгалтера, чтоб объяснил, что такое Сверка.
К примеру, хотим делать сверку на 01.01.2016. Определяем все данные на 01.01.2016 00:00:00.
После этого все эти данные вводим в программу на конец дня предшествующий началу выбранного периода.
В нашем случае на 31.12.2015 23:59:59

Даже и не знаю, что тут не понятно?
7. Вадим Хорошев (hvs) 27.12.16 23:51 Сейчас в теме
(6)
не путайте понятие "Периодичность регистра" и периодичность как параметр виртуальной таблицы регистра. Первый он всегда только один. Тот, что указан в свойствах регистра.

Я знаю что это такое и не путаю эти понятия, не представляю из-за чего вы сделали такой вывод...

этим фрагментом кода отсекаются все регистры, с установленным свойством регистра "Подчинение регистратору".
Уже далее в параметрах виртуальной таблицы СрезаПервых регистра (тех регистров, которые не "Подчинение регистратору") указывается отбор по Периоду на Начало дня периода ведения учета.

Отсечение регистров, происходит перед запросом, я не привел этот участок кода, т.к. писал не про то, какие регистры участвуют в сверТке (а не в сверке, не путайте, пожалуйста, эти два понятия) код, который отсекает регистры, не подчиненные регистратору отсекаются тут:
ТекРег = Метаданные.РегистрыСведений.Найти(СтрокаСписка.ОбъектМД);
		
	Если (НЕ ТекРег.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору) Тогда
		Возврат;
		
	КонецЕсли;
...Показать Скрыть


Найдите хорошего бухгалтера, чтоб объяснил, что такое Сверка.
К примеру, хотим делать сверку на 01.01.2016. Определяем все данные на 01.01.2016 00:00:00.
После этого все эти данные вводим в программу на конец дня предшествующий началу выбранного периода.
В нашем случае на 31.12.2015 23:59:59

Даже и не знаю, что тут не понятно?

Вы видимо не можете ответить на мой вопрос, в виду не понимания того, о чем я спрашиваю...
8. Oleg Space (spacecraft) 28.12.16 01:24 Сейчас в теме
(7)
Я знаю что это такое и не путаю эти понятия, не представляю из-за чего вы сделали такой вывод...

ок. читаем в (5) :
т.е. программисты выделили в это условие только конкретную периодичность регистра... вопрос зачем? Если следовать вашей логике, то это условие нужно делать и, как минимум, для периодичности "В пределах дня" и "В пределах секунды", а не только "По позиции регистратора"...

А теперь открывает свойства регистра сведений, который подчинен регистратору. Находим там свойство "Периодичность". Это как раз и есть о чем я говорил. И это отсекается в коде, который приведен в (6).
Тут возможно я не правильно понял Вас. Имели ввиду, что проверка нужна на регистр сведений с режимом записи по регистратору, но с Периодичностью секунда?

(5)
Так это входит в ведение учета: я не ввожу остатки в новую базу... я делаю свертку текущей базы. Т.е. эта цена была, и по ней отгружался товар. Я лишь сворачиваю данные...

Свертка базы на выходе должна получиться аналогично введением остатков в новую базу.


Единственная избыточность тут со второй проверкой на периодичность.
Если в начале отсекаются все регистры с режимом записи по регистратору, то вторая проверка на Периодичность просто лишняя. Возможно первую проверку добавили позднее.
9. Oleg Space (spacecraft) 28.12.16 02:32 Сейчас в теме
(8). Перечитал код в (6). Нет избыточности. Все правильно.
(7). Значит в итоге есть код, где запросом выбираются данные из регистров сведений, которые подчинены регистратору, но с Периодичностью не "по регистратору".
Не знаю, что там с этим дальше делается.

10. Вадим Хорошев (hvs) 28.12.16 09:17 Сейчас в теме
(9)
(8). Перечитал код в (6). Нет избыточности. Все правильно.
(7). Значит в итоге есть код, где запросом выбираются данные из регистров сведений, которые подчинены регистратору, но с Периодичностью не "по регистратору".

Конечно есть, я вам его привел в первом посте. Для всех регистров, подчиненных регистратору там берется срез последних. Только вот потом если периодичность не равна "По позиции регистратора" то делается соединение со срезом первых.

А теперь открывает свойства регистра сведений, который подчинен регистратору. Находим там свойство "Периодичность". Это как раз и есть о чем я говорил.

Так я про это и говорю, наконец вы поняли что я говорю именно об этом свойстве, а не о режиме записи (если посмотреть чуть ниже то найдете это свойство)

И это отсекается в коде, который приведен в (6).

Что это? отсекаются регистры которые не подчинены регистратору? это делается выше, и явным образом, обращаясь к свойству РежимЗаписи

Не знаю, что там с этим дальше делается

Дальше идет выполнение запроса и ввод документов, больше никаких проверок / условий - нет.

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

Тут возможно я не правильно понял Вас. Имели ввиду, что проверка нужна на регистр сведений с режимом записи по регистратору, но с Периодичностью секунда?


Да, именно про это я и говорю, что если периодичность секунда, то в этом случае тоже нет смысла брать записи, т.к. на следующую секунду / день (02.07.2016 0:00:00) уже может быть другая цена. Соответственно в условие
Если (НЕ ТекРег.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.ПозицияРегистратора) Тогда

Нужно добавить условие по периодичности "В пределах дня" и "В пределах секунды". Это если исходить из вашей логики, что данное соединение делается только из соображения логичности (незачем вводить цену номенклатуры, если на начало учета после свертки базы уже стоит другая цена)
11. Oleg Space (spacecraft) 28.12.16 09:47 Сейчас в теме
(10)
Конечно есть, я вам его привел в первом посте. Для всех регистров, подчиненных регистратору там берется срез последних. Только вот потом если периодичность не равна "По позиции регистратора" то делается соединение со срезом первых.

Как раз в первом посте не указано, что берутся только регистры подчиненные регистратору. Отсюда и путаница произошла.

Да, именно про это я и говорю, что если периодичность секунда, то в этом случае тоже нет смысла брать записи, т.к. на следующую секунду / день (02.07.2016 0:00:00) уже может быть другая цена.

Нужно добавить условие по периодичности "В пределах дня" и "В пределах секунды".

Как раз наоборот. Только с периодичностью по позициям регистратора берутся записи все, без условия и соединения.
А "Секунда", "День" и т.д. проверяются и отсекаются, если есть новые записи на начало следующего дня.
Почему именно "по позициям регистратора" не проверяются... тут сложно сказать, чем руководствовались программисты.
Единственно, чем такой период (по позициям регистратора) отличается от остальных, это возможностью в одном периоде (в пределах секунды) иметь сразу несколько записей разными документами.
12. Вадим Хорошев (hvs) 28.12.16 10:18 Сейчас в теме
(11)
Как раз наоборот. Только с периодичностью по позициям регистратора берутся записи все, без условия и соединения.

О да... видимо, свертка 16 баз меня доканала... Действительно, я только после этого сообщения осознал что проверка делается как раз на все остальные регистры, у которых периодичность не равна по позиции регистратора, а по позиции регистратора берутся все записи. Я правильно читал условие но не правильно его трактовал. Сделано как раз так, как я и думал сделать, но т.к. я не правильно трактовал условие то и получился логичный вопрос, да еще и вас запутал...

Единственно, чем такой период (по позициям регистратора) отличается от остальных, это возможностью в одном периоде (в пределах секунды) иметь сразу несколько записей разными документами.

А "Секунда", "День" и т.д. проверяются и отсекаются, если есть новые записи на начало следующего дня.

Все верно, и условие написано как раз грамотно, т.к. если периодичность регистра не по позиции регистратора и на следующую секунду / день и тд... введен документ, то при записи моего документа остатка возникнет не уникальная запись (в пределах секунды / дня и тд....) и документ попросту не запишется (вывалится ошибка) а если по позиции регистратора, то такое как раз возможно, т.к. документы будут разные.

Спасибо, что помогли осознать, видимо, мне у меня в голове уже НГ начался :)
И извините за глупый вопрос и что запутал вас...
13. Oleg Space (spacecraft) 28.12.16 10:24 Сейчас в теме
14. Вадим Хорошев (hvs) 28.12.16 10:25 Сейчас в теме
Оставьте свое сообщение