Имя: Пароль:
1C
1С v8
Можно ли "сократить" вот такой вот код?
0 1398
 
14.03.12
11:10
Встретил у коллеги в обработке для БП (2.0.33.8) вот такой вот кусок кода (середина из него убрана):
"Вопрос к знатокам", как говориться – можно ли как-то код этот переписать в одну-две строки?

Справочники.ДокументыУдостоверяющиеЛичность.ИМНС27 – предопределенный элемент, естественно. У справочника нет кода, и нет каких-либо используемых реквизитов. Коду "27" - однозначно соответствует этот предопределенный элемент.

Функция ПолучитьДокументУдостоверяющийЛичность(КодДокумента)
       
   _КодДокумента = СокрЛП(КодДокумента);
   Если ЗначениеЗаполнено(_КодДокумента) Тогда
       // да, я "индус" :-(
       Если _КодДокумента = "1" Тогда          Результат = Справочники.ДокументыУдостоверяющиеЛичность.ИМНС01;
       ИначеЕсли _КодДокумента = "2" Тогда     Результат = Справочники.ДокументыУдостоверяющиеЛичность.ИМНС02;

       ИначеЕсли _КодДокумента = "27" Тогда    Результат = Справочники.ДокументыУдостоверяющиеЛичность.ИМНС27;
       ИначеЕсли _КодДокумента = "91" Тогда    Результат = Справочники.ДокументыУдостоверяющиеЛичность.ИМНС91;
       Иначе                                   Результат = Справочники.ДокументыУдостоверяющиеЛичность.ПустаяСсылка();
       КонецЕсли;
   Иначе                                       Результат = Справочники.ДокументыУдостоверяющиеЛичность.ПустаяСсылка();
   КонецЕсли;
   
   Возврат Результат;

Справочники.ДокументыУдостоверяющиеЛичность.ИМНС27
1 1398
 
14.03.12
11:11
последняя строка в коде ("Справочники.ДокументыУдостоверяющиеЛичность.ИМНС27") опечатка, если чо
2 Fish
 
14.03.12
11:11
Комментарий зачётный :)))
3 mikecool
 
14.03.12
11:12
соответствие
4 Wobland
 
14.03.12
11:12
Справочники.ДокументыУдостоверяющиеЛичность[ИМНС+Формат(_КодДокумента]
или пустая ссылка
5 luckyluke
 
14.03.12
11:12
(0) Может лучше регистр сведений сделать?
6 Wobland
 
14.03.12
11:12
(4) ["ИМНС"+Формат()], конечно
7 Дикообразко
 
14.03.12
11:13
мда....
8 Ненавижу 1С
 
гуру
14.03.12
11:14
(4) проблема только в том, что будет если я передам код другой, например "66"
9 pumbaEO
 
14.03.12
11:14
(6) ну соответствие будет универсальней, для случаев Код "1" и "2" для ИМНC100/
10 zelebobi4
 
14.03.12
11:14
Можно. Но зачем?
Все прост ои понятно. Работает.
11 Wobland
 
14.03.12
11:14
(8) предлагаю не передавать ;)
12 Wobland
 
14.03.12
11:15
(11) в смысле контролировать такое снаружи
13 Maxus43
 
14.03.12
11:15
да пусть так будет... собсно в типовых НДС аналогично считает, Если Тогда Иначе...
14 pumbaEO
 
14.03.12
11:15
(11) А если кто-то пидераст?
15 Fish
 
14.03.12
11:15
(8) Можно Попытку сделать
16 Wobland
 
14.03.12
11:15
(12) или попытку употребить, а в исключении пустую ссылку
17 Maxus43
 
14.03.12
11:16
(13) + пример неудачный правда)
18 pumbaEO
 
14.03.12
11:16
(14) *передаст
19 Steel_Wheel
 
14.03.12
11:17
(18) палишься )
20 Ненавижу 1С
 
гуру
14.03.12
11:17
перечисление СтавкиНДС это зло
21 Дикообразко
 
14.03.12
11:18
(20) как будто вся архитектура учет ндс в типовых конфах добро
22 pumbaEO
 
14.03.12
11:18
(21) +10050
23 Maxus43
 
14.03.12
11:19
(21) если к ней по хорошему - и она к тебе по хорошему)
24 Дикообразко
 
14.03.12
11:19
(23) дело не в том как с ней работать,
дело в том какими руками она сделана
25 Дикообразко
 
14.03.12
11:20
+(с) по мотивам анекдота
26 Fragster
 
гуру
14.03.12
11:20
нужно посмотреть, откуда этот код дергается. если из загрузки данных, то в принципе, нормально, просто я б сделал НайтиПоКоду или через [] и попытку... а вот если из формы какой-нибудь - то тут надо сразу выбирать элемент справочника
27 D_Pavel
 
14.03.12
11:24
(0) Нормальный код. Оставь так. Зачем экономить?
28 Wobland
 
14.03.12
11:28
первые две строки лишние?

