В начало

Остатки номенклатуры по подразделениям

 

            В конфигурации имеются: справочники «Номенклатура» и «Подразделения», документ «Расходная накладная» и реестры накопления «Остатки номенклатуры» и «Остатки по подразделениям».

            Нужно при выборе позиций номенклатуры Остатки номенклатуры по подразделениям отображать в форме выбора общие остатки, остатки по отделу закупок и остатки по отделу, являющемся текущим поставщиком.

 

Таблица. Измерения и ресурсы регистров накопления

Измерения

Ресурсы

Регистр «Остатки номенклатуры»

Номенклатура

Количество

Регистр «Остатки по подразделениям»

Подразделение

Номенклатура

Количество

 

            В документе Расходная накладная создаем кнопку и прописываем код для вызова формы выбора справочника Номенклатура.

Рис. Добавление кнопки на форму документа «Расходная накладная»

 

            Далее пишем код вызова формы выбора справочника Номенклатура как действие кнопки.

Листинг. Процедура «Открыть форму выбора»

&НаКлиенте

Процедура ОткрытьФормуВыбора(Команда)

ПараметрыФормы = Новый Структура("РежимВыбора,ЗакрыватьПриВыборе, МножественныйВыбор", Истина, Истина, Истина);

Владелец=ЭлементыписокНоменклатуры;

Ф=ПолучитьФорму("Справочникоменклатура.ФормаВыбора", ПараметрыФормы, Владелец);

Ф.Списокараметры.УстановитьЗначениеПараметра("Подразделение", Объект.Поставщик);

Ф.Открыть();       

КонецПроцедуры

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

 

Листинг. Обработка выбора таблицы списка номенклатуры

&НаКлиенте

Процедура СписокНоменклатурыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда

Для каждого ТекЗнач Из ВыбранноеЗначение Цикл

Стр=ЭлементыписокНоменклатуры.ТекущиеДанные;

Строменклатура=ТекЗнач;

ЭлементыписокНоменклатуры.ДобавитьСтроку();

КонецЦикла;

КонецЕсли;

КонецПроцедуры

 

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

Рис. Свойства реквизита «Список» формы выбора справочника «Номенклатура»

 

            Откроется конструктор запроса, в котором нужно организовать объединение 3-х вложенных запросов.

 

Листинг. Код объединения вложенных запросов

ВЫБРАТЬ

      ВложенныйЗапросаименование КАК Наименование,

      ВложенныйЗапросоличествоОстаток,

      ВложенныйЗапросодразделение

ИЗ

      (ВЫБРАТЬ

            СправочникНоменклатурасылка КАК Ссылка,

            СправочникНоменклатураерсияДанных КАК ВерсияДанных,

            СправочникНоменклатураометкаУдаления КАК ПометкаУдаления,

            СправочникНоменклатураодитель КАК Родитель,

            СправочникНоменклатуратоГруппа КАК ЭтоГруппа,

            СправочникНоменклатураод КАК Код,

            СправочникНоменклатурааименование КАК Наименование,

            СправочникНоменклатураредопределенный КАК Предопределенный,

            СправочникНоменклатурамяПредопределенныхДанных КАК ИмяПредопределенныхДанных,

            ОстаткиНоменклатурыОстаткиоличествоОстаток КАК КоличествоОстаток,

            "Общий остаток" КАК Подразделение

      ИЗ

            Справочникоменклатура КАК СправочникНоменклатура

                  ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакоплениястаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки

                  ПО СправочникНоменклатурасылка = ОстаткиНоменклатурыОстатки.Номенклатура) КАК ВложенныйЗапрос

 

ОБЪЕДИНИТЬ ВСЕ

 

ВЫБРАТЬ

      ВложенныйЗапросаименование,

      ВложенныйЗапросоличествоОстаток,

      ВложенныйЗапросодразделение

