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

24.03.21

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

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

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

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

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

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

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

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

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

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

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

 

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

См. также

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

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    6022    bayselonarrend    126    

59

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

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    7804    dsdred    57    

99

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

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

23.06.2024    11522    bayselonarrend    21    

162

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

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

13.03.2024    7854    dsdred    18    

82

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

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

24.01.2024    27075    YA_418728146    33    

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

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

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

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

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