Как ограничить кассирам видимость чужих чеков ККМ и настроить отчет "Отчет о розничных продажах" по текущему пользователю в 1С:Рознице 2.3?

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

При работе в розничной торговле часто возникает необходимость обеспечить конфиденциальность данных и ограничить доступ персонала к информации, которая не относится к их прямым обязанностям. Одной из таких задач является требование, чтобы каждый кассир видел только те чеки контрольно-кассовой машины (ККМ) и отчеты о розничных продажах, которые он пробил или к которым имеет непосредственное отношение. В конфигурации 1С:Розница 2.3 на платформе 1С v8.3 (Управляемые формы) существуют мощные механизмы для реализации подобных ограничений. Мы с вами подробно разберем, как настроить систему таким образом, чтобы обеспечить необходимый уровень безопасности и удобства работы.

Мы рассмотрим два основных аспекта этой задачи: сначала сосредоточимся на ограничении видимости списков документов, таких как Чеки ККМ, а затем перейдем к настройке отбора по текущему пользователю в отчете "Отчет о розничных продажах".

Ограничение видимости чеков ККМ с помощью RLS (Row-Level Security)

Для того чтобы кассир мог видеть только свои чеки ККМ, а не все чеки магазина, нам необходимо использовать механизм ограничения доступа на уровне записей (RLS). RLS – это мощный инструмент платформы 1С, позволяющий настраивать права пользователей не только на уровне объектов (например, разрешить доступ к документу "ЧекККМ"), но и на уровне отдельных записей этих объектов (например, разрешить доступ только к чекам, где кассиром является текущий пользователь). Применение RLS является типовым и наиболее безопасным способом решения данной задачи, не требующим изменения конфигурации.

Разберем по шагам, как настроить RLS для ограничения видимости чеков ККМ в 1С:Рознице 2.3.

  1. Анализ структуры данных:

    Прежде всего, давайте убедимся, что в документе ЧекККМ и регистре накопления Продажи (на основании которого формируется отчет) имеется поле, ссылающееся на кассира, которое, в свою очередь, связано со справочником Пользователи. Обычно в 1С:Рознице 2.3 в документе ЧекККМ присутствует реквизит Кассир, тип которого СправочникСсылка.Пользователи. Аналогично, в регистре накопления Продажи, который является источником данных для многих отчетов, данные о кассире обычно можно получить через ссылку на регистратор (Продажи.Регистратор.Кассир) или напрямую, если такое измерение есть.

  2. Настройка профиля групп доступа:

    Откройте раздел "Администрирование", затем перейдите в "Настройки пользователей и прав" и выберите пункт "Профили групп доступа". Найдите профиль, который назначен вашим кассирам (например, "Кассир") или создайте новый, если это необходимо. Откройте его для редактирования.

  3. Установка ограничений для документа "Чек ККМ":

    В открывшемся профиле группы доступа перейдите на вкладку "Ограничения доступа". Найдите в списке документ "ЧекККМ". Установите для него ограничение на чтение и просмотр. В поле "Условия ограничения" или "Шаблон ограничения" (в зависимости от версии и настроек) вам потребуется ввести выражение, которое будет фильтровать записи. Используем стандартный параметр RLS - &ТекущийПользователь, который автоматически заменяется на ссылку на текущего пользователя, под которым работает система.

    
    Если ЧекККМ.Кассир = &ТекущийПользователь Тогда
        Разрешить = Истина;
    Иначе
        Разрешить = Ложь;
    КонецЕсли;
    

    Или в более компактной форме, которая часто используется в типовых шаблонах RLS:

    
    #Если Кассир
        ИЛИ ЧекККМ.Кассир = &ТекущийПользователь
    #КонецЕсли
    

    Здесь #Если Кассир является служебным оператором и означает, что следующее условие будет применено, если пользователю назначена роль "Кассир". Если у вашего профиля доступа нет такой роли, можно просто использовать условие ЧекККМ.Кассир = &ТекущийПользователь.

  4. Установка ограничений для регистра накопления "Продажи":

    Помимо чеков ККМ, нам также важно ограничить доступ к данным продаж, которые формируются в регистре накопления Продажи. Это гарантирует, что даже если кассир попытается обратиться к данным напрямую, он увидит только свои записи. Найдите в списке регистр "Продажи" и примените к нему аналогичное ограничение.

    
    #Если Кассир
        ИЛИ Продажи.Регистратор.Кассир = &ТекущийПользователь
    #КонецЕсли
    

    Здесь мы обращаемся к реквизиту Кассир документа-регистратора (которым в данном случае является ЧекККМ), чтобы связать запись регистра с конкретным кассиром.

  5. Проверка и устранение конфликтов:

    После сохранения изменений в профиле доступа необходимо тщательно проверить права пользователя. Зачастую проблема, когда RLS не работает, заключается в том, что у пользователя есть другая роль или профиль доступа, предоставляющий ему полные права или более широкий доступ к данным, что перекрывает установленные ограничения. Убедитесь, что у кассира нет лишних ролей, таких как "Полные права" или других, которые могут игнорировать RLS.

    Для тестирования рекомендуем:

    1. Войдите в систему под учетной записью кассира и проверьте списки документов "Чеки ККМ". Он должен видеть только свои чеки.
    2. Если RLS не срабатывает, временно попробуйте заменить &ТекущийПользователь на конкретную ссылку на пользователя в шаблоне RLS, чтобы убедиться в правильности самого шаблона. Например, ЧекККМ.Кассир = &ПользовательКонкретныйДляТеста, где &ПользовательКонкретныйДляТеста - это заранее созданный параметр, которому вы программно или интерактивно присвоите ссылку на пользователя. Если с конкретной ссылкой работает, значит, проблема в корректности определения &ТекущийПользователь или в конфликтующих правах.
    3. Самое важное: перепроверьте все назначенные пользователю роли и профили доступа. Удалите те, которые явно не требуются для работы кассира и могут давать избыточные права.

    После успешной настройки RLS кассир будет видеть только те чеки ККМ, которые он пробил, и его функциональность в Рабочем месте кассира (РМК) останется без изменений, так как RLS работает на уровне чтения данных, а не на уровне записи.

