Новая упрощенная процедура перерасчета записей регистров расчета (пример)

24.03.21

Разработка - Механизмы платформы 1С

В данной публикации описано назначение и приведен пример процедуры перерасчета записей регистра перерасчета с сортировкой на уровне набора записей. Предназначена для лиц, готовящихся к экзамену "1С Специалист по платформе" и преподавателей, занимающихся подготовкой Специалистов.

Не секрет, что создание процедуры перерасчета записей регистров расчета она из самых сложных задач по всей теме "Сложные периодические расчеты". Казалось бы, нет ничего сложного: получить набор записей того регистра расчета, записи которого следует пересчитать, сделать отбор по нужным регистраторам (их получить можно запросом к таблице перерасчета соответствующего регистра) и передать полученный набор записей в основную процедуру расчета. Но... При этом теряется основной смысл перерасчета: вместо того, чтобы пересчитать только те записи, которые действительно требуют перерасчета и которые записаны в таблицу перерасчета, будет произведен перерасчет по ВСЕМ записям документа. Конечно, можно пойти дальше и "доработать" обе процедуры (и расчета, и перерасчета) кодом, который будет производить "фильтрацию" только по нужным записям. Примеры таких процедур можно увидеть в различной литературе по  1С и на разных курсах по подготовке специалистов. Но такой код становится достаточно объемным и сложным для изучения.

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

Мне удалось сделать процедуру перерасчета с сортировкой на уровне набора записей. В общий модуль (процедуру расчета) передается набор только тех записей, которые требуют перерасчета. Остальные записи (которые не надо перерассчитывать) впоследствии "дозаписываются" к перерассчитанным. Сама процедура расчета (в общем модуле) остается НЕИЗМЕННОЙ (совершенно одинаковой: используются перерасчеты или нет) и в ней ничего менять не нужно! Проверил - все работает. По-моему все красиво! И объем кода минимальный.

Привожу пример процедуры перерасчета для регистра расчета "ДополнительныеНачисления" (релиз платформы 8.3.18.1128):

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

		НачатьТранзакцию();
		
		Пока ВыборкаРегистратор.Следующий() Цикл
			ДополнительныеНачисления = РегистрыРасчета.ДополнительныеНачисления.СоздатьНаборЗаписей();
			ДополнительныеНачисления.Отбор.Регистратор.Установить(ВыборкаРегистратор.Регистратор);
			ДополнительныеНачисления.Прочитать();
			ТЗНеРассчитываемые = ДополнительныеНачисления.Выгрузить();
			ТЗПерерасчет = Новый ТаблицаЗначений;
			МассивСтрок = Новый Массив;
			
			ВыборкаДетальныеЗаписи = ВыборкаРегистратор.Выбрать();
			
			Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
				НайденнаяСтрока = ТЗНеРассчитываемые.Найти(ВыборкаДетальныеЗаписи.НомерСтроки, "НомерСтроки");
				МассивСтрок.Добавить(НайденнаяСтрока);
			КонецЦикла;
			
			ТЗПерерасчет = ТЗНеРассчитываемые.Скопировать(МассивСтрок);
			ТЗПерерасчет.Сортировать("НомерСтроки");
			ДополнительныеНачисления.Загрузить(ТЗПерерасчет);
			ДополнительныеНачисления.Записать();
			Расчеты.РассчитатьДополнительныеНачисления(ВыборкаРегистратор.Регистратор, ДополнительныеНачисления, НачалоМесяца(ВыборкаРегистратор.Дата));
			
			Для каждого Строка Из МассивСтрок Цикл
				ТЗНеРассчитываемые.Удалить(Строка);
			КонецЦикла; 
			ДополнительныеНачисления.Загрузить(ТЗНеРассчитываемые);
			ДополнительныеНачисления.Записать(Ложь);
		КонецЦикла;

		Если ТранзакцияАктивна() Тогда
			ЗафиксироватьТранзакцию();
		КонецЕсли;

	КонецЕсли; 
	
КонецПроцедуры

&НаКлиенте
Процедура Перессчитать(Команда)
	ПерессчитатьНаСервере();
КонецПроцедуры

 

расчет перерасчет процедура

См. также

Сервисы интеграции без Шины и интеграции

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    3377    dsdred    16    

65

Как готовить и есть массивы

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    7898    YA_418728146    25    

69

Планы обмена VS История данных

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    8070    dsdred    44    

117

1С-ная магия

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    20352    SeiOkami    46    

125

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    14296    human_new    27    

77

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    10690    YA_418728146    7    

149

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    7119    sebekerga    54    

99
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. triviumfan 94 29.03.21 09:52 Сейчас в теме
Статья не для новичков и имеет высокий порог вхождения.
Тут можно почитать как устроено: https://its.1c.ru/db/pubapplied#content:289:hdoc
Или вообще всю 5 главу книги.
2. galexmvs 4 29.03.21 11:10 Сейчас в теме
Да, данная статья не для новичков.
Статья предназначена для лиц, которые уже заканчивают подготовку к экзамену "1С: Специалист по платформе" и уже имеют определенный багаж знаний по работе и использованию механизмов сложных периодических расчетов, прорешали целый ряд задач. Также данная статья будет интересна преподавателям, занимающимся подготовкой специалистов.
Хочется отметить, что здесь описана не конкретная реализация процедуры перерасчета, а пример альтернативного подхода к ее реализации.
3. triviumfan 94 29.03.21 14:29 Сейчас в теме
(2) начал вчитываться и заметил

ОбъектПерерасчета = ВыборкаРегистратор.Регистратор.ПолучитьОбъект();
ДополнительныеНачисления = ОбъектПерерасчета.Движения.ДополнительныеНачисления;

Спецу по платформе так позволительно?:)
4. galexmvs 4 29.03.21 16:11 Сейчас в теме
(3)Подобный способ получения набора записей показал один из слушателей курса П.С.Белоусова.
Можно по-другому:
ДополнительныеНачисления = РегистрыРасчета.ДополнительныеНачисления.СоздатьНаборЗаписей();
	    ДополнительныеНачисления.Отбор.Регистратор.Установить(ВыборкаРегистратор.Регистратор);
	    ДополнительныеНачисления.Прочитать();

Такой способ получения набора записей показывают Курсы-по-1С-РФ
Так даже, наверное, оптимальнее.
Исправил в коде.

Но, в любом случае, не претендую на истину в последней инстанции. Готов выслушать критические замечания. И в результате совместного обсуждения получить оптимальный код.
А Вы как предлагаете?
triviumfan; +1 Ответить
5. triviumfan 94 29.03.21 17:00 Сейчас в теме
(4) либо как вы исправили, либо запросом. Но получать документобъект как-то не по-православному.
Оставьте свое сообщение