Ограничение проведения документов текущей датой в УТ 11
Администрирование - Роли и права
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Ограничение проведения документов текущей датой в УТ 11
В работе часто возникает необходимость запретить кассирам и менеджерам проводить документы задним или передним числом, не трогая типовую конфигурацию. Предлагаю расширение, которое может помочь с этим.
На боевой базе операционные сотрудники иногда правят дату документа «для удобства» или проводят вчерашние черновики. Типовая дата запрета изменения данных закрывает период целиком и не различает кассира и администратора. В расширении точечное правило: ограничить только выбранные профили и только проведение, оставив черновики, обмен и исправления руководителю.
В данном расширении не используются объекты метаданных, которые приведут к реструктуризации. Нет своих справочников, регистров и ролей — только подписка на ПередЗаписью и два общих модуля. Типовые документы не заимствуем.
Для перехвата будем использовать подписку на событие ПередЗаписью с источником ДокументОбъект. Так как у обработчика есть Отказ, недопустимый документ не записывается и не проводится, а в групповом проведении каждый объект обрабатывается отдельно: допустимые проходят, недопустимые остаются непроведёнными с тем же сообщением.
Общая настройка
- Загрузить расширение
ОграничениеДатыДокументовв конфигуратор / через «Расширения конфигурации». - Убедиться, что в базе есть профили групп доступа с точными наименованиями: «Кассир», «Менеджер активных продаж», «Офис-менеджер», «Помощник бухгалтера» и/или добавьте профили самостоятельно.
- Назначить операционным пользователям нужные профили. Роль «ПолныеПрава» или профиль «Администратор» снимают ограничение даже вместе с «Кассир».
- Список контролируемых документов зашит в коде: заказ клиента, реализация, возврат от клиента, ПКО, РКО, отчёт о розничных продажах, счёт-фактура выданный и полученный.
Процедура ОДД_ПередЗаписьюКонтролируемыхДокументов(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если РежимЗаписи <> РежимЗаписиДокумента.Проведение Тогда
Возврат;
КонецЕсли;
Если НЕ ЭтоКонтролируемыйДокумент(Источник.Метаданные().Имя) Тогда
Возврат;
КонецЕсли;
Если Источник.ОбменДанными.Загрузка = Истина Тогда
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(Источник.ОбменДанными.Отправитель) Тогда
Возврат;
КонецЕсли;
Если ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание() <> Неопределено Тогда
Возврат;
КонецЕсли;
Если НЕ ОДД_ПроведениеДокументовПовтИсп.ОДД_ПользовательОграничен() Тогда
Возврат;
КонецЕсли;
Если ЭтоПерепроведениеВТекущемДне(Источник) Тогда
Возврат;
КонецЕсли;
Если ОтклонениеДатыДопустимо(Источник.Дата) Тогда
Возврат;
КонецЕсли;
Отказ = Истина;
Текст = "Проведение документа невозможно. Дата документа должна соответствовать текущей дате. Обратитесь к руководителю.";
ОбщегоНазначения.СообщитьПользователю(Текст, Источник, "Дата");
КонецПроцедуры
Функция ОтклонениеДатыДопустимо(ДатаДокумента)
Сейчас = ТекущаяДатаСеанса();
Возврат Макс(ДатаДокумента, Сейчас) - Мин(ДатаДокумента, Сейчас) <= 300;
КонецФункции
Как проверить: войти под пользователем только с профилем «Кассир», открыть реализацию или заказ, поставить вчерашнюю дату → Провести. Ожидание — отказ и текст сообщения выше; дата в документе не меняется. Затем поставить дату/время в пределах 5 минут от текущего момента сеанса — проведение проходит.

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