Как в 1С:ERP реализовать выбор складов из разных групп в табличной части документа?

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

В типовой конфигурации 1С:ERP Управление предприятием пользователи часто сталкиваются с ограничением: если в шапке документа (например, «Заказ клиента» или «Заказ на сборку») выбрана группа складов, то в табличной части в колонке Склад можно выбрать только те склады, которые входят в эту конкретную группу. Это продиктовано логикой обеспечения и контроля остатков, но в реальных бизнес-процессах, таких как работа с давальческим сырьем или отбор проб на склад качества, это ограничение может мешать работе.

В рамках данной статьи мы подробно разберем, почему система ведет себя именно так, и рассмотрим несколько способов решения задачи: от правильной настройки нормативно-справочной информации (НСИ) до программного вмешательства в механизмы конфигурации.

Почему система ограничивает выбор склада?

Прежде чем «ломать» типовой механизм, проанализируем ситуацию и выясним причину такого поведения системы. Ограничение выбора рамками группы — это не ошибка, а важная часть архитектуры 1С:ERP:

  1. Контроль доступности (ATP): Когда в шапке указана группа, система рассчитывает свободные остатки и графики поступления сразу по всем складам этой группы. Если разрешить выбор склада «со стороны», механизмы автоматического резервирования могут выдать некорректный результат, так как они не учитывают этот склад в текущем контексте планирования.
  2. Схемы обеспечения: Склады объединяются в логистические группы для настройки правил пополнения запасов. Выбор склада вне группы может нарушить цепочку автоматического формирования заказов поставщикам или на перемещение.
  3. Права доступа (RLS): В крупных компаниях права доступа часто разграничиваются по группам складов. Снятие фильтра в форме может привести к тому, что пользователь выберет склад, на который у него нет прав, и документ просто не проведется — для контроля прав подойдёт утилита для анализа прав доступа и ограничений RLS.

Решение 1: Использование иерархии групп (Административный метод)

Рассмотрим наиболее «красивый» способ, который не требует изменения программного кода. Если нам необходимо выбирать склады из разных веток, мы можем изменить структуру справочника Склады.

Разберем по шагам:

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

Решение 2: Настройка функциональных опций

Проанализируем настройки системы. Иногда поле выбора склада в табличной части вообще недоступно или жестко заблокировано. Убедимся, что включена возможность работы с несколькими складами в одном документе.

Перейдем в раздел НСИ и администрирование -> Настройка разделов -> Продажи (или Склад и доставка). Проверим наличие галочки Отгрузка с нескольких складов. Без этой опции система всегда будет требовать указания конкретного склада в шапке и не позволит детализировать его в строках.

Решение 3: Программное отключение фильтра (для программистов)

Если бизнес-процесс категорически не укладывается в рамки групп (как в примере с давальческим сырьем и пробами), нам придется прибегнуть к расширению конфигурации. Основная логика фильтрации сосредоточена в модулях форм документов и специализированных процедурах заполнения. Для этой задачи есть расширение для настройки видимости реквизитов формы.

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

Пример кода для расширения формы документа:


&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Получаем текущие параметры выбора склада в ТЧ
    НовыеПараметры = Новый Массив;
    
    // Если нужно полностью убрать связь с группой из шапки, 
    // мы очищаем массив параметров выбора или удаляем конкретный фильтр
    Элементы.ТоварыСклад.ПараметрыВыбора = Новый ФиксированныйМассив(НовыеПараметры);
    
    // Если нужно добавить свои условия (например, исключить только архивные склады)
    ЭлементОтбора = Новый ПараметрВыбора("Отбор.ПометкаУдаления", Ложь);
    НовыеПараметры.Добавить(ЭлементОтбора);
    
    Элементы.ТоварыСклад.ПараметрыВыбора = Новый ФиксированныйМассив(НовыеПараметры);

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

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

Проанализируем типовую процедуру в модуле менеджера или модуле объекта, отвечающую за проверку заполнения. При использовании ОбработкаПроверкиЗаполнения система может выдать ошибку, если склад строки не принадлежит группе из шапки — решить проблему поможет конструктор пользовательских проверок и автозаполнения реквизитов. В этом случае потребуется перехватить эту проверку в расширении:


&ВКлиенте
Процедура ТоварыСкладНачалоВыбораПосле(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    // Динамически меняем отбор перед открытием формы выбора
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", Новый Структура("ВыборГруппыСкладов", Ложь));
    
    // Это позволит выбирать любой склад, игнорируя иерархию группы из шапки
    ОткрытьФорму("Справочник.Склады.ФормаВыбора", ПараметрыФормы, Элемент);
    СтандартнаяОбработка = Ложь;
КонецПроцедуры

Риски и технические последствия

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

  1. Проведение по регистрам: В 1С:ERP многие регистры накопления (например, ЗапасыИПотребности) имеют измерения, связанные с группами складов. Если склад в строке не соответствует логике группы, отчеты типа «Остатки и доступность товаров» могут показывать противоречивые данные.
  2. Серийный учет: Если на одном складе используется учет по сериям, а на другом (из другой группы) — нет, то при смене склада в строке нужно принудительно вызывать пересчет доступности серий. Для этого используется форма ЗапросКоличестваИСерий. Потребуется проверить, корректно ли она подхватывает новый контекст склада.
  3. Обновление конфигурации: Механизмы работы со складами в ERP 2.5.11 и 2.5.12 претерпели значительные изменения. Любая «ломка» типового кода в этой области может привести к конфликтам при обновлении на новые релизы, где работа с давальцами и складами качества уже реализована более гибко.

Итог

Для реализации возможности выбора любого склада в табличной части документа 1С:ERP, мы рекомендуем следующий порядок действий:

1. Сначала попробуйте изменить структуру справочника, объединив нужные ветки под одну общую группу с разрешением использования в заказах. Это самый безопасный путь.

2. Если это невозможно, используйте расширение формы для программного снятия ПараметровВыбора у элемента ТЧ Склад. При этом обязательно протестируйте проведение документа по регистру СвободныеОстатки, чтобы убедиться, что система видит движения по «внеплановому» складу.

3. Помните о RLS: если в системе включено разграничение прав, убедитесь, что у кладовщиков и менеджеров есть права на просмотр и отгрузку со всех складов, которые теперь стали доступны для выбора — для этой задачи пригодится отчет для проверки и анализа прав доступа RLS.

← На главную