ИЗ

      (ВЫБРАТЬ

            СправочникНоменклатурасылка КАК Ссылка,

            СправочникНоменклатураерсияДанных КАК ВерсияДанных,

            СправочникНоменклатураометкаУдаления КАК ПометкаУдаления,

            СправочникНоменклатураодитель КАК Родитель,

            СправочникНоменклатуратоГруппа КАК ЭтоГруппа,

            СправочникНоменклатураод КАК Код,

            СправочникНоменклатурааименование КАК Наименование,

            СправочникНоменклатураредопределенный КАК Предопределенный,

            СправочникНоменклатурамяПредопределенныхДанных КАК ИмяПредопределенныхДанных,

            ОстаткиПоПодразделениямОстаткиодразделение КАК Подразделение,

            ОстаткиПоПодразделениямОстаткиоличествоОстаток КАК КоличествоОстаток

      ИЗ

            Справочникоменклатура КАК СправочникНоменклатура

                  ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакоплениястаткиПоПодразделениям.Остатки(, Подразделение.Наименование = "Отдел закупок") КАК ОстаткиПоПодразделениямОстатки

                  ПО СправочникНоменклатурасылка = ОстаткиПоПодразделениямОстатки.Номенклатура) КАК ВложенныйЗапрос

 

ОБЪЕДИНИТЬ ВСЕ

 

ВЫБРАТЬ

      ВложенныйЗапросаименование,

      ВложенныйЗапросоличествоОстаток,

      ВложенныйЗапросодразделение

ИЗ

      (ВЫБРАТЬ

            СправочникНоменклатурасылка КАК Ссылка,

            СправочникНоменклатураерсияДанных КАК ВерсияДанных,

            СправочникНоменклатураометкаУдаления КАК ПометкаУдаления,

            СправочникНоменклатураодитель КАК Родитель,

            СправочникНоменклатуратоГруппа КАК ЭтоГруппа,

            СправочникНоменклатураод КАК Код,

            СправочникНоменклатурааименование КАК Наименование,

            СправочникНоменклатураредопределенный КАК Предопределенный,

            СправочникНоменклатурамяПредопределенныхДанных КАК ИмяПредопределенныхДанных,

            ОстаткиПоПодразделениямОстаткиоличествоОстаток КАК КоличествоОстаток,

            ОстаткиПоПодразделениямОстаткиодразделение КАК Подразделение

      ИЗ

            Справочникоменклатура КАК СправочникНоменклатура

                  ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакоплениястаткиПоПодразделениям.Остатки(, Подразделение = &Подразделение) КАК ОстаткиПоПодразделениямОстатки

                  ПО СправочникНоменклатурасылка = ОстаткиПоПодразделениямОстатки.Номенклатура) КАК ВложенныйЗапрос

 

УПОРЯДОЧИТЬ ПО

      Наименование

 

            Далее запускаем режим 1Средприятие, открываем документ Расходная накладная, вызываем формы выбора. Сравниваем с регистрами накоплений, вроде все правильно показывается.

Рис. Форма выбора с остатками номенклатуры по подразделениям

 

            Далее выбираем на этой форме некоторые позиции и нажимаем кнопку «Выбрать». К сожалению выбранные позиции номенклатуры НЕ перенеслись в таблицу «Список номенклатуры» на форме документа «Расходная накладная».

            Ставим прерывание в процедуре «Обработка выбора» и смотрим переменную «Выбранное значение». Выделяем ее и вычисляем выражение.

 

Рис. Вычисленное выражение для переменной «Выбранное значение»

 

            Вроде все правильно, должен возвращаться массив значений выбранных позиций номенклатуры. Жмем на карандаш и получаем далее значение.

 

Рис. Дальнейший расчет значения

 

            Странно, опять нет выбранных позиций номенклатуры. Жмем опять на карандаш.

 

Рис. Дальнейший расчет карандашом

 

            Все, приехали! Номенклатуры нет, а следовательно обрабатывать данное «Выбранное значение» в обработке выбора совершенно бессмысленно. И, наконец, становится понятно почему собственно таблица «Список номенклатуры» на форме документа «Расходная накладная» не заполнилась выбранными значениями.

 

            ПРИМЕЧАНИЕ: данный эксперимент проводился на версии 8.3, релиз 8.3.6.2014, основной режим запуска «Управляемое приложение», режим совместимости «Такси».

 

            ВЫВОДЫ: таким образом вложенные запросы нельзя использовать в форме выбора справочника «Номенклатура», т.к. при дальнейшем выборе значений форме-владельцу не возвращаются выбранные позиции в виде массива выбранных значений, а вместо этого массив неких чисел.