|
Чем заменить НайтиПоНаименованию | ☑ | ||
---|---|---|---|---|
0
Cоляпсус
07.06.23
✎
17:46
|
Здравствуйте, был исходный с множественным НайтиПоНаименованию. Что-то так оставлять не хочется. Подскажите пожалуйста чем можно заменить данный кусок?
//Если Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("CIP") // ИЛИ Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("CIF") // ИЛИ Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("CPT") // ИЛИ Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("CFR") // ИЛИ Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("DAT") // ИЛИ Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("DAP") Тогда // Элементы.ДатаПоступленияНаСкладРасчет.ТолькоПросмотр = Ложь; // Элементы.СтавкаЗаФрахт.ТолькоПросмотр = Ложь; // Элементы.Валюта.ТолькоПросмотр = Ложь; |
|||
1
Spieluhr
07.06.23
✎
17:48
|
Предопределенные?
|
|||
2
novichok79
07.06.23
✎
17:48
|
давно не писал на 1С, но я бы сделал регистр сведений а ля настройки
туда бы закинул СправочникСсылка.ТерминыИнкотермс. при открытии формы кешировал бы в Соответствие, и проверял бы на наличие ссылки в Соответствии. я думаю за такими вопросами даже не стоит заходить на форум. |
|||
3
novichok79
07.06.23
✎
17:49
|
а да, можно еще предопределенные, но имхо правильнее - регистр сведений с заполненными настройками.
|
|||
4
Cоляпсус
07.06.23
✎
17:51
|
(1) К сожалению нет. Была мысль сделать предопределёнными, но подумал может ещё какой выход есть
|
|||
5
Cоляпсус
07.06.23
✎
17:58
|
А без добавления регистра есть ещё способы?
|
|||
6
azernot
07.06.23
✎
18:00
|
(0) Массив текстовых наименований, запрос с условием типа "Наименоваt в (&МассивНаименований), на выходе - массив нужных элементов справочника.
|
|||
7
Cоляпсус
07.06.23
✎
18:04
|
(6) Думал так сделать, но задумался из-за того что тут несколько условий и как всё это в запросе отработать.Вот полный текст:
//Если Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("CIP") // ИЛИ Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("CIF") // ИЛИ Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("CPT") // ИЛИ Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("CFR") // ИЛИ Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("DAT") // ИЛИ Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("DAP") Тогда // Элементы.ДатаПоступленияНаСкладРасчет.ТолькоПросмотр = Ложь; // Элементы.СтавкаЗаФрахт.ТолькоПросмотр = Ложь; // Элементы.Валюта.ТолькоПросмотр = Ложь; //ИначеЕсли Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("EXW") // ИЛИ Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("FCA") // ИЛИ Объект.УсловиеПоставки = Справочники.ТерминыИнкотермс.НайтиПоНаименованию("FCA, EXW") Тогда // Объект.ДатаДоставкиПлан = Объект.ДатаОтгрузкиФакт; // Объект.ДатаДоставкиФакт = Объект.ДатаОтгрузкиФакт; // Элементы.ДатаПоступленияНаСкладРасчет.ТолькоПросмотр = Истина; // Элементы.СтавкаЗаФрахт.ТолькоПросмотр = Истина; // Элементы.Валюта.ТолькоПросмотр = Истина; // Объект.СтавкаЗаФрахт = 0; // Объект.Валюта = ""; //Иначе // Объект.ДатаДоставкиПлан = Дата(1, 1, 1); // Объект.ДатаДоставкиФакт = Дата(1, 1, 1); // Элементы.ДатаПоступленияНаСкладРасчет.ТолькоПросмотр = Истина; // Элементы.СтавкаЗаФрахт.ТолькоПросмотр = Ложь; // Элементы.Валюта.ТолькоПросмотр = Ложь; //КонецЕсли; |
|||
8
novichok79
07.06.23
✎
18:04
|
(6) ужас. хардкод, про который без конфигуратора не узнать.
|
|||
9
Cоляпсус
07.06.23
✎
18:07
|
(8) вот вот
|
|||
10
Donkey_hot
07.06.23
✎
18:13
|
(7) Собрать запросом в табличку, в первой колонке которой ссылка на элемент справочника, а во второй - индекс ветвления условия, в который хотите попасть (кроме ИНАЧЕ). И пользовать себе на здоровье. Можно еще и в модуль с повторным использованием загнать.
|
|||
11
Donkey_hot
07.06.23
✎
18:15
|
(7) И еще убедиться, что объект - это объект, а не ссылка, в противном случае еще и получение условия поставки вынести из многократного повторения.
|
|||
12
novichok79
07.06.23
✎
18:21
|
(10) это вроде как стейт-машинки получается уже, а это лучше однозначно вынести в регистр.
|
|||
13
Donkey_hot
07.06.23
✎
18:23
|
(12) Вопрос в том, одинакова ли данная группировка для всех запросов или в соседнем механизме они совсем иначе группируются. Не создавать же ресурс под каждый новый обработчик... Тогда уж проще реквизиты в сам справочник добавлять.
|
|||
14
azernot
07.06.23
✎
18:26
|
(7) Может зайти с другой стороны?
В справочнике "ТерминыИнкотермс" добавить реквизиты типа "ПредполагаетсяФрахт", "ЭтоИмпорт" и т.п. Разово корректно заполнить эти данные. И уже в зависимости от этих флагов в выбранном УсловиеПоставки играться формой. |
|||
15
azernot
07.06.23
✎
18:32
|
Или в модуле менеджера Справочники.ТерминыИнкотермс организовать экспортные функции типа
Функция ПредполагаетсяФрахт(НаименованиеУсловийПоставки) Экспорт Если НаименованиеУсловийПоставки = "EXW" ИЛИ НаименованиеУсловийПоставки = "FCA" ... Возврат Истина; КонецЕсли; Возврат Ложь; КонецФункции А там где надо, использовать: НаименованиеУсловийПоставки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.УсловиеПоставки, "Наименование"); Если Справочники.ПредполагаетсяФрахт(НаименованиеУсловийПоставки) Тогда бла-бла-бла Т.е. хардкодить в одном конкретном месте. В модуле менеджера справочника. |
|||
16
azernot
07.06.23
✎
18:32
|
*(15) Если Справочники.ТерминыИнкотермс.ПредполагаетсяФрахт(НаименованиеУсловийПоставки) Тогда
|
|||
17
AAA
07.06.23
✎
19:08
|
Можно создать справочник с двумя табличными частями. В одной табличной части условия , в другой табличной части результаты (то есть действия).
|
|||
18
DrZombi
08.06.23
✎
06:21
|
(0) Предлагаю заменить на запросы, КЭШи...
Предопределенные значения. Оптимизация алгоритма, исключающие обращения к справочнику через точки ЭлементСпр.Код и т.д.... |
|||
19
DrZombi
08.06.23
✎
06:23
|
+(0) Создать общий модуль, где будет обращение к справочнику один раз на время сеанса.
Можно использовать Параметры сеанса, аккумулировав там заранее предопределенные параметры в Структуре или еще как :) |
|||
20
DrZombi
08.06.23
✎
06:23
|
+ Все в ваших руках, фантазии и желание переписать конфигурацию :)
|
|||
21
Bigbro
08.06.23
✎
06:37
|
затолкать в какую-то настройку список элементов.
который считывать в модуле повторного использования. должно быть достаточно удобно. |
|||
22
НафНаф
08.06.23
✎
07:37
|
Справочник с предопределенными значениями
https://ru.wikipedia.org/wiki/Инкотермс#Содержание |
|||
23
dmpl
08.06.23
✎
08:00
|
(7) В справочник ТерминыИнкотермс добавить реквизиты с соответствующими настройками. Тогда просто получаешь реквизиты по ссылке - и никаких Если.
|
|||
24
Мультук
08.06.23
✎
08:53
|
(0)
Мы для внутренних разработок используем вот такую конструкцию (идея c infostart-а) ВидЦены = XMLЗначение(Тип("СправочникСсылка.ВидыЦен"), "9825736f-5026-11d9-b586-000d6144255e"); //ЦенаПродажи 1000 таких вызовов стоит 16 мс 1000 найтипонаименованию стоит 1062 мс Для генерации простейшая обработка, где на входе навигационная ссылка в виде строки, а на выходе вот такая строчка. (идея также с infostart-а) //=================================================== &НаКлиенте Процедура НавигационнуюСсылкуВТекст(Команда) ссылка = НавигационнаяСсылка2Ссылка(нс); СсылкуВТекстНаСервере(ссылка); КонецПроцедуры &НаСервереБезКонтекста Функция НавигационнаяСсылка2Ссылка(нс) ПерваяТочка = Найти(НС, "e1cib/data/"); ВтораяТочка = Найти(НС, "?ref="); ПредставлениеТипа = Сред(НС, ПерваяТочка + 11, ВтораяТочка - ПерваяТочка - 11); ШаблонЗначения = ЗначениеВСтрокуВнутр(ПредопределенноеЗначение(ПредставлениеТипа + ".ПустаяСсылка")); ЗначениеСсылки = СтрЗаменить(ШаблонЗначения, "00000000000000000000000000000000", Сред(НС, ВтораяТочка + 5)); пСсылка = ЗначениеИзСтрокиВнутр(ЗначениеСсылки); Возврат пСсылка; КонецФункции &НаСервере Процедура СсылкуВТекстНаСервере(ЛюбаяСсылка) тт = XMLСтрока(ЛюбаяСсылка); пТип = ОбщегоНазначения.СтроковоеПредставлениеТипа(ТипЗнч(ЛюбаяСсылка)); пСтр = СтрШаблон("XMLЗначение(Тип(""%1""), ""%2"");//%3", пТип, тт, Строка(ЛюбаяСсылка)); Сообщить(пстр); КонецПроцедуры |
|||
25
KJlag
08.06.23
✎
08:18
|
(0) как вариант, чтобы не плодить кучу регистров сведений под каждый "уникальный случай"
можно звести какой нибудь справочник: ЛякакиеГруппировки. заводишь предопределенное - ТерминыИнкотермс и там в ТЧ пихаешь свои объекты. нужна будет такая же фигня в другом месте с другими значениями - делаешь в этом же справочнике новое предопределенное |
|||
26
Fish
08.06.23
✎
08:54
|
(4) Чем не нравятся предопределённые? Судя по (22) это должен быть именно предопределённый справочник.
|
|||
27
Fish
08.06.23
✎
08:56
|
+(26) Или вообще перечисление сделать и не париться.
|
|||
28
DrZombi
08.06.23
✎
09:16
|
(24) И главное, вашей поделкой не так просто воспользоваться, ведь надо будет генерить кучу ГУИД-ов, что бы начать работать на новой площадке. "Оригинально"(C)
|
|||
29
DrZombi
08.06.23
✎
09:21
|
(25) Можно завести один регистр, https://infostart.ru/1c/tools/1718882/
см. "Общие настройки формы", в https://infostart.ru/upload/iblock/c78/c781955064db4cd0c6dde67d8cf035c0.png |
|||
30
DrZombi
08.06.23
✎
09:22
|
(27) Тоже вариант :)
|
|||
31
Мультук
08.06.23
✎
09:23
|
(29)
Красиво конечно, только медленно. А как искать нужную запись в этом регистре? Найти по наименованию? |
|||
32
DrZombi
08.06.23
✎
09:25
|
(31) Любую поделку можно сконфигурировать, так, что будет медленно.
В (29) смысл иметь Динамический набор "Констант" :) А как организовать его чтение, уже в ваших руках. "Помни, можно создавать Общие модули, которые значение помнят на время сеанса" :) |
|||
33
НЕА123
08.06.23
✎
09:30
|
(0)
А зачем найтиПоНаименованию? //Если Объект.УсловиеПоставки.Наименование = "CIP" // ИЛИ Объект.УсловиеПоставки.Наименование = "CIF" .................. // ИЛИ Объект.УсловиеПоставки.Наименование = "DAP" Тогда // Элементы.ДатаПоступленияНаСкладРасчет.ТолькоПросмотр = Ложь; // Элементы.СтавкаЗаФрахт.ТолькоПросмотр = Ложь; // Элементы.Валюта.ТолькоПросмотр = Ложь; |
|||
34
Мультук
08.06.23
✎
09:35
|
(33)
Люди привыкают писать через точку "удобно же". А потом начинают писать: СсылкаНаТолстыйОбъект100кСтрок.Дата и удивляются -- "медленно что-то". Я же только дату читаю. P.S. А читать нужно ИТС :-) |
|||
35
oslokot
08.06.23
✎
09:44
|
(34) Вы намекаете что СсылкаНаТолстыйОбъект100кСтрок.Дата отработает медленнее чем СсылкаНаТолстыйОбъект1Строка.Дата ?
|
|||
36
Aleksey
08.06.23
✎
09:49
|
Ну типа при обращении толстый объект тащит на клиента все реквизиты включая и 100к строк. Поэтому в БСП и появилась процедура значения реквизита обекта
|
|||
37
uno-group
08.06.23
✎
09:52
|
Если все равно ищешь по наименованию не проще сразу искать по текстовой строке
Если найти("CIP,CIF,....",",Объект.УсловиеПоставки)>0 Тогда |
|||
38
НЕА123
08.06.23
✎
10:09
|
(36)
100к строк - вроде нет, но все реквизиты да. при двух и более точек (Объект.УсловиеПоставки.Наименование) не кэшируется. решение в (37) самое оптимальное(можно в коллекции искать). |
|||
39
Мультук
08.06.23
✎
10:18
|
(38)
ИТС прямо говорит "вместе с его табличными частями". ИТС врёт/информация устарела? И на самом деле табличные части не загружаются? https://its.1c.ru/db/v8std/content/496/hdoc == цитата == При чтении отдельных реквизитов объекта из базы данных следует иметь в виду, что вызов метода ПолучитьОбъект или обращение к реквизитам объекта через точку от ссылки приводит к загрузке объекта из базы целиком, вместе с его табличными частями. == Конец цитаты == |
|||
40
uno-group
08.06.23
✎
10:25
|
нацать поисков по наименованию, по любому будут работать медленнее чем 1 преобразование в строку и поиск по строке. не зависимо от кеширования.
|
|||
41
oslokot
08.06.23
✎
10:50
|
(39) При вызове ПолучитьОбъект() никто не спорит - весь объект тащится целиком, но речь шла о ссылке на объект в (34)
|
|||
42
Aleksey
08.06.23
✎
10:53
|
(41) "или обращение к реквизитам объекта через точку от ссылки "
|
|||
43
oslokot
08.06.23
✎
11:04
|
хм, точно...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |