Проверка функции в 1С 8.3: от точки останова до автотеста

· 11 мин

Содержание

Проверить функцию в 1С быстрее всего так: поставьте точку останова (F9) на первой строке функции в конфигураторе, запустите отладку (F5) и пройдите код по шагам, глядя на значения переменных. Если функцию нужно вызвать с конкретными параметрами, не открывая форму, — вызовите её в окне «Вычислить выражение» (Shift+F9) или из маленькой внешней обработки.

Частое заблуждение — проверять функцию «на глаз», запуская документ и смотря, что получилось на выходе. Так вы видите только итог. Где именно сломался расчёт, при каких параметрах и сколько это стоит по времени, покажут отладчик, журнал регистрации, автотест и замер производительности.

Что подготовить перед проверкой функции

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

  • 🗂️ Копия базы. Выгрузите рабочую базу в .dt (Администрирование → Выгрузить информационную базу в конфигураторе) и разверните копию. Функции, которые пишут данные, проверяйте только там.
  • 🔓 Экспорт. Чтобы вызвать функцию извне модуля (из обработки, теста, другого модуля), в её объявлении должно стоять ключевое слово Экспорт.
  • 🧭 Контекст исполнения. Посмотрите директиву (&НаСервере, &НаКлиенте) и флажки общего модуля: «Сервер», «Клиент (управляемое приложение)», «Вызов сервера». Серверную функцию без «Вызова сервера» с клиента напрямую не вызвать.
  • 🧪 Набор входных данных. Выпишите 3–5 вариантов параметров: обычный, граничный (ноль, пустая строка, пустая ссылка) и заведомо неверный.

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

Перед проверкой функции
Выполнено: 0 / 5

Отладка функции в конфигураторе: точки останова и шаги

Отладчик — главный инструмент, если функция возвращает не то, что ожидалось, и непонятно почему.

Как запустить отладку

  1. Откройте модуль с функцией в конфигураторе.
  2. Встаньте на первую исполняемую строку функции и нажмите F9 — слева появится красная точка.
  3. Запустите Отладка → Начать отладку (F5). Откроется 1С:Предприятие в режиме отладки.
  4. Выполните в пользовательском режиме действие, которое вызывает функцию: проведите документ, нажмите кнопку, сформируйте отчёт.
  5. Выполнение остановится на точке, а конфигуратор выйдет на передний план.

Если 1С:Предприятие уже запущено отдельно, подключитесь к нему через Отладка → Подключение и выберите нужный сеанс в списке предметов отладки.

Клавиши, которые нужны при проходе

КлавишаЧто делает
F9Поставить или снять точку останова
F5Продолжить выполнение до следующей точки
F11Шагнуть в: зайти внутрь вызываемой процедуры или функции
F10Шагнуть через: выполнить строку целиком, не заходя внутрь
Shift+F11Шагнуть из: выполнить функцию до конца и вернуться в вызывающий код
Shift+F9Вычислить выражение

Что смотреть во время остановки

  • 👁️ Значения переменных. Наведите курсор на переменную — появится подсказка. Для коллекций и структур удобнее «Вычислить выражение» или табло: там раскрываются вложенные элементы.
  • 📚 Стек вызовов. Показывает, кто вызвал функцию и с какими параметрами. Полезно, когда одна функция вызывается из десятка мест.
  • 🎯 Точка останова с условием. Через контекстное меню строки задайте условие, например Сумма > 100000. Отладчик остановится только на нужной итерации, а не на каждой из 5 000.
  • 🛑 Остановка по ошибке. Включите в меню Отладка. Выполнение прервётся прямо на строке, где возникло исключение, даже если ошибку перехватывает Попытка … Исключение.

Отладку не запускайте на рабочем сервере в часы работы. Пока выполнение стоит на точке, сеанс пользователя висит, а если функция внутри транзакции — висят и наложенные ею блокировки. Другие пользователи будут ждать или получат ошибку блокировки.

Что мешает проверке

Диагностика: выберите симптом

Вызов функции с нужными параметрами без запуска всей формы

Иногда до функции долго «дойти» в интерфейсе: нужно создать документ, заполнить десять реквизитов, провести. Проще вызвать её напрямую.

Окно «Вычислить выражение»

Остановитесь в отладчике в любом месте, где доступен модуль с функцией, нажмите Shift+F9 и введите вызов:

РасчетыСервер.СуммаСкидки(15000, 7)

Нажмите «Рассчитать» — в окне появится результат. Меняйте параметры и пересчитывайте, не перезапуская сеанс. Так за минуту проверяется вся таблица входных данных, подготовленная заранее.

