При переносе данных из одной конфигурации 1С в другую, особенно в такую сложную систему, как 1С:ERP, часто возникают ситуации, когда основные справочники, такие как
Контрагенты
Номенклатура
Основная причина такого поведения системы заключается в том, что в 1С:ERP многие объекты не существуют «сами по себе». Они тесно связаны с другими справочниками, регистрами сведений, функциональными опциями и механизмами разграничения прав доступа. При переносе данных мы часто фокусируемся на самих объектах справочников, но забываем о всех сопутствующих данных, которые определяют их «видимость» и «доступность» в различных контекстах.
Тот факт, что ручная перезапись элемента в форме списка (через
НСИ
ПриЗаписи
ПередЗаписью
Первым шагом к решению проблемы является понимание того, как формируются списки в формах выбора. Формы выбора в 1С:ERP почти всегда используют динамические списки, основанные на запросах. Чтобы понять, почему ваши элементы не отображаются, мы рекомендуем проанализировать запросы этих динамических списков:
В 1С:ERP используется двухуровневая структура для представления юридических лиц и партнеров по бизнесу:
Партнеры
Контрагенты
Контрагент
Партнеру
Если мы перенесли только
Контрагентов
Партнеров
Контрагентов
Партнерам
Ключевой регистр сведений:
ИерархияПартнеров
Регистр сведений
СостоянияКонтрагентов
Для справочника
Номенклатура
ВидыНоменклатуры
Реализация товаров и услуг
ВидНоменклатуры
ЭтоТовар
ЭтоУслуга
Помимо основных проблем с
Партнерами
ВидамиНоменклатуры
В 1С:ERP активно используется разграничение прав доступа на уровне записей. Если в справочниках существуют поля, отвечающие за RLS (например,
Организация
Подразделение
ГруппаДоступа
Конвертации данных
При использовании обработок
Конвертация данных
ОбменДанными.Загрузка = Истина
ПриЗаписи
ПередЗаписью
В 1С:ERP многие функции управляются через функциональные опции (например, использование характеристик номенклатуры, соглашений с клиентами). Динамические списки в формах выбора могут учитывать эти опции. Если данные были перенесены для функционала, который в целевой базе отключен, то связанные с ним элементы могут не отображаться или отображаться некорректно.
В редких случаях причиной некорректного отображения могут быть закэшированные данные форм или настроек на стороне клиента. Хотя это менее вероятно для данной проблемы, очистка кэша (через меню "Все функции" -> "Стандартные" -> "Удаление временных файлов") иногда помогает.
Полнотекстовый поиск (ПТП) работает на совершенно другом принципе. Он индексирует текстовое содержимое объектов напрямую из базы данных, не применяя сложную бизнес-логику и отборы, характерные для динамических списков форм выбора. ПТП ищет по "сырым" данным, тогда как формы выбора оперируют "обогащенными" данными, прошедшими через логику конфигурации и связанные регистры. Поэтому, даже если ПТП находит элемент, это не гарантирует его видимость через стандартные механизмы выбора.
Поскольку ручная перезапись элемента решает проблему, наиболее эффективным способом устранения проблемы для всех перенесенных элементов является их программная перезапись. Эта операция инициирует выполнение всех необходимых обработчиков событий объекта и заполнит недостающие данные в связанных регистрах и полях.
Мы можем создать простую внешнюю обработку или использовать консоль запросов/кода для выполнения следующего алгоритма:
Контрагенты
Номенклатура
Записать()
Рассмотрим пример кода для программной перезаписи справочника
Контрагенты
&НаКлиенте
Процедура ПерезаписатьКонтрагентов(Команда)
// Выполняем на сервере, чтобы иметь доступ к объектам базы данных
ПерезаписатьКонтрагентовНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПерезаписатьКонтрагентовНаСервере()
Сообщить("Начало перезаписи контрагентов...");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.ПометкаУдаления"; // Исключаем помеченные на удаление
Выборка = Запрос.Выполнить().Выбрать();
КоличествоПерезаписанных = 0;
КоличествоОшибок = 0;
Пока Выборка.Следующий() Цикл
Попытка
// Получаем объект по ссылке
ОбъектКонтрагент = Выборка.Ссылка.ПолучитьОбъект();
// Флаг ОбменДанными.Загрузка = Истина обычно используется при загрузке данных
// для пропуска проверок и ускорения. В данном случае мы хотим именно запустить
// стандартные обработчики, поэтому флаг НЕ устанавливаем, если только
// какая-то часть логики не требует его. В большинстве случаев его не нужно ставить.
// ОбменДанными.Загрузка = Истина; // Если требуется пропустить специфичные проверки
ОбъектКонтрагент.Записать();
// ОбменДанными.Загрузка = Ложь; // Сброс флага, если устанавливался
КоличествоПерезаписанных = КоличествоПерезаписанных + 1;
Если КоличествоПерезаписанных % 100 = 0 Тогда // Сообщаем о прогрессе каждые 100 элементов
Сообщить("Перезаписано " + КоличествоПерезаписанных + " контрагентов...");
КонецЕсли;
Исключение
КоличествоОшибок = КоличествоОшибок + 1;
Сообщить("Ошибка при перезаписи контрагента " + Выборка.Ссылка + ": " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
КонецЦикла;
Сообщить("Перезапись контрагентов завершена.");
Сообщить("Всего перезаписано: " + КоличествоПерезаписанных);
Сообщить("Ошибок: " + КоличествоОшибок);
// После перезаписи можем очистить кэш для текущего пользователя,
// чтобы изменения сразу отобразились в формах выбора.
// ОчиститьКэшКлиента(); // Это гипотетическая функция, в реальной 1С нет такой одной команды
// Для очистки кэша обычно требуется перезапуск клиента 1С или удаление файлов кэша вручную.
КонецПроцедуры
// Аналогичный код можно написать для справочника "Номенклатура":
&НаСервере
Процедура ПерезаписатьНоменклатуруНаСервере()
Сообщить("Начало перезаписи номенклатуры...");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
КоличествоПерезаписанных = 0;
КоличествоОшибок = 0;
Пока Выборка.Следующий() Цикл
Попытка
ОбъектНоменклатура = Выборка.Ссылка.ПолучитьОбъект();
ОбъектНоменклатура.Записать();
КоличествоПерезаписанных = КоличествоПерезаписанных + 1;
Если КоличествоПерезаписанных % 100 = 0 Тогда
Сообщить("Перезаписано " + КоличествоПерезаписанных + " позиций номенклатуры...");
КонецЕсли;
Исключение
КоличествоОшибок = КоличествоОшибок + 1;
Сообщить("Ошибка при перезаписи номенклатуры " + Выборка.Ссылка + ": " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
КонецЦикла;
Сообщить("Перезапись номенклатуры завершена.");
Сообщить("Всего перезаписано: " + КоличествоПерезаписанных);
Сообщить("Ошибок: " + КоличествоОшибок);
КонецПроцедуры
Важные замечания по программной перезаписи:
ОбменДанными.Загрузка
ОбменДанными.Загрузка = Истина
Проблема отсутствия перенесенных справочников в формах выбора 1С:ERP — это типичный симптом неполного переноса данных, а именно, отсутствия записей в связанных служебных регистрах или неактуальности обязательных реквизитов. Глубокий анализ архитектуры 1С:ERP, в частности взаимосвязей между
Партнерами
Контрагентами
Видов номенклатуры