Ситуация, когда после аварийного завершения работы или поломки жесткого диска база данных «1С:Предприятие 7.7» начинает вести себя некорректно, является классической для систем на базе DBF-файлов. Одной из самых неприятных ошибок в конфигурации «Торговля и Склад 9.2» является невозможность записать элемент номенклатуры из-за ошибки в модуле формы. Проанализируем ситуацию: при попытке выбрать базовую единицу измерения система выдает фатальную ошибку {Справочник.Номенклатура.Форма.Модуль(427)}: Не выбран элемент!. Это происходит потому, что логическая целостность между таблицей товаров и таблицей единиц измерения была нарушена.
Разберем подробно, почему это происходит и как восстановить работоспособность базы, не прибегая к ручному перебиванию справочников с нуля.
Для начала проанализируем техническую сторону вопроса. В системе «1С 7.7» справочник Единицы является подчиненным справочнику Номенклатура. Это означает, что для каждого товара в отдельной таблице (файле) хранятся его единицы измерения (шт, кг, упаковки). В основной таблице номенклатуры есть реквизиты БазоваяЕдиница и ОсновнаяЕдиница, в которых хранятся ссылки (идентификаторы ID) на записи из подчиненного справочника.
Когда происходит сбой HDD, могут возникнуть следующие проблемы:
1cv7.md был заменен на старую версию, структура таблиц может не совпадать с данными в DBF.Ошибка в строке 427 модуля формы номенклатуры возникает именно в момент обращения к объекту, который не был инициализирован. Программа пытается выполнить код СпрЕдиницы.Наименование = РекаЕдиница.Наименование, но так как РекаЕдиница не найдена в базе по указанному в карточке идентификатору, возникает отказ.
Рассмотрим первоочередные действия, которые необходимо выполнить перед глубоким восстановлением. Прежде всего, создадим полную копию каталога базы данных. Это критически важно, так как любые манипуляции с DBF могут привести к окончательной потере данных.
После создания копии выполним следующие действия:
.cdx из каталога базы данных. Эти файлы содержат индексы и будут автоматически пересозданы при следующем запуске.Если после переиндексации ошибка сохраняется, значит проблема кроется непосредственно в данных (битых ссылках в DBF-таблицах).
Проанализируем ситуацию, упомянутую опытными специалистами: «подсунули старый MD-шник». В 1С 7.7 структура справочников жестко привязана к файлу 1cv7.md. Если в процессе восстановления вы взяли файл конфигурации из старого архива, а файлы данных (DBF) остались от новой версии, программа может некорректно считывать длину полей или внутренние идентификаторы объектов.
Убедимся, что файл 1cv7.md соответствует текущей версии базы. Если точного архива нет, попробуйте вспомнить, вносились ли изменения в справочники Номенклатура или Единицы в последнее время. Если да, эти изменения необходимо восстановить в конфигураторе, чтобы структура метаданных совпала с физической структурой файлов.
Если «Тестирование и исправление» (ТиИ) не помогает, а бухгалтеры уже готовы вводить данные вручную, воспользуемся более эффективным методом — написанием лечащей обработки. Разберем логику скрипта, который поможет нам «пришить» единицы измерения обратно к товарам.
Нам необходимо перебрать всю номенклатуру и проверить, существуют ли для каждого товара соответствующие записи в подчиненном справочнике. Если ссылка «битая», мы её обновим.
Пример программного кода для восстановления связей:
Процедура ВосстановитьЕдиницы()
СпрНом = СоздатьОбъект("Справочник.Номенклатура");
СпрЕд = СоздатьОбъект("Справочник.Единицы");
СпрНом.ВыбратьЭлементы();
Пока СпрНом.ПолучитьЭлемент() = 1 Цикл
Если СпрНом.ЭтоГруппа = 1 Тогда
Продолжить;
КонецЕсли;
// Устанавливаем фильтр по владельцу
СпрЕд.ИспользоватьВладельца(СпрНом.ТекущийЭлемент());
СпрЕд.ВыбратьЭлементы();
Если СпрЕд.ПолучитьЭлемент() = 1 Тогда
// Если нашли хотя бы одну единицу, назначаем её базовой
СпрНом.БазоваяЕдиница = СпрЕд.ТекущийЭлемент();
СпрНом.ОсновнаяЕдиница = СпрЕд.ТекущийЭлемент();
СпрНом.Записать();
Сообщить("Восстановлена связь для: " + СпрНом.Наименование);
Иначе
// Если единиц нет совсем, создаем новую "шт"
СпрЕд.Новый();
СпрЕд.Наименование = "шт";
// В ТиС 9.2 важно заполнить реквизит "ОКЕИ"
// Предположим, код для "шт" в ОКЕИ - 796
СпрЕд.Записать();
СпрНом.БазоваяЕдиница = СпрЕд.ТекущийЭлемент();
СпрНом.ОсновнаяЕдиница = СпрЕд.ТекущийЭлемент();
СпрНом.Записать();
Сообщить("Создана новая единица для: " + СпрНом.Наименование);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот метод позволяет автоматизировать процесс, на который у человека ушли бы недели. Мы программно заставляем систему переписать идентификаторы в полях БазоваяЕдиница на реально существующие в текущей таблице единиц измерения.
В некоторых случаях ошибка настолько серьезная, что справочник даже не открывается. Тогда проанализируем ситуацию с помощью DBF-редактора. Нам нужно найти два файла: основной справочник номенклатуры (например, SC123.dbf) и подчиненный справочник единиц (например, SC150.dbf). Определить конкретные номера файлов можно, открыв файл 1cv7.dd в любом текстовом редакторе.
Выполним следующие действия в DBF-вьювере:
ISMARK. Если там стоит символ *, значит записи помечены на удаление. Иногда после сбоя флаги удаления проставляются хаотично. Снятие этих пометок может «вернуть» единицы в 1С.PARENTEXT. В нем должен храниться ID владельца (товара). Если это поле пустое или заполнено мусором, 1С не увидит эти единицы как принадлежащие конкретному товару.Важный нюанс: В 1С 7.7 идентификаторы объектов — это строки из 13 символов в 36-ричной системе исчисления. Любая ошибка в одном символе делает ссылку «битой».
Мы выяснили, что причина ошибки Не выбран элемент! кроется в нарушении ссылочной целостности между таблицами DBF. Вместо того чтобы создавать базу с нуля, рекомендуется использовать программный метод восстановления связей, который вернет работоспособность номенклатуре за считанные минуты.
Чтобы избежать подобных ситуаций в будущем, настоятельно рекомендуем:
Помните, что в 1С 7.7 данные почти всегда можно спасти, если понимать внутреннюю структуру хранения идентификаторов и взаимосвязи таблиц.