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