Рейтинг:  0 / 5

Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

Добрый день.

Сегодня мы поговрим о таком новшестве платформы 8.3, как временная ссылка на объект. Для чего она нужна? Как ей пользоваться? Как правильно с ней работать?

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

Вы спросите: Что за глупость? Такие операции всегда выполняются при наличии конкретного объекта, который может быть регистратором.

Я отвечу: Да, вы правы, у нас всегда есть наш объект, но:

 

1. Он может быть еще не записан в БД. Помните раньше в ЗУП перед заполненим/расчетом нас всегда просили записать документ? Теперь в ЗУП 3.0 нас об этом не просят.

2. Набор нашего объекта уже может быть заполнен, т.к. документ уже проведен. Распроводить документ при перезаполнении - плохой тон, не во всех случаях при его обратном проведении мы вернем его в исходное состояние.

Итак задача стала  ясна. Мы хотим временно записать данные в базу, чтобы обрабатывать их запросом, но при этом не использовать наш объект в качестве регистратора.

Делается это очень легко:

набор = РегистрыНакопления.РабочееВремяСотрудников.СоздатьНаборЗаписей();
ВременнаяСсылка = Документы.ТабельУчетаРабочегоВремени.ПолучитьСсылку();
набор.Отбор.регистратор.Значение = ВременнаяСсылка;
//... добавляем записи в набор
набор.Записать();

Теперь наши записи будут видны для запроса. А переменную "ВременнаяСсылка" мы сможем использовать в запросах как параметр.

Опасность и борьба с ней:

Опасность одна, и её можно увидеть в отладчике посмотрев на набор записей, после заполнения:

Объект не найден в наборе записей регистра

<объект не обнаружен> - это злое зло. По сути мы рушим ссылочную целостность базы данных.

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

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

Теперь о том, когда это реально необходимо:

Использование этих приемов имеет минус - перед выполнением расчета мы пишем временные  данные в БД, а потом удаляем их оттуда. Это плохо. Но зато при обращении к виртуальным таблицам (обороты, остатки и обороты, фактический период действия) мы получаем сразу хорошие данные. Для остатков и оборотов считаю это глупостью, т.к. проще передать в запрос таблицу значений и скорректировать данные виртуальной таблицы объединением с ней. А вот самому в запросе скорректировать фактические периоды действия у регистра расчета - задача не для слабонервных, тут реально проще записать данные в БД и получить все готовенькое. По этой причине такой метод мы встречаем в основном в зарплатных программах.

Всем спасибо за внимание.

Вложения
ATTACH_DOWNLOAD_THIS_FILE_SПримерРаботыСВременнойСсылкой.epf[пример для изучения в режиме отладчика, разработан для конфигурации 1С ЗУП 3.0]6 kB

Авторизуйтесь пожалуйста