В сетевой торговле часто возникает ситуация, когда кассиры одного магазина видят остатки товаров в других торговых точках через интерфейс Рабочего места кассира (РМК). В некоторых случаях это полезно для консультации покупателей, однако в конфигурациях типа 1С:Розница 2 или 1С:Розница 8. Аптека это может привести к пересортице и ошибкам, когда кассир случайно пробивает товар, числящийся на другом складе. Разберем подробно, как изолировать данные магазинов друг от друга, используя штатные механизмы и дополнительные настройки.
Первым делом проанализируем базовый механизм платформы 1С — RLS (Record Level Security). Именно он отвечает за то, какие данные пользователь может видеть в списках и отчетах, а какие — нет. Рассмотрим пошагово процесс включения и настройки этого функционала:
Важно понимать ошибку, упомянутую в обсуждении на форуме: нельзя создавать профиль без назначенных ролей. Профиль групп доступа — это совокупность разрешенных действий (ролей) и ограничений. Чтобы ограничение по магазинам заработало, выполним следующие действия:
Проанализируем состав ролей в профиле Продавец-кассир. Выясним, есть ли там роли, дающие право на чтение остатков. Обычно это типовые роли. Далее переходим на вкладку Ограничения доступа. Здесь для вида доступа Магазины установим значение Все запрещены, исключения назначаются в группах доступа.
Теперь, когда профиль готов, создадим Группы доступа. Рассмотрим ситуацию, когда у нас два магазина: «Магазин 1» и «Магазин 2».
Таким образом, система на уровне запроса к базе данных будет добавлять условие фильтрации. Однако, как заметили пользователи, в подборе РМК остатки все равно могут быть видны. Выясним, почему это происходит.
В конфигурации 1С:Розница 2 за поведение формы подбора отвечает не только RLS, но и настройки самого интерфейса РМК. Посмотрим на настройки, которые могут игнорировать общие правила доступа для удобства пользователя.
Перейдем в Продажи — Настройки РМК. Выберем используемый профиль настроек. В разделе, отвечающем за интерфейс и поиск товаров, проверим флаг Отображать остатки по магазинам. Если этот флаг установлен, система может выполнять прямой запрос к регистрам, минуя стандартные механизмы фильтрации динамических списков, чтобы показать кассиру, где еще есть нужный товар.
Если наша задача — полная изоляция, этот флаг необходимо снять. Проанализируем также настройку Выбор склада в РМК. Если кассиру разрешено выбирать склад, он сможет переключиться на склад другого магазина (если это не запрещено в Дополнительных правах пользователей).
Даже если мы скрыли видимость, остается риск продажи «в минус» или случайного выбора серии/характеристики, принадлежащей другому складу (особенно актуально для 1С:Аптека). Для решения второго вопроса автора — запрета пробития — выполним следующие настройки:
Теперь система будет жестко контролировать наличие товара именно на том складе, который привязан к текущему рабочему месту (ККМ).
Иногда после настройки RLS кассиры продолжают видеть старые данные. Проанализируем причину: это может быть связано с кэшированием данных на стороне клиента или некорректной работой полнотекстового поиска. Рассмотрим алгоритм очистки:
Во-первых, после изменения прав доступа пользователь должен полностью перезапустить сеанс 1С. Во-вторых, если используется поиск «по строке», система обращается к индексам полнотекстового поиска. Рекомендуется обновить индекс в разделе Поддержка и обслуживание — Управление полнотекстовым поиском.
Если штатные средства RLS не дают нужного результата в форме подбора (например, из-за специфики отраслевого решения «Аптека»), наиболее эффективным методом будет использование расширения конфигурации. Рассмотрим пример логики, которую можно внедрить.
Нам необходимо перехватить запрос, который формирует данные для формы подбора. Обычно это метод ПриСозданииНаСервере или специализированные функции получения остатков в модуле менеджера или в коде формы подбора. Добавим условие фильтрации программно:
&Вместо("УстановитьПараметрыЗапросаОстатков")
Процедура Расш_УстановитьПараметрыЗапросаОстатков(Запрос)
// Получаем текущий магазин из настроек пользователя или РМК
ТекущийМагазин = Справочники.Магазины.НайтиПоНаименованию("Наш Магазин");
// Устанавливаем жесткий фильтр по складу магазина
Запрос.УстановитьПараметр("МагазинФильтр", ТекущийМагазин);
// Вызываем оригинальный метод, если нужно, или модифицируем текст запроса
ТекстЗапроса = Запрос.Текст;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ГДЕ", "ГДЕ Склад.Магазин = &МагазинФильтр И ");
Запрос.Текст = ТекстЗапроса;
КонецПроцедуры
Такой подход гарантирует, что никакие «хитрые» настройки интерфейса не позволят увидеть данные чужих торговых точек, так как ограничение накладывается на уровне программного кода запроса. Чтобы не реализовывать доработку самостоятельно, можно воспользоваться готовым расширением для подбора и поиска товаров по наличию на складе в Рознице 2.
Подведем итог. Для полной изоляции магазинов в 1С:Розница 2 требуется комплексный подход:
ПолныеПрава или ПросмотрВсехДанных, которые работают в обход RLS.Соблюдение этих шагов позволит избежать ошибок при реализации медикаментов или товаров общего потребления и обеспечит чистоту учета в рамках каждой торговой точки.