Остатки в подборе товаров в документ продажи по нескольким складам



Остатки в подборе товаров в документ продажи по нескольким складам без включенной опции «Реализация товаров с нескольких складов».

Организация среднего звена, старший менеджер говорит, что реализация товара должна происходить только с оптового склада, но в центральном офисе есть еще розничные точки. Старший менеджер хочет при подборе товара видеть остатки не только по оптовому складу, но и остатки розничных точек в центре, для перемещения их на склад опта  в случаи нехватки товара. При этом в ут 11 нельзя включать реализацию с нескольких складов.

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

Первое что нужно сделать это заставить думать программу, что мы используем реализацию с нескольких складов, за которую отвечает  опция «Реализация товаров с нескольких складов» в настройках продаж. Делается это через функцию «ТекстЗапросаСпискаФормыПодбора» . Функция формирует текст  запроса  динамического списка.  В данной функции  в области «ПодставитьЗначенияПараметровВШаблонТекстаЗапроса» Ищем строчку: ПараметрыЗамены.Вставить("НесколькоСкладов",НесколькоСкладов);

Если переменная НесколькоСкладов = Истина то в запросе меняется условие  с  Т.Склад =&Склад на Т.Склад В(&Склад).

Для того чтобы программа понимала что используется несколько складов  приведем код к следующему виду:

Если    Форма.Склады.Количество() = 1  Тогда
Если Форма.Склады[0].Значение = Справочники.Склады.НайтиПоНаименованию("Оптовый склад").Ссылка  Тогда
ПараметрыЗамены.Вставить("НесколькоСкладов",Истина);
Иначе
ПараметрыЗамены.Вставить("НесколькоСкладов",НесколькоСкладов);
КонецЕсли;
Иначе
ПараметрыЗамены.Вставить("НесколькоСкладов",НесколькоСкладов);
КонецЕсли;

В место «оптовый склад» указать склад, с которого менеджеры работают с безнальщиками.

Разберем данный код.

Условие  «Если    Форма.Склады.Количество() = 1  » срабатывает тогда когда подбор товаров используется в документе закупки или в документе продажи не выбран склад.

Условие «Если Форма.Склады[0].Значение = Справочники.Склады.НайтиПоНаименованию("Оптовый склад").Ссылка» срабатывает когда менеджер по работе с  безнальщиками  выбирает «Оптовый склад», соответственно параметр НесколькоСкладов принудительно устанавливается в значение истина .

Далее ищем процедуру «ПриСозданииФормыПодбораНаСервере» в данной процедуре нужна область  «УстановитьСкладскиеНастройкиПоПараметрам» .

В данной области  ищем :

// Если склад не выбран, то заполнить список складов всеми разрешенными складами.
Если Форма.Склады.Количество() = 0
И Параметры.Свойство("ОстаткиПоВсемСкладам")
И Параметры.ОстаткиПоВсемСкладам Тогда
Форма.ОстаткиПоВсемСкладам = Истина;
ЗапросПоСкладам = Новый Запрос(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Склады.Ссылка КАК Склад
|ИЗ
| Справочник.Склады КАК Склады
|ГДЕ
| (Не Склады.ЭтоГруппа)");
Форма.Склады.ЗагрузитьЗначения(ЗапросПоСкладам.Выполнить().Выгрузить().ВыгрузитьКолонку("Склад"));
КонецЕсли;

вместо :

Если Форма.Склады.Количество() = 0 Тогда

СкладПараметр = Справочники.Склады.ПустаяСсылка();

ИначеЕсли Форма.Склады.Количество() = 1 Тогда

СкладПараметр = Форма.Склады[0].Значение;

Иначе

СкладПараметр = Форма.Склады.ВыгрузитьЗначения();

КонецЕсли;

вставляем :

Если    Форма.Склады.Количество() = 1  Тогда

Если Форма.Склады[0].Значение = Справочники.Склады.НайтиПоНаименованию("Оптовый склад").Ссылка Тогда

СкладыМассив = Новый Массив;

СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию("Оптовый склад").Ссылка);

СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию("Уличный склад").Ссылка);

СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию("Магазин Павильон").Ссылка);

СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию("Магазин Краски").Ссылка);

СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию("Магазин 2-й этаж (касса 3, касса 4)").Ссылка);

СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию("Магазин 2-й этаж").Ссылка);

СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию("Магазин 1-й этаж").Ссылка);

СкладПараметр = СкладыМассив;

Иначе

Если Форма.Склады.Количество() = 0 Тогда

СкладПараметр = Справочники.Склады.ПустаяСсылка();

ИначеЕсли Форма.Склады.Количество() = 1 Тогда

СкладПараметр = Форма.Склады[0].Значение;

Иначе

СкладПараметр = Форма.Склады.ВыгрузитьЗначения();

КонецЕсли;



КонецЕсли;

иначе

Если Форма.Склады.Количество() = 0 Тогда

СкладПараметр = Справочники.Склады.ПустаяСсылка();

ИначеЕсли Форма.Склады.Количество() = 1 Тогда

СкладПараметр = Форма.Склады[0].Значение;

Иначе

СкладПараметр = Форма.Склады.ВыгрузитьЗначения();

КонецЕсли;

КонецЕсли;

 

Разберем код.

Условие «Если    Форма.Склады.Количество() = 1 » проверяет выбран ли склад в документе продажи или подбор используется в документах закупки.

Условие «Если Форма.Склады[0].Значение = Справочники.Склады.НайтиПоНаименованию("Оптовый склад").Ссылка» проверяет, выбран ли оптовый склад.

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

После данных манипуляций получаем следующее.  При использовании подбора в документ закупки, исправления, внесенные в модуль, не отрабатывают. Также при использовании  подбора в документ  продажи без выбранного склада, исправления также не отработают. Но если в документе продажи установить  оптовый склад, то в подборе будут отображаться остатки не только по оптовому складу, но и по розничным, которые добавлены  в СкладыМассив. 

P. S. Строго не судите, это первая моя статья. Код тоже не уникален и, возможно, гуру в 1С сделал бы лучше. Спасибо, что дочитали до конца.   

5 Comments

  1. Eremkin
    СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию(«Оптовый склад»).Ссылка);

    СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию(«Уличный склад»).Ссылка);

    СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию(«Магазин Павильон»).Ссылка);

    СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию(«Магазин Краски»).Ссылка);

    СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию(«Магазин 2-й этаж (касса 3, касса 4)»).Ссылка);

    СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию(«Магазин 2-й этаж»).Ссылка);

    СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию(«Магазин 1-й этаж»).Ссылка);

    Показать

    Сделали хотя бы тогда найти по коду и в комментариях наименование склада. Или еще лучше свой справочник с настройками, где в последующем можно будет добавлять/удалять элементы. А то получается переименовали склад и ищи-свищи по коду.

    Справочники.Склады.НайтиПоНаименованию(«Оптовый склад»)

    Тут и так возвращается Ссылка, если найдено. Дополнительная «.Ссылка» +1 скрытый серверный вызов

    Reply
  2. klepser

    Делалось все на коленке. Менеджеру нужно было срочно. За замечание спасибо. Появится время переделаю.

    Reply
  3. Sakhatyr_Vitaliy
    Reply
  4. Eremkin

    (2)Это еще останется надолго 🙂

    Reply
  5. klepser

    Не через расширение. С поддержки база снята. Доработок много в базе.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *