Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 ноя 2021, 19:57

Выбор по дате из справочника

Автор Anachronizm, 18 дек 2020, 16:36

0 Пользователей и 1 гость просматривают эту тему.

Anachronizm

Здравствуйте, есть проблема с выбором из справочника. У меня есть справочник Сеансы с записями, в каждой записи есть дата, есть второй справочник Билеты, в котором есть реквизит с типом данных СправочникСсылка.Сеансы на первый справочник Сеансы.

Задача сделать доступным для выбора только те записи из первого справочника, в которых дата больше или равна текущей.

Я пробовал реализовать это в режиме конфигуратора в свойстве реквизита Параметры выбора, но там можно установить имя и значение, а условие сделать не вижу где. Как в таком случае мне поступить? Я хочу сделать это в конфигураторе, так как вещь вроде лёгкая и не требует запросов в базу данных. Хотя возможно это делается через обработчик событий, но я не уверен что именно так.

DmitriyF

Цитата: Anachronizm от 18 дек 2020, 16:36
Здравствуйте, есть проблема с выбором из справочника. У меня есть справочник Сеансы с записями, в каждой записи есть дата, есть второй справочник Билеты, в котором есть реквизит с типом данных СправочникСсылка.Сеансы на первый справочник Сеансы.

Задача сделать доступным для выбора только те записи из первого справочника, в которых дата больше или равна текущей.

Я пробовал реализовать это в режиме конфигуратора в свойстве реквизита Параметры выбора, но там можно установить имя и значение, а условие сделать не вижу где. Как в таком случае мне поступить? Я хочу сделать это в конфигураторе, так как вещь вроде лёгкая и не требует запросов в базу данных. Хотя возможно это делается через обработчик событий, но я не уверен что именно так.
При открытии формы, отбор задать по необходимому значению. Но более правильно периодические значения хранить в регистре сведений.

LexaK

Anachronizm,
Цитироватьв режиме конфигуратора в свойстве реквизита Параметры выбора,
такой отбор работает только по равенству,
что бы реализовать вашу идею отбора по условию Дата сеанса больше или равна текущей даты, нужно писать запрос (или код программы)
ответ Понравился? (в смысле пригодился?)

Anachronizm

Цитата: DmitriyF от 18 дек 2020, 17:01
Цитата: Anachronizm от 18 дек 2020, 16:36
Здравствуйте, есть проблема с выбором из справочника. У меня есть справочник Сеансы с записями, в каждой записи есть дата, есть второй справочник Билеты, в котором есть реквизит с типом данных СправочникСсылка.Сеансы на первый справочник Сеансы.

Задача сделать доступным для выбора только те записи из первого справочника, в которых дата больше или равна текущей.

Я пробовал реализовать это в режиме конфигуратора в свойстве реквизита Параметры выбора, но там можно установить имя и значение, а условие сделать не вижу где. Как в таком случае мне поступить? Я хочу сделать это в конфигураторе, так как вещь вроде лёгкая и не требует запросов в базу данных. Хотя возможно это делается через обработчик событий, но я не уверен что именно так.
При открытии формы, отбор задать по необходимому значению. Но более правильно периодические значения хранить в регистре сведений.

Я решил сделать через обработчик событий и пока что просто выводить сообщение об ошибке через функцию Сообщить(<Сообщение>). У меня на форме есть элемент у которого путь к данным таков: Объект.Сеанс.ВремяПоказаФильма, данные в этом элементе заполняются автоматически как только я выберу элемент из первого справочника Сеансы.

Написал простенький код для процедуры:

&НаКлиенте
//Обрабатывает событие изменения данных в поле Сеанс на форме (на стороне клиента)
Процедура СеансПриИзменении(Элемент)
Если Объект.Сеанс.ВремяПоказаФильма < ТекущаяДата() Тогда
Сообщить("Сеанс не может быть меньше текущего времени и даты!")
КонецЕсли;
КонецПроцедуры


но процедура выдаёт ошибку так как не видит поле объекта ВремяПоказаФильма. В чём  может быть проблема, что обработчик не видит поле которое на форме есть? Или надо проверять не на форме а в справочнике? Если да тогда как?

antoneus

На клиенте до этого поля не достучаться. Надо на сервере смотреть.

Anachronizm

Цитата: antoneus от 18 дек 2020, 17:57
На клиенте до этого поля не достучаться. Надо на сервере смотреть.

Хмм интересно как так выходит, то есть нужно делать запрос в базу данных и проверять дату, которая приходит из запроса для текущей записи. И проверять её с текущей датой? Капец зачем так усложнять. Если поле на форме есть, его можно видеть на форме и оно заполняется автоматически при выборе записи в справочнике то почему бы не сделать возможность чтения данных из этих полей через объект этих же полей или хотя бы методы какие-нибудь использовать?

DmitriyF

Цитата: Anachronizm от 18 дек 2020, 18:32
Цитата: antoneus от 18 дек 2020, 17:57
На клиенте до этого поля не достучаться. Надо на сервере смотреть.

