Modber Сообщество
профессионалов по 1С

Полезные приемы и рекомендации по оформлению кода 1С



Платформы: 1С:Предприятие 8.3, 1С:Предприятие 8.2, 1С:Предприятие 8.1, 1С:Предприятие 7.7
Конфигурации: Все конфигурации
2013-03-26
2683 

 

Заголовки методов

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

// <Описание функции>
//
// Параметры:
//  *<Параметр1> – <Тип.Вид>, *<ЗначениеПоУмолчанию1> – <описание параметра1>
//                 <продолжение описания параметра1>;
//  *<Параметр2> – <Тип.Вид>, *<ЗначениеПоУмолчанию2> – <описание параметра2>
//                 <продолжение описания параметра2>.
// Возвращаемое значение:
//  <Значение1> — <Тип.Вид> – <описание значения1> — <описание условия1>;
//  <Значение2> — <Тип.Вид> — <описание значения2> – иначе.
//


Звездочка обозначает необязательность параметра. После звездочки, следующим за типом параметра указывается значение по умолчанию.
Пример

// Получает список реквизитов объекта БД.
//
// Параметры:
//  пОбъект      – ОбъектБД;
//  *СписокВыбора – СписокЗначений, *Неопределено – если нужно заполнить уже имеющийся список;
//  *ЛиВключатьТолькоЧитаемые — Булево, *Ложь — включать ли в список только читаемые реквизиты;
//  *ЛиВключатьНедоступные — Булево, *Ложь — включать ли в список недоступные (группы/элементы)
//                         реквизиты;
//  *ЛиСортировать — Булево, *Ложь — отсортировать ли по представлению.
//
// Возвращаемое значение:
//  СписокЗначений – содержащий в качестве значений имена реквизитов.
//
Функция ЛксПолучитьСписокРеквизитовОбъектаБД(пОбъект, пСписокВыбора = Неопределено,
    ЛиВключатьТолькоЧитаемые = Ложь, ЛиВключатьНедоступные = Ложь, ЛиСортировать = Ложь)

 

Логические выражения

Приведу пример сложного логического выражения:
 
Если А = Б И В > Г И (Д = Неопределено ИЛИ НЕ Ж = З ИЛИ НЕ (К = Л И М = 0)) Тогда
    <Тело положительной ветви условия>
Иначе
    <Тело отрицательной ветви условия>
КонецЕсли;


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

Если Котрагент = ПоследнийКонтрагент И СуммаДокументаРеализации > СуммаДляПредоставленияСкидки И (ЗаказПокупателя = Неопределено ИЛИ НЕ ДеньНедели = ДеньНеделиВоскресение ИЛИ НЕ (НеделяПродажи = ПоследняяНеделяМесяца И СуммаПродажиПоРасходникам = 0)) Тогда
    <Тело положительной ветви условия>
Иначе
    <Тело отрицательной ветви условия>
КонецЕсли;


Теперь вызывает неудобство воспринимать и редактировать это условие.
Возникает сложность в разбиении условий на строки, только вот как? Часто это происходит следующим образом:

Если Котрагент = ПоследнийКонтрагент И СуммаДокументаРеализации > СуммаДляПредоставленияСкидки
   И (ЗаказПокупателя = Неопределено ИЛИ НЕ ДеньНедели = ДеньНеделиВоскресение ИЛИ НЕ
     (НеделяПродажи = ПоследняяНеделяМесяца И СуммаПродажиПоРасходникам = 0)) Тогда
 
    <Тело положительной ветви условия>
Иначе
    <Тело отрицательной ветви условия>
КонецЕсли;

 

Конструкция тяжело воспринимается и модифицируется

В случае внутреннего языка это условие необходимо разбить на множество мелких условий:

Флаг = Ложь;
Если Котрагент = ПоследнийКонтрагент И СуммаДокументаРеализации > СуммаДляПредоставленияСкидки Тогда
    Если ЗаказПокупателя = Неопределено Тогда
        Флаг = Истина;
    ИначеЕсли Не ДеньНедели = ДеньНеделиВоскресение Тогда
        Флаг = Истина;
    ИначеЕсли Не (НеделяПродажи = ПоследняяНеделяМесяца И СуммаПродажиПоРасходникам = 0) Тогда
        Флаг = Истина;
    КонецЕсли;
КонецЕсли;
Если Флаг Тогда
    <Тело положительной ветви условия>
Иначе
    <Тело отрицательной ветви условия>
КонецЕсли;

 

Многие рекомендуют следующее


Если Истина
    И Контрагент = ПоследнийКонтрагент
    И СуммаДокументаРеализации > СуммаДляПредоставленияСкидки
    И (Ложь
        Или ЗаказПокупателя = Неопределено
        Или Не ДеньНедели = ДеньНеделиВоскресение
        Или Не (Истина
            И НеделяПродажи = ПоследняяНеделяМесяца
            И СуммаПродажиПоРасходникам = 0))
Тогда
    <Тело положительной ветви условия>
Иначе
    <Тело отрицательной ветви условия>
КонецЕсли;


Все довольно компактнее. Что позволяет быстрее воспринимать сложное условие в целом. А главное, она легка в  модификации за счет правила "одна строка — одно условие».

С языком запросов дело обстоит примерно так же. Здесь уже мы не можем применить альтернативу типа разбивки на множество Если… Тогда.
Итак обычная запись логического условия на языке запросов:

ГДЕ Котрагент = Контрагенты.ПоследнийКонтрагент И СуммаДокументаРеализации > СуммаДляПредоставленияСкидки
   И (ЗаказПокупателя ЕСТЬ NULL ИЛИ НЕ ДеньНедели = &ДеньНеделиВоскресение ИЛИ НЕ
     (НеделяПродажи = &ПоследняяНеделяМесяца И СуммаПродажиПоРасходникам = 0))



Конструкция выглядит так:

ГДЕ Истина
    И Контрагент = Контрагенты.ПоследнийКонтрагент
    И СуммаДокументаРеализации > СуммаДляПредоставленияСкидки
    И (Ложь
        Или ЗаказПокупателя ЕСТЬ NULL
        Или Не ДеньНедели = &ДеньНеделиВоскресение
        Или Не (Истина
            И НеделяПродажи = &ПоследняяНеделяМесяца
            И СуммаПродажиПоРасходникам = 0))


Так намного удобнее и понятнее, хотя и занимает больше строк.

Теперь  любой программист, сможет легко вставить вместо любой непоследней строки или закомментировать любую непоследнюю строку в любой группе и при этом оформить свою доработку соответствующими комментариями.



Бесплатная юридическая
консультация по телефону

8 (499) 350-80-26(Москва)
8 (812) 627-15-62(Спб)

звонок бесплатный

В центре внимания

Комментарии (0)