Склад в 1С УТ 11 — элемент справочника «Склады», и от его настроек зависит складской учёт: нужны ли ордера, хранятся ли остатки по ячейкам, кто видит склад. Ниже — как настроить склад в 1С УТ 11, что значат флажки карточки и как кодом запретить отгрузку с конкретного склада, подставлять склад автоматически и не давать пометить на удаление склад с товаром.
Названия даны по УТ 11.4; в УТ 11.5, КА 2.5 и ERP 2.5 справочник устроен так же, отличия отмечены. Отчёты по остаткам — в статье об остатках товаров на складе.
Пока склад один, списка нет: «Склады и магазины» сразу открывает его карточку. Чтобы завести второй:



Опции, которые меняют поведение складов:
| Флажок | Где включается | Что даёт |
|---|---|---|
| Несколько складов | Склад и доставка | Список складов и выбор склада в документах |
| Ордерные склады | Склад и доставка | Вкладку «Ордерная схема и структура» в карточке склада |
| Реализация товаров с нескольких складов | Продажи | Склад в строках продаж, группу складов в шапке |
| Поступление товаров на несколько складов | Закупки | То же для закупок |
| Розничные продажи | Продажи | Переключатель «Оптовый склад / Розничный магазин» |
| Ограничивать доступ на уровне записей | Настройки пользователей и прав | Ограничение доступа по складам |
На вкладке «Основное»:

Склады раскладывают по группам: «Москва», «Регионы», «Магазины». У группы есть поле «Выбор этой группы»: «Запретить», «Разрешить в заказах», «Разрешить в заказах и накладных». Если выбор разрешён, в шапке документа указывают группу, а склад — в каждой строке. Склад наследует вариант своей группы; когда склады в строках документов выключены, вариант всегда «Запретить».
На ордерной схеме строится управление складом в 1С: менеджер оформляет распоряжение, кладовщик — ордер по факту. Вкладка «Ордерная схема и структура» появляется после флажка «Ордерные склады»; в блоке «Использовать ордерную схему документооборота» три флажка со своими датами начала:

