На основании определенного опыта и работы с различными проектами нам удалось собрать определнный список типичных ошибок, рекомендаций и советов при работе в программе 1С. Как ни странно подобные ошибки встречаются иногда не только у начинающих разработчиков и их результатах работы, но и в типовых конфигурациях. Есть ряд советов, которые вроде широко известны, но почему-то не используются.
Ниже мы приведем список пунктов с примерным категорированием для акцентирования внимания (ошибки, запросы, код, хранилище, советы):
1. Деление на 0. (ошибки, запрос, код)
Используйте проверку деления на ноль в запросах и в коде. Классическая ошибка №1.
2. Копипаст или Ctrl+C & Ctrl+V. (ошибки, код)
Мы считаем, что это одна из самых коварных ошибок, которую допускают практически все.
3. Ошибки отсутствия проверки на ЭтоГруппа. (ошибки, запрос, код)
Отсутствии проверки на элеметы и группы. У элементов и групп возможно различное использование реквизитов. Т.е. если вы будете пытаться получить реквизиты папки, которые доступны для элемента, то скорее всего получите ошибку.
4. Определение переменных. (ошибки, код)
Т.к. в 1С нет необходимости определять переменные как в Си, C# и др., то разработчики порой допускают ошибку определяя или устанавливая значения переменной в ветвях условий. Могут возникнуть точки когда переменная будет не объявлена или содержать недопустимое значение. Пример ошибки:
Функция ПолучитьЧтоТо(Вариант,Количество)
Если Вариант=0 Тогда
Коэффициент = 1;
ИначеЕсли Вариант=1 Тогда
Коэффициент = 0;
КонецЕсли;
Возврат Коэффициент*Количество; // получим ошибку произведение значения Неопределено на количество, если значения варианта будут отличны от 1 или 0
КонецФункции
5. Проверка в условии на истину переменной со значением "Неопределено". (ошибки, код)
В случае, когда значение переменной может принимать значения "Неопределено" даже вполне неожиданно необходимо включать это условие в проверку. К примеру,
… Если НЕ Результат=Неопределено // перенос строки
И Результат Тогда … // правильно
ИЛИ
...Если Результат=Истина Тогда ... // правильно
… Если Результат Тогда ... // не правильно
6. Формат строки. (ошибки, код)
Не забывайте про формат строки, т.к. 1С число преобразует в строку с пробелом между разрядами.
7. Не используйте в названиях переменных имена реквизитов формы. (ошибки, код)
Синтаксический анализатор не укажет на наличие ошибки, но в процессе работы Вы обязательно столкнетесь с непонятным на первый взгляд исключением.
8. Предположение наличия результата выполнения запроса или наличие в массиве/таблице хотябы одной записи. (ошибки, код)
Иногда результат запроса может вернуть ноль значений и предположение наличия хотябы одной записи в таблице результата приводит к ошибке. Т.е. конструкция вида РезультатЗапросаТаблица[0] может привести к ошибке, используйте условия проверки РезультатЗапроса.Пустой() или Выборка.Следующий(). Пример:
...
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
...
КонецЕсли;
....
9. Неправильное использование функции языка запросов "Выразить" - несовместимые типы. (ошибки, запросы)
Функция "Выразить" языка запросов 1С не может преобразовать несовместимые типы, т.е. если вы попробуете преобразовать, к примеру, строку в справочник, то получите ошибку. Данная ситуация может быть особенно коварной для составного типа данных, при передаче в запрос таблицы значений или простых параметров.
10. Используйте отборы внутри виртуальных таблиц. (ошибки, запросы)
Используйте это условие, кроме случаев, когда иное требуется логикой
11. Запрос в цикле. (ошибки, код, запросы)
Классическая ошибка, иногда ее допускают сознательно особенно при создании какой-нибудь обработки за "5 минут", а потом прогоняя на большом массиве данных идут пить чай.
12. Роли/Доступ. (ошибки, код)
1. При добавлении нового объекта метаданных - команды, отчета, документа и т.д. не забывайте про роли. Необходимо добавить новую роль или включить доступ объекта в одну или несколько существующих ролей
2. При создании отдельного внешнего отчета, обработки необходимо проверять для всех потенциальных групп пользователей, т.к. в результате можем получить не работающий у всех функционал (ошибка доступа в некоторых случаях) или различные результаты в данных.
13. Недостаточно данных в тесте при разработке или проверке алгоритма. (ошибки)
Подобная ошибка встречается довольно часто. К примеру, при разработке запроса вы используете в качестве входных данных одну строку, то при наличии левого соединения в запросе вы можете пропустить "задваивание", "затраивание" строк в результирующей таблице. Или другой пример: почему-то не предполагаете что пользователь может методом копирования создать полностью зеркальную строчку.
14. Ограниченное мышление. (ошибки)
Особенно актуально при проведении внутреннего тестирования разработчиком. В процессе решения задачи или особенно исправлении ошибки не проводится более широкое рассмотрение проблемы, поэтому в результате может быть исправлена текущая ошибка в конкретной ситуации, но в общем проблема останется или появится новая, связанная с решением. В таком случае говорят о решении последствий, а не причин.
15. Не изобретайте велосипед/"индусский код". (ошибки)
Кроме специализированных функций самой конфигурации, 1С в своих типовых конфигурациях использует БСП, в которй достаточно широкий набором функциональности. В результате появляется множество полуфункций и полупроцедур, работающих по части условий и не всегда; разобраться в итоговом коде получается очень сложно.
16. Получение данных через точку (объектную модель). (совет, код)
Не получайте данные через точку. Получение данных через объектную модель может достаточно сильно снизить производительность системы.
17. Использование директивы БезКонтекста. (совет, код)
Используйте &БезКонтекстаНаСервере и &НаСервере в зависимости от необходимости работы с контектом приложения на сервере особенно в случае вызова с клиента и при большом количестве данных на форме. Пример, была создана обработка, в которой на форме находилась большая таблица данных, в этой обработке была использована кнопка для анализа данных, которая проходила по таблице на клиенте и в случае срабатывания условий отправляла запрос на сервер с контекстом, в результате длительность работы этой процедуры оказалось безмерно завышена из-за частой передачи большого объема данных: до рефакторинга процедура выполнялась 10-15 минут, после 2-3 минуты.
18. Хранение в реквизитах справочника, документа типа данных «Хранилище Значения». (совет, код)
Старайтесь не использовать в реквизитах справочников, документов типов данных «Хранилище значения» иначе при работе с объектной моделью вы получите необоснованное снижение производительности.
19. Используйте в конструкторе запросов конструктор запросов. (совет, запросы)
Не все знают, что в конструкторе запросов можно использовать конструтор запросов. Его особенно удобно применять при определении условий по полям и в виртуальных таблицах.
20. Используйте расширенный синтаксис оператора языка запросов "В". (совет, запросы)
Часто требуется определить условие вхождения по нескольким реквизитам и это довольно просто реализуется. Пример:
… (Организация,Контрагент) В (ВЫБРАТЬ Т.Организация,Т.Контрагент ИЗ ВтТ как Т) …
21. Испольуйте предопределенные значения в запросах. (совет, запросы)
К примеру, вместо создания параметра передающего пустую ссылку используйте следующий код
… НЕ Контрагент=Значение(Справочник.Контрагенты.ПустаяСсылка) …
22. Оптимальность запросов. (совет, запросы)
1. Испольуйте пакетные запросы и временные таблицы вместо вложенных запросов
2. Для объединения нескольких таблиц используйте объединить, а не левое соединение
3. Для отладки сложных запросов используйте дам запроса
4. Инедксируйте реквизиты/устанавливайте индекс для реквизитов, по которым используете отбор, поиск, соединение.
5. И другие рекомендации, которые можно найти в сети если поставить цель.
23. Передача между клиентом и сервером таблицы значений. (совет)
На текущий момент между клиентом и сервером не возможна передача типа "Таблица значений", но если очень хочется, то ситуацию можно решить. Для этого на форме создайте реквизит с типом значений с определенным составом полей или определяемым динамически и используйте.
24. Не используйте повторяющийся код. (совет)
Завершающий совет, но очень злободневный. Любой повторяющийся код старайтесь выносить в отдельную функцию. Это позволит в дальнейшем существенно облегчить работу - читаемость, рефакторинг, исправление ошибок.
Продолжение ожидается...