Почему в 1С:Бухгалтерия 3.0 появляется кнопка «Разблокировать объект для редактирования» после перехода с редакции 2.0 и как её убрать?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При переходе с конфигурации «Бухгалтерия предприятия» редакции 2.0 на редакцию 3.0 многие специалисты сталкиваются с ситуацией, когда в некоторых документах (чаще всего в банковских выписках) в меню «Еще» появляется пункт «Разблокировать объект для редактирования». При попытке нажать на него система выдает сообщение: «Данные объекта заблокированы, т.к. не завершен переход на новую версию программы». При этом отчеты о результатах обновления могут рапортовать о том, что все процедуры выполнены успешно и ошибок нет.

В этой статье мы подробно разберем, почему возникает эта ситуация, как работают механизмы Библиотеки стандартных подсистем (БСП) и какими методами можно вернуть базу данных к нормальному состоянию.

Причина появления кнопки: механизмы БСП

Для начала проанализируем ситуацию с технической точки зрения. Появление данной команды — это не ошибка в привычном понимании, а следствие работы подсистемы «Обновление информационной базы» из состава БСП. В современных конфигурациях 1С используется механизм «отложенного обновления». Это означает, что после того, как пользователь зашел в обновленную базу, часть данных продолжает обрабатываться в фоновом режиме. Для принудительного запуска таких процедур можно использовать обработку для выполнения отложенного обновления информационной базы.

Чтобы пользователь не изменил данные, которые в данный момент трансформируются фоновым процессом, БСП динамически подключает команду блокировки. Если система «считает», что обработка определенного типа документов еще не завершена, она выводит кнопку «Разблокировать...» и ограничивает редактирование реквизитов, которые участвуют в обновлении.

Проблема заключается в том, что иногда из-за специфических данных или программных сбоев флаг «обновление завершено» для конкретного вида метаданных не снимается, хотя сами обработчики уже давно отработали. Рассмотрим, как это исправить.

Шаг 1. Проверка регистров сведений и планов обмена

Прежде чем переходить к радикальным мерам, проверим, не остались ли в системе «хвосты» регистраций. Для этого проанализируем следующие объекты:

  1. Регистр сведений «Данные для обновления». Именно здесь хранится информация о том, какие объекты еще подлежат обработке. Если в этом регистре есть записи, относящиеся к документам ПоступлениеНаРасчетныйСчет или СписаниеСРасчетногоСчета, система будет блокировать интерфейс.
  2. Планы обмена. В некоторых случаях объекты регистрируются на узлах планов обмена для выполнения процедур обновления. Проверьте регистрацию изменений в планах обмена, связанных с обновлением ИБ. Если регистрация есть, а обработчики стоят в статусе «Выполнен», регистрацию можно снять вручную.
  3. Регистр сведений «Обработчики обновления». Убедитесь, что все обработчики, имеющие отношение к переходу с 2.0 на 3.0, имеют статус Выполнен.

Шаг 2. Анализ константы «Сведения о блокируемых объектах»

Вся информация о том, какие именно объекты интерфейса должны быть заблокированы, хранится в технической константе СведенияОБлокируемыхОбъектах. Эта константа содержит ХранилищеЗначения, внутри которого находится структура с типами объектов. Если переход с версии 2.0 был сложным, данные в этой константе могли «зависнуть».

Для того чтобы выяснить, что именно там записано, можно воспользоваться следующим кодом в консоли кода:


Сообщить(ЗначениеВСтрокуВнутр(ОбновлениеИнформационнойБазыСлужебный.СведенияОБлокируемыхОбъектах()));

Если вы видите там упоминание ваших документов, значит, система продолжает считать их находящимися в процессе миграции.

Шаг 3. Программная очистка блокировки

Если вы абсолютно уверены, что все процедуры обновления выполнены успешно, а кнопка в меню «Еще» продолжает «напрягать» пользователей, можно принудительно очистить сведения о блокировках. Рассмотрим, как это сделать программно. Создайте внешнюю обработку или воспользуйтесь консолью кода:


// Очистка сведений о блокируемых объектах в БСП
ОбновлениеИнформационнойБазыСлужебный.ЗаписатьСведенияОБлокируемыхОбъектах(Неопределено);

После выполнения этого кода константа будет обнулена. В большинстве случаев после перезапуска сеанса пользователем команда «Разблокировать объект для редактирования» исчезает из интерфейса.

Шаг 4. Использование отладчика для поиска причины

Если программная очистка константы не помогла (например, она заполняется снова), нам придется выяснить, какое именно место в коде принимает решение о выводе кнопки. Разберем алгоритм действий с использованием отладчика:

  1. Запустите «1С:Предприятие» в режиме отладки.
  2. Включите замер производительности в меню «Отладка».
  3. Нажмите на кнопку «Разблокировать» в документе, чтобы вызвать окно с сообщением о незавершенном переходе.
  4. Остановите замер и найдите в списке функций ту, которая выводит текст: «Данные объекта заблокированы, т.к. не завершен переход...».
  5. Установите точку останова в этом месте и проанализируйте стек вызовов. Это позволит понять, к какому именно обработчику или регистру обращается система.

Обычно поиск приводит к функции ОбновлениеИнформационнойБазы.ДанныеОбъектаЗаблокированы() или аналогичным методам в модулях БСП.

Шаг 5. Проверка динамических подключаемых команд

Иногда проблема кроется не в данных, а в самой форме документа. В БСП существует подсистема СтандартныеПодсистемы.ПодключаемыеКоманды. Если форма документа была изменена (кастомизирована) или при обновлении произошло некорректное слияние форм, вызов обновления видимости команд может работать неправильно.

Проанализируем процедуру ПриОткрытии на клиенте и ПриСозданииНаСервере. В них должны присутствовать вызовы соответствующих методов БСП:


// В процедуре ПриСозданииНаСервере
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);

// В процедуре ПриОткрытии
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Параметры);

Если эти вызовы отсутствуют или закомментированы в нетиповой форме, динамическая команда «Разблокировать...» может отображаться всегда, просто потому что система «забыла» проверить её необходимость и скрыть.

Дополнительные рекомендации

Выясним еще несколько моментов, которые могут помочь в решении проблемы:

Таким образом, мы рассмотрели комплексный подход к решению проблемы. Чаще всего достаточно программного обнуления константы через ОбновлениеИнформационнойБазыСлужебный.ЗаписатьСведенияОБлокируемыхОбъектах(Неопределено), но в сложных случаях стоит внимательно проверить регистр сведений «Данные для обновления» на предмет записей, которые «застряли» из-за ошибок в данных выписок при переходе с редакции 2.0.

← На главную