Довольно часто при разработке или после обновления типовых конфигураций 1С мы сталкиваемся с неочевидными ошибками. Рассмотрим классический случай: при попытке изменить состояние заказа покупателя через контекстное меню (по правому клику мыши) система выдает ошибку, в которой фигурирует некое СостояниеОригиналовПервичныхДокументов. При этом текст ошибки гласит, что поле Ссылка не обнаружено.
Ситуация осложняется тем, что глобальный поиск по коду конфигурации не дает результатов, а штатный отладчик при воспроизведении действий пользователя попросту "не проваливается" в проблемный модуль. Давайте вместе разберем по шагам, откуда берется эта ошибка, что означает упомянутый реквизит и, главное, как правильно настроить конфигуратор для поиска таких неуловимых сбоев.
Для начала разберем, к какому механизму относится переменная, вызвавшая сбой. В современных конфигурациях 1С, таких как 1С:Управление нашей фирмой (УНФ), 1С:ERP, 1С:Комплексная автоматизация и других, активно используется Библиотека стандартных подсистем (БСП). В новых версиях БСП был добавлен полезный типовой механизм — учет состояний оригиналов первичных документов.
Этот функционал позволяет пользователям системы визуально отслеживать жизненный цикл бумажного документа. Например, мы можем видеть, распечатан ли документ, передан ли он курьеру, подписан ли клиентом и вернулся ли оригинал обратно в бухгалтерию. В интерфейсе программы данный механизм активируется через настройки системы в разделе администрирования печатных форм и отчетов.
В программном коде за работу этого блока отвечает специальный определяемый тип ОбъектСУчетомОригиналовПервичныхДокументов. Именно с ним и связана наша проблема.
Проанализируем, почему система сообщает об отсутствии поля. Ошибка "Поле Ссылка не обнаружено" имеет четкую природу — это несовпадение типов данных. Мы пытаемся обратиться к свойству Ссылка у переменной или объекта, который физически не является ссылочным типом данных (например, не является типом ДокументСсылка или СправочникСсылка).
В нашем случае проблема возникла в подключенном расширении конфигурации. Скорее всего, сценарий был следующим:
Ссылка. Старый код в расширении пытается выполнить чтение этого свойства, что и приводит к мгновенному падению (исключению).Пожалуй, самый интересный момент в этой задаче — почему отладчик в Конфигураторе не останавливается на строке с ошибкой. Ответ кроется в конструкции языка 1С, которая используется для обработки исключительных ситуаций. Разберем этот механизм.
Ошибка находилась внутри блока Попытка. По умолчанию отладчик платформы 1С:Предприятие настроен таким образом, что он игнорирует любые ошибки, возникающие внутри секции Попытка. Вместо остановки, система молча прерывает выполнение текущего блока и переходит к выполнению кода внутри секции Исключение. Если разработчик не вывел в исключении внятное сообщение об ошибке, программа просто проглатывает сбой, оставляя нас в неведении.
Давайте посмотрим, как заставить платформу показать нам реальное место падения программы. Для этого выполним следующие действия в Конфигураторе:
Теперь, при повторении действий пользователя в режиме предприятия, отладчик принудительно прервет работу и остановится ровно на той строке внутри блока Попытка, где происходит обращение к несуществующему полю Ссылка. Мы сможем открыть табло или вычислить выражение, чтобы посмотреть, какой именно тип данных реально пришел в переменную.
Также рассмотрим важную практику написания надежного кода. Если вы используете перехват ошибок, всегда фиксируйте причину сбоя. Правильный шаблон использования конструкции выглядит так:
Попытка
// Блок кода, где может возникнуть ошибка (например, установка состояния)
УстановитьСостояниеДокумента(ТекущиеДанные);
Исключение
// Обязательно получаем детальное описание для отладки
ОписаниеСбоя = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
// Выводим в журнал регистрации или сообщаем пользователю
ЗаписьЖурналаРегистрации("УстановкаСостояния", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеСбоя);
Сообщить("Не удалось обновить статус документа. Обратитесь к администратору.");
КонецПопытки;
Используя встроенную функцию ИнформацияОбОшибке, мы сохраняем стек вызовов и точный текст ошибки платформы. Это сэкономит часы на поиск неисправности в будущем.
Мы выяснили причину поведения программы. Чтобы окончательно решить проблему, нам необходимо:
Всегда помните, что после масштабных обновлений типовых конфигураций (особенно при изменении версий БСП) программные интерфейсы могут меняться. Регулярная проверка расширений и правильная настройка отладчика помогут вам быстро локализовать и устранять подобные неполадки.