В начало

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

 

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

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

 

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

Измерения

Ресурсы

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

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

Количество

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

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

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

Количество

 

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

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

 

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

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

&НаКлиенте

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

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

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

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

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

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

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

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

 

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

&НаКлиенте

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

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

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

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

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

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

КонецЦикла;

КонецЕсли;

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

 

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

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

 

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

 

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

ВЫБРАТЬ

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

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

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

ИЗ

      (ВЫБРАТЬ

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

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

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

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

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

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

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

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

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

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

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

      ИЗ

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

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

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

 

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

 

ВЫБРАТЬ

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

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

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

ИЗ

      (ВЫБРАТЬ

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

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

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

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

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

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

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

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

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

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

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

      ИЗ

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

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

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

 

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

 

ВЫБРАТЬ

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

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

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

ИЗ

      (ВЫБРАТЬ

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

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

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

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

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

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

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

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

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

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

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

      ИЗ

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

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

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

 

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

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

 

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

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

 

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

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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