Как правильно реализовать автоматическую фиксацию динамики цен номенклатуры в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

Реализация механизма отслеживания изменения цен — это классическая задача при разработке управленческого учета. Однако, как показывает практика, попытка реализовать это через стандартную процедуру ПриЗаписиНаСервере в модуле формы объекта может привести к ряду серьезных проблем. Давайте разберем, почему выбранный вами подход требует доработки и как сделать его надежным.

Основные ошибки при прямой записи в регистр из формы

Рассмотрим, почему использование кода в событии ПриЗаписиНаСервере может оказаться неэффективным:

  1. Неполнота данных: Если вы меняете цену программно (например, через загрузку данных из Excel или групповую обработку), код, написанный в форме, просто не выполнится.
  2. Проблемы с производительностью: При массовом изменении номенклатуры пользователь, открывающий карточки товаров, столкнется с тем, что система будет принудительно записывать данные в регистр при каждом нажатии кнопки, что может замедлить работу.
  3. Ошибки конкурентного доступа: При записи с использованием ТекущаяДата() вы рискуете столкнуться с тем, что несколько правок цены за один день будут «затирать» друг друга или вызывать ошибки уникальности, так как период регистра — день.

Разбор критических замечаний к коду

Ваш текущий подход к записи набора записей имеет архитектурный изъян. Рассмотрим пример, который вы привели:


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

Здесь важно понимать, что ТекущаяДата() возвращает значение без учета миллисекунд (зависит от настроек системы). Если запись происходит часто, система может пытаться переписать существующую запись. Кроме того, использование ПриЗаписиНаСервере — это «интерфейсный» подход. Для надежного учета необходимо использовать Подписки на события.

Рекомендуемый способ: использование Подписки на события

Чтобы данные попадали в регистр при любом изменении цены — будь то ручная правка или групповая обработка — необходимо перенести логику в общий модуль через механизм ПодпискиНаСобытия.

Шаг 1: Создание подписки. Создайте подписку на событие ПриЗаписи для объекта СправочникОбъект.Номенклатура.

Шаг 2: Реализация логики в общем модуле. В процедуре-обработчике подписки выполните следующие действия:

  1. Проверьте, изменилась ли цена по сравнению с предыдущим значением. Нет смысла писать в регистр, если стоимость осталась прежней.
  2. Используйте периодичность регистра «в пределах секунды». Это позволит хранить полную историю изменений.
  3. Вместо ТекущаяДата() используйте ТекущаяДатаСеанса(), а лучше — фиксируйте время записи транзакции.

Альтернативные методы реализации

Не всегда создание отдельного регистра — лучшее решение. Рассмотрим, что еще можно предпринять:

1. Анализ документов

Если цены в вашей системе меняются специальными документами, такими как УстановкаЦенНоменклатуры, то регистр сведений должен заполняться именно при проведении этого документа. Это гарантирует, что каждая запись имеет строго определенную дату и контекст (кто установил, на основании чего).

2. Использование механизма версионирования

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

3. Регистр сведений с периодичностью «в пределах секунды»

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

Итоговая рекомендация: откажитесь от записи данных в модуле формы. Создайте Подписку на событие, используйте проверку на изменение данных перед записью и обеспечьте точность периода до секунды. Это превратит ваш инструмент из «ошибочного» решения в надежный механизм для аналитики в СКД.

← На главную