Как скрыть закупочные цены от пользователей в 1С 7.7 «Торговля + Склад»?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

В оптово-розничной торговле часто возникает задача ограничить доступ обычных сотрудников (кассиров, продавцов, менеджеров по продажам) к информации о закупочных ценах и себестоимости товаров. В современных конфигурациях на платформе 1С 8.3 для этого предусмотрены развитые механизмы ролей и RLS (ограничение доступа на уровне записей). Однако в классической платформе 1С:Предприятие 7.7 (в частности, в конфигурации «Торговля + Склад» редакции 9.2) штатных инструментов для гибкого скрытия отдельных типов цен «из коробки» не предусмотрено.

Если у всех пользователей в базе назначен один и тот же интерфейс или схожие наборы прав, решить эту задачу стандартным кликом мыши в Конфигураторе не удастся. Тем не менее, эту проблему можно успешно решить программными методами. В этой статье мы подробно разберем, как шаг за шагом ограничить видимость закупочных цен в интерфейсе программы, справочниках, документах и отчетах, а также рассмотрим возможные «каналы утечки» информации и способы их перекрытия.

---

Способ 1. Ограничение видимости типов цен в форме списка справочника

Основное место, где пользователи видят закупочные цены — это справочник «Цены», открываемый из карточки номенклатуры или через меню справочников. Нам необходимо сделать так, чтобы при открытии формы списка типов цен система автоматически проверяла роль текущего пользователя и убирала «Закупочную цену» из списка доступных.

Для реализации этого механизма мы воспользуемся встроенным методом ИспользоватьСписокЭлементов(). Он позволяет ограничить выборку элементов справочника только заранее определенным списком значений.

Рассмотрим по шагам, как это реализовать в Конфигураторе:

  1. Откроем Конфигуратор, перейдем в дерево метаданных и найдем справочник ТипыЦен.
  2. Откроем форму списка этого справочника (обычно это основная форма выбора или списка).
  3. В модуле формы в процедуре ПриОткрытии() пропишем алгоритм фильтрации.

Посмотрим на пример кода, который нужно внедрить в модуль формы списка справочника ТипыЦен:


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

Данный код принудительно скрывает строку с закупочной ценой для всех пользователей, чьи права в системе не соответствуют «Администратор» или «Бухгалтер». Обратите внимание, что обращение к Константа.ЗакупочнаяЦена предполагает наличие соответствующей константы в вашей базе, где указан используемый по умолчанию тип закупочных цен.

---

Способ 2. Модификация глобальной функции получения цен

Скрытие элемента в справочнике — это лишь половина дела. В конфигурации «Торговля + Склад» получение цен для различных расчетов, заполнения документов и вывода на экран часто происходит через вызовы функций Глобального модуля. Основной функцией, отвечающей за это, является глВернутьЦену().

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

Рассмотрим подробнее изменения, которые необходимо внести в тело функции глВернутьЦену():


Функция глВернутьЦену(Номенклатура, ТипЦены, ДатаЦены = 0, ЦенаЦены = 0, ЕдЦены = 0, ВалЦены = 0, НаценкаЦены = 0, НайденнаяЦена = 0) Экспорт
    
    // Вставляем проверку прав доступа в самом начале функции
    Если (НазваниеНабораПрав() <> "Администратор") И (НазваниеНабораПрав() <> "Бухгалтер") Тогда
        Если ТипЦены = Константа.ЗакупочнаяЦена Тогда
            // Если у пользователя нет прав, принудительно возвращаем 0
            ЦенаЦены = 0;
            Возврат 0;
        КонецЕсли;
    КонецЕсли;
    
    // Далее идет оригинальный код функции глВернутьЦену...
    // [Оригинальный код конфигурации]
    
    Возврат НайденнаяЦена;
КонецФункции

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

---

Способ 3. Скрытие элементов управления на форме элемента справочника «Цены»

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

Разберем, как настроить видимость полей формы. В модуле формы элемента справочника Цены в процедуре ПриОткрытии() добавим следующий код контроля доступа:


