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

24.03.21

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

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

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

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

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

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

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

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

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

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

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

 

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

См. также

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

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7451    bayselonarrend    20    

154

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

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

13.03.2024    5943    dsdred    16    

80

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

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

24.01.2024    17672    YA_418728146    26    

71

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

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

11.12.2023    11224    dsdred    44    

130

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

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

06.10.2023    23761    SeiOkami    48    

135

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

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

14.09.2023    18831    human_new    27    

80

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

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

28.08.2023    14732    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. triviumfan 97 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 97 29.03.21 14:29 Сейчас в теме
(2) начал вчитываться и заметил

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

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

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

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