Рассмотрим одну из самых неприятных ситуаций, с которой сталкивается каждый разработчик 1С: при попытке записать документ система выдает ошибку с определенным текстом, но глобальный поиск по конфигурации (Ctrl+Shift+F) по этому тексту ничего не находит. Более того, точка останова в обработчике события ПриЗаписи документа даже не срабатывает. Кажется, что сообщение появляется из ниоткуда, но, конечно, это не так. Давайте вместе разберемся, как системно подойти к поиску такого «скрытого» кода и выявить причину проблемы.
Проанализируем типичный случай: при программном создании документа «Заказ клиента» в конфигурации «Управление торговлей 11.5» появляется сообщение «Запрещено создавать документ в заказе клиента, если контрагент является головным». Поиск по этой фразе, ее частям и даже по одному слову «Запрещено» не дает результатов. Отладчик до события записи не доходит. Выясним, что делать в такой ситуации.
Первое, что нужно понять — это последовательность событий, которые происходят при записи объекта в 1С. Событие ПриЗаписи — далеко не первое в этой цепочке. Если на одном из предыдущих этапов проверка не пройдена и установлен отказ от записи, выполнение просто не дойдет до этого обработчика. Это ключевой момент, объясняющий, почему ваша точка останова не срабатывает.
Рассмотрим упрощенную последовательность серверных событий для документа:
ОбработкаПроверкиЗаполнения. Этот обработчик вызывается одним из первых и предназначен для проверки корректности и полноты данных. Если здесь обнаруживается ошибка, генерируется исключение (через вызов ВызватьИсключение) или массив с ошибками добавляется в специальный параметр. В любом случае, дальнейшая процедура записи прерывается. Это самый вероятный кандидат на источник нашей проблемы.ПередЗаписью. Этот обработчик выполняется непосредственно перед транзакцией записи в базу данных. Здесь также выполняются многочисленные проверки. Если какая-то из них не проходит, разработчик устанавливает параметр Отказ = Истина. Это штатный способ отменить запись, и после этого ПриЗаписи вызван не будет.ПриЗаписи. Этот обработчик срабатывает, только если все предыдущие проверки успешно пройдены. Он выполняется уже внутри транзакции записи и предназначен для выполнения сопутствующих действий, а не для проверок и отказов.Таким образом, наша задача — найти код, который выполняется в обработчиках ОбработкаПроверкиЗаполнения или ПередЗаписью и отменяет запись.
Это самый частый источник «невидимого» кода в типовых конфигурациях. Подписка на событие — это механизм платформы, который позволяет выполнить процедуру из общего модуля при возникновении определенного события у объекта (например, перед записью документа). Это позволяет дорабатывать систему, не внося изменений в сам объект конфигурации, что удобно при обновлениях.
Разберем по шагам, как их найти:
Документ.ЗаказКлиента.ПередЗаписью и ОбработкаПроверкиЗаполнения.В типовых конфигурациях без расширений именно подписки часто являются причиной такого поведения, так как они добавляют логику, которая не очевидна при просмотре модуля самого документа.
Если анализ подписок не помог или их слишком много, на помощь приходит один из самых мощных инструментов отладки — замер производительности. Он записывает полную последовательность всех вызовов процедур и функций за определенный период.
Как его использовать для нашей задачи:
Этот метод безотказен и помогает в самых запутанных случаях, так как он показывает реальную картину выполнения кода, а не то, что мы предполагаем.
Иногда глобальный поиск все же может помочь, если использовать его правильно. Прямой поиск полной фразы сообщения часто не работает по одной простой причине: строка сообщения может формироваться динамически из нескольких частей.
Например, код может выглядеть так:
ТекстСообщения = "Запрещено создавать документ %1, если контрагент %2";
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%1", "в заказе клиента");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%2", "является головным");
ВызватьИсключение ТекстСообщения;
В этом случае поиск по полной фразе ничего не даст. Что делать?
"является головным" или "Запрещено создавать документ". Это значительно повышает шансы на успех."Запрещено" или "головным". Их может быть не так много, и просмотреть их вручную будет несложно.Если ничего из вышеперечисленного не помогло, возможно, вы столкнулись с более изощренным способом реализации. Рассмотрим редкие, но возможные варианты.
.epf), то и код проверки может находиться в ее модуле. Убедитесь, что вы ищете код именно там, а не только в основной конфигурации.СтрШаблон, СтрЗаменить) в предполагаемых местах проверок.Выполнить(). Это плохая практика, но ее нельзя полностью исключать.В заключение, помните: чудес не бывает, и у любого сообщения всегда есть источник в коде. Системный подход, начинающийся с понимания порядка событий, анализа подписок и использования мощных инструментов вроде замера производительности, поможет вам решить даже самую запутанную проблему.