Запросы в 1С

1. G_104675376381940917085 20.02.24 21:14 Сейчас в теме
нужно чтобы данные реквизитов которые заполнены в шапке документа ВводНормДляСотрудников сравнивались с данными из справочника Сотрудники и если они совпали, то заполняется табличная часть,если не совпадает какой-либо реквизит, данные не заполняются, но реквизиты могут быть пустые, тогда отбор по ним не ведется


&НаСервере
Процедура ПоискСотрудника()

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

Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Подразделение КАК Подразделение,
| Сотрудники.Должность КАК Должность,
| Сотрудники.Наименование КАК Наименование
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Подразделение = &Подразделение
| И Сотрудники.Звание = &Звание
| И Сотрудники.РежимРаботы = &РежимРаботы
| И Сотрудники.Пол = &Пол
| И Сотрудники.ГруппаОбеспечение = &ГруппаОбеспечение
| И Сотрудники.ИсточникФинансирования = &Источник
| И Сотрудники.Должность = &Должность
| И Сотрудники.СоставОпергруппы = &СоставОпергруппы";

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

Если НЕ РезультатЗапроса.Пустой() Тогда
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.ТабличнаяЧастьВводНормДляСотрудников.Добавить();
НоваяСтрока.Подразделение = Выборка.Подразделение;
НоваяСтрока.Должность = Выборка.Должность;
НоваяСтрока.Норма = Объект.Норма;
НоваяСтрока.Сотрудник = Выборка.Наименование;
КонецЦикла;
Иначе
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Сообщить("Ничего не найдено!")
КонецЕсли;

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



&НаКлиенте
Процедура Подобрать(Команда)
ПоискСотрудника();
КонецПроцедуры
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. THEBESTolo4b 10 21.02.24 04:55 Сейчас в теме
(1)
Сотрудники.Наименование КАК Наименование
Тут можно написать Иванов Иван Иваныч или Иванов И.И. или "Сто раз как угодно" Как тогда вы будете сравнивать?
4. nomad_irk 76 21.02.24 08:44 Сейчас в теме
(1) Чтобы не собирать текст запроса, можно пойти по другому пути и формировать условия следующим образом:
....

|ГДЕ
| &Подразделение В (Сотрудники.Подразделение, ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка))
| И &Звание В (Сотрудники.Звание, ЗНАЧЕНИЕ(Справочник.Звания.ПустаяСсылка))
| И
......
6. G_104675376381940917085 21.02.24 13:51 Сейчас в теме
(4) Подразделения, звание, должность, режимработы,пол, группаОбеспечения, источник, должность, составОпергруппы эти все данные хранятся в справочнике сотрудники
7. nomad_irk 76 21.02.24 14:35 Сейчас в теме
(6)я понял.
вам же нужно выполнять отбор, если значение будет заполнено на форме, если не заполнено, то отбора по этому значению быть не должно, так?
9. G_104675376381940917085 21.02.24 19:07 Сейчас в теме
(7)
(7) да вы верно поняли, но я уже решил задачу
3. jmw 60 21.02.24 06:34 Сейчас в теме
Запрос = Новый Запрос;

стрУсловия = ""; стрИ = "";

Если ЗначениеЗаполнено(Объект.Подразделение) Тогда
	Запрос.УстановитьПараметр("Подразделение", Объект.Подразделение);
	стрУсловия = "
	|	" + стрИ + " Сотрудники.Подразделение = &Подразделение";
	стрИ = "И";
КонецЕсли;

Если ЗначениеЗаполнено(Объект.Звание) Тогда
	Запрос.УстановитьПараметр("Звание", Объект.Звание);
	стрУсловия = "
	|	" + стрИ + " Сотрудники.Звание = &Звание";
	стрИ = "И";
КонецЕсли;

. . . . .

