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