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