В процессе автоматизации розничной торговли (например, строительными материалами) часто возникает необходимость работы нескольких рабочих мест в рамках одного магазина, где каждый продавец или касса должны списывать товар со своего склада (торговый зал, склад крупногабарита, уличная площадка). Однако при стандартной настройке пользователи сталкиваются с ситуацией, когда в окне подбора остатки видны по всем складам, а при переносе товара в форму РМК (Рабочее место кассира) программа жестко привязывается к одному складу и показывает нулевой остаток для остальных.
Разберем причины такого поведения платформы и конфигурации 1С:Розница, а также проанализируем варианты решения задачи — от административных и методических настроек до программной доработки.
Проанализируем логику работы типового механизма РМК:
СкладПродажи берется напрямую из карточки элемента справочника Магазины.НастройкиПользователей в РМК по умолчанию игнорируется.Рассмотрим самый быстрый штатный способ обхода ограничения без изменения исходного программного кода. Если для каждого склада завести отдельный элемент в справочнике Магазины, поведение системы нормализуется.
Магазины отдельные карточки под каждую торговую площадку или отдел.Такой подход полностью поддерживается типовым обновлением, однако требует дополнительного контроля при перемещении товаров между магазинами и формировании сводной отчетности.
Если разделение на разные магазины неудобно для бизнес-процессов компании, разберем программный способ решения задачи. Добавим функционал, который определяет склад списания на основании персональных настроек выбранного продавца.
Реализуем доработку в форме РМКУправляемыйРежим (рекомендуется выносить данный код в расширение конфигурации):
ОсновнойСкладПродажи для текущего пользователя и магазина:
Функция ПолучитьСкладПоПродавцуНаСервере(Магазин, Продавец)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Пользователи.Ссылка КАК Ссылка
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.ФизическоеЛицо = &ФизическоеЛицо";
Запрос.УстановитьПараметр("ФизическоеЛицо", Продавец);
ВыборкаПользователя = Запрос.Выполнить().Выбрать();
Если Не ВыборкаПользователя.Следующий() Тогда
Возврат Магазин.СкладПродажи;
КонецЕсли;
ТекПользователь = ВыборкаПользователя.Ссылка;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НастройкиПользователей.Значение КАК Значение
|ИЗ
| РегистрСведений.НастройкиПользователей КАК НастройкиПользователей
|ГДЕ
| НастройкиПользователей.Пользователь = &Пользователь
| И НастройкиПользователей.Магазин = &Магазин
| И НастройкиПользователей.Настройка = &Настройка";
Запрос.УстановитьПараметр("Магазин", Магазин);
Запрос.УстановитьПараметр("Пользователь", ТекПользователь);
Запрос.УстановитьПараметр("Настройка", ПланыВидовХарактеристик.НастройкиПользователей.ОсновнойСкладПродажи);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() И ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.Значение) Тогда
Возврат ВыборкаДетальныеЗаписи.Значение;
Иначе
Возврат Магазин.СкладПродажи;
КонецЕсли;
КонецФункции
ТоварыПриИзмененииНоменклатуры переопределим склад для добавляемой строки табличной части:
СтрокаТабличнойЧасти.Склад = ПолучитьСкладПоПродавцуНаСервере(Объект.Магазин, Объект.Продавец);
В результате при подборе и сканировании номенклатуры в чек будет подставляться склад, закрепленный за конкретным продавцом в регистре НастройкиПользователей.
Рассмотрим типовые механизмы, которые позволяют организовать продажи с нескольких складов без вмешательства в исходный программный код:
РасходныйОрдерНаТовары непосредственно кладовщиками.ЗаказПокупателя, где построчно указывает склады отгрузки для каждого товара. Кассир в РМК находит готовый заказ, принимает оплату и закрывает чек.Выбор оптимального способа зависит от бизнес-процессов торговой точки: если требуется быстрая продажа с кассы «в одно действие», используем доработку через расширение или разделение структуры на магазины; при сложной логистике и физическом разделении зон хранения стройматериалов целесообразно переходить на ордерную схему.