Проверка изменения полей регистра сведений ПередЗаписью, кеширование средствами БСП

builin 89 1 3 3

Проверка изменения полей регистра сведений ПередЗаписью с использованием кеширования исходных данных через БСП (БуферОбмена). Сложность в том, что при изменении данных регистра сведений сперва происходит запись пустого набора данных и когда записывается итоговый набор данных, прежние данные запросом уже не получить. Данный код кеширует прежние данные в первой итерации во временном хранилище и передает его адрес второй итерации через параметр сеанса (встроенными средствами БСП).

Блог Жёлтая тетрадь 📒 http://t.me/yellow_pad

Процедура ПередЗаписью(Отказ, Замещение)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли; 
	
	ИмяИсточника = ОбщегоНазначения.КонтрольнаяСуммаСтрокой(Новый Структура("Пользователь, Отборы", ИмяПользователя(), Отбор.Задача.Значение));
	
	Если ЭтотОбъект.Количество() = 0 Тогда
		
		ОбщегоНазначения.СкопироватьВБуферОбмена(ПолучитьНачальныеДанные(Отбор.Задача.Значение), ИмяИсточника);
		
	Иначе
		
		БуферОбмена = ОбщегоНазначения.СтрокиИзБуфераОбмена();
		Если БуферОбмена.Источник = ИмяИсточника Тогда // новая запись
			НачальныеДанные = БуферОбмена.Данные;
		Иначе
			НачальныеДанные = Неопределено;
		КонецЕсли; 
		
		ТекущаяДата = ТекущаяДата();
		
		Для каждого Запись Из ЭтотОбъект Цикл
			
			ТекНачальныеДанные = ?(НачальныеДанные = Неопределено, Неопределено, НачальныеДанные.Найти(Запись.Задача, "Задача"));
			
			Если ТекНачальныеДанные = Неопределено Тогда // запись создана
				Запись.ДатаСоздания = ТекущаяДата;
				Продолжить;
			КонецЕсли; 
			
			Если ЗначениеЗаполнено(Запись.Ссылка)
				И НЕ Запись.Ссылка = ТекНачальныеДанные.Ссылка Тогда // получена новая ссылка
				Запись.ДатаПолученияСсылки = ТекущаяДата;
			КонецЕсли; 
			
		КонецЦикла; 
		
		// очистим буфер обмена
		ОбщегоНазначения.СкопироватьВБуферОбмена(Неопределено, ИмяИсточника);
		
	КонецЕсли; 
	
КонецПроцедуры

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

Похожие публикации

ПроверитьДатуЗапретаИзмененияПередЗаписьюНабораЗаписейРегистраБухгалтерии (БСП)

ПроверитьДатуЗапретаИзмененияПередЗаписьюНабораЗаписейРегистраРасчета (БСП)

ПроверитьДатуЗапретаИзмененияПередЗаписьюНабораЗаписей (БСП)

ПроверитьДатуЗапретаИзмененияПередЗаписью (БСП)

ПроверитьДатуЗапретаИзмененияПередЗаписьюДокумента (БСП)

Модератору