Хмм интересно как так выходит, то есть нужно делать запрос в базу данных и проверять дату, которая приходит из запроса для текущей записи. И проверять её с текущей датой? Капец зачем так усложнять. Если поле на форме есть, его можно видеть на форме и оно заполняется автоматически при выборе записи в справочнике то почему бы не сделать возможность чтения данных из этих полей через объект этих же полей или хотя бы методы какие-нибудь использовать?
Потому, что на клиенте происходит только отрисовка, сами значения на ней не хранятся.

Anachronizm

Цитата: DmitriyF от 18 дек 2020, 20:25
Цитата: Anachronizm от 18 дек 2020, 18:32
Цитата: antoneus от 18 дек 2020, 17:57
На клиенте до этого поля не достучаться. Надо на сервере смотреть.

Хмм интересно как так выходит, то есть нужно делать запрос в базу данных и проверять дату, которая приходит из запроса для текущей записи. И проверять её с текущей датой? Капец зачем так усложнять. Если поле на форме есть, его можно видеть на форме и оно заполняется автоматически при выборе записи в справочнике то почему бы не сделать возможность чтения данных из этих полей через объект этих же полей или хотя бы методы какие-нибудь использовать?
Потому, что на клиенте происходит только отрисовка, сами значения на ней не хранятся.

Но мы же можем получить доступ и прочитать значения других полей, к примеру реквизит текущего справочника (Объект.Цена например, то есть Объект - глобальный объект, представляющий форму элемента и на ней есть поле, представляющее реквизит Цена текущего справочника)

К примеру:
&НаКлиенте
//Обрабатывает событие изменения данных в поле Количесто на форме
Процедура КоличестоПриИзменении(Элемент)
КоличествоБилетов = Объект.Количесто; //Пишем значение поля Количесто на форме в КоличествоБилетов
Сообщить(КоличествоБилетов);
КонецПроцедуры


Тут всё читается и всё работает. Хотя здесь мы сами их вводим, тогда как же получить данные из другого справочника? Можно даже пример какой-нибудь, буду признателен.
Добавлено: 18 дек 2020, 22:14


Написал код функции для выполнения на сервере и код процедуры для выполнения на клиенте в качестве теста взял задачку по проверке дат (на больше меньше):


&НаСервереБезКонтекста
//Возвращает дату начала показа указанного фильма
//НазваниеФильма - название фильма указанного фильма
Функция ВремяПоказаФильмаПриИзмененииНаСервере(НазваниеФильма)
Фильмы = Справочники.Фильмы;
СсылкаНаФильм = Фильмы.НайтиПоНаименованию(НазваниеФильма, Истина);
Возврат СсылкаНаФильм.ДатаНачалаПоказа;
КонецФункции

&НаКлиенте
//Обрабатывает изменение данных в поле ВремяПоказаФильма
Процедура ВремяПоказаФильмаПриИзменении(Элемент)
Если Объект.ВремяПоказаФильма < ВремяПоказаФильмаПриИзмененииНаСервере(Объект.НазваниеФильма) Тогда
сбщ = Новый СообщениеПользователю;
сбщ.Текст = "Показ фильма не может быть меньше чем дата начала его показа!";
сбщ.Поле = "ВремяПоказаФильма";
сбщ.ПутьКДанным = "Объект";
сбщ.Сообщить();
Объект.ВремяПоказаФильма = "";
КонецЕсли;
КонецПроцедуры


Метод работает, всё проверяет и выводит, надеюсь правильно сделал что функция вызывается на сервере "без контекста" так скажем.

antoneus

Объект в форме - это не "глобальный объект", а данные с типом "ДанныеФормыСтруктура", хоть в редакторе реквизитов и написано, что его тип - СправочникОбъект. И доступ к его реквизитам происходит так же, как доступ к значениям в структуре - по ключу.
Реквизит формы ссылочного типа имеет тип СправочникСсылка, ДокументСсылка и т.д. и на клиенте только ссылка в этом реквизите и хранится. В серверной процедуре можно обращаться к ее реквизитам, реквизитам ее реквизитов и так далее. В клиентской процедуре тоже возможно к ним обращаться, но база должна быть запущена в режиме толстого клиента.

Anachronizm

Цитата: antoneus от 18 дек 2020, 22:16
Объект в форме - это не "глобальный объект", а данные с типом "ДанныеФормыСтруктура", хоть в редакторе реквизитов и написано, что его тип - СправочникОбъект. И доступ к его реквизитам происходит так же, как доступ к значениям в структуре - по ключу.
Реквизит формы ссылочного типа имеет тип СправочникСсылка, ДокументСсылка и т.д. и на клиенте только ссылка в этом реквизите и хранится. В серверной процедуре можно обращаться к ее реквизитам, реквизитам ее реквизитов и так далее. В клиентской процедуре тоже возможно к ним обращаться, но база должна быть запущена в режиме толстого клиента.

Ясно благодарю за разъяснение, я попробовал поработать "на сервере без контекста" код выше и работает. Данные с сервера идут в обработчик на клиенте и же в процедуре всё на том же клиенте сравниваются.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск