При переходе на новые релизы конфигурации «1С:Зарплата и управление персоналом 3.1» (особенно с веток 3.1.10 или 3.1.14) многие специалисты сталкиваются с критической остановкой процесса обновления. Система выдает сообщение об ошибке: «Не заполнено обязательное поле Наименование у вида контактной информации...». Проблема осложняется тем, что объект является предопределенным, и стандартными средствами интерфейса отредактировать его невозможно. В данной статье мы подробно разберем, почему возникает эта ситуация и как её исправить несколькими способами.
Прежде чем приступать к лечению, проанализируем ситуацию. Ошибка возникает на этапе выполнения процедур обработки данных для новой версии. В последних релизах ЗУП была значительно переработана логика БСП (Библиотеки стандартных подсистем), отвечающая за хранение и обработку контактной информации.
Основная причина кроется в «рассинхронизации» предопределенных данных. В справочнике ВидыКонтактнойИнформации существует запись, которая связана с метаданными конфигурации через ИмяПредопределенныхДанных (например, ТелефонДомашнийФизическиеЛица), но по каким-то причинам (сбои при прошлых обновлениях, некорректные обмены данными или ручное вмешательство) поле Наименование в таблице базы данных оказалось пустым. Так как в метаданных для этого поля стоит признак «Проверка заполнения: Выдавать ошибку», механизм обновления не может записать или обработать этот объект, блокируя весь процесс.
Рассмотрим самый эффективный метод, который использовал автор темы. Если элемент справочника «битый» и не дает себя редактировать, мы можем написать небольшую обработку, которая принудительно заполнит нужные поля. Мы воспользуемся тем, что программная запись объекта позволяет обойти некоторые интерактивные ограничения.
Проанализируем пример кода, который поможет восстановить целостность данных:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВидыКонтактнойИнформации.Ссылка КАК Ссылка,
| ВидыКонтактнойИнформации.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
|ГДЕ
| ВидыКонтактнойИнформации.Наименование = """"";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ОбъектСправочника = Выборка.Ссылка.ПолучитьОбъект();
// Устанавливаем наименование равным имени предопределенного узла,
// чтобы пользователь мог опознать элемент
ОбъектСправочника.Наименование = Выборка.ИмяПредопределенныхДанных;
// Важно также убедиться, что заполнен Тип контактной информации
Если ОбъектСправочника.Тип.Пустая() Тогда
ОбъектСправочника.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
КонецЕсли;
// Используем ОбменДанными.Загрузка, чтобы избежать лишних проверок модуля объекта
ОбъектСправочника.ОбменДанными.Загрузка = Истина;
Попытка
ОбъектСправочника.Записать();
Сообщить("Исправлен элемент: " + Выборка.ИмяПредопределенныхДанных);
Исключение
Сообщить("Не удалось исправить " + Выборка.ИмяПредопределенныхДанных + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
В этом коде мы сначала находим все элементы справочника ВидыКонтактнойИнформации с пустым наименованием. Затем для каждого такого элемента мы устанавливаем Наименование и проверяем заполнение реквизита Тип. Обратите внимание на использование ОбменДанными.Загрузка = Истина — это критически важный момент, позволяющий записать объект, даже если он находится в противоречивом состоянии с точки зрения бизнес-логики конфигурации.
Если вы не хотите писать код, мы можем воспользоваться стандартным инструментом администратора. Однако обычный запуск обработки не поможет, так как предопределенные элементы и служебные поля скрыты по умолчанию. Разберем по шагам, как настроить обработку:
Наименование и введите корректное название (например, «Домашний телефон»).Этот метод хорош тем, что не требует навыков программирования, но требует осторожности: убедитесь, что вы выбрали в отборе (ссылка «Все элементы») именно тот конкретный элемент, у которого пустое имя, чтобы не переименовать все виды контактной информации в базе.
Иногда система настолько жестко блокирует изменение предопределенного элемента, что даже запись через Загрузка = Истина не помогает. В этом случае можно применить «хитрый» прием: временно разорвать связь записи в БД с метаданными.
Проанализируем следующий алгоритм действий:
// Находим ссылку на проблемный объект
СсылкаНаОбъект = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("", Ложь);
ОбъектСправочника = СсылкаНаОбъект.ПолучитьОбъект();
// Очищаем имя предопределенных данных, делая элемент "обычным"
ОбъектСправочника.ИмяПредопределенныхДанных = "";
ОбъектСправочника.Записать();
// Теперь элемент можно редактировать интерактивно в пользовательском режиме!
// После заполнения Наименования возвращаем связь обратно:
ОбъектСправочника.ИмяПредопределенныхДанных = "ТелефонДомашнийФизическиеЛица";
ОбъектСправочника.Записать();
После таких манипуляций связь восстановится, Наименование будет заполнено, и процедура обновления 1С:ЗУП сможет успешно завершить свою работу.
Перед выполнением любых манипуляций с базой данных на уровне кода или групповых обработок, обязательно сделайте резервную копию (выгрузку .dt или копию файла .1cd). Работа с предопределенными данными напрямую — это вмешательство в структуру, на которую опирается программный код конфигурации.
Также рекомендуем проверить наличие официальных патчей (исправлений) от фирмы 1С. Часто подобные массовые ошибки при обновлении оперативно исправляются выпуском патчей, которые можно скачать и установить через раздел Администрирование — Обслуживание — Обновление программы — Установленные исправления. Если патч для вашего релиза существует, он автоматически подкорректирует данные справочника ВидыКонтактнойИнформации перед запуском обновления.
Выяснив причину и применив один из описанных выше методов, вы сможете успешно преодолеть критическую ошибку и продолжить эксплуатацию актуальной версии программы.