Если ЗначениеЗаполнено(Объект.СоставОпергруппы) Тогда
	Запрос.УстановитьПараметр("СоставОпергруппы", Объект.СоставОпергруппы);
	стрУсловия = "
	|	" + стрИ + " Сотрудники.СоставОпергруппы = &СоставОпергруппы";
	стрИ = "И";
КонецЕсли;

Запрос.Текст =
"ВЫБРАТЬ
|	Сотрудники.Ссылка КАК Ссылка,
|	Сотрудники.Подразделение КАК Подразделение,
|	Сотрудники.Должность КАК Должность,
|	Сотрудники.Наименование КАК Сотрудник
|ИЗ
|	Справочник.Сотрудники КАК Сотрудники
|" + ?(ПустаяСтрока(стрУсловия), "", "ГДЕ " + стрУсловия);

Выборка = Запрос.Выполнить().Выбрать();
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Пока Выборка.Следующий() Цикл
	
	НоваяСтрока = Объект.ТабличнаяЧастьВводНормДляСотрудников.Добавить();
	ЗаполнитьЗначениеСвойств(НоваяСтрока, Выборка);
	
КонецЦикла;
Показать
8. G_104675376381940917085 21.02.24 15:07 Сейчас в теме
(3)Ну я сделал по вашему примеру, чтото похожее и похоже работает нормально. Храни вас господь! Единственный адекватный ответ!
5. G_104675376381940917085 21.02.24 13:37 Сейчас в теме
Спасибо за пример . Но при выполнении выдаёт такую ошибку
Ошибка при вызове метода контекста (Выполнить)
{Документ.ВводНормДляСотрудников.Форма.ФормаДокумента.Форма(75)}:РезультатЗапроса = Запрос.Выполнить();
{Документ.ВводНормДляСотрудников.Форма.ФормаДокумента.Форма(98)}:ПоискСотрудника();

