Реализация механизма отслеживания изменения цен — это классическая задача при разработке управленческого учета. Однако, как показывает практика, попытка реализовать это через стандартную процедуру ПриЗаписиНаСервере в модуле формы объекта может привести к ряду серьезных проблем. Давайте разберем, почему выбранный вами подход требует доработки и как сделать его надежным.
Рассмотрим, почему использование кода в событии ПриЗаписиНаСервере может оказаться неэффективным:
ТекущаяДата() вы рискуете столкнуться с тем, что несколько правок цены за один день будут «затирать» друг друга или вызывать ошибки уникальности, так как период регистра — день.Ваш текущий подход к записи набора записей имеет архитектурный изъян. Рассмотрим пример, который вы привели:
НаборЗаписей = РегистрыСведений.ДинамикаЦенНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(ТекущийОбъект.Ссылка);
НаборЗаписей.Отбор.Период.Установить(ТекущаяДата());
НовЗапись = НаборЗаписей.Добавить();
// ... заполнение реквизитов ...
НаборЗаписей.Записать(Истина);
Здесь важно понимать, что ТекущаяДата() возвращает значение без учета миллисекунд (зависит от настроек системы). Если запись происходит часто, система может пытаться переписать существующую запись. Кроме того, использование ПриЗаписиНаСервере — это «интерфейсный» подход. Для надежного учета необходимо использовать Подписки на события.
Чтобы данные попадали в регистр при любом изменении цены — будь то ручная правка или групповая обработка — необходимо перенести логику в общий модуль через механизм ПодпискиНаСобытия.
Шаг 1: Создание подписки. Создайте подписку на событие ПриЗаписи для объекта СправочникОбъект.Номенклатура.
Шаг 2: Реализация логики в общем модуле. В процедуре-обработчике подписки выполните следующие действия:
ТекущаяДата() используйте ТекущаяДатаСеанса(), а лучше — фиксируйте время записи транзакции.Не всегда создание отдельного регистра — лучшее решение. Рассмотрим, что еще можно предпринять:
Если цены в вашей системе меняются специальными документами, такими как УстановкаЦенНоменклатуры, то регистр сведений должен заполняться именно при проведении этого документа. Это гарантирует, что каждая запись имеет строго определенную дату и контекст (кто установил, на основании чего).
Если ваша задача — просто видеть, кто и когда изменил цену, возможно, вам не нужен отдельный регистр. Включите встроенное Версионирование объектов в 1С. Система сама будет хранить историю состояний объекта. Вы сможете в любой момент сравнить текущую версию с предыдущей через стандартные отчеты.
Если вы все же решили использовать регистр, обязательно установите периодичность В пределах секунды. Это стандарт индустрии для учетных систем. Получить актуальную цену на любую дату можно будет с помощью метода СрезПоследних.
Итоговая рекомендация: откажитесь от записи данных в модуле формы. Создайте Подписку на событие, используйте проверку на изменение данных перед записью и обеспечьте точность периода до секунды. Это превратит ваш инструмент из «ошибочного» решения в надежный механизм для аналитики в СКД.