Настройка отбора в отчете "Отчет о розничных продажах"

Теперь, когда мы решили вопрос с видимостью чеков, давайте разберем, как обеспечить, чтобы отчет "Отчет о розничных продажах" автоматически открывался с отбором по текущему кассиру. Это может быть более сложной задачей, поскольку стандартные отчеты не всегда предусматривают такую динамическую настройку по умолчанию при открытии из общего списка отчетов.

Рассмотрим несколько подходов, начиная с самых простых, но ограниченных, и переходя к наиболее гибкому и рекомендованному решению.

Программная установка отбора в форме отчета (для специальных кнопок)

Если отчет запускается из специфической кнопки, например, в РМК или какой-либо обработке, мы можем программно установить отбор в форме отчета. Этот метод достаточно прост в реализации, но его главный недостаток заключается в том, что он не будет работать, если пользователь откроет отчет напрямую из меню "Отчеты".

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Проверяем, нет ли уже такого отбора, чтобы не задваивать
    ЭлементОтбораКассир = НастройкиОтчета.Отбор.Элементы.Найти("Кассир", Новый ПолеКомпоновкиДанных("Кассир"));
    Если ЭлементОтбораКассир = Неопределено Тогда
        ЭлементОтбораКассир = НастройкиОтчета.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбораКассир.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Кассир"); 
        ЭлементОтбораКассир.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбораКассир.ПравоеЗначение = Пользователи.ТекущийПользователь();
        ЭлементОтбораКассир.Использование = Истина;
    Иначе
        // Если отбор уже есть, просто обновляем его значение
        ЭлементОтбораКассир.ПравоеЗначение = Пользователи.ТекущийПользователь();
        ЭлементОтбораКассир.Использование = Истина;
    КонецЕсли;
    
    КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);
КонецПроцедуры

Здесь мы программно добавляем элемент отбора по полю Кассир (которое должно присутствовать в схеме компоновки данных отчета) и устанавливаем его значение равным текущему пользователю. Важно: поле Кассир в схеме компоновки данных отчета "Отчет о розничных продажах" обычно берется из регистра накопления "Продажи" или связанного с ним документа, поэтому его использование корректно.

Использование расширений для программной установки отбора в СКД-отчетах (рекомендованный подход)

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