[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
{(9, 5)}: Синтаксическая ошибка "И"
<<?>>И Сотрудники.СоставОпергруппы = &СоставОпергруппы
Код который у меня получился, можете помочь почему выдаёт такую ошибку

&НаСервере
Процедура ПоискСотрудника()

Запрос = Новый Запрос;

стрУсловия = ""; стрИ = "";

Если ЗначениеЗаполнено(Объект.Подразделение) Тогда
Запрос.УстановитьПараметр("Подразделение", Объект.Подразделение);
стрУсловия = "
| " + стрИ + " Сотрудники.Подразделение = &Подразделение";
стрИ = "И";
КонецЕсли;

Если ЗначениеЗаполнено(Объект.Звание) Тогда
Запрос.УстановитьПараметр("Звание", Объект.Звание);
стрУсловия = "
| " + стрИ + " Сотрудники.Звание = &Звание";
стрИ = "И";
КонецЕсли;

Если ЗначениеЗаполнено(Объект.РежимРаботы) Тогда
Запрос.УстановитьПараметр("РежимРаботы", Объект.РежимРаботы);
стрУсловия = "
| " + стрИ + " Сотрудники.РежимРаботы = &РежимРаботы";
стрИ = "И";
КонецЕсли;

Если ЗначениеЗаполнено(Объект.Пол) Тогда
Запрос.УстановитьПараметр("Пол", Объект.Пол);
стрУсловия = "
| " + стрИ + " Сотрудники.Пол = &Пол";
стрИ = "И";
КонецЕсли;

Если ЗначениеЗаполнено(Объект.ГруппаОбеспечения) Тогда
Запрос.УстановитьПараметр("ГруппаОбеспечения", Объект.ГруппаОбеспечения);
стрУсловия = "
| " + стрИ + " Сотрудники.ГруппаОбеспечения = &ГруппаОбеспечения";
стрИ = "И";
КонецЕсли;

Если ЗначениеЗаполнено(Объект.Источник) Тогда
Запрос.УстановитьПараметр("Источник", Объект.Источник);
стрУсловия = "
| " + стрИ + " Сотрудники.Источник = &Источник";
стрИ = "И";
КонецЕсли;

Если ЗначениеЗаполнено(Объект.Должность) Тогда
Запрос.УстановитьПараметр("Должность", Объект.Должность);
стрУсловия = "
| " + стрИ + " Сотрудники.Должность = &Должность";
стрИ = "И";
КонецЕсли;

Если ЗначениеЗаполнено(Объект.СоставОпергруппы) Тогда
Запрос.УстановитьПараметр("СоставОпергруппы", Объект.СоставОпергруппы);
стрУсловия = "
| " + стрИ + " Сотрудники.СоставОпергруппы = &СоставОпергруппы";
стрИ = "И";
КонецЕсли;

Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Подразделение КАК Подразделение,
| Сотрудники.Должность КАК Должность,
| Сотрудники.Наименование КАК Сотрудник
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|" + ?(ПустаяСтрока(стрУсловия), " ", "ГДЕ " + стрУсловия);

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

Если НЕ РезультатЗапроса.Пустой() Тогда
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.ТабличнаяЧастьВводНормДляСотрудников.Добавить();
НоваяСтрока.Подразделение = Выборка.Подразделение;
НоваяСтрока.Должность = Выборка.Должность;
НоваяСтрока.Норма = Объект.Норма;
НоваяСтрока.Сотрудник = Выборка.Наименование;
КонецЦикла;
Иначе
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Сообщить("Ничего не найдено!")
КонецЕсли;

КонецПроцедуры
10. jmw 60 22.02.24 09:51 Сейчас в теме
(8) Перед Запрос.Выполнить() добавить

Сообщить(стрУсловия)


и посмотреть, если уж отладчиком не умеете пользоваться,
чтобы догадаться, что нужно вот так:

стрУсловия = стрУсловия + "
| " + стрИ + " Сотрудники.Подразделение = &Подразделение";


и во всех остальных строках!
11. magvay_k 64 22.02.24 17:51 Сейчас в теме
Можно так еще попробовать:
        Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	Сотрудники.Ссылка КАК Ссылка,
	|	Сотрудники.Подразделение КАК Подразделение,
	|	Сотрудники.Должность КАК Должность,
	|	Сотрудники.Норма КАК Норма,
	|	Сотрудники.Наименование КАК Наименование
	|ИЗ
	|	Справочник.Сотрудники КАК Сотрудники";
	
	СхемаЗапроса = Новый СхемаЗапроса;
	СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
	
	Операторы = СхемаЗапроса.ПакетЗапросов[0].Операторы[0];
	
	ПоляОтбора = Новый Структура("Подразделение, Звание, РежимРаботы, Пол, ГруппаОбеспечение, Источник, Должность, СоставОпергруппы", 
		"Подразделение", "Звание", "РежимРаботы", "Пол", "ГруппаОбеспечение", "ИсточникФинансирования", "Должность", "СоставОпергруппы");
	
	Для Каждого Поле Из ПоляОтбора Цикл 
		Если ЗначениеЗаполнено(Объект[Поле.Ключ]) Тогда  
			Запрос.УстановитьПараметр(Поле.Ключ, Объект[Поле.Ключ]);
			
			Операторы.Отбор.Добавить(СтрШаблон("Сотрудники.%1 = &%2", Поле.Значение, Поле.Ключ));	
		КонецЕсли;	
	КонецЦикла;
	
	Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
	
	Результат = Запрос.Выполнить();
	
	Если Не Результат.Пустой() Тогда 
		Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
		
		Выборка = Результат.Выбрать(); 
		
		Пока Выборка.Следующий() Цикл
			ЗаполнитьЗначенияСвойств(Объект.ТабличнаяЧастьВводНормДляСотрудников.Добавить(), Выборка);
		КонецЦикла;
	Иначе 
		ОбщегоНазначения.СообщитьПользователю(нСтр("ru='Сотрудник не найден.'"));
	КонецЕсли;
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот