Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
26 июн 2022, 07:27

Правильность написания кода для получения значений из реквизитов справочника

Автор Anachronizm, 19 дек 2020, 01:15

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

Anachronizm

Здравствуйте, продолжаю изучать встроенный язык 1С.

На сей раз я решил проверять время показа фильма и текущую дату, если текущая дата больше чем время показа фильма, то я вывожу сообщение о запрете.

И так, есть всё та же форма выбора, на ней есть поле выбора сеанса (объект СправочникСсылка.Сеансы), само собой отображение на форме - значение стандартного реквизита Наименование.

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


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


Есть ли какие-нибудь замечания по коду? Код работает и всё проверяет, но я спрашиваю на всякий случай, чтобы сразу писать его правильно (если есть замечания конечно).

Anachronizm

Эта форма, для который я реализовал функции и процедуру, нужна для создания записи в справочнике Билеты.

antoneus

Совершенно не нужны все эти телодвижения с получением уид. Все будет работать так:

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


И в сеансах лучше все-таки хранить не наименование фильма, а ссылку на него. Наименование в справочнике фильмов может измениться, а в сеансах останется прежним. Тело функции тогда будет выглядеть так:

Возврат СсылкаНаСеанс.Фильм.ЦенаЗаОдинБилет

LexaK

примерно такая функция должна быть

&НаСервереБезКонтекста
Функция ПолучитьЦенуЗаФильм(СеансСсылка)
    Возврат СеансСсылка.Фильм.ЦенаЗаОдинБилет;
КонецФункции
если помогло сказать: Спасибо!

Anachronizm

Цитата: antoneus от 19 дек 2020, 11:14
Совершенно не нужны все эти телодвижения с получением уид. Все будет работать так:

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


И в сеансах лучше все-таки хранить не наименование фильма, а ссылку на него. Наименование в справочнике фильмов может измениться, а в сеансах останется прежним. Тело функции тогда будет выглядеть так:

Возврат СсылкаНаСеанс.Фильм.ЦенаЗаОдинБилет

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

И да по поводу названия фильма, у меня ссылка на фильм - это реквизит справочника Сеансы с типом СправочникСсылка.Фильмы и выбор фильма с дальнейшим отображением на форме у меня происходит как раз по стандартному реквизиту Наименование (название фильма), поэтому когда я меняю название фильма, то и в остальных справочниках, где имеется ссылка на этот фильм, название тоже меняется, к примеру если обновлю список грубо говоря. А в справочнике с билетами, у меня также отображается фильм, но уже через ссылку на справочник с сеансами СправчоникСсылка.Сеансы. Получается некая лестница (когда через реквизит-ссылку идём в справочник, на который указывает ссылка, а там тоже реквизит-ссылка но уже на другой справочник и так далее) впрочем как в реляционной базе данных.
Добавлено: 19 дек 2020, 14:50


Цитата: LexaK от 19 дек 2020, 11:17
примерно такая функция должна быть

&НаСервереБезКонтекста
Функция ПолучитьЦенуЗаФильм(СеансСсылка)
    Возврат СеансСсылка.Фильм.ЦенаЗаОдинБилет;
КонецФункции


Благодарю, да так тоже работает, просто меня смутило что редактор кода не имеет автокомплита для ссылки на сеанс, видимо это связано с тем что это ссылка а не сам объект.

antoneus

Редактор кода не знает - что вы ему подсовываете в параметре процедуры, поэтому автокомплит не работает. Если объявить процедуру с директивой &НаСервере (в чем ничего страшного нет, процедуры и функции без контекста чаще всего объявляют когда форма очень тяжелая и гонять ее на сервер и снова на клиент затратно) и обратиться к реквизиту формы Сеанс - автокомлит прекрасно заработает.

Теги:

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

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

Поиск