Схема действует с даты у флажка, более ранние документы живут по старой схеме, поэтому склад переводят с начала периода, закрыв незавершённые документы. В коде проверяйте схему на дату документа — в общем модуле СкладыСервер есть готовая функция:
// Ордерная схема включается с даты, поэтому проверяем на дату документа, а не флажок
Если СкладыСервер.ИспользоватьОрдернуюСхемуПриОтгрузке(Склад, Дата) Тогда
// остаток спишет «Расходный ордер на товары», документ — только распоряжение
Иначе
// документ сам уменьшит остаток на складе
КонецЕсли;
В блоке «Структура склада» той же вкладки — «Использовать помещения» с датой и поле «Ячейки»: «Не использовать», «Использование определяется в помещениях», «Использовать для справочного размещения номенклатуры», «Использовать для хранения остатков номенклатуры». Помещения и ячейки с остатками работают только при всех трёх флажках ордерной схемы: без них флажок помещений недоступен, а хранение остатков в ячейках при записи сбрасывается в «Не использовать». Справочному размещению ордерная схема не нужна. Отбор и размещение — в статьях об адресном хранении и о ТСД в УТ 11.
Настройки «основной склад пользователя», которую читали бы типовые заказ клиента и реализация, в УТ 11.4 нет. Склад в новый документ приходит:
Иначе поле остаётся пустым. Частая доработка — подставлять склад подразделения: подразделение приходит в документ из карточки пользователя, а у склада есть такое же поле.
Вид доступа «Склады» уже есть в типовых профилях УТ. Чужие реализации и остатки пользователь не увидит, а группы складов видны всем — так написано ограничение в модуле менеджера справочника. В своих запросах пишите ВЫБРАТЬ РАЗРЕШЕННЫЕ, иначе у такого пользователя они упадут с ошибкой. Подробнее — в статье о правах доступа 1С.
Код ниже — одно расширение с префиксом Расш_: реквизит Расш_ЗапретОтгрузки (Булево) в заимствованном справочнике «Склады», заимствованные форма элемента склада, документы РеализацияТоваровУслуг и ЗаказКлиента и общий модуль Расш_СкладыСервер. Как заимствовать объекты — в статье о расширении конфигурации.
Сводку полезно снять перед включением ордерной схемы или чисткой справочника. Текст запроса работает и в консоли запросов.
// Сводка по складам: тип, ордерная схема с датами начала, помещения, ячейки,
// МОЛ и число позиций на остатке. Функция для серверного общего модуля
// или модуля объекта внешней обработки; текст запроса работает и в консоли.
Функция ТаблицаНастроекСкладов() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Остатки.Склад КАК Склад,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Остатки.Номенклатура) КАК ПозицийНаОстатке
|ПОМЕСТИТЬ ВТОстатки
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
|ГДЕ
| Остатки.ВНаличииОстаток <> 0
|
|СГРУППИРОВАТЬ ПО
| Остатки.Склад
|
|ИНДЕКСИРОВАТЬ ПО
| Склад
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Ячейки.Владелец КАК Склад,
| КОЛИЧЕСТВО(Ячейки.Ссылка) КАК Ячеек
|ПОМЕСТИТЬ ВТЯчейки
|ИЗ
| Справочник.СкладскиеЯчейки КАК Ячейки
|ГДЕ
| НЕ Ячейки.ЭтоГруппа
| И НЕ Ячейки.ПометкаУдаления
|
|СГРУППИРОВАТЬ ПО
| Ячейки.Владелец
|
|ИНДЕКСИРОВАТЬ ПО
| Склад
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Склады.Ссылка КАК Склад,
| Склады.Родитель КАК Группа,
| Склады.ТипСклада КАК ТипСклада,
| Склады.Подразделение КАК Подразделение,
| Склады.ТекущийОтветственный КАК МОЛ,
| Склады.ИспользоватьОрдернуюСхемуПриПоступлении КАК ОрдернаяПриПоступлении,
| Склады.ДатаНачалаОрдернойСхемыПриПоступлении КАК ПриПоступленииС,
| Склады.ИспользоватьОрдернуюСхемуПриОтгрузке КАК ОрдернаяПриОтгрузке,
| Склады.ДатаНачалаОрдернойСхемыПриОтгрузке КАК ПриОтгрузкеС,
| Склады.ИспользоватьСкладскиеПомещения КАК Помещения,
| Склады.НастройкаАдресногоХранения КАК НастройкаЯчеек,
| ЕСТЬNULL(ВТЯчейки.Ячеек, 0) КАК Ячеек,
| ЕСТЬNULL(ВТОстатки.ПозицийНаОстатке, 0) КАК ПозицийНаОстатке,
| Склады.ПометкаУдаления КАК ПометкаУдаления
|ИЗ
| Справочник.Склады КАК Склады
| ЛЕВОЕ СОЕДИНЕНИЕ ВТОстатки КАК ВТОстатки
| ПО Склады.Ссылка = ВТОстатки.Склад
| ЛЕВОЕ СОЕДИНЕНИЕ ВТЯчейки КАК ВТЯчейки
| ПО Склады.Ссылка = ВТЯчейки.Склад
|ГДЕ
| НЕ Склады.ЭтоГруппа
|
|УПОРЯДОЧИТЬ ПО
| Склады.Наименование";
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
// Расширение, модуль формы ФормаЭлемента справочника Склады.
// Реквизит Расш_ЗапретОтгрузки (Булево) добавлен в заимствованный справочник.
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Поле создаём кодом: в заимствованной форме нет своих элементов,
// и обновление типовой формы проходит без ручного сравнения
ГруппаДляФлажка = Элементы.Найти("ОсновноеЛево");
Если ГруппаДляФлажка = Неопределено Тогда
Поле = Элементы.Добавить("Расш_ЗапретОтгрузки", Тип("ПолеФормы"));
Иначе
Поле = Элементы.Добавить("Расш_ЗапретОтгрузки", Тип("ПолеФормы"), ГруппаДляФлажка);
КонецЕсли;
Поле.Вид = ВидПоляФормы.ПолеФлажка;
Поле.ПутьКДанным = "Объект.Расш_ЗапретОтгрузки";
Поле.Заголовок = НСтр("ru = 'Запретить отгрузку с этого склада'");
Поле.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право;
КонецПроцедуры
Общий модуль с проверкой и поиском склада подразделения:
// Общий модуль расширения Расш_СкладыСервер.
// Свойства: флажок «Сервер» установлен, остальные сняты.
#Область ПрограммныйИнтерфейс
// Проверяет, что документ не отгружает товар со склада с флажком «Запретить отгрузку».
//
// Параметры:
// Объект - ДокументОбъект - проверяемый документ.
// ИмяПоляСклада - Строка - реквизит шапки со складом отгрузки: "Склад", "СкладОтправитель".
// ИмяТабличнойЧасти - Строка - табличная часть с колонкой "Склад" или "", если колонки нет.
// Отказ - Булево - становится Истина, если найден запрещенный склад.
//
Процедура ПроверитьЗапретОтгрузки(Объект, ИмяПоляСклада, ИмяТабличнойЧасти, Отказ) Экспорт
СкладШапки = Объект[ИмяПоляСклада];
// Склады шапки и строк без повторов
Склады = Новый Массив;
Если ЗначениеЗаполнено(СкладШапки) Тогда
Склады.Добавить(СкладШапки);
КонецЕсли;
Если ЗначениеЗаполнено(ИмяТабличнойЧасти) Тогда
Для Каждого СтрокаТЧ Из Объект[ИмяТабличнойЧасти] Цикл
Если ЗначениеЗаполнено(СтрокаТЧ.Склад) И Склады.Найти(СтрокаТЧ.Склад) = Неопределено Тогда
Склады.Добавить(СтрокаТЧ.Склад);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если Склады.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Склады.Ссылка КАК Склад
|ИЗ
| Справочник.Склады КАК Склады
|ГДЕ
| Склады.Ссылка В (&Склады)
| И Склады.Расш_ЗапретОтгрузки";
Запрос.УстановитьПараметр("Склады", Склады);
Запрещенные = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Склад");
Если Запрещенные.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Шаблон = НСтр("ru = 'Отгрузка со склада «%1» запрещена. Выберите другой склад.'");
Сообщено = Новый Соответствие;
// Склад шапки: сообщение у поля шапки
Если Запрещенные.Найти(СкладШапки) <> Неопределено Тогда
ОбщегоНазначения.СообщитьПользователю(
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, СкладШапки),
Объект, ИмяПоляСклада, , Отказ);
Сообщено.Вставить(СкладШапки, Истина);
КонецЕсли;
Если Не ЗначениеЗаполнено(ИмяТабличнойЧасти) Тогда
Возврат;
КонецЕсли;
// Склады строк: одно сообщение на склад, у первой строки с ним
Для Каждого СтрокаТЧ Из Объект[ИмяТабличнойЧасти] Цикл
Если Запрещенные.Найти(СтрокаТЧ.Склад) = Неопределено
Или Сообщено[СтрокаТЧ.Склад] <> Неопределено Тогда
Продолжить;
КонецЕсли;
ОбщегоНазначения.СообщитьПользователю(
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, СтрокаТЧ.Склад),
Объект,
ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти(ИмяТабличнойЧасти, СтрокаТЧ.НомерСтроки, "Склад"),
,
Отказ);
Сообщено.Вставить(СтрокаТЧ.Склад, Истина);
КонецЦикла;
КонецПроцедуры
// Возвращает склад подразделения, если он у подразделения единственный.
//
// Параметры:
// Подразделение - СправочникСсылка.СтруктураПредприятия - подразделение документа.
//
// Возвращаемое значение:
// СправочникСсылка.Склады - склад или пустая ссылка.
//
Функция СкладПодразделения(Подразделение) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 2
| Склады.Ссылка КАК Склад
|ИЗ
| Справочник.Склады КАК Склады
|ГДЕ
| Склады.Подразделение = &Подразделение
| И НЕ Склады.ЭтоГруппа
| И НЕ Склады.ПометкаУдаления
| И НЕ Склады.Расш_ЗапретОтгрузки";
Запрос.УстановитьПараметр("Подразделение", Подразделение);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() = 1 И Выборка.Следующий() Тогда
Возврат Выборка.Склад;
КонецЕсли;
Возврат Справочники.Склады.ПустаяСсылка();
КонецФункции
#КонецОбласти
Подключение в модуле объекта реализации:
// Расширение, модуль объекта документа РеализацияТоваровУслуг.
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
&После("ОбработкаПроверкиЗаполнения")
Процедура Расш_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Проведение из формы: сообщение встанет у поля «Склад» или у ячейки строки
Расш_СкладыСервер.ПроверитьЗапретОтгрузки(ЭтотОбъект, "Склад", "Товары", Отказ);
КонецПроцедуры
&После("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Типовой ПередЗаписью при загрузке выходит по Возврат, а этот метод вызывается всё равно
Если ОбменДанными.Загрузка Или Отказ Тогда
Возврат;
КонецЕсли;
// Программное проведение (обработки, обмен с сайтом) проверку заполнения не вызывает
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Расш_СкладыСервер.ПроверитьЗапретОтгрузки(ЭтотОбъект, "Склад", "Товары", Отказ);
КонецЕсли;
КонецПроцедуры
#КонецЕсли
Срабатывает при создании нового заказа, если типовая логика оставила склад пустым.
// Расширение, модуль объекта документа ЗаказКлиента.
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
&После("ОбработкаЗаполнения")
Процедура Расш_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
// Склад уже пришел из основания, соглашения или статистики — не трогаем
Если ЗначениеЗаполнено(Склад) Или Не ЗначениеЗаполнено(Подразделение) Тогда
Возврат;
КонецЕсли;
СкладПодразделения = Расш_СкладыСервер.СкладПодразделения(Подразделение);
Если Не ЗначениеЗаполнено(СкладПодразделения) Тогда
Возврат;
КонецЕсли;
Склад = СкладПодразделения;
// Как в конце типовой ОбработкаЗаполнения: склад попадет в строки с товарами.
// Второй параметр Ложь: СкладПодразделения никогда не бывает группой.
СкладыСервер.ЗаполнитьСкладыВТабличнойЧасти(Склад, Ложь, Товары, Ложь);
КонецПроцедуры
#КонецЕсли
В УТ 11.4 склад с товаром можно пометить на удаление; проверка в расширении это запрещает.
// Расширение, модуль объекта справочника Склады.
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
&Перед("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ)
// Интересует только момент, когда склад помечают на удаление
Если ОбменДанными.Загрузка Или ЭтоГруппа Или ЭтоНовый() Или Не ПометкаУдаления Тогда
Возврат;
КонецЕсли;
Если ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ПометкаУдаления") Тогда
Возврат; // склад уже помечен, это обычная перезапись
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Остатки.Номенклатура КАК Номенклатура
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК Остатки
|ГДЕ
| Остатки.ВНаличииОстаток <> 0";
Запрос.УстановитьПараметр("Склад", Ссылка);
Если Не Запрос.Выполнить().Пустой() Тогда
ОбщегоНазначения.СообщитьПользователю(
НСтр("ru = 'На складе есть остатки товаров. Переместите или спишите их, затем помечайте склад на удаление.'"),
, , , Отказ);
КонецЕсли;
КонецПроцедуры
#КонецЕсли
ТоварыНаСкладах.Остатки без параметров — текущие остатки; РАЗРЕШЕННЫЕ в каждом запросе пакета нужен пользователям с ограничением по складам.ПроверитьЗапретОтгрузки принимает имена поля склада и табличной части и подключается к другим документам одной строкой: к перемещению — (ЭтотОбъект, "СкладОтправитель", "", Отказ), к заказу клиента — с "Товары" (учтите строки с флажком «Отменено»).Сообщено оставляет одно сообщение на склад, а не по сообщению на строку.ОбработкаПроверкиЗаполнения срабатывает при проведении из формы и подсвечивает поле, ПередЗаписью ловит программное проведение, где платформа проверку заполнения не вызывает. Дублей нет: при ошибке в первой проверке до записи дело не доходит.&После("ПередЗаписью") выполняется, даже если типовой метод вышел по ОбменДанными.Загрузка, поэтому условие повторяем.ПЕРВЫЕ 2 в СкладПодразделения — приём из типовой Справочники.Склады.СкладПоУмолчанию: два склада у подразделения — пустая ссылка.&Перед значение Отказ = Истина не отменяет типовой метод: он выполнится, но запись не пройдёт. Заменить типовой код позволяет &Вместо, править его середину — &ИзменениеИКонтроль; такие методы сверяют после каждого обновления. На ордерном складе перед пометкой проверьте и ТоварыКОтгрузке, ТоварыКПоступлению.РАЗРЕШЕННЫЕ, а у пользователя ограничение по складам.ОбработкаПроверкиЗаполнения, а нужен ещё вызов в ПередЗаписью.Включите флажок «Несколько складов» в настройках раздела «Склад и доставка» — без него команда открывает карточку единственного склада.
Да: остатки останутся, с даты начала изменится порядок документов. Закройте незавершённые поступления и отгрузки и ставьте дату не раньше последних документов. Заблокированные флажки открывает «Разрешить редактирование реквизитов».
Ограничение в группах доступа скрывает склад целиком. Чтобы склад оставался видимым, добавьте в начало ПроверитьЗапретОтгрузки выход по своей роли расширения: Если Пользователи.РолиДоступны("Расш_ОтгрузкаСЗакрытыхСкладов") Тогда Возврат; КонецЕсли;.
Справочник общий для УТ 11, КА 2 и ERP 2. В ERP и КА склад бывает цеховой кладовой, а в релизах 2.5 у магазинов есть настройки сборки и доставки заказов.
Перевод действующего склада на ордерную схему, разбивка на помещения и ячейки, свои правила отгрузки в обмене с сайтом или отдельный склад под остатки для маркетплейсов — задачи, где ошибка сразу бьёт по остаткам. Опишите задачу в разделе услуг по доработке 1С или разместите задачу: оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.