Имя: Пароль:
1C
1С v8
Проверка на новый элемент справочника
🠗 (Serg_1960 08.12.2022 13:03)
, ,
0 Len1vec
 
08.12.22
12:36
Добрый день всем.
Подскажите, пожалуйста.

Есть 2 команды на управляемой форме: "Установка цен" и "Список цен". Перейти по ним нельзя, пока элемент справочника не записан.

Можно ли как-то оптимизировать или переписать проще приведенный ниже код?


&НаКлиенте
Процедура УстановкаЦен(Команда)
    Номенклатура = ПроверкаНаНовыйЭлемент();                                      

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

&НаКлиенте
Процедура СписокЦен(Команда)
    Номенклатура = ПроверкаНаНовыйЭлемент();
    ФормаСписка = ПолучитьФорму("РегистрСведений.ЦеныПродажи.Форма.ФормаСписка");
    ФормаСписка.ФильтрПоНоменклатуре = Номенклатура;
    ФормаСписка.Открыть();      
КонецПроцедуры

&НаСервере
Функция ПроверкаНаНовыйЭлемент()
    Если Объект.Ссылка.Пустая() Тогда
        Номенклатура = Справочники.Номенклатура.СоздатьЭлемент();
        Номенклатура.Наименование = Объект.Наименование;
        Номенклатура.Записать();
        ЭтаФорма.Модифицированность = Ложь;
        Возврат Номенклатура.Ссылка;
    Иначе
        Возврат Объект.Ссылка;
    КонецЕсли;
КонецФункции
1 Beduin
 
08.12.22
12:40
У тебя при вызове каких-то процедур записывается элемент справочника?
2 PR
 
08.12.22
12:41
Какая-то лютая дичь
3 Kassern
 
08.12.22
12:42
(0) Надеюсь вы это делаете не в форме создания номенклатуры?)
4 PR
 
08.12.22
12:42
Проверка на то, новый элемент или нет, в случае, если новый, создает какой-то новый элемент?!
5 PR
 
08.12.22
12:43
(3) Не будь так скоропалителен со своими выводами, ты же не знаешь бизнес-процессов компании, может им так нужно :))
6 Kassern
 
08.12.22
12:44
(0) У вас ЦеныПродажи не документ фиксирует?
7 Kassern
 
08.12.22
12:44
(5) я потому и уточняю)
8 PR
 
08.12.22
12:46
(7) Это была попытка доброго троллинга :))
На самом деле написанный в (0) код не имеет права на существование ни при каких обстоятельствах
9 Kassern
 
08.12.22
12:47
(5) мой разум пока не в силах представить когда требуется создавать новую номенклатуру в форме создания новой номенклатуры) Здравый смысл говорит, что нужно просто не давать переходить по этим кнопкам и ругаться, что номенклатура не записана, как это делают типовые конфы.
(0) Посмотрите как работают упаковки, или штрихкоды в карточке номенклатуры, возможно этот вариант взаимодействия вам лучше подойдет)
10 Serg_1960
 
08.12.22
12:47
Вернуть ссылку на другую запись справочника если Объект новый? О_О Да, согласен с (2)
11 Новый1сник2
 
08.12.22
12:49
(0) хочешь текущий элемент записать? или новый создать
12 Kassern
 
08.12.22
12:49
(8) Тут как раз бы подошел метод ПоказатьВопрос. Мол для работы с ценами нужно записать номенклатуру, продолжить?. И все дела.
13 Kigo_Kigo
 
08.12.22
12:50
То есть записать религия не позволяет?
14 Kassern
 
08.12.22
12:51
(13) Вот же есть Номенклатура.Записать();  =)
15 Гипервизор
 
08.12.22
12:53
Где находится функция ПроверкаНаНовыйЭлемент() и что такое Объект?
16 Serg_1960
 
08.12.22
13:02
(15) Автор от наших вопросов впал в ступор :)
17 Serg_1960
 
08.12.22
13:03
Функция ПроверкаНаНовыйЭлемент()
    Если Объект.Ссылка.Пустая() Тогда
        Объект.Записать();
        ЭтаФорма.Модифицированность = Ложь;
    КонецЕсли;
    Возврат Объект.Ссылка;
КонецФункции
18 Len1vec
 
08.12.22
13:05
Почитал Ваши комментариями, огорчился своей тупости, сократил код до следующего (норм или всё равно говно?):

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

&НаКлиенте
Процедура СписокЦен(Команда)
    Если Не Объект.Ссылка.Пустая() Тогда
        ФормаСписка = ПолучитьФорму("РегистрСведений.ЦеныПродажи.Форма.ФормаСписка");
        ФормаСписка.ФильтрПоНоменклатуре = Объект.Ссылка;
        ФормаСписка.Открыть();      
    КонецЕсли;
КонецПроцедуры
19 Kigo_Kigo
 
08.12.22
13:07
(18) Перечитай еще раз и объясни нахрена ты пустой ссылкой кидаешься туда обратно?
20 PR
 
08.12.22
13:09
(18) Вместо Не Объект.Ссылка.Пустая() напиши ЗначениеЗаполнено(Объект.Ссылка)
21 Kassern
 
08.12.22
13:13
(20) (18) ИТС говорит использовать "Параметры" https://its.1c.ru/db/metod8dev/content/3545/hdoc
Если Не Параметры.Ключ.Пустая() Тогда - как вариант. Имхо вкусовщина конечно)
22 PR
 
08.12.22
13:22
(21) Хм, ну может быть, да
23 Serg_1960
 
08.12.22
13:28
(21) Угу. Параметры.Ключ.Пустая() вместо старого доброго ЭтоНовый().
24 Len1vec
 
08.12.22
13:29
(21) этим я пользовался, тоже работает.
В чем разница между Объект.Ссылка.Пустая(), Параметры.Ключ.Пустая() и ЗначениеЗаполнено(Объект.Ссылка) в скорости выполнения?
25 Len1vec
 
08.12.22
13:30
(23) Для этого, вроде как, нужно получить объект. Но для чего нам это на клиенте?
26 Serg_1960
 
08.12.22
13:33
(25) "Старый и добрый" - это из эры Толстых Клиентов до эпохи Управляемых Форм :)
27 Kassern
 
08.12.22
13:35
(24) "в скорости выполнения" - ага. Объект.Ссылка - вроде как заставит весь объект прочитать, могу ошибаться.
28 Len1vec
 
08.12.22
13:48
(27) Мы что через Объект.Ссылка вызываем метод проверки ссылки Пустая(), что через Параметры.Ключ тот же метод для проверки ссылки Пустая(). Так что тут я не вижу разницы.

Решил проверить.
Данные по отладке.

1. ЗначениеЗаполнено
До: Тек вызовы 2, Накопленные 30
После : Тек вызовы 6, Накопленные 36

2. Объект.Ссылка.Пустая()
До: Тек вызовы 2, Накопленные 29
После : Тек вызовы 6, Накопленные 35

3. Параметры.Ключ.Пустая()
До: Тек вызовы 2, Накопленные 31
После : Тек вызовы 7, Накопленные 38

Менее требовательные ЗначениеЗаполнено и Объект.Ссылка.Пустая().
29 Len1vec
 
08.12.22
13:50
Тесты проводились на команде "УстановкаЦен"
30 Serg_1960
 
08.12.22
13:56
(28) Хех :) про кэширование забыли.
31 Len1vec
 
08.12.22
14:02
(30) Вообще забыл про него)
32 PR
 
08.12.22
16:32
(27) Ошибаешься