Метод работает и для функций общих модулей, и для функций модуля текущего объекта (если вы остановились внутри него).

Внешняя обработка для повторных проверок

Если проверку предстоит повторять, сделайте внешнюю обработку:

  1. В конфигураторе: Файл → Новый → Внешняя обработка.
  2. Добавьте форму и команду «Проверить».
  3. В модуле формы напишите вызов функции и вывод результата.
&НаКлиенте
Процедура Проверить(Команда)
	ПроверитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПроверитьНаСервере()
	Варианты = Новый Массив;
	Варианты.Добавить(Новый Структура("Сумма, Процент", 15000, 7));
	Варианты.Добавить(Новый Структура("Сумма, Процент", 0, 7));
	Варианты.Добавить(Новый Структура("Сумма, Процент", 15000, 0));

	Для Каждого Вариант Из Варианты Цикл
		Результат = РасчетыСервер.СуммаСкидки(Вариант.Сумма, Вариант.Процент);
		Сообщить(СтрШаблон("Сумма %1, процент %2 -> %3",
			Формат(Вариант.Сумма, "ЧН=0; ЧГ=0"),
			Формат(Вариант.Процент, "ЧН=0; ЧГ=0"),
			Формат(Результат, "ЧН=0; ЧГ=0")));
	КонецЦикла;
КонецПроцедуры
  1. Сохраните файл .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 секунд. Проверка производительности — отдельная задача.

Замер производительности в отладчике

  1. Запустите отладку (F5).
  2. В конфигураторе включите Отладка → Замер производительности.
  3. Выполните в Предприятии действие с вызовом функции.
  4. Выключите замер той же командой.

Откроется окно с результатами по строкам: число выполнений, время, доля в процентах от общего. Отсортируйте по времени — сразу видно, какая строка тянет. Типичная картина: запрос внутри цикла, который выполняется 3 000 раз вместо одного раза до цикла.

Замер прямо в коде

Если нужно сравнить два варианта функции, хватит пары строк:

Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
Результат = РасчетыСервер.СуммаСкидки(15000, 7);
Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
Сообщить(СтрШаблон("Выполнено за %1 мс", Формат(Длительность, "ЧН=0; ЧГ=0")));

Один вызов даёт шум. Вызовите функцию в цикле 1 000 раз и делите итог на 1 000.

Когда нужен технологический журнал

Для клиент-серверной базы, где тормоз проявляется только под нагрузкой, отладчика мало. Технологический журнал настраивается файлом logcfg.xml на сервере 1С и пишет длительные вызовы, запросы к СУБД и ожидания на блокировках. Это инструмент администратора: включайте его на ограниченный набор событий и на короткое время, логи растут на гигабайты.

Как пользователю проверить, что функция в программе работает

Не каждый, кто ищет «проверить функцию в 1С», пишет код. Бухгалтеру обычно нужно понять: включена ли возможность и работает ли она правильно.

  • ⚙️ Включена ли возможность. В 1С:Бухгалтерии 3.0 возможности программы включаются в Главное → Функциональность. Если нужной команды или реквизита не видно, сначала проверьте флажок здесь.
  • 🧾 Работает ли расчёт. Повторите операцию в копии базы на простых числах, которые легко пересчитать вручную. Например, документ на 10 000 руб. — и сверьте результат с калькулятором.
  • 📝 Что произошло при ошибке. Откройте журнал регистрации через «Все функции» и отберите записи уровня «Ошибка» за нужное время. Текст ошибки и время передайте программисту — с ними он найдёт проблему в разы быстрее.

Частые вопросы

Можно ли отлаживать функцию в базе, где работают пользователи?
Технически да, через подключение к своему сеансу. Но пока выполнение стоит на точке, ваш сеанс держит блокировки. Для серверного кода в рабочей базе лучше журнал регистрации и копия базы.
Чем «шагнуть в» отличается от «шагнуть через»?
F11 заходит внутрь вызываемой функции и проходит её построчно. F10 выполняет вызов одной строкой и показывает только результат.
Нужен ли EDT, чтобы писать модульные тесты?
Для YAxUnit основная среда — EDT. Самописные тесты во внешней обработке или общем модуле можно вести и в обычном конфигураторе.
Почему функция даёт разный результат при отладке и без неё?
Чаще всего из-за данных и времени: функция использует текущую дату, кэш повторно используемых значений или права пользователя. Сравните параметры обоих запусков через журнал регистрации.
Как проверить функцию фонового задания?
Вызовите её процедуру напрямую из обработки на сервере или в «Вычислить выражение» — тогда сработают обычные точки останова. Сам запуск в фоне проверяйте по записям в журнале регистрации.