Тест 1С с откатом: безопасная схема
АйТи Фреш
1С и базы данных

Как проверять документы 1С на копии базы

Автор: , директор ООО «АйТи-Фреш» · · ~11 мин чтения
Копия бухгалтерского журнала для безопасного теста 1С с откатом
Проверяйте копию, берегите оригинал

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

Зачем проверять изменения на копии

Я не запускаю эксперимент на рабочей базе только потому, что код выглядит коротким. Проведение документа может записать движения, изменить остатки, вызвать подписки и запустить настроенные обмены. Отключение одного тестового действия не всегда отключает весь маршрут, который за ним тянется. Поэтому отдельная копия нужна не для красоты: она дает возможность повторить сценарий и удалить испорченный стенд, не восстанавливая рабочую базу. В условном кейсе ООО «Утро-Трейд» я проверяю на копии один маршрут документов: что создается, какие движения появляются и какой отчет получает бухгалтер. Для настройки такой среды подойдет услуга сопровождения 1С. В копии могут оставаться реальные учетные и персональные данные, поэтому доступ к тестовому экземпляру тоже ограничиваю. Подпись «тест» в названии не заменяет права доступа. Перед запуском еще раз сверяю имя информационной базы и строку подключения: если они не совпали с планом, тест не стартует.

Сначала определяю вариант базы. В файловом варианте данные находятся в файле 1Cv8.1CD; прямое копирование делаю после закрытия сеансов, иначе можно получить копию не того состояния, которое собирался проверить. Для клиент-серверной базы резервную копию делают средствами используемой СУБД или штатным способом конфигурации, а не поиском мифического файла на диске. Если нужна переносимая выгрузка, у платформы есть отдельный механизм выгрузки и загрузки информационной базы; его не следует путать с обычным копированием. Подробности о формате копии и восстановлении разобраны в статье выгрузка и загрузка базы 1С. Рабочий экземпляр и тестовый должны иметь разные каталоги, доступы и понятные подписи. Иначе копия рано или поздно становится новой рабочей базой — обычно в пятницу вечером. После восстановления копии проверяю, что база открывается в нужном режиме и видна именно тестовая метка, а не рабочая. Если резервную копию нельзя восстановить и открыть отдельно, пока рано считать ее страховкой. Копию и исходный резерв храню раздельно, чтобы ошибка при тестировании не затронула оба экземпляра сразу.

Копия защищает данные базы, но сама по себе не изолирует почту, обмены и внешние сервисы.
Схема тестирования 1С на копии с контролем интеграций
Сначала копия, потом эксперимент

Что именно откатывает транзакция 1С

Встроенный язык позволяет явно начать транзакцию, зафиксировать ее при успехе или отменить при ошибке: НачатьТранзакцию(), ЗафиксироватьТранзакцию(), ОтменитьТранзакцию(). Эти вызовы не являются волшебной кнопкой «вернуть всё как было». Они управляют изменениями базы в рамках текущей транзакции. Если обработка уже отправила письмо, создала файл вне базы, вызвала стороннюю систему или успела зафиксировать предыдущую порцию данных, отмена этой транзакции не отменит такие действия. Я держу тест на копии даже тогда, когда в коде есть отмена: это второй рубеж, а не страховка от всех последствий. До запуска записываю исходное состояние объектов, которые будет трогать тест, и заранее решаю, какие действия должны остаться только в копии. Например, отправку сообщения заменяю тестовой записью, а обмен с внешней системой не запускаю. Так я проверяю учетную логику, не устраивая побочный эксперимент для соседних систем.

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

Не запускайте тест с внешними действиями, пока не отключили или не заменили их безопасными заглушками.
Я помогу описать сценарий отката, подготовить копию и настроить проверку результата так, чтобы тест не затрагивал рабочие интеграции. Обсудить задачу
Схема транзакции 1С и границ автоматического отката
Откат ограничен границами транзакции

Как запускать повторяемый тест

Тест можно запускать вручную из отдельной копии или автоматизировать через поддерживаемые параметры запуска платформы. Внешняя обработка запускается в режиме 1С:Предприятие; для пакетного запуска я сверяю синтаксис именно с руководством администратора для установленной версии. Командный запуск создает еще один рабочий сеанс, но не превращает его в изолированную песочницу и не скрывает его от администрирования. Сеанс подключается к указанной базе и получает назначенные ему права. Поэтому прежде чем нажать «старт», проверяю строку подключения, выбранное имя базы и учетную запись. Один неверно выбранный путь — и все аккуратно написанные проверки отправятся не туда. Первый прогон делаю вручную и сверяю, куда подключился клиент и с какими правами. Только после этого переношу запуск в автоматизацию. Для воспроизводимости фиксирую установленный релиз платформы, вариант базы и путь к обработке; жестко вшитые пароли и пути к рабочим каталогам в файл сценария не добавляю.

