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