Организация среднего звена, старший менеджер говорит, что реализация товара должна происходить только с оптового склада, но в центральном офисе есть еще розничные точки. Старший менеджер хочет при подборе товара видеть остатки не только по оптовому складу, но и остатки розничных точек в центре, для перемещения их на склад опта в случаи нехватки товара. При этом в ут 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С сделал бы лучше. Спасибо, что дочитали до конца.