При переходе с конфигурации «Бухгалтерия предприятия» редакции 2.0 на редакцию 3.0 многие специалисты сталкиваются с ситуацией, когда в некоторых документах (чаще всего в банковских выписках) в меню «Еще» появляется пункт «Разблокировать объект для редактирования». При попытке нажать на него система выдает сообщение: «Данные объекта заблокированы, т.к. не завершен переход на новую версию программы». При этом отчеты о результатах обновления могут рапортовать о том, что все процедуры выполнены успешно и ошибок нет.
В этой статье мы подробно разберем, почему возникает эта ситуация, как работают механизмы Библиотеки стандартных подсистем (БСП) и какими методами можно вернуть базу данных к нормальному состоянию.
Для начала проанализируем ситуацию с технической точки зрения. Появление данной команды — это не ошибка в привычном понимании, а следствие работы подсистемы «Обновление информационной базы» из состава БСП. В современных конфигурациях 1С используется механизм «отложенного обновления». Это означает, что после того, как пользователь зашел в обновленную базу, часть данных продолжает обрабатываться в фоновом режиме. Для принудительного запуска таких процедур можно использовать обработку для выполнения отложенного обновления информационной базы.
Чтобы пользователь не изменил данные, которые в данный момент трансформируются фоновым процессом, БСП динамически подключает команду блокировки. Если система «считает», что обработка определенного типа документов еще не завершена, она выводит кнопку «Разблокировать...» и ограничивает редактирование реквизитов, которые участвуют в обновлении.
Проблема заключается в том, что иногда из-за специфических данных или программных сбоев флаг «обновление завершено» для конкретного вида метаданных не снимается, хотя сами обработчики уже давно отработали. Рассмотрим, как это исправить.
Прежде чем переходить к радикальным мерам, проверим, не остались ли в системе «хвосты» регистраций. Для этого проанализируем следующие объекты:
ПоступлениеНаРасчетныйСчет или СписаниеСРасчетногоСчета, система будет блокировать интерфейс.Выполнен.Вся информация о том, какие именно объекты интерфейса должны быть заблокированы, хранится в технической константе СведенияОБлокируемыхОбъектах. Эта константа содержит ХранилищеЗначения, внутри которого находится структура с типами объектов. Если переход с версии 2.0 был сложным, данные в этой константе могли «зависнуть».
Для того чтобы выяснить, что именно там записано, можно воспользоваться следующим кодом в консоли кода:
Сообщить(ЗначениеВСтрокуВнутр(ОбновлениеИнформационнойБазыСлужебный.СведенияОБлокируемыхОбъектах()));
Если вы видите там упоминание ваших документов, значит, система продолжает считать их находящимися в процессе миграции.
Если вы абсолютно уверены, что все процедуры обновления выполнены успешно, а кнопка в меню «Еще» продолжает «напрягать» пользователей, можно принудительно очистить сведения о блокировках. Рассмотрим, как это сделать программно. Создайте внешнюю обработку или воспользуйтесь консолью кода:
// Очистка сведений о блокируемых объектах в БСП
ОбновлениеИнформационнойБазыСлужебный.ЗаписатьСведенияОБлокируемыхОбъектах(Неопределено);
После выполнения этого кода константа будет обнулена. В большинстве случаев после перезапуска сеанса пользователем команда «Разблокировать объект для редактирования» исчезает из интерфейса.
Если программная очистка константы не помогла (например, она заполняется снова), нам придется выяснить, какое именно место в коде принимает решение о выводе кнопки. Разберем алгоритм действий с использованием отладчика:
Обычно поиск приводит к функции ОбновлениеИнформационнойБазы.ДанныеОбъектаЗаблокированы() или аналогичным методам в модулях БСП.
Иногда проблема кроется не в данных, а в самой форме документа. В БСП существует подсистема СтандартныеПодсистемы.ПодключаемыеКоманды. Если форма документа была изменена (кастомизирована) или при обновлении произошло некорректное слияние форм, вызов обновления видимости команд может работать неправильно.
Проанализируем процедуру ПриОткрытии на клиенте и ПриСозданииНаСервере. В них должны присутствовать вызовы соответствующих методов БСП:
// В процедуре ПриСозданииНаСервере
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
// В процедуре ПриОткрытии
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Параметры);
Если эти вызовы отсутствуют или закомментированы в нетиповой форме, динамическая команда «Разблокировать...» может отображаться всегда, просто потому что система «забыла» проверить её необходимость и скрыть.
Выясним еще несколько моментов, которые могут помочь в решении проблемы:
/ClearCache.Таким образом, мы рассмотрели комплексный подход к решению проблемы. Чаще всего достаточно программного обнуления константы через ОбновлениеИнформационнойБазыСлужебный.ЗаписатьСведенияОБлокируемыхОбъектах(Неопределено), но в сложных случаях стоит внимательно проверить регистр сведений «Данные для обновления» на предмет записей, которые «застряли» из-за ошибок в данных выписок при переходе с редакции 2.0.