Рассмотрим шаги по созданию расширения и добавлению в него логики для автоматической установки отбора в отчете:

  1. Создание нового расширения:

    Откройте конфигуратор, перейдите в меню "Конфигурация" -> "Расширения конфигурации" и добавьте новое расширение. Присвойте ему осмысленное имя, например, "ОтборыДляКассиров". Убедитесь, что для расширения установлен режим совместимости, соответствующий вашей конфигурации 1С:Розница 2.3.

  2. Добавление в расширение отчета:

    В дереве объектов расширения найдите раздел "Отчеты". Перетащите в него из основной конфигурации отчет "ОтчетОРозничныхПродажах". Это позволит расширению "видеть" и модифицировать этот отчет.

  3. Переопределение формы отчета в расширении:

    Для добавленного отчета создайте переопределенную форму (например, основную форму отчета, которая используется по умолчанию). В конфигураторе, в расширении, нажмите правой кнопкой мыши на отчет и выберите "Создать формы" -> "ФормаОтчета". Система предложит скопировать типовую форму.

    В модуле этой переопределенной формы найдите процедуру ПриСозданииНаСервере. Если ее нет, создайте ее. Вставьте в нее следующий код:

    
    // В модуле формы отчета (переопределенной в расширении)
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // #Область СтандартныеПодсистемы.ВариантыОтчетов
        // ЭтотКод = ИмяПроцедуры; // Если есть типовой вызов, его можно сохранить
        // КонецОбласти СтандартныеПодсистемы.ВариантыОтчетов
    
        НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
        
        // Поиск существующего отбора, чтобы не задваивать, но при этом обеспечить его наличие и актуальность
        ЭлементОтбораКассир = Неопределено;
        Для Каждого ЭлементКомпоновки Из НастройкиОтчета.Отбор.Элементы Цикла
            Если ТипЗнч(ЭлементКомпоновки) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
                Если ЭлементКомпоновки.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Кассир") Тогда
                    ЭлементОтбораКассир = ЭлементКомпоновки;
                    Прервать;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    
        Если ЭлементОтбораКассир = Неопределено Тогда
            ЭлементОтбораКассир = НастройкиОтчета.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
            ЭлементОтбораКассир.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Кассир");
        КонецЕсли;
        
        ЭлементОтбораКассир.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбораКассир.ПравоеЗначение = Пользователи.ТекущийПользователь();
        ЭлементОтбораКассир.Использование = Истина;
        
        КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);
    КонецПроцедуры
    

    Этот код будет выполнен при каждом открытии формы отчета, гарантируя, что отбор по текущему кассиру всегда будет установлен.

  4. Активация расширения:

    После всех изменений сохраните расширение и обновите конфигурацию базы данных. Убедитесь, что расширение включено в списке расширений конфигурации.

Данный подход с использованием расширения является наиболее предпочтительным, так как он не нарушает целостность типовой конфигурации, позволяет гибко управлять функционалом и сохраняет работоспособность при обновлении программы.

Альтернативные методы настройки отбора в отчетах (менее предпочтительные)

Рассмотрим кратко другие варианты, которые обсуждались или могут быть использованы, но имеют свои ограничения:

  1. Создание нового варианта отчета с фиксированным параметром:

    Мы могли бы создать новый вариант отчета "Мои продажи", в котором изначально настроить отбор по кассиру. Однако, чтобы этот отбор динамически устанавливался для &ТекущийПользователь, нам все равно понадобилась бы какая-то программная доработка. Либо мы должны были бы в настройках СКД этого варианта отчета установить параметр Кассир как "Ограничение доступности" и затем в модуле отчета (или через расширение) программно присваивать ему значение Пользователи.ТекущийПользователь() в процедуре ПриКомпоновкеРезультата. Это решение требует доработки кода отчета, что нежелательно без расширения.

  2. Копирование типового отчета во внешнюю обработку:

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

Заключение

Мы с вами рассмотрели комплексный подход к решению задачи по ограничению доступа кассиров к чужим продажам и чекам ККМ, а также по автоматической настройке отчета "Отчет о розничных продажах" в 1С:Рознице 2.3. Ключевыми инструментами стали ограничения доступа на уровне записей (RLS) для списков документов и расширения конфигурации для динамической установки отборов в отчетах на Системе Компоновки Данных (СКД). Эти методы позволяют создавать гибкие и безопасные информационные системы, сохраняя при этом возможность легкого обновления конфигурации и поддерживая ее в актуальном состоянии. Всегда помните о важности тщательного тестирования прав доступа после любых изменений, чтобы избежать непреднамеренного предоставления избыточных прав.

← На главную