Вопрос о поиске «идеального кода» в среде 1С часто вызывает бурные дискуссии. Для одного разработчика это лаконичность и использование сложных конструкций, для другого — строжайшее соответствие стандартам фирмы «1С» и легкая читаемость. В этой статье мы проанализируем мнения опытных разработчиков, разберем конкретные примеры из типовых решений и выясним, какие критерии действительно определяют качество программного кода.
Прежде всего, давайте определимся, по каким признакам можно узнать качественное решение. Проанализируем основные мысли сообщества:
Рассмотрим пример кода, который встречается в типовом решении «Зарплата и Управление Персоналом» (редакция 2.5). Задача заключается в обеспечении уникальности основного лицевого счета сотрудника. Проанализируем, как реализована проверка и установка флага ОсновнойЗарплатныйПроект в модуле набора записей регистра сведений.
ТаблицаНабораЗаписей = ЭтотОбъект.Выгрузить();
ОтборОсновнойЗарплатныйПроект = Новый Структура;
ОтборОсновнойЗарплатныйПроект.Вставить("ОсновнойЗарплатныйПроект", Истина);
МассивСтрокНабораЗаписей = ТаблицаНабораЗаписей.НайтиСтроки(ОтборОсновнойЗарплатныйПроект);
Если МассивСтрокНабораЗаписей.Количество() = 0 Тогда
Возврат;
КонецЕсли;
СписокФизЛицНабора = Новый СписокЗначений;
Для каждого СтрокаНабораЗаписей Из МассивСтрокНабораЗаписей Цикл
Если Не СписокФизЛицНабора.НайтиПоЗначению(СтрокаНабораЗаписей.ФизЛицо) = Неопределено Тогда
СтрокаНабораЗаписей.ОсновнойЗарплатныйПроект = Ложь;
Продолжить;
КонецЕсли;
СписокФизЛицНабора.Добавить(СтрокаНабораЗаписей.ФизЛицо);
КонецЦикла;
ЭтотОбъект.Загрузить(ТаблицаНабораЗаписей);
В данном фрагменте мы видим классический подход к обработке данных внутри объекта. Сначала данные выгружаются в ТаблицаЗначений, затем с помощью структуры отбора находятся нужные строки. Если в наборе оказывается несколько записей с признаком «Основной» для одного физического лица, лишние флаги сбрасываются. Это гарантирует целостность данных на уровне записи объекта.
Продолжим анализ решения. Для того чтобы сбросить флаг у старых записей в базе данных, которые не входят в текущий набор, используется ПостроительЗапроса. Это позволяет динамически формировать условия на основе установленных отборов набора записей.
ПостроительЗапроса = Новый ПостроительЗапроса;
ПостроительЗапроса.Текст =
"ВЫБРАТЬ
| ЛицевыеСчетаРаботниковОрганизации.Организация,
| ЛицевыеСчетаРаботниковОрганизации.Банк,
| ЛицевыеСчетаРаботниковОрганизации.ФизЛицо
|ПОМЕСТИТЬ ВТ_ЛицевыеСчетаСОтборомНабораЗаписей
|ИЗ
| РегистрСведений.ЛицевыеСчетаРаботниковОрганизации КАК ЛицевыеСчетаРаботниковОрганизации
|ГДЕ
| ЛицевыеСчетаРаботниковОрганизации.ФизЛицо В(&СписокФизЛиц)
| И ЛицевыеСчетаРаботниковОрганизации.ОсновнойЗарплатныйПроект";
ПостроительЗапроса.ЗаполнитьНастройки();
// Динамическое заполнение отбора из структуры
ЗаполнитьОтборИзСтруктуры(ПостроительЗапроса.Отбор, ПолучитьСтруктуруОтбора(Отбор));
Этот подход примечателен тем, что разработчик не пишет громоздкие условия «ГДЕ» вручную, а делегирует это платформенному механизму ПостроительЗапроса. Это делает код более гибким к изменениям метаданных (например, при добавлении новых измерений в регистр).
Важной составляющей «прекрасного» кода является его надежность. Проанализируем ситуацию: часто ли мы проверяем входные данные на Неопределено или деление на ноль? В профессиональной разработке принято использовать механизмы проверки утверждений (Asserts).
Хотя в платформе 1С нет встроенной функции Assert, хорошим тоном считается написание собственных оберток для проверки критических условий. Выясним, почему это важно: код, который падает с понятной ошибкой на этапе проверки условий, гораздо легче отлаживать, чем код, который молча выдает неверный результат.
Пример правильной проверки (защитное программирование):
Процедура РассчитатьСумму(Цена, Количество)
// Проверка входных параметров
Если Цена < 0 Или Количество < 0 Тогда
ВызватьИсключение "Параметры расчета не могут быть отрицательными!";
КонецЕсли;
// Основная логика
Сумма = Цена * Количество;
КонецПроцедуры
Если вы хотите увидеть примеры действительно качественной архитектуры, стоит обратить внимание на следующие компоненты:
Подведем итог нашему анализу и сформулируем правила, которые приблизят ваш код к идеалу:
ТекСтр пишите СтрокаЛицевогоСчета. Это избавляет от необходимости писать комментарии к каждой строке.Помните, что идеальный код — это не тот, в который нечего добавить, а тот, из которого нечего убрать. Стремление к простоте и использование проверенных паттернов БСП сделает вашу работу приятной не только для вас, но и для тех коллег, которые будут поддерживать вашу конфигурацию в будущем.