При переходе на новые релизы программных продуктов семейства «1С:Предприятие» пользователи и администраторы баз данных нередко сталкиваются со сбоями при выполнении дополнительных (отложенных) процедур обновления. Типичным примером такой проблемы является ошибка при обновлении конфигурации «1С:Розница» до версии 2.2.7.32 (при обновлении с ветки 2.2.6.х).
В процессе выполнения отложенных обработчиков система аварийно завершает работу, выдавая в журнале регистрации и на экране пользователя сообщение следующего вида:
Процедура "РаботаСФайламиСлужебныйВызовСервера.ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений" обработки данных завершилась с ошибкой: {ОбщийМодуль.ОбновлениеИнформационнойБазы.Модуль(2024)}: Ошибка при вызове метода контекста (Выполнить) РезультатЗапроса = Запрос.Выполнить; по причине: {(5, 2)}: Таблица не найдена "Справочник.УдалитьНастройкиРМКПрисоединенныеФайлы.Изменения"
В этой статье мы подробно разберем техническую природу возникновения данной ошибки, проанализируем механизмы работы платформы с таблицами регистрации изменений и предложим два проверенных практических способа решения проблемы: для версий конфигураций с возможностью изменения (ПРОФ) и для базовых версий, где изменение метаданных заблокировано разработчиком.
Для того чтобы эффективно устранить ошибку, нам необходимо понять, почему она возникает. Ошибка локализована в процедуре ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений, которая входит в состав Библиотеки стандартных подсистем (БСП). Данный обработчик отвечает за миграцию данных электронных подписей и сертификатов из табличных частей различных справочников присоединенных файлов в специализированные регистры сведений.
Алгоритм работы этого обработчика устроен следующим образом:
*ПрисоединенныеФайлы).Справочник.[ИмяСправочника].Изменения через подстановку #ТаблицаИзменений.При выпуске релиза 2.2.7.32 разработчики «1С» приняли решение вывести из эксплуатации справочник НастройкиРМКПрисоединенныеФайлы. Они переименовали его в УдалитьНастройкиРМКПрисоединенныеФайлы, подготовив к полному удалению в будущих версиях, и корректно исключили его из всех планов обмена базы данных.
Однако в коде отложенного обновления БСП этот справочник по-прежнему остался в списке анализируемых объектов. Когда процедура динамически формирует запрос к базе данных и пытается прочитать таблицу изменений Справочник.УдалитьНастройкиРМКПрисоединенныеФайлы.Изменения, платформа выдает ошибку, так как этой таблицы физически не существует в базе — ведь объект был исключен из планов обмена! Это классическая архитектурная недоработка релиза, которую нам предстоит обойти.
Если вы используете версию конфигурации «1С:Розница ПРОФ» (или любую другую версию с возможностью внесения изменений), самым быстрым и корректным решением будет временное включение проблемного справочника в состав системного плана обмена. Это заставит платформу физически создать требуемую SQL-таблицу изменений.
Рассмотрим этот процесс по шагам:
Конфигурация — Поддержка — Настройка поддержки. Нажмите кнопку Включить возможность изменения. Для правил поддержки объектов установите значение Объект поставщика редактируется с сохранением поддержки.Планы обмена.ОбновлениеИнформационнойБазы (в некоторых случаях можно использовать любой другой активный план обмена, например, связанный с синхронизацией данных). Откройте его свойства двойным кликом.УдалитьНастройкиРМКПрисоединенныеФайлы.Конфигурация — Обновить конфигурацию базы данных). Примите изменения структуры метаданных.После запуска система автоматически продолжит отложенное обновление. Поскольку справочник теперь включен в план обмена, платформа успешно создаст таблицу изменений, запрос выполнится без ошибок, и процедура обновления завершится в штатном режиме. После завершения обновления справочник можно при желании снова исключить из состава плана обмена в конфигураторе.
В базовых версиях программных продуктов «1С» возможность изменения метаданных в конфигураторе полностью заблокирована на уровне лицензии платформы. Включить справочник в состав плана обмена вручную не удастся. В этой ситуации мы применим программный обход проблемы с помощью внешней обработки.
Наша задача — принудительно сообщить подсистеме обновления БСП, что сбойный обработчик уже «выполнен успешно». Сведения о состоянии отложенных обработчиков обновлений хранятся в специальном регистре сведений. Мы напишем код, который найдет запись о проблемном обработчике и установит ему статус выполнения.
Для реализации этого метода выполните следующие действия:
// Процедура принудительной пометки обработчика обновления как выполненного
Процедура СнятьБлокировкуОбновленияНаСервере()
// Имя проблемной процедуры, которая вызывает сбой
ИмяСбойногоОбработчика = "РаботаСФайламиСлужебныйВызовСервера.ПеренестиЭлектронныеПодписиИСертификатыШифрованияВРегистрыСведений";
// В зависимости от версии БСП данные могут храниться в регистре "ОбработчикиОбновления"
РегистрОбработчиков = РегистрыСведений.ОбработчикиОбновления;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Обработчики.ИмяОбработчика КАК ИмяОбработчика,
| Обработчики.Версия КАК Версия
|ИЗ
| РегистрСведений.ОбработчикиОбновления КАК Обработчики
|ГДЕ
| Обработчики.ИмяОбработчика ПОДОБНО &ИмяОбработчика";
Запрос.УстановитьПараметр("ИмяОбработчика", "%" + ИмяСбойногоОбработчика + "%");
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Сообщить("Сбойный обработчик обновления не найден в регистре сведений!");
Возврат;
КонецЕсли;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Создаем менеджер записи для изменения статуса конкретного обработчика
МенеджерЗаписи = РегистрОбработчиков.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ИмяОбработчика = Выборка.ИмяОбработчика;
МенеджерЗаписи.Версия = Выборка.Версия;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
// Устанавливаем статус "Выполнен" из соответствующего перечисления БСП
МенеджерЗаписи.Статус = Перечисления.СтатусыОбработчиковОбновления.Выполнен;
Попытка
МенеджерЗаписи.Записать();
Сообщить("Статус обработчика успешно изменен на 'Выполнен' для версии " + Выборка.Версия);
Исключение
Сообщить("Ошибка при записи изменений в регистр: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важное примечание: Поскольку сам проблемный справочник УдалитьНастройкиРМКПрисоединенныеФайлы в базе данных является пустым (как подтверждают пользователи на форуме), пропуск данного обработчика не приведет к потере реальных пользовательских данных или нарушению ссылочной целостности базы данных. Этот шаг абсолютно безопасен для последующей эксплуатации программы.
После выполнения данного кода запустите процедуру обновления заново через форму Поддержка и обслуживание — Обновление программы (или просто перезапустите сеанс «1С:Предприятие»). Система увидит, что проблемный шаг успешно пройден, и завершит процесс обновления оставшихся подсистем без вывода сообщений об ошибках.
Чтобы избежать подобных коллизий при последующих обновлениях, рекомендуем придерживаться следующих правил:
.1cd для файловых баз или бэкап средствами СУБД для клиент-серверного варианта).