Для автоматического прогона использую отдельную учетную запись с минимальными правами, храню ее реквизиты в защищенной настройке среды, а не в тексте скрипта. В журнал регистрации можно писать начало и итог теста, но платформа не обязана сама фиксировать каждую границу транзакции так, как нужно автору теста. Журнал предназначен для событий работы с информационной базой; дополнительные диагностические события разработчик записывает явно. Поэтому добавляю в тест собственный идентификатор запуска, имя сценария и итог проверки. Если такой записи нет, нельзя заключить, что откат не сработал: сначала выясняю, была ли вообще настроена запись события. И наоборот, строка «ошибка» в журнале сама по себе не доказывает, что данные повреждены. Запись делаю на каждом завершении: отдельное событие для успешного результата и отдельное для ошибки с кратким контекстом. Не кладу в журнал большие куски данных и не записываю лишние сведения о пользователях. В итоговом отчете указываю время, идентификатор запуска, версию конфигурации и ссылку на сохраненные диагностические материалы.

Журнал событий помогает расследовать запуск, но не заменяет проверку данных.

Как проверить результат после отката

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

«Тестирование и исправление информационной базы» — инструмент диагностики и исправления ошибок хранения, а не обязательный ритуал после каждого штатного отката. Его применяют, когда есть основания подозревать проблему с базой; перед исправлением сохраняют отдельную копию. Важная деталь из документации 1С: такая процедура выполняется только в монопольном режиме, то есть пользователи в это время не работают с базой. Не запускайте ее на живой системе ради красивой галочки в чек-листе. Если копия после теста подозрительна, оставьте ее для анализа и поднимите новую из проверенного резерва. Сценарий восстановления после реального сбоя — отдельная задача, о ней есть статья восстановление базы 1С после сбоя. Перед ТиИ я предупреждаю пользователей и проверяю, что все сеансы действительно закрыты; в клиент-серверном варианте действую по правилам администрирования кластера. Диагностику нельзя запускать параллельно с тестовой записью. После исправления снова проверяю копию прикладными сценариями и только потом решаю, можно ли взять из нее отдельные диагностические выводы.

ТиИ может исправлять данные. Перед ним сохраните копию, которую не жалко изменить.
Дерево решений для проверки результата теста 1С
Расхождение останавливает прогон

Как встроить проверку в CI

Автоматизация полезна, когда она каждый раз поднимает чистую копию и проверяет один и тот же ожидаемый результат. Я строю процесс вокруг четырех условий: версия платформы и конфигурации записаны; база для запуска однозначно выбрана; интеграции с реальными системами отключены или заменены тестовыми; итог проверки возвращается в систему сборки вместе с журналом. Если проверка упала, рабочая база не «откатывается» из резерва — прекращается только прогон тестовой копии. Такой стенд можно связать с системой CI, но скорость зависит от размера базы, восстановления и самих сценариев. Я не обещаю одинаковые 10 минут для всех: размер базы не читает маркетинговые обещания. Для параллельных сборок выдаю каждому запуску отдельный экземпляр базы: два сценария на общей копии могут мешать друг другу и портить результат сравнения. При ошибке система CI хранит статус и журнал, но не пытается автоматически перезаписать рабочие данные. Это простое правило убирает опасный соблазн сделать восстановление частью обычной кнопки «повторить».

В условном кейсе ООО «Утро-Трейд» я оформляю сценарий как последовательность: поднять экземпляр из контрольной копии, отключить реальные обмены и задания, создать тестовые документы, проверить движения и отчет, отменить тестовую транзакцию, записать итог. Перед следующим прогоном база поднимается заново, чтобы остатки первого запуска не влияли на второй. Если конфигурация изменилась, рядом с результатом сохраняются ее версия и версия платформы — без них повторить неудачный тест трудно. Выход для команды — воспроизводимый набор шагов и понятный отчет «прошел / не прошел», а не обещание нулевого риска. Автоматизация убирает ручную рутину; думать о том, куда уходит тестовый запрос, она за вас не будет. В карточке сценария я описываю исходные данные, ожидаемое поведение документа и способ проверки движений. Так коллега может повторить тест без устных подсказок и без доступа к рабочей базе. Если проверяется не типовая конфигурация, критерии согласуются с ее правилами учета; универсального набора проводок для всех баз 1С не существует.

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

Можно ли проверить документ прямо в рабочей базе?

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

Всегда ли ОтменитьТранзакцию возвращает данные?

Метод отменяет изменения в своей транзакции. Он не отменяет отправленные письма, внешние вызовы и ранее зафиксированные порции данных.

Доказывает ли журнал регистрации, что откат прошел?

Нет. Он хранит события, но отметки о старте и результате теста нужно явно записать в коде; затем проверьте ожидаемые данные.

Нужно ли запускать тестирование и исправление после каждого теста?

Нет. Это диагностический инструмент; применяйте его при основаниях подозревать проблему и только на копии в монопольном режиме.

Можно ли сделать тестовую базу на том же сервере?

Можно, если это отдельный экземпляр с ограниченными доступами и отключенными реальными обменами. Для файловой базы прямое копирование выполняйте при закрытых сеансах.

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Источники

© ООО «АйТи-Фреш» · Москва · Все статьи