Почему не изменяется значение константы в 1С 7.7 и как это исправить?

Программист 1С v7.7 Управленческий учет IT и автоматизация бизнеса
← На главную

При работе в конфигурациях 1С:Предприятие 7.7 (в частности, в «Торговля и Склад») в файловом режиме (DBF) можно столкнуться с аномальным поведением: попытка изменить значение константы — как программным путем, так и интерактивно — не приводит к результату. При этом платформа не выдает никаких сообщений об ошибках.

Рассмотрим стандартный пример кода, выполняющего запись новой настройки:


Процедура Сформировать()
    Сообщить("до: " + Константа.КонтрольОтрицательныхОстатков);
    Константа.КонтрольОтрицательныхОстатков = Перечисление.СпособыКонтроляОстатковТМЦ.ПоКомпании;
    Сообщить("после: " + Константа.КонтрольОтрицательныхОстатков);
КонецПроцедуры

При выполнении данной процедуры в окно сообщений может выводиться одинаковое значение до и после выполнения присвоения (например, «По фирме»). Выясним причину этой проблемы и разберем по шагам варианты её устранения.

В чем причина аномального поведения платформы

Проблема кроется во внутренней структуре хранения данных 1С 7.7. Непериодические константы и история периодических реквизитов хранятся в общей таблице базы данных 1SCONST.DBF и соответствующем индексном файле 1SCONST.CDX.

Вследствие сетевых сбоев, некорректной работы обменов данными (УРБД) или аварийного завершения работы программы в таблице 1SCONST.DBF могут образоваться дублирующие записи для одного и того же идентификатора константы. Для непериодической константы в нормальном состоянии должна существовать ровно одна запись.

Когда в таблице появляется несколько строк с одинаковым идентификатором объекта, возникает системное противоречие:

  1. При считывании значения: платформа движется по индексному файлу и выбирает значение из последней прочитанной по индексу записи (или записи, на которую позиционирован курсор выборки).
  2. При записи нового значения: механизм позиционирования берет первую встреченную запись с нужным ключом и обновляет именно её.

В результате программный код обновляет первую запись в файле 1SCONST.DBF, однако при последующем считывании (а также во всех окнах конфигурации) платформа продолжает брать значение из последней строки таблицы, создавая иллюзию того, что константа не меняется.

Методы решения проблемы

Простая процедура «Тестирование и исправление информационной базы» (ТиИ) не устраняет данный сбой, так как с точки зрения целостности структуры базы данных индексный файл допускает наличие одинаковых ключей. Рассмотрим проверенные способы исправления данной ситуации.

Способ 1. Выгрузка и загрузка данных (Рекомендуемый метод)

Самый безопасный и штатный способ вернуть структуру базы данных в нормальное состояние — переформировать файл константы средствами конфигуратора.

  1. Откройте базу в режиме Конфигуратор.
  2. Перейдите в меню Администрирование — Выгрузка данных и сохраните архив информационной базы.
  3. Создайте новую пустую папку на диске и укажите её в качестве каталога новой базы в окне запуска 1С.
  4. Запустите Конфигуратор для новой базы (без конфигурации) и выберите Администрирование — Загрузка данных, указав ранее созданный архив.

В процессе загрузки платформа сформирует файлы DBF заново, корректно свернув дублирующие записи констант.

Способ 2. Очистка дублирующих записей с помощью XBase

Если требуется решить проблему программно без полной выгрузки базы, можно воспользоваться встроенным объектом XBase. Для этого необходимо найти идентификатор константы (36-ричный код) и удалить дублирующие строки из файла 1SCONST.DBF.

Рассмотрим пример внешней обработки для исправления структуры файла констант:


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

Важное предупреждение: перед прямым редактированием таблицы 1SCONST.DBF обязательно завершите сеансы всех пользователей и сделайте резервную копию каталога информационной базы. Помните, что данный файл содержит также историю периодических реквизитов справочников.

Способ 3. Пересоздание константы в Конфигураторе

Если проблема возникла только с одной конкретной константой, не являющейся ключевой для служебных алгоритмов запуска (как, например, НомерРелиза), можно применить следующий порядок действий:

  1. Откройте Конфигуратор и сохраните копию конфигурации (md-файл).
  2. Удалите проблемную константу из дерева метаданных и сохраните конфигурацию.
  3. Заново добавьте константу с точно таким же идентификатором и типом данных.
  4. Сохраните конфигурацию и заново задайте необходимое значение в режиме 1С:Предприятие.

После проведения любой из описанных процедур позиционирование по индексам при чтении и записи будет совпадать, и значение константы начнет успешно изменяться.

← На главную