Как в 1С:Комплексная автоматизация 2.0 и ERP 2 запретить пользователям отключать контроль остатков товаров

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

В процессе эксплуатации ERP-систем, таких как 1С:Комплексная автоматизация 2.0 или 1С:ERP Управление предприятием 2, владельцы бизнеса часто сталкиваются с необходимостью жесткого контроля складских остатков. Проведение документов «в минус» ведет к искажению себестоимости, путанице в отчетах и серьезным расхождениям при инвентаризации. Однако в типовых конфигурациях заложена штатная опция, позволяющая отключать этот контроль. Если ошибки уже возникли и мешают расчету себестоимости, для исправления ситуации подойдёт обработка для выравнивания отрицательных остатков товаров организаций.

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

Анализируем внутренний механизм контроля остатков в ERP / КА 2.0

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

В типовых решениях возможность временного или постоянного обхода проверок завязана на два ключевых объекта метаданных:

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

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

Проектирование решения через механизм расширений

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

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

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

Рассмотрим подробнее реализацию интерфейсного ограничения по шагам.

Шаг 1. Создание роли в расширении

Для начала создадим в нашем расширении новую роль, например, РазрешитьОтключениеКонтроляОстатков. Эту роль мы будем назначать только тем пользователям, которым действительно доверяем временное отключение проверок. У остальных («недоадминов») эта роль будет отсутствовать.

Шаг 2. Заимствование формы настроек

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

Шаг 3. Написание программного кода в расширении формы

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

Проанализируем ситуацию и напишем следующий код:


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

Благодаря этому коду, при открытии панели настроек пользователем без роли РазрешитьОтключениеКонтроляОстатков, элементы управления для снятия контроля будут заблокированы (серые) или их можно сделать полностью невидимыми, заменив свойство Доступность на Видимость.

Способ 2. Блокировка обхода контроля на уровне проведения документов

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

Чтобы исключить любую возможность проведения документов «в минус», реализуем жесткую проверку на уровне сервера перед записью документов или в момент их проведения. Выясним причину нарушения контроля непосредственно перед выполнением транзакции.

Для этого в расширении перехватим общий модуль, отвечающий за проведение документов, или настроим подписку на событие ПередЗаписью или ОбработкаПроведения для документов движения товаров (например, РеализацияТоваровУслуг, СписаниеТоваров).

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


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

Этот подход гарантирует 100% надежность. Даже если пользователь каким-то образом переключил параметр сеанса в значение Истина, при первой же попытке провести документ система перепроверит его роли, вернет параметр в значение Ложь и заблокирует проведение «в минус».

Важные технологические нюансы контроля остатков в 1С:КА 2 и ERP

При настройке прав для нашего «недоадмина» крайне важно разделять два совершенно разных контура контроля остатков, которые работают в программе параллельно и независимо друг от друга:

  1. Контроль по организациям (Интеркампани):

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

  2. Контроль по складам (Оперативный учет):

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

    Чтобы ограничить возможность отключения контроля остатков по складам для нашего администратора, программировать не нужно! Достаточно штатными средствами ограничить его права на изменение элементов справочника Склады. Настройте ограничение доступа на уровне записей (RLS) или просто заберите роль на редактирование складов у этого пользователя, оставив только права на просмотр.

Подведем итоги

Мы подробно проанализировали проблему и нашли оптимальные пути ее решения без изменения типовой конфигурации 1С:Комплексная автоматизация 2.0. Использование механизма расширений позволяет гибко настроить права доступа даже для пользователей с полным набором административных прав.

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

← На главную