Процедура ПриОткрытии()
    // Проверяем, открыта ли карточка закупочной цены пользователем с ограниченными правами
    Если (НазваниеНабораПрав() <> "Администратор") И (НазваниеНабораПрав() <> "Бухгалтер") Тогда
        Если Владелец.ТекущийЭлемент() = Константа.ЗакупочнаяЦена Тогда
            
            // Скрываем числовое поле ввода цены
            Форма.Цена.Видимость(0);
            
            // Если на форме есть кнопка просмотра истории периодического реквизита
            Попытка
                Форма.кнУстановить.Видимость(0);
            Исключение
                // Игнорируем, если кнопка называется иначе или отсутствует
            КонецПопытки;
            
            Предупреждение("У вас нет прав на просмотр данного типа цен!");
            СтатусВозврата(0); // Закрываем форму элемента, не давая ее прочесть
            Возврат;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

---

Способ 4. Перекрытие каналов утечки данных (Отчеты и Документы)

Многие начинающие программисты 1С совершают ошибку, ограничивая доступ только на уровне справочников. Однако реальная себестоимость и закупочные цены легко могут быть вычислены пользователем из других источников в программе. Проанализируем эти источники и выясним, как их перекрыть.

  1. Стандартные отчеты конфигурации:
    Такие отчеты, как «Ведомость по остаткам ТМЦ» (при выборе оценки остатков по себестоимости), «Анализ продаж», «Продажи по поставщикам» и «Отчет по прибыли» напрямую выводят закупочные цены и маржинальность.

    Решение: В Конфигураторе для интерфейса и прав кассира/менеджера необходимо полностью снять галочку «Использование» для этих отчетов. Если менеджеру все же необходим доступ к «Ведомости по остаткам», то в модуле отчета перед формированием таблицы нужно программно запретить группировки и показатели, связанные с себестоимостью, если текущие права пользователя не равны «Администратор» или «Бухгалтер».

  2. Документы поступления и движения:
    Если кассир или менеджер имеет доступ к журналу документов «Поступление ТМЦ», он легко увидит входящие цены прямо в табличной части накладных поступления.

    Решение: Ограничьте права на чтение и просмотр журналов документов поступления для всех ролей, кроме бухгалтерии и склада. Если склад должен принимать товар, но не должен видеть цены — используйте интерфейс «Приходный ордер» (двухфазная приемка), где фигурирует только количество номенклатуры без стоимостных показателей.

  3. Обработка «Подбор номенклатуры»:
    В форме подбора (динамическое окно выбора товаров при заполнении накладных) часто выводятся колонки со всеми типами цен.

    Решение: Найдите в конфигураторе форму подбора (обычно это форма ДляПодбора или Select справочника Номенклатура) и проверьте алгоритм вывода колонок цен. Добавьте условие, аналогичное проверке в Способе 1, чтобы колонка закупочной цены просто не создавалась для рядовых пользователей.

---

Способ 5. Использование внешней компоненты FormEx для скрытия колонок

Для более гибкого управления интерфейсом в системе 1С 7.7 разработчики часто используют бесплатную внешнюю компоненту FormEx. Она позволяет динамически управлять элементами табличных частей на формах, что невозможно сделать штатными средствами платформы.

С помощью FormEx мы можем легко скрыть колонку с закупочной ценой в табличном поле, если у пользователя нет соответствующих прав. Пример использования компоненты в модуле формы:


Процедура ПриОткрытии()
    // Инициализируем расширение формы через FormEx
    Шаблон("![РасширениеФормы]"); 
    
    Если (НазваниеНабораПрав() <> "Администратор") И (НазваниеНабораПрав() <> "Бухгалтер") Тогда
        // Скрываем конкретную колонку по ее идентификатору в таблице формы
        Форма.ТабличнаяЧасть.ВидимостьКолонки("ЗакупочнаяЦена", 0);
    КонецЕсли;
КонецПроцедуры

---

Способ 6. Физическая безопасность данных (Защита базы на уровне СУБД)

Не стоит забывать об уязвимости самой платформы 1С 7.7. Если ваша база работает в файловом режиме (DBF), то абсолютно любые программные ограничения в коде 1С можно обойти за 5 минут. Продвинутый пользователь может скопировать файлы таблиц (например, SC*.dbf, где хранятся цены) к себе на флешку и открыть их через обычный Microsoft Excel или бесплатный DBF-вьюер.

Чтобы исключить этот сценарий, рассмотрите следующие инфраструктурные решения:

Подводя итог, можно сказать: надежное скрытие информации в 1С 7.7 — это комплексная задача. Сочетание программной фильтрации списков через ИспользоватьСписокЭлементов(), модификации функции глВернутьЦену(), отключения доступа к отчетам в Конфигураторе и защиты файлов базы данных на сервере позволит вам гарантировать конфиденциальность коммерческой информации компании.

← На главную