Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 сен 2021, 05:28

Обратиться в запросе к реквизиту справочника

Автор ivangrant, 26 мар 2019, 07:52

0 Пользователей и 1 гость просматривают эту тему.

ivangrant

Как обратиться в запросе к реквизиту справочника, где реквизит справочника - это перечисления?
Должен получится процесс записи в регистр бухглатерии в зависимости от вариант реквизита справочника.
Учсловно: если это комплект, значит запись будет по одной проводке на счет "Товары", если это деталь, то запись должна пойти по другой проводке на счёт "Материалы",
Чего я "наколдовал" (документ РасходнаяНакладная):
_______

Процедура ОбработкаПроведения(Отказ, Режим)

Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Записать();

//Блокировка = Новый БлокировкаДанных;
//ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
//ЭлементБлокировки.УстановитьЗначение("Качество", Справочники.Качество.НайтиПоКоду("1"));
//ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
//ЭлементБлокировки.ИсточникДанных = ДокументОбъект.ВозвратнаяТара;
//ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
//ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад");
//Блокировка.Заблокировать();

//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
| РасходнаяНакладнаяСписокНоменклатуры.Свойство КАК Свойство,
| РасходнаяНакладная.Склад,
| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК КоличествоДок,
| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК СуммаДок,
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры
|ПОМЕСТИТЬ Документ_ТЧ
|ИЗ
| Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная КАК РасходнаяНакладная
| ПО РасходнаяНакладнаяСписокНоменклатуры.Ссылка = РасходнаяНакладная.Ссылка
|ГДЕ
| РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
| РасходнаяНакладнаяСписокНоменклатуры.Свойство,
| РасходнаяНакладная.Склад,
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура,
| Свойство
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Документ_ТЧ.Номенклатура,
| Документ_ТЧ.Свойство,
| Документ_ТЧ.Склад,
| Документ_ТЧ.КоличествоДок,
| Документ_ТЧ.СуммаДок,
| УправленческийОборотыТовары.СуммаОборотДт КАК СуммаОборотДтТовары,
| УправленческийОборотыТовары.КоличествоОборотДт КАК КоличествоОборотДтТовары,
| ВЫБОР
| КОГДА УправленческийОборотыТовары.КоличествоОборотДт = 0
| ТОГДА 0
| ИНАЧЕ УправленческийОборотыТовары.СуммаОборотДт / УправленческийОборотыТовары.КоличествоОборотДт * УправленческийОборотыТовары.КоличествоОборотКт
| КОНЕЦ КАК СуммаОборотКтФормула,
| УправленческийОборотыМатериалы.СуммаОборотДт КАК СуммаОборотДтМатериалы,
| УправленческийОборотыМатериалы.КоличествоОборотДт КАК КоличествоОборотДтматериалы,
| ВЫБОР
| КОГДА Документ_ТЧ.Номенклатура.ВидНоменклатуры = ""Товары""
| ТОГДА УправленческийОборотыТовары.СуммаОборотДт
| ИНАЧЕ УправленческийОборотыМатериалы.СуммаОборотДт
| КОНЕЦ КАК СуммаОборотДтФормула,
| ВЫБОР
| КОГДА Документ_ТЧ.Номенклатура.ВидНоменклатуры = ""Товары""
| ТОГДА УправленческийОборотыТовары.КоличествоОборотДт
| ИНАЧЕ УправленческийОборотыМатериалы.КоличествоОборотДт
| КОНЕЦ КАК КоличествоОборотДтФормула
|ИЗ
| Документ_ТЧ КАК Документ_ТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Обороты(
| ,
| ,
| ,
| Счет = &Товары,
| &ВидыСубконто,
| (Субконто1, Субконто2) В
| (ВЫБРАТЬ
| Документ_ТЧ.Номенклатура,
| Документ_ТЧ.Свойство
| ИЗ
| Документ_ТЧ КАК Документ_ТЧ),
| ,
| ) КАК УправленческийОборотыТовары
| ПО Документ_ТЧ.Номенклатура = УправленческийОборотыТовары.Субконто1
| И Документ_ТЧ.Свойство = УправленческийОборотыТовары.Субконто2,
| РегистрБухгалтерии.Управленческий.Обороты(
| ,
| ,
| ,
| Счет = &Материалы,
| &ВидыСубконто,
| (Субконто1, Субконто2) В
| (ВЫБРАТЬ
| Документ_ТЧ.Номенклатура,
| Документ_ТЧ.Свойство
| ИЗ
| Документ_ТЧ КАК Документ_ТЧ),
| ,
| ) КАК УправленческийОборотыМатериалы";

ВидыСубконто = Новый Массив;
ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура);
ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.СвойствоТовара);
ВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склад);

Запрос.УстановитьПараметр("ВидыСубконто", ВидыСубконто);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Товары", ПланыСчетов.Управленческий.Товары);
Запрос.УстановитьПараметр("Материалы", ПланыСчетов.Управленческий.Материалы);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Нехватка = ВыборкаДетальныеЗаписи.КоличествоДок - ВыборкаДетальныеЗаписи.КоличествоОборотДт;
Если Нехватка > 0 Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно  " +ВыборкаДетальныеЗаписи.НоменклатураПред+" в количестве "+Нехватка;
Сообщение.Сообщить();
КонецЕсли;

Если НЕ Отказ Тогда

// регистр Управленческий
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки;

ЗначениеПеречисления = Перечисления.ВидыНоменклатуры.Комплектующие;

Если ВыборкаДетальныеЗаписи.Номенклатура.ВидНоменклатуры = ЗначениеПеречисления Тогда
Движение.СчетКт = ПланыСчетов.Управленческий.Материалы;
Иначе
Движение.СчетКт = ПланыСчетов.Управленческий.Товары;
КонецЕсли;
Движение.Период = Дата;

Движение.КоличествоКт = ВыборкаДетальныеЗаписи.КоличествоДок;

Себестоимость = ?(Движение.КоличествоКт = ВыборкаДетальныеЗаписи.КоличествоОборотДт, ВыборкаДетальныеЗаписи.СуммаОборотДт, ВыборкаДетальныеЗаписи.СуммаОборотДт / ВыборкаДетальныеЗаписи.КоличествоОборотДт*Движение.КоличествоКт);

Движение.Сумма = Себестоимость;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаДетальныеЗаписи.Субконто1;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаДетальныеЗаписи.Субконто1;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СвойствоТовара] = ВыборкаДетальныеЗаписи.Субконто2;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склад] = ВыборкаДетальныеЗаписи.Субконто3;


// регистр Управленческий
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели;
Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.Период = Дата;
Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаДок;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаДетальныеЗаписи.Субконто1;

КонецЕсли;

КонецЦикла;

//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА





//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

_________
Не могу в запросе получить значение реквизита. Как это можно сделать?

alex0402

Цитата: ivangrant от 26 мар 2019, 07:52Как обратиться в запросе к реквизиту справочника

РасходнаяНакладнаяСписокНоменклатуры.Ссылка.ИмяРеквизита КАК ИмяРеквизита

ну и далее в запросе использовать ИмяРеквизита...

ЗЫ.
В Конструкции СГРУППИРОВАТЬ ПО естественно добавится строчка
РасходнаяНакладнаяСписокНоменклатуры.Ссылка
Спасибо за Сказать спасибо

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск