Как запретить смену склада в документе Расходная накладная в 1С:УНФ

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

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

Вариант 1. Реализация проверки через расширение конфигурации

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

Разберем по шагам создание проверки склада в расширении:

  1. Откроем конфигуратор и перейдем в меню «Конфигурация» — «Расширения конфигурации». Добавим новое расширение (назначение — «Адаптация» или «Дополнение»).
  2. Добавим в расширение документ РасходнаяНакладная.
  3. Для перехвата записи документа создадим обработчик события. Наиболее корректным местом для валидации данных является событие ОбработкаПроверкиЗаполнения или ПередЗаписью модуля объекта. В отличие от события ПриЗаписи, отказ на этапе проверки заполнения не приводит к некорректному откату уже открытой транзакции и выводит пользователю стандартное информативное предупреждение.
  4. Добавим аннотацию &Вместо или &После для соответствующего серверного метода.

Посмотрим на пример программного кода валидации склада в модуле объекта документа расширения:


&После("ОбработкаПроверкиЗаполнения")
Процедура Расш1_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	// Пропускаем проверку для администраторов и системных обменов
	Если РольДоступна("ПолныеПрава") Тогда
		Возврат;
	КонецЕсли;
	
	РазрешенныйСклад = Справочники.СтруктурныеЕдиницы.НайтиПоНаименованию("СГП");
	
	// Проверяем склад в шапке документа
	Если ЗначениеЗаполнено(ЭтотОбъект.СтруктурнаяЕдиница) 
		И ЭтотОбъект.СтруктурнаяЕдиница <> РазрешенныйСклад Тогда
		
		ТекстОшибки = "Отгрузка разрешена только со склада 'СГП'!";
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ЭтотОбъект, "СтруктурнаяЕдиница",, Отказ);
		
	КонецЕсли;
	
	// Если в настройках включен учет по складам в табличной части "Запасы"
	Для Каждого Стр Из ЭтотОбъект.Запасы Цикл
		Если ЗначениеЗаполнено(Стр.СтруктурнаяЕдиница) И Стр.СтруктурнаяЕдиница <> РазрешенныйСклад Тогда
			ТекстОшибки = СтрШаблон("В строке %1 указан недопустимый склад отгрузки!", Стр.НомерСтроки);
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, ЭтотОбъект, "Запасы[" + (Стр.НомерСтроки - 1) + "].СтруктурнаяЕдиница",, Отказ);
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

Вариант 2. Использование подписки на события

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

Разберем процесс настройки подписки:

  1. В дереве метаданных конфигурации перейдем в ветку «Общие» — «Подписки на события» и нажмем «Добавить».
  2. В свойстве «Источник» выберем документ ДокументОбъект.РасходнаяНакладная.
  3. В свойстве «Событие» укажем ПередЗаписью или ОбработкаПроверкиЗаполнения.
  4. В свойстве «Обработчик» укажем процедуру в собственном нетиповом общем модуле (например, КастомныеПроверкиСервер).

Посмотрим на программную реализацию обработчика подписки на событие:


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

КонецПроцедуры

Вариант 3. Административная настройка формы без доработки конфигурации

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

  1. Установка основного склада по умолчанию: для каждого пользователя в его персональных настройках жестко фиксируем основное значение поля «Склад» равным значению «СГП».
  2. Блокировка поля на форме: в режиме «1С:Предприятие» откроем форму документа Расходная накладная под администратором, перейдем в меню «Еще» — «Изменить форму», найдем элемент поля выбора склада («Структурная единица») и установим свойство Только просмотр = Да (или снимем флаг доступности).
  3. Тиражирование интерфейса: через раздел программы «Администрирование» — «Настройки пользователей и прав» — «Копирование настроек» скопируем измененный вид формы всем пользователям с ограниченными правами.

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

Вариант 4. Ограничение бизнес-процессом ввода документов

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

← На главную