Имя: Пароль:
1C
1С v8
Чем заменить НайтиПоНаименованию
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
хм, точно...
2 + 2 = 3.9999999999999999999999999999999...