В типовой конфигурации 1С:Бухгалтерия предприятия 3.0 (БП 3) часто возникает бизнес-задача: разрешить младшему персоналу (например, операторам или помощникам бухгалтера) вносить первичные данные в систему, но запретить им финальное проведение документов, чтобы старший бухгалтер мог проверить их перед тем, как они повлияют на учет. Рассмотрим подробнее, как реализовать этот механизм, не снимая конфигурацию с поддержки и используя современные инструменты платформы 1С:Предприятие 8.3.
Для начала проанализируем, почему в типовом интерфейсе «Бухгалтерии предприятия» нет простой настройки для решения этой задачи. В системе 1С права доступа определяются Ролями. В БП 3.0 роли спроектированы по принципу функциональных участков. Например, роль ДобавлениеИзменениеДанныхБухгалтерии объединяет в себе права на чтение, запись и проведение большинства документов.
Если мы заглянем в «Профили групп доступа» в пользовательском режиме, то увидим, что мы можем только комбинировать существующие роли. Однако ни одна типовая роль для основных документов (таких как «Реализация товаров и услуг» или «Поступление») не разделяет право на Запись и Проведение. Эти права идут «в одном пакете». Следовательно, простым переключением настроек в режиме 1С:Предприятие, без внесения изменений в структуру метаданных, решить задачу не получится.
Иногда специалисты предлагают использовать механизм Даты запрета редактирования. Разберем, подходит ли он в данном случае. Если мы установим дату запрета по сегодняшний день включительно, пользователь действительно не сможет провести документ. Однако он не сможет даже просто сохранить (записать) новый документ, так как любая запись в базу данных в закрытом периоде блокируется системой. Таким образом, этот метод не позволяет реализовать сценарий «создать черновик для последующей проверки».
Это самый «чистый» способ с точки зрения архитектуры 1С. Мы не снимаем конфигурацию с поддержки и сохраняем возможность легкого обновления. Рассмотрим этот процесс по шагам:
Роль, назовем ее, например, ЗапретПроведенияДокументов.РеализацияТоваровУслуг) установим галочки на Чтение, Добавление и Изменение, но снимем галочку с права Проведение и ИнтерактивноеПроведение.Важно помнить: чтобы эта схема заработала, у пользователя не должно быть других ролей, которые разрешают проведение тех же документов. Система 1С работает по принципу суммирования прав: если хотя бы одна роль разрешает действие, оно будет доступно.
Если документов много и настраивать роли для каждого из них долго, проанализируем программный метод. Мы можем перехватить событие записи документа и проверить, с каким режимом оно выполняется. Для этого лучше всего использовать механизм перехвата событий (Аннотации) в модуле объекта документа или в общем модуле.
Разберем пример кода, который можно разместить в расширении для проверки прав при попытке проведения:
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Проверяем, что документ записывается именно в режиме проведения
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
// Проверяем наличие определенной роли у текущего пользователя
// Если у пользователя нет роли "РазрешитьПроведение", блокируем действие
Если НЕ РольДоступна("ПолныеПрава") И НЕ РольДоступна("Администрирование") Тогда
ТекстСообщения = "У вас недостаточно прав для проведения данного документа.
|Пожалуйста, сохраните его кнопкой 'Записать' для проверки бухгалтером.";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , , , Отказ);
// Устанавливаем Отказ в Истина, чтобы прервать запись
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Выясним причину, почему такой подход удобен. Во-первых, он позволяет гибко управлять логикой: можно создать специальный Регистр сведений, где перечислить конкретных пользователей, которым запрещено проведение, и обращаться к нему в коде. Во-вторых, пользователь сразу получает понятное сообщение об ошибке, если нажимает кнопку Провести и закрыть.
Как справедливо заметили участники обсуждения на форуме, просто запретить действие в коде — это половина дела. Хорошим тоном считается скрывать или деактивировать кнопки проведения в интерфейсе, чтобы пользователь не тратил время на заполнение документа, который он все равно не сможет провести.
Для этого в расширении можно использовать процедуру ПриСозданииНаСервере для формы документа:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Проверяем права программно
Если НЕ РольДоступна("ПолныеПрава") Тогда
// Ищем кнопки проведения и делаем их недоступными
ЭлементПровести = Автозаполнение.Элементы.Найти("ФормаПровести");
Если ЭлементПровести <> Неопределено Тогда
ЭлементПровести.Доступность = Ложь;
КонецЕсли;
ЭлементПровестиИЗакрыть = Автозаполнение.Элементы.Найти("ФормаЗаписатьИЗакрыть");
Если ЭлементПровестиИЗакрыть <> Неопределено Тогда
// Можно изменить заголовок или поведение, но в БП 3.0
// кнопка "Записать и закрыть" обычно выполняет проведение.
// Поэтому лучше оставить только кнопку "Записать".
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Подведем итог нашему анализу. В типовой конфигурации 1С:Бухгалтерия предприятия 3.0 разделение прав на «запись» и «проведение» штатными галочками в пользовательском режиме невозможно. Однако мы рассмотрели два эффективных пути решения через расширения:
Выбор конкретного способа зависит от квалификации специалиста и требований к гибкости настроек системы. В любом случае, использование расширений позволяет оставить основную базу на полной поддержке, что критически важно для регулярного обновления бухгалтерских программ.