Проверка функции в 1С 8.3: от точки останова до автотеста
Содержание
Проверить функцию в 1С быстрее всего так: поставьте точку останова (F9) на первой строке функции в конфигураторе, запустите отладку (F5) и пройдите код по шагам, глядя на значения переменных. Если функцию нужно вызвать с конкретными параметрами, не открывая форму, — вызовите её в окне «Вычислить выражение» (Shift+F9) или из маленькой внешней обработки.
Частое заблуждение — проверять функцию «на глаз», запуская документ и смотря, что получилось на выходе. Так вы видите только итог. Где именно сломался расчёт, при каких параметрах и сколько это стоит по времени, покажут отладчик, журнал регистрации, автотест и замер производительности.
Что подготовить перед проверкой функции
Проверка без подготовки часто заканчивается тем, что тестовые данные попадают в рабочую базу. Пять минут на подготовку это исключают.
- 🗂️ Копия базы. Выгрузите рабочую базу в
.dt(Администрирование → Выгрузить информационную базув конфигураторе) и разверните копию. Функции, которые пишут данные, проверяйте только там. - 🔓 Экспорт. Чтобы вызвать функцию извне модуля (из обработки, теста, другого модуля), в её объявлении должно стоять ключевое слово
Экспорт. - 🧭 Контекст исполнения. Посмотрите директиву (
&НаСервере,&НаКлиенте) и флажки общего модуля: «Сервер», «Клиент (управляемое приложение)», «Вызов сервера». Серверную функцию без «Вызова сервера» с клиента напрямую не вызвать. - 🧪 Набор входных данных. Выпишите 3–5 вариантов параметров: обычный, граничный (ноль, пустая строка, пустая ссылка) и заведомо неверный.
Для клиент-серверной базы серверный код отлаживается, только если отладка разрешена на сервере 1С: агент сервера запускается с ключом -debug. В файловой базе серверный код выполняется в процессе клиента, и дополнительно ничего включать не нужно.
Отладка функции в конфигураторе: точки останова и шаги
Отладчик — главный инструмент, если функция возвращает не то, что ожидалось, и непонятно почему.
Как запустить отладку
- Откройте модуль с функцией в конфигураторе.
- Встаньте на первую исполняемую строку функции и нажмите
F9— слева появится красная точка. - Запустите
Отладка → Начать отладку(F5). Откроется 1С:Предприятие в режиме отладки. - Выполните в пользовательском режиме действие, которое вызывает функцию: проведите документ, нажмите кнопку, сформируйте отчёт.
- Выполнение остановится на точке, а конфигуратор выйдет на передний план.
Если 1С:Предприятие уже запущено отдельно, подключитесь к нему через Отладка → Подключение и выберите нужный сеанс в списке предметов отладки.
Клавиши, которые нужны при проходе
| Клавиша | Что делает |
|---|---|
F9 | Поставить или снять точку останова |
F5 | Продолжить выполнение до следующей точки |
F11 | Шагнуть в: зайти внутрь вызываемой процедуры или функции |
F10 | Шагнуть через: выполнить строку целиком, не заходя внутрь |
Shift+F11 | Шагнуть из: выполнить функцию до конца и вернуться в вызывающий код |
Shift+F9 | Вычислить выражение |
Что смотреть во время остановки
- 👁️ Значения переменных. Наведите курсор на переменную — появится подсказка. Для коллекций и структур удобнее «Вычислить выражение» или табло: там раскрываются вложенные элементы.
- 📚 Стек вызовов. Показывает, кто вызвал функцию и с какими параметрами. Полезно, когда одна функция вызывается из десятка мест.
- 🎯 Точка останова с условием. Через контекстное меню строки задайте условие, например
Сумма > 100000. Отладчик остановится только на нужной итерации, а не на каждой из 5 000. - 🛑 Остановка по ошибке. Включите в меню
Отладка. Выполнение прервётся прямо на строке, где возникло исключение, даже если ошибку перехватываетПопытка … Исключение.
Отладку не запускайте на рабочем сервере в часы работы. Пока выполнение стоит на точке, сеанс пользователя висит, а если функция внутри транзакции — висят и наложенные ею блокировки. Другие пользователи будут ждать или получат ошибку блокировки.
Что мешает проверке
Вызов функции с нужными параметрами без запуска всей формы
Иногда до функции долго «дойти» в интерфейсе: нужно создать документ, заполнить десять реквизитов, провести. Проще вызвать её напрямую.
Окно «Вычислить выражение»
Остановитесь в отладчике в любом месте, где доступен модуль с функцией, нажмите Shift+F9 и введите вызов:
РасчетыСервер.СуммаСкидки(15000, 7)
Нажмите «Рассчитать» — в окне появится результат. Меняйте параметры и пересчитывайте, не перезапуская сеанс. Так за минуту проверяется вся таблица входных данных, подготовленная заранее.
Метод работает и для функций общих модулей, и для функций модуля текущего объекта (если вы остановились внутри него).
Внешняя обработка для повторных проверок
Если проверку предстоит повторять, сделайте внешнюю обработку:
- В конфигураторе:
Файл → Новый → Внешняя обработка. - Добавьте форму и команду «Проверить».
- В модуле формы напишите вызов функции и вывод результата.
&НаКлиенте
Процедура Проверить(Команда)
ПроверитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПроверитьНаСервере()
Варианты = Новый Массив;
Варианты.Добавить(Новый Структура("Сумма, Процент", 15000, 7));
Варианты.Добавить(Новый Структура("Сумма, Процент", 0, 7));
Варианты.Добавить(Новый Структура("Сумма, Процент", 15000, 0));
Для Каждого Вариант Из Варианты Цикл
Результат = РасчетыСервер.СуммаСкидки(Вариант.Сумма, Вариант.Процент);
Сообщить(СтрШаблон("Сумма %1, процент %2 -> %3",
Формат(Вариант.Сумма, "ЧН=0; ЧГ=0"),
Формат(Вариант.Процент, "ЧН=0; ЧГ=0"),
Формат(Результат, "ЧН=0; ЧГ=0")));
КонецЦикла;
КонецПроцедуры
- Сохраните файл
.epfи откройте его в 1С:Предприятии черезФайл → Открыть.
Для этого у пользователя должно быть право на интерактивное открытие внешних обработок. В типовых конфигурациях оно есть у полных прав.
Тот же приём работает в режиме «Предприятие» без конфигуратора: если в базе уже есть обработка вида «Консоль кода», в неё можно вставить вызов функции и выполнить. Пользуйтесь такими обработками только в копии базы — код в них выполняется с вашими правами.
Проверка функции через журнал регистрации
Отладчик хорош, когда ошибку можно воспроизвести у себя. Если функция сбоит у пользователя раз в день или в фоновом задании ночью, остановить её на точке не получится. Здесь помогает запись в журнал регистрации.
Как добавить запись в код
Оберните подозрительный участок в Попытка и пишите в журнал и параметры, и текст ошибки:
Функция СуммаСкидки(Сумма, Процент) Экспорт
Попытка
Результат = Окр(Сумма * Процент / 100, 2);
Исключение
ЗаписьЖурналаРегистрации("Расчеты.СуммаСкидки",
УровеньЖурналаРегистрации.Ошибка, , ,
СтрШаблон("Сумма: %1; Процент: %2; Ошибка: %3",
Сумма, Процент, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
ВызватьИсключение;
КонецПопытки;
Возврат Результат;
КонецФункции
ВызватьИсключение без параметров передаёт ошибку дальше. Без этой строки функция молча вернёт Неопределено, и ошибка вылезет совсем в другом месте.
Для промежуточных значений используйте уровень УровеньЖурналаРегистрации.Информация. Придумайте одно имя события на модуль, например Расчеты.СуммаСкидки: по нему удобно фильтровать.
Где смотреть записи
| Где | Путь |
|---|---|
| Конфигуратор | Администрирование → Журнал регистрации |
| Любая конфигурация в режиме Предприятие | Все функции → Стандартные → Журнал регистрации |
Команда «Все функции» включается в Сервис и настройки → Параметры, флажок «Отображать команду «Все функции»».
В журнале установите отбор по событию и периоду. В колонке «Комментарий» будут параметры вызова — по ним ошибка воспроизводится в отладчике.
Не оставляйте подробные информационные записи в функциях, которые вызываются тысячи раз в час. Журнал быстро разрастается, а сама запись замедляет код. После проверки удалите их или оставьте только запись уровня «Ошибка».
Автоматические тесты функции: от самописной проверки до YAxUnit
Ручная проверка отвечает на вопрос «работает ли сейчас». Тест отвечает на вопрос «не сломалось ли после доработки». Для функций с расчётами это главный способ проверки.
Самописный тест без фреймворков
Простейший вариант — процедура, которая сравнивает результат с ожидаемым и падает при расхождении:
Процедура ПроверитьРавенство(Факт, Ожидание, Описание)
Если Факт <> Ожидание Тогда
ВызватьИсключение СтрШаблон("%1: ожидали %2, получили %3",
Описание, Ожидание, Факт);
КонецЕсли;
КонецПроцедуры
Процедура ТестыСуммыСкидки() Экспорт
ПроверитьРавенство(РасчетыСервер.СуммаСкидки(15000, 7), 1050, "Обычный случай");
ПроверитьРавенство(РасчетыСервер.СуммаСкидки(0, 7), 0, "Нулевая сумма");
ПроверитьРавенство(РасчетыСервер.СуммаСкидки(999.99, 10), 100, "Округление");
КонецПроцедуры
Проверка арифметики: 15 000 × 7 / 100 = 1 050; 999,99 × 10 / 100 = 99,999, после округления до двух знаков — 100. Ожидания в тесте считайте вручную, а не копируйте из вывода самой функции, иначе тест закрепит ошибку.
Фреймворки для модульных тестов
| Инструмент | Подход | Когда выбирать |
|---|---|---|
| YAxUnit | Тесты в расширении конфигурации, модуль на каждую группу | Разработка в EDT, нужна изоляция тестов от основной конфигурации |
| Vanessa-ADD | Модульные (xUnit) и сценарные тесты | Есть готовая инфраструктура на этом инструменте |
| Vanessa Automation | Сценарии на языке Gherkin через клиент тестирования | Проверка поведения форм и пользовательских действий, а не отдельной функции |
В YAxUnit тест — экспортная процедура общего модуля в расширении. Список тестов регистрируется в ИсполняемыеСценарии:
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты.ДобавитьТест("СкидкаОбычныйСлучай");
КонецПроцедуры
Процедура СкидкаОбычныйСлучай() Экспорт
Результат = РасчетыСервер.СуммаСкидки(15000, 7);
ЮТест.ОжидаетЧто(Результат).Равно(1050);
КонецПроцедуры
Тесты в расширении не меняют основную конфигурацию: при обновлении типовой их не нужно переносить.
Клиент тестирования платформы
Для проверки функции через интерфейс у платформы есть режим автоматизированного тестирования. Один экземпляр 1С:Предприятия запускается с ключом /TESTMANAGER, другой — с /TESTCLIENT. Менеджер программно нажимает кнопки и заполняет поля в клиенте. Этот режим нужен для сценариев «пользователь сделал — получил результат», на нём работает Vanessa Automation.
Проверка функции с обращениями к базе, файлам и интернету
Функция, которая только считает, проверяется легко. Сложнее, когда она читает регистры, пишет документы, вызывает веб-сервис или открывает файл.
Функции, которые пишут в базу
Оберните проверку в транзакцию и отмените её:
НачатьТранзакцию();
Попытка
Результат = ОбменСервер.СоздатьДокументПоЗаявке(Заявка);
Сообщить(Результат);
ОтменитьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Все изменения внутри откатятся. Код выполняйте на сервере. Работает это только для изменений данных базы: отправленный e-mail, записанный на диск файл или запрос во внешнюю систему транзакция не отменит.
Внешние сервисы и файлы
- 🌐 HTTP и веб-сервисы. Вынесите адрес сервиса в константу или параметр функции. Для проверки укажите тестовый адрес (песочницу сервиса) вместо боевого.
- 📁 Файлы. Передавайте путь параметром, а не собирайте его внутри функции. Тогда в тесте можно подсунуть временный файл из
ПолучитьИмяВременногоФайла()и удалить его после проверки. - 🔁 Подмена зависимостей. В YAxUnit есть механизм «Мокито»: он подменяет результат вызова другой функции на заданный в тесте. Так функция проверяется без реального обращения к сервису.
Разделяйте расчёт и обращения
Самый надёжный приём — переписать функцию на две части. Первая получает данные (запрос, HTTP, файл), вторая только считает по переданным значениям. Вторую часть тогда проверяет обычный тест без базы и сети, а первую — один интеграционный прогон на копии.
Замер скорости работы функции
Функция может возвращать правильный результат, но работать 40 секунд. Проверка производительности — отдельная задача.
Замер производительности в отладчике
- Запустите отладку (
F5). - В конфигураторе включите
Отладка → Замер производительности. - Выполните в Предприятии действие с вызовом функции.
- Выключите замер той же командой.
Откроется окно с результатами по строкам: число выполнений, время, доля в процентах от общего. Отсортируйте по времени — сразу видно, какая строка тянет. Типичная картина: запрос внутри цикла, который выполняется 3 000 раз вместо одного раза до цикла.
Замер прямо в коде
Если нужно сравнить два варианта функции, хватит пары строк:
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
Результат = РасчетыСервер.СуммаСкидки(15000, 7);
Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
Сообщить(СтрШаблон("Выполнено за %1 мс", Формат(Длительность, "ЧН=0; ЧГ=0")));
Один вызов даёт шум. Вызовите функцию в цикле 1 000 раз и делите итог на 1 000.
Когда нужен технологический журнал
Для клиент-серверной базы, где тормоз проявляется только под нагрузкой, отладчика мало. Технологический журнал настраивается файлом logcfg.xml на сервере 1С и пишет длительные вызовы, запросы к СУБД и ожидания на блокировках. Это инструмент администратора: включайте его на ограниченный набор событий и на короткое время, логи растут на гигабайты.
Как пользователю проверить, что функция в программе работает
Не каждый, кто ищет «проверить функцию в 1С», пишет код. Бухгалтеру обычно нужно понять: включена ли возможность и работает ли она правильно.
- ⚙️ Включена ли возможность. В 1С:Бухгалтерии 3.0 возможности программы включаются в
Главное → Функциональность. Если нужной команды или реквизита не видно, сначала проверьте флажок здесь. - 🧾 Работает ли расчёт. Повторите операцию в копии базы на простых числах, которые легко пересчитать вручную. Например, документ на 10 000 руб. — и сверьте результат с калькулятором.
- 📝 Что произошло при ошибке. Откройте журнал регистрации через «Все функции» и отберите записи уровня «Ошибка» за нужное время. Текст ошибки и время передайте программисту — с ними он найдёт проблему в разы быстрее.
Частые вопросы
Можно ли отлаживать функцию в базе, где работают пользователи?
Чем «шагнуть в» отличается от «шагнуть через»?
F11 заходит внутрь вызываемой функции и проходит её построчно. F10 выполняет вызов одной строкой и показывает только результат.