Универсальный запрос по табличным частям разных документов для их проверки
Здравствуйте.
Помогите написать выборку.
Не могу в запросе указать название колонки в зависимости от типа документа.
Изначально написал конкретно для проверки табличной части ТОВАРЫ документа "Реализация товаров и услуг".
На нем все полностью отработал.
Затем данную функцию понадобилось использовать для проверки заполняемости табличной части ТОВАРЫ в других документах.
Столкнулся с проблемой - если в табличной части ТОВАРЫ документа реализации заказы покупателей размещены в колонке с названием "ЗаказыПокупателей", то, например, в документе Перемещения данная колонка называется "ДокументРезерва.
Как (лучше в самом запросе) взависимости от типа документа указать или "ТаблицаТовары.ДокументРезерва" или "ТаблицаТовары.ЗаказПокупателя".
В начале функции - это эксперименты.
ДатаДок - на какую дату.
СкладОтправитель - откуда отгрузка или перемещение
СсылкаНаДокумент - табличная часть документа (ДокументТабличнаяЧасть.ПеремещениеТоваров.Товары или ДокументТабличнаяЧасть.РеализацияТоваровИУслуг.Товары
Дальше идет проверка выбранного.......
Помогите написать выборку.
Не могу в запросе указать название колонки в зависимости от типа документа.
Изначально написал конкретно для проверки табличной части ТОВАРЫ документа "Реализация товаров и услуг".
На нем все полностью отработал.
Затем данную функцию понадобилось использовать для проверки заполняемости табличной части ТОВАРЫ в других документах.
Столкнулся с проблемой - если в табличной части ТОВАРЫ документа реализации заказы покупателей размещены в колонке с названием "ЗаказыПокупателей", то, например, в документе Перемещения данная колонка называется "ДокументРезерва.
Как (лучше в самом запросе) взависимости от типа документа указать или "ТаблицаТовары.ДокументРезерва" или "ТаблицаТовары.ЗаказПокупателя".
В начале функции - это эксперименты.
ДатаДок - на какую дату.
СкладОтправитель - откуда отгрузка или перемещение
СсылкаНаДокумент - табличная часть документа (ДокументТабличнаяЧасть.ПеремещениеТоваров.Товары или ДокументТабличнаяЧасть.РеализацияТоваровИУслуг.Товары
Функция ПроверкаТоваровВРезервеИСвободныхОстатках(ДатаДок, СкладОтправитель, СсылкаНаДокумент, Отказ) Экспорт
Если ТипЗнч(СсылкаНаДокумент) = Тип("ДокументТабличнаяЧасть.ПеремещениеТоваров.Товары") Тогда
ЗначениеЗаказа = "ДокументРезерва";
Иначе
ЗначениеЗаказа = "ЗаказПокупателя";
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаТовары.Номенклатура,
| ТаблицаТовары.ХарактеристикаНоменклатуры,
| ТаблицаТовары.СерияНоменклатуры,
| ТаблицаТовары.Количество,
| ТаблицаТовары.ЕдиницаИзмеренияМест,
| ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(&ТаблицаТовары) = ТИП(Документ.Перемещение)
| ТОГДА
| ТаблицаТовары.ДокументРезерва
| ИНАЧЕ
| ТаблицаТовары.ЗаказПокупателя
| КОНЕЦ
| КАК ДокументРезерва
//| &ЗначениеЗаказа КАК ДокументРезерва
|ПОМЕСТИТЬ ВТ
|ИЗ
| &ТаблицаТовары КАК ТаблицаТовары
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ВТ.Номенклатура КАК Номенклатура,
| ВТ.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| ВТ.СерияНоменклатуры КАК СерияНоменклатуры,
| ВТ.ДокументРезерва КАК ЗаказВДокументе,
| ВТ.ЕдиницаИзмеренияМест КАК ЕдМест,
| ОстатокТовара.ДокументРезерва КАК ЗаказВБазе,
| ОстатокТовараВЯщиках.ДокументРезерва КАК ЗаказВБазеВЯщиках,
| ВТ.Количество КАК КоличествоВДокументе,
| ОстатокТовара.КоличествоОстаток КАК ОстатокВРезерве,
| ОстатокТовараВЯщиках.КоличествоОстаток КАК ОстатокВРезервеВЯщиках,
| СвободныйОстаткок.КоличествоСУчетомСерииОстаток КАК СвободныйОстаток,
| СвободныйостатокВЯщиках.КоличествоОстаток КАК СвободныйостатокВЯщиках
//| ВТ.СпособСписания
|ИЗ
| ВТ КАК ВТ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&НаДату, Склад = &Склад) КАК ОстатокТовара
| ПО (ОстатокТовара.Номенклатура = ВТ.Номенклатура)
| И (ОстатокТовара.ХарактеристикаНоменклатуры = ВТ.ХарактеристикаНоменклатуры)
| И (ОстатокТовара.СерияНоменклатуры = ВТ.СерияНоменклатуры)
| И (ОстатокТовара.ДокументРезерва = ВТ.ДокументРезерва)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.МУР_ТоварыВРезервеНаСкладахВЯщиках.Остатки(&НаДату, Склад = &Склад) КАК ОстатокТовараВЯщиках
| ПО (ОстатокТовараВЯщиках.Номенклатура = ВТ.Номенклатура)
| И (ОстатокТовараВЯщиках.СерияНоменклатуры = ВТ.СерияНоменклатуры)
| И (ОстатокТовараВЯщиках.ХарактеристикаНоменклатуры = ВТ.ХарактеристикаНоменклатуры)
| И (ОстатокТовараВЯщиках.ДокументРезерва = ВТ.ДокументРезерва)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(&НаДату, Склад = &Склад) КАК СвободныйОстаткок
| ПО (СвободныйОстаткок.Номенклатура = ВТ.Номенклатура)
| И (СвободныйОстаткок.ХарактеристикаНоменклатуры = ВТ.ХарактеристикаНоменклатуры)
| И (СвободныйОстаткок.СерияНоменклатуры = ВТ.СерияНоменклатуры)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.МУР_ТоварыНаСкладахЯщики.Остатки(&НаДату, Склад = &Склад) КАК СвободныйостатокВЯщиках
| ПО (СвободныйостатокВЯщиках.Номенклатура = ВТ.Номенклатура)
| И (СвободныйостатокВЯщиках.ХарактеристикаНоменклатуры = ВТ.ХарактеристикаНоменклатуры)
| И (СвободныйостатокВЯщиках.СерияНоменклатуры = ВТ.СерияНоменклатуры)";
Запрос.УстановитьПараметр("ТаблицаТовары", СсылкаНаДокумент.Выгрузить());
Запрос.УстановитьПараметр("НаДату", ДатаДок);
Запрос.УстановитьПараметр("Склад", СкладОтправитель);
Запрос.УстановитьПараметр("ВидДокумента", СсылкаНаДокумент);
ВыборкаЗапроса = Запрос.Выполнить();
РезультатЗапроса = ВыборкаЗапроса.Выбрать();
ПоказатьДальше идет проверка выбранного.......
По теме из базы знаний
- Перенос данных из УПП 1.3 / КА 1.1 в БП 3. Переносятся документы, справочники и начальные остатки
- Перенос данных из УТ 10.3 в УТ 11 / КА 2 / ERP 2. Переносятся документы, справочники и остатки
- Загрузка документов и номенклатуры из Excel в 1С "одним нажатием": УПД, ТОРГ-12, отчеты маркетплейсов, заказы, счета, прайсы
- Не спеша, эффективно и правильно – путь разработки. Часть 3. Практика
- Универсальная сверка данных между разными базами 1С через веб-сервис
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Не знаю правильно я сделал или нет, но работает:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаТовары.Номенклатура,
| ТаблицаТовары.ХарактеристикаНоменклатуры,
| ТаблицаТовары.СерияНоменклатуры,
| ТаблицаТовары.Количество,
| ТаблицаТовары.ЕдиницаИзмеренияМест,
| ТаблицаТовары.ЗаказПокупателя КАК ДокументРезерва
|ПОМЕСТИТЬ ВТ
|ИЗ
| &ТаблицаТовары КАК ТаблицаТовары
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
...............................................
Запрос.УстановитьПараметр("ТаблицаТовары", СсылкаНаДокумент.Выгрузить());
Запрос.УстановитьПараметр("НаДату", ДатаДок);
Запрос.УстановитьПараметр("Склад", СкладОтправитель);
Если ТипЗнч(СсылкаНаДокумент) = Тип("ДокументТабличнаяЧасть.ПеремещениеТоваров.Товары") Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ТаблицаТовары.ЗаказПокупателя КАК ДокументРезерва", "ТаблицаТовары.ДокументРезерва КАК ДокументРезерва");
Иначе
КонецЕсли;
ВыборкаЗапроса = Запрос.Выполнить();
РезультатЗапроса = ВыборкаЗапроса.Выбрать();
Показать
В общем работает, НО появилась одна непонятка.
Теперь при закрытии не измененного документа (перемещение или реализация) постоянно спрашивает "данные были изменены сохранить изменения" или если нажать в документе с начало провести, а затем его закрыть - "данные были изменены сохранить изменения".
Убираю замену строки для подбора - все работает нормально, ни чего не спрашивает.
Ставлю назад и опять начинается.
Я что то связи этого сообщения со строкой запроса понимаю.
Работаем в УПП. В базе используется и тонкий и толстый клиент.
Запрос проявляет себя только в толстом клиенте.
Теперь при закрытии не измененного документа (перемещение или реализация) постоянно спрашивает "данные были изменены сохранить изменения" или если нажать в документе с начало провести, а затем его закрыть - "данные были изменены сохранить изменения".
Убираю замену строки для подбора - все работает нормально, ни чего не спрашивает.
Ставлю назад и опять начинается.
Я что то связи этого сообщения со строкой запроса понимаю.
Работаем в УПП. В базе используется и тонкий и толстый клиент.
Запрос проявляет себя только в толстом клиенте.
Так, понял. Видимо полный текст нужен.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Дерево значений, содержащее имена необходимых полей в запросе по шапке.
Перем ДеревоПолейЗапросаПоШапке;
Если мУдалятьДвижения Тогда
ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ, Истина, РежимПроведения);
КонецЕсли;
// +МУР Контроль остатков
Если Отказ = Ложь Тогда
ТоварыСписком = ЭтотОбъект.Товары;
СкладОтправитель = ЭтотОбъект.СкладОтправитель;
Отказ = МУР_ОбщегоНазначенияВызовСервера.ПроверкаТоваровВРезервеИСвободныхОстатках(ДатаДок, СкладОтправитель, ТоварыСписком, Отказ);
КонецЕсли;
// -МУР
..........................................
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Дерево значений, содержащее имена необходимых полей в запросе по шапке.
Перем ДеревоПолейЗапросаПоШапке;
Если мУдалятьДвижения Тогда
ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ, Истина, РежимПроведения);
КонецЕсли;
// +МУР Контроль остатков
Если Отказ = Ложь Тогда
ТоварыСписком = ЭтотОбъект.Товары;
СкладОтправитель = ЭтотОбъект.СкладОтправитель;
Отказ = МУР_ОбщегоНазначенияВызовСервера.ПроверкаТоваровВРезервеИСвободныхОстатках(ДатаДок, СкладОтправитель, ТоварыСписком, Отказ);
КонецЕсли;
// -МУР
..........................................
Ошибся:
Далее стандартная процедура проведения.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Дерево значений, содержащее имена необходимых полей в запросе по шапке.
Перем ДеревоПолейЗапросаПоШапке;
Если мУдалятьДвижения Тогда
ОбщегоНазначения.УдалитьДвиженияРегистратора(ЭтотОбъект, Отказ, Истина, РежимПроведения);
КонецЕсли;
// +МУР Контроль остатков
Если Отказ = Ложь Тогда
ДатаДок = ЭтотОбъект.Дата;
ТоварыСписком = ЭтотОбъект.Товары;
СкладОтправитель = ЭтотОбъект.СкладОтправитель;
Отказ = МУР_ОбщегоНазначенияВызовСервера.ПроверкаТоваровВРезервеИСвободныхОстатках(ДатаДок, СкладОтправитель, ТоварыСписком, Отказ);
КонецЕсли;
// -МУР
............................
ПоказатьДалее стандартная процедура проведения.
Вся функция.
Функция ПроверкаТоваровВРезервеИСвободныхОстатках(ДатаДок, СкладОтправитель, СсылкаНаДокумент, Отказ) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаТовары.Номенклатура,
| ТаблицаТовары.ХарактеристикаНоменклатуры,
| ТаблицаТовары.СерияНоменклатуры,
| ТаблицаТовары.Количество,
| ТаблицаТовары.ЕдиницаИзмеренияМест,
| ТаблицаТовары.ЗаказПокупателя КАК ДокументРезерва
|ПОМЕСТИТЬ ВТ
|ИЗ
| &ТаблицаТовары КАК ТаблицаТовары
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ВТ.Номенклатура КАК Номенклатура,
| ВТ.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| ВТ.СерияНоменклатуры КАК СерияНоменклатуры,
| ВТ.ДокументРезерва КАК ЗаказВДокументе,
| ВТ.ЕдиницаИзмеренияМест КАК ЕдМест,
| ОстатокТовара.ДокументРезерва КАК ЗаказВБазе,
| ОстатокТовараВЯщиках.ДокументРезерва КАК ЗаказВБазеВЯщиках,
| ВТ.Количество КАК КоличествоВДокументе,
| ОстатокТовара.КоличествоОстаток КАК ОстатокВРезерве,
| ОстатокТовараВЯщиках.КоличествоОстаток КАК ОстатокВРезервеВЯщиках,
| СвободныйОстаткок.КоличествоСУчетомСерииОстаток КАК СвободныйОстаток,
| СвободныйостатокВЯщиках.КоличествоОстаток КАК СвободныйостатокВЯщиках
|ИЗ
| ВТ КАК ВТ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&НаДату, Склад = &Склад) КАК ОстатокТовара
| ПО (ОстатокТовара.Номенклатура = ВТ.Номенклатура)
| И (ОстатокТовара.ХарактеристикаНоменклатуры = ВТ.ХарактеристикаНоменклатуры)
| И (ОстатокТовара.СерияНоменклатуры = ВТ.СерияНоменклатуры)
| И (ОстатокТовара.ДокументРезерва = ВТ.ДокументРезерва)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.МУР_ТоварыВРезервеНаСкладахВЯщиках.Остатки(&НаДату, Склад = &Склад) КАК ОстатокТовараВЯщиках
| ПО (ОстатокТовараВЯщиках.Номенклатура = ВТ.Номенклатура)
| И (ОстатокТовараВЯщиках.СерияНоменклатуры = ВТ.СерияНоменклатуры)
| И (ОстатокТовараВЯщиках.ХарактеристикаНоменклатуры = ВТ.ХарактеристикаНоменклатуры)
| И (ОстатокТовараВЯщиках.ДокументРезерва = ВТ.ДокументРезерва)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(&НаДату, Склад = &Склад) КАК СвободныйОстаткок
| ПО (СвободныйОстаткок.Номенклатура = ВТ.Номенклатура)
| И (СвободныйОстаткок.ХарактеристикаНоменклатуры = ВТ.ХарактеристикаНоменклатуры)
| И (СвободныйОстаткок.СерияНоменклатуры = ВТ.СерияНоменклатуры)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.МУР_ТоварыНаСкладахЯщики.Остатки(&НаДату, Склад = &Склад) КАК СвободныйостатокВЯщиках
| ПО (СвободныйостатокВЯщиках.Номенклатура = ВТ.Номенклатура)
| И (СвободныйостатокВЯщиках.ХарактеристикаНоменклатуры = ВТ.ХарактеристикаНоменклатуры)
| И (СвободныйостатокВЯщиках.СерияНоменклатуры = ВТ.СерияНоменклатуры)";
Запрос.УстановитьПараметр("ТаблицаТовары", СсылкаНаДокумент.Выгрузить());
Запрос.УстановитьПараметр("НаДату", ДатаДок);
Запрос.УстановитьПараметр("Склад", СкладОтправитель);
Если ТипЗнч(СсылкаНаДокумент) = Тип("ДокументТабличнаяЧасть.ПеремещениеТоваров.Товары") Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ТаблицаТовары.ЗаказПокупателя КАК ДокументРезерва", "ТаблицаТовары.ДокументРезерва КАК ДокументРезерва");
Иначе
КонецЕсли;
ВыборкаЗапроса = Запрос.Выполнить();
РезультатЗапроса = ВыборкаЗапроса.Выбрать();
//Отказ = Ложь;
Если НЕ ВыборкаЗапроса.Пустой() Тогда
Пока РезультатЗапроса.Следующий() Цикл
Если РезультатЗапроса.ОстатокВРезерве <> РезультатЗапроса.ОстатокВРезервеВЯщиках
И ЗначениеЗаполнено(РезультатЗапроса.ЗаказВДокументе) Тогда
Сообщить("Товар " + РезультатЗапроса.Номенклатура + " " + РезультатЗапроса.ХарактеристикаНоменклатуры + " " + РезультатЗапроса.СерияНоменклатуры);
Сообщить("Расфасованное количество в документе не соответствует расфасованному количеству в резерве.");
Отказ = Истина;
ИначеЕсли (РезультатЗапроса.ЗаказВДокументе <> РезультатЗапроса.ЗаказВБазе
ИЛИ РезультатЗапроса.ЗаказВДокументе <> РезультатЗапроса.ЗаказВБазеВЯщиках)
И ЗначениеЗаполнено(РезультатЗапроса.ЗаказВДокументе) Тогда
Сообщить("Товар " + РезультатЗапроса.Номенклатура + " " + РезультатЗапроса.ХарактеристикаНоменклатуры + " " + РезультатЗапроса.СерияНоменклатуры);
Сообщить("Не верно указан заказ в документе или нет такого количества этой позиции под заказ " + РезультатЗапроса.ЗаказВДокументе + ".");
Отказ = Истина;
ИначеЕсли НЕ ЗначениеЗаполнено(РезультатЗапроса.СвободныйОстаток) И НЕ ЗначениеЗаполнено(РезультатЗапроса.СвободныйостатокВЯщиках + ".")
И НЕ ЗначениеЗаполнено(РезультатЗапроса.ЗаказВДокументе)
И НЕ ЗначениеЗаполнено(РезультатЗапроса.ЕдМест) Тогда
Сообщить("Товар " + РезультатЗапроса.Номенклатура + " " + РезультатЗапроса.ХарактеристикаНоменклатуры + " " + РезультатЗапроса.СерияНоменклатуры);
Сообщить("Нет свободных остатков в ящиках или без них для проведения документа.");
Отказ = Истина;
ИначеЕсли (ЗначениеЗаполнено(РезультатЗапроса.ОстатокВРезервеВЯщиках) ИЛИ ЗначениеЗаполнено(РезультатЗапроса.СвободныйостатокВЯщиках))
И НЕ ЗначениеЗаполнено(РезультатЗапроса.ЕдМест) Тогда
Сообщить("Товар " + РезультатЗапроса.Номенклатура + " " + РезультатЗапроса.ХарактеристикаНоменклатуры + " " + РезультатЗапроса.СерияНоменклатуры);
Сообщить("Продукция расфасована. Укажите расфасовку в документе.");
Отказ = Истина;
ИначеЕсли РезультатЗапроса.СвободныйОстаток <> РезультатЗапроса.СвободныйостатокВЯщиках
И НЕ ЗначениеЗаполнено(РезультатЗапроса.ЗаказВДокументе)
И ЗначениеЗаполнено(РезультатЗапроса.ЕдМест) Тогда
Сообщить("Товар " + РезультатЗапроса.Номенклатура + " " + РезультатЗапроса.ХарактеристикаНоменклатуры + " " + РезультатЗапроса.СерияНоменклатуры);
Сообщить("Свободный остаток не совпадает со свободным остатком в ящиках.");
Отказ = Истина;
ИначеЕсли (ЗначениеЗаполнено(РезультатЗапроса.ОстатокВРезерве) ИЛИ ЗначениеЗаполнено(РезультатЗапроса.ОстатокВРезервеВЯщиках))
И НЕ ЗначениеЗаполнено(РезультатЗапроса.ЗаказВДокументе) Тогда
Сообщить("Товар " + РезультатЗапроса.Номенклатура + " " + РезультатЗапроса.ХарактеристикаНоменклатуры + " " + РезультатЗапроса.СерияНоменклатуры);
Сообщить("Товар находится в резерве. Укажите заказ.");
Отказ = Истина;
ИначеЕсли (ЗначениеЗаполнено(РезультатЗапроса.ОстатокВРезервеВЯщиках) ИЛИ ЗначениеЗаполнено(РезультатЗапроса.СвободныйостатокВЯщиках))
И НЕ ЗначениеЗаполнено(РезультатЗапроса.ЕдМест) Тогда
Сообщить("Товар " + РезультатЗапроса.Номенклатура + " " + РезультатЗапроса.ХарактеристикаНоменклатуры + " " + РезультатЗапроса.СерияНоменклатуры);
Сообщить("Товар расфасован. В документе не указана расфасовка.");
Отказ = Истина;
Иначе
Отказ = Ложь;
КонецЕсли;
КонецЦикла;
ИначеЕсли СсылкаНаДокумент.Количество() = 0 Тогда
Отказ = Отказ;
Иначе
Сообщить("На складах нет остатков товаров указанных в документе");
Отказ = Истина;
КонецЕсли;
Возврат Отказ;
КонецФункции
Показать
ПередЗаписью() находится в модуле формы, а не в общем модуле.
Хотелось бы сделать один вызов.
У нас документы имеют как обычные формы так и управляемые.
И оба вида форм одного и того же документа используются.
Для примера: бухгалтера работают в толстом клиенте, а сбыт и кладовщики только в тонком.
Так сделано из-за сильного ограничения в ресурсах единственного сервера.
На нем реализовано ВСЁ.
Говорить, что так нельзя мне не нужно - это все к моему начальству.
Хотелось бы сделать один вызов.
У нас документы имеют как обычные формы так и управляемые.
И оба вида форм одного и того же документа используются.
Для примера: бухгалтера работают в толстом клиенте, а сбыт и кладовщики только в тонком.
Так сделано из-за сильного ограничения в ресурсах единственного сервера.
На нем реализовано ВСЁ.
Говорить, что так нельзя мне не нужно - это все к моему начальству.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот