нужно чтобы данные реквизитов которые заполнены в шапке документа ВводНормДляСотрудников сравнивались с данными из справочника Сотрудники и если они совпали, то заполняется табличная часть,если не совпадает какой-либо реквизит, данные не заполняются, но реквизиты могут быть пустые, тогда отбор по ним не ведется
&НаСервере
Процедура ПоискСотрудника()
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Подразделение", Объект.Подразделение);
Запрос.УстановитьПараметр("Звание",Объект.Звание);
Запрос.УстановитьПараметр("РежимРаботы",Объект.РежимРаботы);
Запрос.УстановитьПараметр("Пол",Объект.Пол);
Запрос.УстановитьПараметр("ГруппаОбеспечение",Объект.ГруппаОбеспечения);
Запрос.УстановитьПараметр("Источник", Объект.Источник);
Запрос.УстановитьПараметр("Должность",Объект.Должность);
Запрос.УстановитьПараметр("СоставОпергруппы",Объект.СоставОпергруппы);
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Подразделение КАК Подразделение,
| Сотрудники.Должность КАК Должность,
| Сотрудники.Наименование КАК Наименование
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Подразделение = &Подразделение
| И Сотрудники.Звание = &Звание
| И Сотрудники.РежимРаботы = &РежимРаботы
| И Сотрудники.Пол = &Пол
| И Сотрудники.ГруппаОбеспечение = &ГруппаОбеспечение
| И Сотрудники.ИсточникФинансирования = &Источник
| И Сотрудники.Должность = &Должность
| И Сотрудники.СоставОпергруппы = &СоставОпергруппы";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если НЕ РезультатЗапроса.Пустой() Тогда
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.ТабличнаяЧастьВводНормДляСотрудников.Добавить();
НоваяСтрока.Подразделение = Выборка.Подразделение;
НоваяСтрока.Должность = Выборка.Должность;
НоваяСтрока.Норма = Объект.Норма;
НоваяСтрока.Сотрудник = Выборка.Наименование;
КонецЦикла;
Иначе
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Сообщить("Ничего не найдено!")
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подобрать(Команда)
ПоискСотрудника();
КонецПроцедуры
&НаСервере
Процедура ПоискСотрудника()
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Подразделение", Объект.Подразделение);
Запрос.УстановитьПараметр("Звание",Объект.Звание);
Запрос.УстановитьПараметр("РежимРаботы",Объект.РежимРаботы);
Запрос.УстановитьПараметр("Пол",Объект.Пол);
Запрос.УстановитьПараметр("ГруппаОбеспечение",Объект.ГруппаОбеспечения);
Запрос.УстановитьПараметр("Источник", Объект.Источник);
Запрос.УстановитьПараметр("Должность",Объект.Должность);
Запрос.УстановитьПараметр("СоставОпергруппы",Объект.СоставОпергруппы);
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Подразделение КАК Подразделение,
| Сотрудники.Должность КАК Должность,
| Сотрудники.Наименование КАК Наименование
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Подразделение = &Подразделение
| И Сотрудники.Звание = &Звание
| И Сотрудники.РежимРаботы = &РежимРаботы
| И Сотрудники.Пол = &Пол
| И Сотрудники.ГруппаОбеспечение = &ГруппаОбеспечение
| И Сотрудники.ИсточникФинансирования = &Источник
| И Сотрудники.Должность = &Должность
| И Сотрудники.СоставОпергруппы = &СоставОпергруппы";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если НЕ РезультатЗапроса.Пустой() Тогда
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.ТабличнаяЧастьВводНормДляСотрудников.Добавить();
НоваяСтрока.Подразделение = Выборка.Подразделение;
НоваяСтрока.Должность = Выборка.Должность;
НоваяСтрока.Норма = Объект.Норма;
НоваяСтрока.Сотрудник = Выборка.Наименование;
КонецЦикла;
Иначе
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Сообщить("Ничего не найдено!")
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подобрать(Команда)
ПоискСотрудника();
КонецПроцедуры
По теме из базы знаний
- Работа с запросами в 1С СКД. Язык выражений СКД и подмена запросов
- Работа с запросами в 1С СКД. Особенности работы запросов в СКД. Часть 2
- Работа с запросами в 1С СКД. Особенности работы запросов в СКД. Часть 3
- Работа с запросами в 1С СКД. Отладка СКД
- Запрос в 1С с нуля. Универсальный запрос "звёздочка"
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Чтобы не собирать текст запроса, можно пойти по другому пути и формировать условия следующим образом:
....
|ГДЕ
| &Подразделение В (Сотрудники.Подразделение, ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка))
| И &Звание В (Сотрудники.Звание, ЗНАЧЕНИЕ(Справочник.Звания.ПустаяСсылка))
| И
......
Запрос = Новый Запрос;
стрУсловия = ""; стрИ = "";
Если ЗначениеЗаполнено(Объект.Подразделение) Тогда
Запрос.УстановитьПараметр("Подразделение", Объект.Подразделение);
стрУсловия = "
| " + стрИ + " Сотрудники.Подразделение = &Подразделение";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.Звание) Тогда
Запрос.УстановитьПараметр("Звание", Объект.Звание);
стрУсловия = "
| " + стрИ + " Сотрудники.Звание = &Звание";
стрИ = "И";
КонецЕсли;
. . . . .
Если ЗначениеЗаполнено(Объект.СоставОпергруппы) Тогда
Запрос.УстановитьПараметр("СоставОпергруппы", Объект.СоставОпергруппы);
стрУсловия = "
| " + стрИ + " Сотрудники.СоставОпергруппы = &СоставОпергруппы";
стрИ = "И";
КонецЕсли;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Подразделение КАК Подразделение,
| Сотрудники.Должность КАК Должность,
| Сотрудники.Наименование КАК Сотрудник
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|" + ?(ПустаяСтрока(стрУсловия), "", "ГДЕ " + стрУсловия);
Выборка = Запрос.Выполнить().Выбрать();
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.ТабличнаяЧастьВводНормДляСотрудников.Добавить();
ЗаполнитьЗначениеСвойств(НоваяСтрока, Выборка);
КонецЦикла;
Показать
Спасибо за пример . Но при выполнении выдаёт такую ошибку
Ошибка при вызове метода контекста (Выполнить)
{Документ.ВводНормДляСотрудников.Форма.ФормаДокумента.Форма(75)}:РезультатЗапроса = Запрос.Выполнить();
{Документ.ВводНормДляСотрудников.Форма.ФормаДокумента.Форма(98)}:ПоискСотрудника();
[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
{(9, 5)}: Синтаксическая ошибка "И"
<<?>>И Сотрудники.СоставОпергруппы = &СоставОпергруппы
Код который у меня получился, можете помочь почему выдаёт такую ошибку
&НаСервере
Процедура ПоискСотрудника()
Запрос = Новый Запрос;
стрУсловия = ""; стрИ = "";
Если ЗначениеЗаполнено(Объект.Подразделение) Тогда
Запрос.УстановитьПараметр("Подразделение", Объект.Подразделение);
стрУсловия = "
| " + стрИ + " Сотрудники.Подразделение = &Подразделение";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.Звание) Тогда
Запрос.УстановитьПараметр("Звание", Объект.Звание);
стрУсловия = "
| " + стрИ + " Сотрудники.Звание = &Звание";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.РежимРаботы) Тогда
Запрос.УстановитьПараметр("РежимРаботы", Объект.РежимРаботы);
стрУсловия = "
| " + стрИ + " Сотрудники.РежимРаботы = &РежимРаботы";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.Пол) Тогда
Запрос.УстановитьПараметр("Пол", Объект.Пол);
стрУсловия = "
| " + стрИ + " Сотрудники.Пол = &Пол";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ГруппаОбеспечения) Тогда
Запрос.УстановитьПараметр("ГруппаОбеспечения", Объект.ГруппаОбеспечения);
стрУсловия = "
| " + стрИ + " Сотрудники.ГруппаОбеспечения = &ГруппаОбеспечения";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.Источник) Тогда
Запрос.УстановитьПараметр("Источник", Объект.Источник);
стрУсловия = "
| " + стрИ + " Сотрудники.Источник = &Источник";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.Должность) Тогда
Запрос.УстановитьПараметр("Должность", Объект.Должность);
стрУсловия = "
| " + стрИ + " Сотрудники.Должность = &Должность";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.СоставОпергруппы) Тогда
Запрос.УстановитьПараметр("СоставОпергруппы", Объект.СоставОпергруппы);
стрУсловия = "
| " + стрИ + " Сотрудники.СоставОпергруппы = &СоставОпергруппы";
стрИ = "И";
КонецЕсли;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Подразделение КАК Подразделение,
| Сотрудники.Должность КАК Должность,
| Сотрудники.Наименование КАК Сотрудник
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|" + ?(ПустаяСтрока(стрУсловия), " ", "ГДЕ " + стрУсловия);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если НЕ РезультатЗапроса.Пустой() Тогда
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.ТабличнаяЧастьВводНормДляСотрудников.Добавить();
НоваяСтрока.Подразделение = Выборка.Подразделение;
НоваяСтрока.Должность = Выборка.Должность;
НоваяСтрока.Норма = Объект.Норма;
НоваяСтрока.Сотрудник = Выборка.Наименование;
КонецЦикла;
Иначе
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Сообщить("Ничего не найдено!")
КонецЕсли;
КонецПроцедуры
Ошибка при вызове метода контекста (Выполнить)
{Документ.ВводНормДляСотрудников.Форма.ФормаДокумента.Форма(75)}:РезультатЗапроса = Запрос.Выполнить();
{Документ.ВводНормДляСотрудников.Форма.ФормаДокумента.Форма(98)}:ПоискСотрудника();
[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
{(9, 5)}: Синтаксическая ошибка "И"
<<?>>И Сотрудники.СоставОпергруппы = &СоставОпергруппы
Код который у меня получился, можете помочь почему выдаёт такую ошибку
&НаСервере
Процедура ПоискСотрудника()
Запрос = Новый Запрос;
стрУсловия = ""; стрИ = "";
Если ЗначениеЗаполнено(Объект.Подразделение) Тогда
Запрос.УстановитьПараметр("Подразделение", Объект.Подразделение);
стрУсловия = "
| " + стрИ + " Сотрудники.Подразделение = &Подразделение";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.Звание) Тогда
Запрос.УстановитьПараметр("Звание", Объект.Звание);
стрУсловия = "
| " + стрИ + " Сотрудники.Звание = &Звание";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.РежимРаботы) Тогда
Запрос.УстановитьПараметр("РежимРаботы", Объект.РежимРаботы);
стрУсловия = "
| " + стрИ + " Сотрудники.РежимРаботы = &РежимРаботы";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.Пол) Тогда
Запрос.УстановитьПараметр("Пол", Объект.Пол);
стрУсловия = "
| " + стрИ + " Сотрудники.Пол = &Пол";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ГруппаОбеспечения) Тогда
Запрос.УстановитьПараметр("ГруппаОбеспечения", Объект.ГруппаОбеспечения);
стрУсловия = "
| " + стрИ + " Сотрудники.ГруппаОбеспечения = &ГруппаОбеспечения";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.Источник) Тогда
Запрос.УстановитьПараметр("Источник", Объект.Источник);
стрУсловия = "
| " + стрИ + " Сотрудники.Источник = &Источник";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.Должность) Тогда
Запрос.УстановитьПараметр("Должность", Объект.Должность);
стрУсловия = "
| " + стрИ + " Сотрудники.Должность = &Должность";
стрИ = "И";
КонецЕсли;
Если ЗначениеЗаполнено(Объект.СоставОпергруппы) Тогда
Запрос.УстановитьПараметр("СоставОпергруппы", Объект.СоставОпергруппы);
стрУсловия = "
| " + стрИ + " Сотрудники.СоставОпергруппы = &СоставОпергруппы";
стрИ = "И";
КонецЕсли;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Подразделение КАК Подразделение,
| Сотрудники.Должность КАК Должность,
| Сотрудники.Наименование КАК Сотрудник
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|" + ?(ПустаяСтрока(стрУсловия), " ", "ГДЕ " + стрУсловия);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если НЕ РезультатЗапроса.Пустой() Тогда
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.ТабличнаяЧастьВводНормДляСотрудников.Добавить();
НоваяСтрока.Подразделение = Выборка.Подразделение;
НоваяСтрока.Должность = Выборка.Должность;
НоваяСтрока.Норма = Объект.Норма;
НоваяСтрока.Сотрудник = Выборка.Наименование;
КонецЦикла;
Иначе
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Сообщить("Ничего не найдено!")
КонецЕсли;
КонецПроцедуры
(8) Перед Запрос.Выполнить() добавить
и посмотреть, если уж отладчиком не умеете пользоваться,
чтобы догадаться, что нужно вот так:
и во всех остальных строках!
Сообщить(стрУсловия)
и посмотреть, если уж отладчиком не умеете пользоваться,
чтобы догадаться, что нужно вот так:
стрУсловия = стрУсловия + "
| " + стрИ + " Сотрудники.Подразделение = &Подразделение";
и во всех остальных строках!
Можно так еще попробовать:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Подразделение КАК Подразделение,
| Сотрудники.Должность КАК Должность,
| Сотрудники.Норма КАК Норма,
| Сотрудники.Наименование КАК Наименование
|ИЗ
| Справочник.Сотрудники КАК Сотрудники";
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
Операторы = СхемаЗапроса.ПакетЗапросов[0].Операторы[0];
ПоляОтбора = Новый Структура("Подразделение, Звание, РежимРаботы, Пол, ГруппаОбеспечение, Источник, Должность, СоставОпергруппы",
"Подразделение", "Звание", "РежимРаботы", "Пол", "ГруппаОбеспечение", "ИсточникФинансирования", "Должность", "СоставОпергруппы");
Для Каждого Поле Из ПоляОтбора Цикл
Если ЗначениеЗаполнено(Объект[Поле.Ключ]) Тогда
Запрос.УстановитьПараметр(Поле.Ключ, Объект[Поле.Ключ]);
Операторы.Отбор.Добавить(СтрШаблон("Сотрудники.%1 = &%2", Поле.Значение, Поле.Ключ));
КонецЕсли;
КонецЦикла;
Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Объект.ТабличнаяЧастьВводНормДляСотрудников.Очистить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(Объект.ТабличнаяЧастьВводНормДляСотрудников.Добавить(), Выборка);
КонецЦикла;
Иначе
ОбщегоНазначения.СообщитьПользователю(нСтр("ru='Сотрудник не найден.'"));
КонецЕсли;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот