Утро доброе всем! Помогите пожалуйста упростить процедуру, пытаюсь избавиться от ВТ, но получается ахинея какая-то(((
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ТоварыНаСкладах.Записывать = Истина;
Движения.ТоварыНаСкладах.Очистить();
Движения.СтоимостьТовара.Записывать = Истина;
Движения.СтоимостьТовара.Очистить();
Движения.Продажи.Записывать = Истина;
Движения.Продажи.Очистить();
Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Очистить();
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество) КАК КоличествоВДокументе,
| СУММА(РеализацияТоваровТовары.Сумма) КАК СуммаВДокументе,
| РеализацияТоваровТовары.НаборСвойств
|ПОМЕСТИТЬ НоменклатураДокумента
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.НаборСвойств";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
Запрос2 = Новый Запрос;
Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос2.Текст = "ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура,
| НоменклатураДокумента.КоличествоВДокументе,
| НоменклатураДокумента.СуммаВдокументе,
| ЕСТЬNULL(СтоимостьТовараОстатки.СтоимостьОстаток, 0) КАК Стоимость,
| ЕСТЬNULL(СтоимостьТовараОстатки.КоличествоОстаток, 0) КАК Количество,
| ТоварыНаСкладахОстатки.НаборСвойств
|ИЗ
| НоменклатураДокумента КАК НоменклатураДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьТовара.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)) КАК СтоимостьТовараОстатки
| ПО НоменклатураДокумента.Номенклатура = СтоимостьТовараОстатки.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
| ПО НоменклатураДокумента.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура";
Движения.СтоимостьТовара.Записать();
Движения.ТоварыНаСкладах.Записать();
Результат = Запрос2.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Количество = 0 Тогда
Стоимость = 0;
Иначе
СтоимостьТовара = Выборка.Стоимость / Выборка.Количество;
КонецЕсли;
// регистр ТоварыНаСкладах Расход
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.НаборСвойств = Выборка.НаборСвойств;
Движение.Склад = Склад;
Движение.Количество = Выборка.КоличествоВДокументе;
// регистр СтоимостьТовара Расход
Движение = Движения.СтоимостьТовара.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Количество = Выборка.КоличествоВДокументе;
Движение.Стоимость = СтоимостьТовара*Выборка.КоличествоВДокументе;
// регистр Продажи
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Контрагент = Контрагент;
Движение.Склад = Склад;
Движение.Количество = Выборка.КоличествоВДокументе;
Движение.Сумма = Выборка.СуммаВДокументе;
Движение.Стоимость = СтоимостьТовара*Выборка.КоличествоВДокументе;
// регистр Управленческий
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.ОсновнойПлан.ДебиторскаяЗадолженность;
Движение.СчетКт = ПланыСчетов.ОсновнойПлан.Капитал;
Движение.Период = Дата;
Движение.Сумма = Выборка.СуммаВДокументе;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.ОсновнойПлан.Капитал;
Движение.СчетКт = ПланыСчетов.ОсновнойПлан.Товары;
Движение.Период = Дата;
Движение.Сумма = СтоимостьТовара * Выборка.КоличествоВДокументе;
Движение.КоличествоКт = Выборка.КоличествоВДокументе;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
КонецЦикла;
Движения.Записать();
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
Запрос3 = Новый Запрос;
Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос3.Текст ="ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
|ГДЕ
| ТоварыНаСкладахОстатки.КоличествоОстаток < 0";
Запрос3.УстановитьПараметр("Склад", Склад);
Результат = Запрос3.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Не хватает "+Строка(-Выборка.КоличествоОстаток)+" единиц товара """+Выборка.Номенклатура+"""";
Сообщение.Сообщить();
Отказ = Истина;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ТоварыНаСкладах.Записывать = Истина;
Движения.ТоварыНаСкладах.Очистить();
Движения.СтоимостьТовара.Записывать = Истина;
Движения.СтоимостьТовара.Очистить();
Движения.Продажи.Записывать = Истина;
Движения.Продажи.Очистить();
Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Очистить();
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество) КАК КоличествоВДокументе,
| СУММА(РеализацияТоваровТовары.Сумма) КАК СуммаВДокументе,
| РеализацияТоваровТовары.НаборСвойств
|ПОМЕСТИТЬ НоменклатураДокумента
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.НаборСвойств";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
Запрос2 = Новый Запрос;
Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос2.Текст = "ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура,
| НоменклатураДокумента.КоличествоВДокументе,
| НоменклатураДокумента.СуммаВдокументе,
| ЕСТЬNULL(СтоимостьТовараОстатки.СтоимостьОстаток, 0) КАК Стоимость,
| ЕСТЬNULL(СтоимостьТовараОстатки.КоличествоОстаток, 0) КАК Количество,
| ТоварыНаСкладахОстатки.НаборСвойств
|ИЗ
| НоменклатураДокумента КАК НоменклатураДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьТовара.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)) КАК СтоимостьТовараОстатки
| ПО НоменклатураДокумента.Номенклатура = СтоимостьТовараОстатки.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
| ПО НоменклатураДокумента.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура";
Движения.СтоимостьТовара.Записать();
Движения.ТоварыНаСкладах.Записать();
Результат = Запрос2.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Количество = 0 Тогда
Стоимость = 0;
Иначе
СтоимостьТовара = Выборка.Стоимость / Выборка.Количество;
КонецЕсли;
// регистр ТоварыНаСкладах Расход
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.НаборСвойств = Выборка.НаборСвойств;
Движение.Склад = Склад;
Движение.Количество = Выборка.КоличествоВДокументе;
// регистр СтоимостьТовара Расход
Движение = Движения.СтоимостьТовара.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Количество = Выборка.КоличествоВДокументе;
Движение.Стоимость = СтоимостьТовара*Выборка.КоличествоВДокументе;
// регистр Продажи
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Контрагент = Контрагент;
Движение.Склад = Склад;
Движение.Количество = Выборка.КоличествоВДокументе;
Движение.Сумма = Выборка.СуммаВДокументе;
Движение.Стоимость = СтоимостьТовара*Выборка.КоличествоВДокументе;
// регистр Управленческий
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.ОсновнойПлан.ДебиторскаяЗадолженность;
Движение.СчетКт = ПланыСчетов.ОсновнойПлан.Капитал;
Движение.Период = Дата;
Движение.Сумма = Выборка.СуммаВДокументе;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.ОсновнойПлан.Капитал;
Движение.СчетКт = ПланыСчетов.ОсновнойПлан.Товары;
Движение.Период = Дата;
Движение.Сумма = СтоимостьТовара * Выборка.КоличествоВДокументе;
Движение.КоличествоКт = Выборка.КоличествоВДокументе;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
КонецЦикла;
Движения.Записать();
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
Запрос3 = Новый Запрос;
Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос3.Текст ="ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
|ГДЕ
| ТоварыНаСкладахОстатки.КоличествоОстаток < 0";
Запрос3.УстановитьПараметр("Склад", Склад);
Результат = Запрос3.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Не хватает "+Строка(-Выборка.КоличествоОстаток)+" единиц товара """+Выборка.Номенклатура+"""";
Сообщение.Сообщить();
Отказ = Истина;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
По теме из базы знаний
Найденные решения
(0) Сам запрос объединенный, если просто объединять, то как-то так будет выглядеть:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество) КАК КоличествоВДокументе,
| СУММА(РеализацияТоваровТовары.Сумма) КАК СуммаВДокументе,
| РеализацияТоваровТовары.НаборСвойств
|ПОМЕСТИТЬ НоменклатураДокумента
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.НаборСвойств
|;
|ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура,
| НоменклатураДокумента.КоличествоВДокументе,
| НоменклатураДокумента.СуммаВдокументе,
| ЕСТЬNULL(СтоимостьТовараОстатки.СтоимостьОстаток, 0) КАК Стоимость,
| ЕСТЬNULL(СтоимостьТовараОстатки.КоличествоОстаток, 0) КАК Количество,
| ТоварыНаСкладахОстатки.НаборСвойств
|ИЗ
| НоменклатураДокумента КАК НоменклатураДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьТовара.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)) КАК СтоимостьТовараОстатки
| ПО НоменклатураДокумента.Номенклатура = СтоимостьТовараОстатки.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
| ПО НоменклатураДокумента.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура";
Результат = Запрос.Выполнить();
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Celine.Angel,
Допустим, если есть алгоритм, который отменяет проведение документа, то, по-уму, в начале нужно выполнить его, а уже потом огород городить! :)
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Не хватает "+Строка(-Выборка.КоличествоОстаток)+" единиц товара """+Выборка.Номенклатура+"""";
Сообщение.Сообщить();
Отказ = Истина;
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Не хватает "+Строка(-Выборка.КоличествоОстаток)+" единиц товара """+Выборка.Номенклатура+"""";
Сообщение.Сообщить();
Отказ = Истина;
Допустим, если есть алгоритм, который отменяет проведение документа, то, по-уму, в начале нужно выполнить его, а уже потом огород городить! :)
1. Для очистки движений документа в типовых конфигурациях есть процедура:
2. все запросы можно объединить в один пакетный запрос. При этом менеджер ВТ будет не нужен.
ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ, Истина, РежимПроведения);
2. все запросы можно объединить в один пакетный запрос. При этом менеджер ВТ будет не нужен.
(0) Сам запрос объединенный, если просто объединять, то как-то так будет выглядеть:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество) КАК КоличествоВДокументе,
| СУММА(РеализацияТоваровТовары.Сумма) КАК СуммаВДокументе,
| РеализацияТоваровТовары.НаборСвойств
|ПОМЕСТИТЬ НоменклатураДокумента
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.НаборСвойств
|;
|ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура,
| НоменклатураДокумента.КоличествоВДокументе,
| НоменклатураДокумента.СуммаВдокументе,
| ЕСТЬNULL(СтоимостьТовараОстатки.СтоимостьОстаток, 0) КАК Стоимость,
| ЕСТЬNULL(СтоимостьТовараОстатки.КоличествоОстаток, 0) КАК Количество,
| ТоварыНаСкладахОстатки.НаборСвойств
|ИЗ
| НоменклатураДокумента КАК НоменклатураДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьТовара.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)) КАК СтоимостьТовараОстатки
| ПО НоменклатураДокумента.Номенклатура = СтоимостьТовараОстатки.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| НоменклатураДокумента.Номенклатура
| ИЗ
| НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки
| ПО НоменклатураДокумента.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура";
Результат = Запрос.Выполнить();
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот