Есть документ в котором врач заполняет данные. Есть различные типы услуг. Необходимо чтобы при выборе врача выбирались только соответствующие его должности услуги. Я расписал под каждую должность услуги в регистре сведений и пробовал при помощи запроса вывести данные, но потом узнал что это глупость, так как документ не создан, его нет в базе. Как я могу в реквизит "Услуга" на создаваемой форме передать определенные услуги врача?
(1)запрос не глупость, а не корректный. Надо не справочник соединять , а регистр сведений должности по врачам, с регистром сведений услуги по должностям. В запрос срез последних рег сведений должности врача передавать параметр ФИО врача на дату документа и на эту же дату левым соединением получать срез последних по регистру услуг и соединять их по должности. Создать реквизит услуга с типом справочник услуг и в событии поля формы, кажется начало выбора(могу ошибиться, надо по экспериментировать), если вариант с выпадающим списком не подходит, в форме выбора этого справочника, установить отбор по этому списку что получен из запроса. Тут два варианта или подправить произвольный запрос формы выбора или установить сам отбор списка в присозданиинасервере.
Распишу если правильно понял документ твой.
Есть поле врач и есть поле услуга, если тебе надо, чтоб при выборе ФИО врача , в поле выбора услуги, открывался справочник только с услугами этого врача, то в событиях поля услуга, при начале выбора, создаёшь запрос, выбрать из рег сведений должности по врачам срез последних, параметром отбора будут дата документа и ФИО врача , соединяет левым соединением с услугами, также срез последних на дату документа. Первая часть сделана. Потом результат запроса переводишь или в список значений или в массив значений , все зависит от варианта , который ты выберешь в форме выбора справочника услуг. Поскольку после того как отработает событие при начале выбора, откроется форма выбора этого справочника. Там или допиливаешь произвольный запрос и отбираешь по услугам в (&массиве) который ты передашь из документа на форму выбора, через параметры(тут надо почитать материал как передать параметр в произвольный запрос динамического списка) или при создании на сервере динамическийсписок.отбор и тип сравнения в списке, в интернете полно материала, как при открытии наложить отбор в динамическом списке формы выбора. Все задача решена.
Я получил список значений который необходим запросом. И не могу понять как этот список перенести на реквизит "Услуги". Этот реквизит у меня с типом справочник СправочникСсылка.Услуги. Где этот динамический список должен быть?
(5)вот когда кликаешь в поле услуга, у тебя открывается справочник услуги, это и есть динамический список, который надо отфильтровать. Тебе твой список, надо передать в параметры, вот тебе надо тоже самое сделать
https://forum.infostart.ru/forum9/topic313097/ Используй открытьформу выбора и параметры передаются в виде структуры. А в самой форме выбора в при создании на сервере получаешь из параметров этот список, я кстати не помню, можно ли список туда передать, но попробуй, по идее должно, если нет, передай массив, а в при создании на сервере создашь список. Данные в этой процедуре, получишь параметры.... В отладчике напиши параметры и увидишь содержание и лепи свой отбор или передавай массив в виде параметра в произвольный запрос и подправь сам запрос к динамическому списку
(6)Хорошо, смотрите, когда я выбираю событие при НачалоВыбора, в нем я не могу создать запрос. Сам список я с нужными значениями с помощью запроса с параметром Врач я получаю при изменении Врача.
Как этот список который я получил передать в параметры? Я окончательно запутался.
(7) а зачем его делать при изменении врача, там это не нужно, поскольку выбор услуги может и не произойти? Сделай функцию на сервере и туда вложи этот запрос и запроси этот список из начало выбора и функция тебе его вернёт, а дальше передавай в форму выбора. Потом когда сделаешь, я подскажу что исправить в запросе, чтоб сейчас не путать тебя) используй функцию на серверебезконтекста, а не на сервере и передай врача так список услуг =ЗапросСпискаУслуг(объект.врач)
&НаСервереБезКонтекста
Функция ЗапросСпискаУслуг(ВыбВрач)
....
....
Запрос.УстановитьПараметр("Врач",ВыбВрач)
Есть ещё третий вариант, точнее это один из двух ранее предложенных, но чуть измененный , надо тестить. Передать в произвольный запрос формы выбора ,должность полученную по ФИО, должность можно через получить последнее. Потом открыть программно форму выбора справочника услуги и передать туда через параметры должность и в произвольном запросе правым соединением справочника с регистром услуг, срез последних, отобрать услуги по должности.
(9) параметры не так передаются
Параметры = новый Структура;
Параметры.Вставить("СписокУслуг",СписокУслуг)
На счёт формы выбора, я ее имел ввиду не также , а этот способ как пример.
&НаКлиенте
Процедура МастерНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если Объект.Филиал.Пустая() или Объект.КатегорияУслуги.Пустая() Тогда
ПоказатьПредупреждение(,"Поля ""Филиал"" и ""Категория услуги"" должны быть заполнены",,"Важное!!!");
Возврат;
Иначе
ПараметрыДанных = Новый Структура("ДатаВизита,ВремяВизита,ФилиалСотрудника,КатегорияУслуги",ДатаВизита,ВремяВизита,Объект.Филиал,Объект.КатегорияУслуги);
ОписаниеЗакрытия = Новый ОписаниеОповещения("ОбработатьВыбор",ЭтотОбъект);
ФормаВыбора = ОткрытьФорму("Справочник.Сотрудники.ФормаВыбора",ПараметрыДанных,ЭтаФорма,,,,ОписаниеЗакрытия,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВыбор(Результат,Параметры) Экспорт
Объект.Мастер = Результат;
КонецПроцедуры
(12) попробуй может пройдет, если будет ошибка то скорее всего где ссылка и всписке, там надо по эксперемнитировать, может содержит вместо всписке. я тебе сделал без параметров и сразу с отбором
&НаКлиенте
Процедура ВрачНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ОписаниеЗакрытия = Новый ОписаниеОповещения("ОбработатьВыбор",ЭтотОбъект);
ФормаВыбора = ОткрытьФорму("Справочник.Услуги.ФормаВыбора",,ЭтаФорма,,,,ОписаниеЗакрытия,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
ЭлементыОтбора = ФормаВыбора.Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементыОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементыОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; Важно, должен быть именно список значений , хотя может и массив твой прокатит
ЭлементыОтбора.ПравоеЗначение = ТвойСписок;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВыбор(Результат,Параметры) Экспорт
Объект.Врач= Результат;
КонецПроцедуры
СписокЗначений = Новый СписокЗначений;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий Цикл
СписокЗначений.Добавить(Выборка.Услуга.Ссылка,Строка(Выборка.Услуга));
КонецЦикла;
Возврат СписокЗначений;
(21) ещё увидел косяк. Объект.услуга , а не объект.врач = результат. В описании оповещения. Глянул , что сделал. Там мой вариант кода, надо было не к врачу а к услуге. То что у тебя врачначаловыбора, перекинь в услугуначаловыбора.
(24)Это победа, вы лучший. Благодарю что помогли с этим. Мне осталось только понять как это можно сделать через открыть форму. Проверял, что список приходит верный, видимо в обозначении параметра ошибка. Еще раз благодарю. Это круто. Вы мощь.
(27)алилуя))) ну, эту историю ранее открытых можно убрать и сделать только на кнопку открытия. Выпадающий список тоже можно создать, при очень сильном желании. Но я говорил, там надо запрос подправить. В запрос надо передавать , помимо врача и дату документа и отбирать срез последних по дате тоже. Вот если надо будет что то исправить в старом документе, нажмёшь услугу и у тебя о берутся услуги по срезу на текущую дату, а надо на дату документа!!!