В процессе администрирования и программирования в среде «1С:Предприятие 7.7» специалисты иногда сталкиваются с крайне загадочным поведением системы: одна из констант (часто булевского типа, принимающая значения «Да» или «Нет») внезапно перестает сохранять измененные данные. Пользователь или администратор пытается интерактивно выбрать нужное значение, однако после сохранения форма обновляется, и константа возвращается к своему прежнему значению (например, «Нет»).
Более того, попытки программного изменения значения этой константы приводят к возникновению критической ошибки: Ошибка обновления записи. Давайте подробно разберем, почему возникает этот сбой, что происходит в этот момент «под капотом» базы данных 1С 7.7 и как эффективно исправить ситуацию несколькими надежными способами.
Рассмотрим классический пример из практики. В конфигурации определено несколько аналогичных констант, имеющих тип Перечисление.Булево. Девять из них работают абсолютно штатно, позволяя свободно переключать значения между «Да» и «Нет». Десятая же константа упорно отказывается фиксировать значение «Да».
Проанализируем ситуацию на уровне программного кода. Если мы попытаемся принудительно изменить значение «закапризничавшей» константы через внешнюю обработку, мы напишем следующий простой код:
Процедура Сформировать()
Константа.ИзмСчетПриНаличПодчиненных = Перечисление.Булево.Да;
КонецПроцедуры
При попытке выполнить эту процедуру система аварийно прервет выполнение и выдаст в окно сообщений системную ошибку:
{Глобальный модуль(4623)}: Ошибка обновления записи
Аналогичные проблемы могут возникать и при попытке использовать предопределенную процедуру ПриЗаписиКонстанты() в глобальном модуле:
Процедура ПриЗаписиКонстанты(ИмяКонстанты, Значен)
Если ИмяКонстанты = "ИзмСчетПриНаличПодчиненных" Тогда
// Попытка принудительно установить значение
Константа.ИзмСчетПриНаличПодчиненных = Значен;
КонецЕсли;
КонецПроцедуры
Вызов присвоения значения внутри обработчика записи константы также завершается ошибкой. Стоит отметить важную деталь: изменять значение константы внутри её собственного обработчика записи ПриЗаписиКонстанты() напрямую через обращение к объекту Константа категорически не рекомендуется платформой, так как это вызывает рекурсивный вызов и взаимные блокировки. Единственное легальное действие здесь — проверка значения и, при необходимости, использование функции СтатусВозврата(0) для отмены транзакции записи.
Для того чтобы понять природу этой ошибки, нам необходимо заглянуть во внутреннее устройство базы данных формата DBF (файловый вариант 1С 7.7). Все константы конфигурации, а также периодические реквизиты справочников и счетов физически хранятся в одной-единственной таблице под названием 1SCONST.DBF.
Давайте выясним, как устроена запись константы в этой таблице. В нормальном состоянии для любой непериодической константы в таблице 1SCONST.DBF должна существовать ровно одна строка. В этой строке:
OBJID содержит значение «0» (это признак того, что запись принадлежит константе, а не периодическому реквизиту конкретного объекта справочника).ID содержит уникальный внутренний идентификатор константы (например, SC125), который генерируется системой автоматически и сопоставляется с именем константы в файле словаря данных 1cv7.dd.VALUE хранит непосредственное значение константы.Сбой с «незапоминанием» значения возникает тогда, когда в таблице 1SCONST.DBF по какой-то причине образуется физическое задвоение записей с одним и тем же идентификатором константы. Это может произойти вследствие аварийного завершения работы программы, сбоя сетевого соединения в многопользовательском режиме, некорректного восстановления базы данных или прямого копирования файла метаданных 1cv7.md без проведения штатного объединения конфигураций.
Когда в таблице присутствуют две записи с одинаковым ID константы, логика платформы 1С 7.7 начинает сбоить следующим образом:
1SCONST.CDX.Ошибка обновления записи, возвращая на экран значение из первой (неизменяемой) строки.Существует несколько способов устранения этого сбоя, от самых простых и быстрых до глубоких низкоуровневых манипуляций с базой данных. Рассмотрим их по порядку.
Это самый простой и действенный метод, не требующий работы со сторонними утилитами. Суть метода заключается в принудительном удалении старых связей константы в словаре данных и создании новой чистой записи.
Разберем этот процесс по шагам:
При таком подходе платформа сгенерирует для константы новый внутренний идентификатор ID в словаре 1cv7.dd. При первом запуске в режиме «Предприятие» система запишет в таблицу 1SCONST.DBF одну чистую запись с новым идентификатором, и проблема с задвоением будет полностью решена.
Если база данных имеет внушительный размер и вы хотите гарантированно избавить её от любых скрытых логических ошибок, дублирующихся записей и мусорных индексов, лучшим решением будет проведение процедуры полной выгрузки и загрузки данных.
Выполним процедуру по следующему алгоритму:
.zip, содержащий файл данных 1cv7.dat). Нажмите кнопку «ОК» и дождитесь завершения процесса.1cv7.md из вашей рабочей базы.В процессе загрузки платформа 1С 7.7 последовательно считывает данные из текстового файла 1cv7.dat и заново создает структуру таблиц DBF строго в соответствии с метаданными. Любые физические дубликаты записей в таблице констант 1SCONST.DBF при этом будут отсечены, так как система переписывает только актуальные значения объектов.
Этот способ подходит для опытных системных администраторов и программистов, когда нет возможности монопольно выгружать большую базу данных или вносить изменения в структуру метаданных.
Давайте пошагово рассмотрим ручное исправление таблицы:
1SCONST.DBF и 1SCONST.CDX.1cv7.dd (он находится в каталоге базы данных) с помощью любого текстового редактора.ИзмСчетПриНаличПодчиненных). Найдите блок описания этой константы. Нам нужно узнать её внутренний идентификатор, указанный в поле ID (например, это может быть строка вида SC248).1SCONST.DBF с помощью специализированного редактора DBF-таблиц.OBJID укажите значение «0», а в колонке ID — найденный нами идентификатор константы (например, SC248).1SCONST.CDX в каталоге базы данных.1SCONST.CDX на основе исправленной таблицы.Иногда банальной причиной ошибки обновления записи является зависшая сессия пользователя или открытое окно редактирования констант на другом рабочем месте. Если один из пользователей вошел в режим редактирования списка констант, платформа блокирует соответствующий диапазон записей в файле 1SCONST.DBF.
Чтобы исключить этот фактор:
*.lck) в каталоге базы данных и в каталогах пользователей (папки \usrdef\users\).Сбой с записью констант в 1С 7.7 — классический пример нарушения логической целостности БД формата DBF. Самым быстрым способом "лечения" является простое пересоздание константы в Конфигураторе, так как оно переназначает внутренние идентификаторы и очищает старый мусор в таблицах. Однако для поддержания общего здоровья базы данных рекомендуется регулярно проводить процедуру тестирования и исправления (ТИИ) с включенными опциями проверки физической целостности и пересчета служебных данных, либо периодически выполнять выгрузку-загрузку данных.