При работе в конфигурациях 1С:Предприятие 7.7 (в частности, в «Торговля и Склад») в файловом режиме (DBF) можно столкнуться с аномальным поведением: попытка изменить значение константы — как программным путем, так и интерактивно — не приводит к результату. При этом платформа не выдает никаких сообщений об ошибках.
Рассмотрим стандартный пример кода, выполняющего запись новой настройки:
Процедура Сформировать()
Сообщить("до: " + Константа.КонтрольОтрицательныхОстатков);
Константа.КонтрольОтрицательныхОстатков = Перечисление.СпособыКонтроляОстатковТМЦ.ПоКомпании;
Сообщить("после: " + Константа.КонтрольОтрицательныхОстатков);
КонецПроцедуры
При выполнении данной процедуры в окно сообщений может выводиться одинаковое значение до и после выполнения присвоения (например, «По фирме»). Выясним причину этой проблемы и разберем по шагам варианты её устранения.
Проблема кроется во внутренней структуре хранения данных 1С 7.7. Непериодические константы и история периодических реквизитов хранятся в общей таблице базы данных 1SCONST.DBF и соответствующем индексном файле 1SCONST.CDX.
Вследствие сетевых сбоев, некорректной работы обменов данными (УРБД) или аварийного завершения работы программы в таблице 1SCONST.DBF могут образоваться дублирующие записи для одного и того же идентификатора константы. Для непериодической константы в нормальном состоянии должна существовать ровно одна запись.
Когда в таблице появляется несколько строк с одинаковым идентификатором объекта, возникает системное противоречие:
В результате программный код обновляет первую запись в файле 1SCONST.DBF, однако при последующем считывании (а также во всех окнах конфигурации) платформа продолжает брать значение из последней строки таблицы, создавая иллюзию того, что константа не меняется.
Простая процедура «Тестирование и исправление информационной базы» (ТиИ) не устраняет данный сбой, так как с точки зрения целостности структуры базы данных индексный файл допускает наличие одинаковых ключей. Рассмотрим проверенные способы исправления данной ситуации.
Самый безопасный и штатный способ вернуть структуру базы данных в нормальное состояние — переформировать файл константы средствами конфигуратора.
В процессе загрузки платформа сформирует файлы DBF заново, корректно свернув дублирующие записи констант.
Если требуется решить проблему программно без полной выгрузки базы, можно воспользоваться встроенным объектом XBase. Для этого необходимо найти идентификатор константы (36-ричный код) и удалить дублирующие строки из файла 1SCONST.DBF.
Рассмотрим пример внешней обработки для исправления структуры файла констант:
Процедура ОчиститьДублиКонстанты(ИдКонстанты)
БД = СоздатьОбъект("XBase");
БД.ОткрытьФайл(КаталогИБ() + "1SCONST.DBF", КаталогИБ() + "1SCONST.CDX");
Если БД.Открыта() = 0 Тогда
Сообщить("Не удалось открыть таблицу 1SCONST!");
Возврат;
КонецЕсли;
// В таблице 1SCONST идентификатор константы хранится в поле ID
БД.ТекущийИндекс("ID");
Если БД.Найти(ИдКонстанты) = 1 Тогда
КоличествоЗаписей = 0;
Пока (БД.ID = ИдКонстанты) И (БД.ВКонце() = 0) Цикл
КоличествоЗаписей = КоличествоЗаписей + 1;
// Оставляем только первую запись, остальные помечаем на удаление
Если КоличествоЗаписей > 1 Тогда
БД.Удалить();
КонецЕсли;
БД.Следующая();
КонецЦикла;
КонецЕсли;
БД.Сжатие(); // Физическое удаление помеченных записей
БД.ЗакрытьФайл();
Сообщить("Обработка таблицы 1SCONST завершена.");
КонецПроцедуры
Важное предупреждение: перед прямым редактированием таблицы 1SCONST.DBF обязательно завершите сеансы всех пользователей и сделайте резервную копию каталога информационной базы. Помните, что данный файл содержит также историю периодических реквизитов справочников.
Если проблема возникла только с одной конкретной константой, не являющейся ключевой для служебных алгоритмов запуска (как, например, НомерРелиза), можно применить следующий порядок действий:
После проведения любой из описанных процедур позиционирование по индексам при чтении и записи будет совпадать, и значение константы начнет успешно изменяться.