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

Публикация № 1019451

Программирование - Практика программирования

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

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

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

2

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Eremkin 14.03.19 10:45 Сейчас в теме
СкладыМассив.Добавить(Справочники.Склады.НайтиПоНаименованию("Оптовый склад").Ссылка);

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

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

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

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

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

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


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

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


Тут и так возвращается Ссылка, если найдено. Дополнительная ".Ссылка" +1 скрытый серверный вызов
2. klepser 4 14.03.19 13:31 Сейчас в теме
Делалось все на коленке. Менеджеру нужно было срочно. За замечание спасибо. Появится время переделаю.
4. Eremkin 14.03.19 17:57 Сейчас в теме
(2)Это еще останется надолго :)
cleaner_it; +1 Ответить
3. Sakhatyr_Vitaliy 14.03.19 15:38 Сейчас в теме
Вместо:

Вместо



Вставляем:

Вставляем


А ещё лучше забыть про "НайтиПоНаименованию" или "НайтиПоКоду", а работать только с метаданными (то есть добавить справочник/РС).

Делали не через расширение? Просто сняли с поддержки?
5. klepser 4 15.03.19 08:49 Сейчас в теме
Не через расширение. С поддержки база снята. Доработок много в базе.
Оставьте свое сообщение