функция НазваниеМесяца(НомерМесяца)экспорт
  // мда...
  Возврат НРег(Формат(ДобавитьМесяц('19700101', НомерМесяца-1), "ДФ=MMMM"));
 
  Если НомерМесяца=1 Тогда
      Возврат("январь");
  иначеЕсли НомерМесяца=2 Тогда
      Возврат("февраль");
  иначеЕсли НомерМесяца=3 Тогда
      Возврат("март");
  иначеЕсли НомерМесяца=4 Тогда
      Возврат("апрель");
  иначеЕсли НомерМесяца=5 Тогда
      Возврат("май");
  иначеЕсли НомерМесяца=6 Тогда
      Возврат("июнь");
  иначеЕсли НомерМесяца=7 Тогда
      Возврат("июль");
  иначеЕсли НомерМесяца=8 Тогда
      Возврат("август");
  иначеЕсли НомерМесяца=9 Тогда
      Возврат("сентябрь");
  иначеЕсли НомерМесяца=10 Тогда
      Возврат("октябрь");
  иначеЕсли НомерМесяца=11 Тогда
      Возврат("Ноябрь");
  иначеЕсли НомерМесяца=12 Тогда
      Возврат("декабрь");
  иначе
      Возврат("деопределен");
     
  КонецЕсли;    
конецфункции
29 Дикообразко
 
14.03.12
11:29
(28) 3 строки
30 Wobland
 
14.03.12
11:30
(29) ну да. тело функции имел в виду
31 acsent
 
14.03.12
11:34
Это
ДобавитьМесяц('19700101', НомерМесяца-1)
конечно тот еще индусский код
32 nicxxx
 
14.03.12
11:35
(31) но лучше чем продолжение функции
33 Wobland
 
14.03.12
11:35
(31) не настолько, как в (0) или ниже ;)
34 vmv
 
14.03.12
11:39
херня все это, согласно (0) есть четкая ключевая структура

Если _КодДокумента = "1" Тогда          Результат = Справочники.ДокументыУдостоверяющиеЛичность.ИМНС01;
       ИначеЕсли _КодДокумента = "2" Тогда     Результат = Справочники.ДокументыУдостоверяющиеЛичность.ИМНС02;

       ИначеЕсли _КодДокумента = "27" Тогда    Результат = Справочники.ДокументыУдостоверяющиеЛичность.ИМНС27;
       ИначеЕсли _КодДокумента = "91" Тогда    Результат = Справочники.ДокументыУдостоверяющиеЛичность.ИМНС91;
       Иначе                                   Результат = Справочники.ДокументыУдостоверяющиеЛичность.ПустаяСсылка();
       КонецЕсли;

СтруктураПоказателей = Новый Структура;


СтруктураПоказателей("2", Справочники.ДокументыУдостоверяющиеЛичность.ИМНС02);
...
СтруктураПоказателей("91", Справочники.ДокументыУдостоверяющиеЛичность.ИМНС91);

имеем

Если ЗначениеЗаполнено(_КодДокумента) Тогда
   СтруктураПоказателей.Свойство(_КодДокумента, Результат);
КонецЕсли;

Если Результат = Неопределено Тогда

Результат  = ПустаяСсылкаТипа;
35 zelebobi4
 
14.03.12
11:45
По сути тот же код, но уже с использованием структуры.
36 Wobland
 
14.03.12
11:46
блин, с попыткой пять строк выходит. и гораздо ясней
37 pumbaEO
 
14.03.12
11:50
(36) где нибудь в транзакции...
СтруктураПоказателей = Новый Структура("2,91, ... бла-бла", Справочники.ДокументыУдостоверяющиеЛичность.ИМНС02, Справочники.ДокументыУдостоверяющиеЛичность.ИМНС91);
Если ЗначениеЗаполнено(_КодДокумента) Тогда
   СтруктураПоказателей.Свойство(_КодДокумента, Результат);
КонецЕсли;

Если Результат = Неопределено Тогда Результат  = ПустаяСсылкаТипа; КонецЕсли;

в 7 строк. :)
38 Steel_Wheel
 
14.03.12
11:50
(0) Кстати, можно все это руками загнать в соответствие. Код получишь более струткурированный
39 Snorkler
 
14.03.12
11:55
(0) Истинно кошерно так:
Результат = Справочники.ДокументыУдостоверяющиеЛичность.НайтиПоРеквизиту("КодИМНС",Формат(Число(КодДокумента), "ЧЦ=2; ЧДЦ=0; ЧВН="),,);
40 Ахиллес
 
14.03.12
12:01
Ну, всё, пипец одинэсникам и их "отстатыщь". Китайские крестьяне освоили программирование на 1С. Теперь неделя работы одинэсника будет стоить 1,5 бакса
41 pumbaEO
 
14.03.12
12:11
42 Ахиллес
 
14.03.12
12:15
(41) По твоему в (0) не китайский код? А по моему, так чистейший образец.
43 pumbaEO
 
14.03.12
12:18
Китайский, где плата за строки кода, вот человек решил сэкономить... :)

Кто не без греха, пускай первым кинет в меня камень.
44 Ахиллес
 
14.03.12
12:20
(43) Кстати у тебя в (37) тоже китайский код, потому, что если кодов документов будет хотя бы пара тысяч... ну ты понял ;-)
45 pumbaEO
 
14.03.12
12:36
(44) Дети иногда кушать просят, а если буду всегда правильно добавлять объекты в конфигурацию, за что же мне деньги будут то платить? :) (это и для фикси актуально и для франя)

Кто не понял: лопата.

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