Почему перенесенные Контрагенты и Номенклатура не отображаются в формах выбора документов 1С:ERP?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет
← На главную

При переносе данных из одной конфигурации 1С в другую, особенно в такую сложную систему, как 1С:ERP, часто возникают ситуации, когда основные справочники, такие как


Контрагенты
или

Номенклатура
, успешно перенесены и видны в их стандартных формах списка, но при этом они полностью отсутствуют в формах выбора при создании или заполнении документов. Эта проблема может вызвать значительное замешательство и замедлить работу. Мы рассмотрим подробнее, почему это происходит и какие шаги необходимо предпринять для устранения этой проблемы.

Суть проблемы: неполный перенос связанных данных

Основная причина такого поведения системы заключается в том, что в 1С:ERP многие объекты не существуют «сами по себе». Они тесно связаны с другими справочниками, регистрами сведений, функциональными опциями и механизмами разграничения прав доступа. При переносе данных мы часто фокусируемся на самих объектах справочников, но забываем о всех сопутствующих данных, которые определяют их «видимость» и «доступность» в различных контекстах.

Тот факт, что ручная перезапись элемента в форме списка (через


НСИ
) делает его видимым в формах выбора, является ключевой подсказкой. Это указывает на то, что при обычной загрузке данных не срабатывают стандартные обработчики событий объекта (

ПриЗаписи
,

ПередЗаписью
и т.д.), которые как раз и отвечают за заполнение необходимых служебных регистров или полей.

Диагностика и анализ запросов динамических списков

Первым шагом к решению проблемы является понимание того, как формируются списки в формах выбора. Формы выбора в 1С:ERP почти всегда используют динамические списки, основанные на запросах. Чтобы понять, почему ваши элементы не отображаются, мы рекомендуем проанализировать запросы этих динамических списков:

  1. Откройте форму выбора (например, выбор контрагента из документа).
  2. Войдите в режим конфигуратора, если это возможно, и найдите эту форму в дереве конфигурации.
  3. Изучите свойства динамического списка, который формирует отображение. Особое внимание уделите тексту запроса к базе данных.
  4. Мы увидим, какие таблицы и регистры используются в запросе, какие условия наложены на выборку (фильтры, отборы, параметры).
  5. Сравним данные «видимого» элемента (который мы перезаписали вручную) с данными «невидимого» элемента по всем полям, участвующим в запросе, а также по записям в связанных регистрах. Это поможет точно определить, какие данные отсутствуют или некорректно заполнены.

Решение проблемы для справочника «Контрагенты»

В 1С:ERP используется двухуровневая структура для представления юридических лиц и партнеров по бизнесу:

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

Если мы перенесли только


Контрагентов
, но не перенесли или некорректно перенесли

Партнеров
или не установили связи между ними, то система не сможет отобразить

Контрагентов
в формах выбора, которые часто фильтруются по

Партнерам
.

Ключевой регистр сведений:


ИерархияПартнеров
. Этот регистр отвечает за построение иерархических связей между партнерами и их контрагентами. Без корректно заполненных записей в этом регистре, система не будет знать, как связать контрагента с партнером для отображения в иерархических списках или списках, отфильтрованных по партнерам.

Регистр сведений


СостоянияКонтрагентов
, упомянутый в обсуждении, также может влиять на видимость контрагентов, особенно если в системе настроены отборы по статусам контрагентов (например, "Действующий", "Недействующий"). Убедимся, что и этот регистр заполнен для перенесенных контрагентов.

Решение проблемы для справочника «Номенклатура»

Для справочника


Номенклатура
основная проблема часто связана с отсутствием или некорректным заполнением следующих данных:

  1. Справочник
    
    ВидыНоменклатуры
    
    :
    Этот справочник является критически важным для номенклатуры в 1С:ERP. Он определяет тип номенклатуры (товар, услуга, тара и т.д.), использование характеристик, серий, наборы дополнительных реквизитов и даже настройки ценообразования. Формы подбора в документах, такие как
    
    Реализация товаров и услуг
    
    , как правило, содержат неявные фильтры по типу номенклатуры. Например, в документе, где мы продаем товары, форма выбора будет показывать только ту номенклатуру, у которой
    
    ВидНоменклатуры
    
    соответствует типу "Товар". Если этот реквизит не был перенесен или заполнен некорректно, такие позиции будут "невидимы".
  2. Флаги
    
    ЭтоТовар
    
    ,
    
    ЭтоУслуга
    
    и т.д.:
    Эти флаги часто определяются видом номенклатуры, но могут использоваться и напрямую в запросах динамических списков. Проверим, корректно ли они установлены для перенесенных позиций.

Дополнительные возможные причины

Помимо основных проблем с


Партнерами
и

ВидамиНоменклатуры
, существует ряд других факторов, которые могут влиять на отображение данных в формах выбора:

  1. Права доступа (RLS – Row-Level Security):

    В 1С:ERP активно используется разграничение прав доступа на уровне записей. Если в справочниках существуют поля, отвечающие за RLS (например,

    
    Организация
    
    ,
    
    Подразделение
    
    ,
    
    ГруппаДоступа
    
    ), и при переносе эти поля остались незаполненными или заполнены некорректно, то пользователи могут просто не видеть эти данные, если их права ограничены. Ручная перезапись элемента часто запускает обработчики, которые заполняют эти поля значениями по умолчанию, делая объект видимым.

  2. Режим загрузки в
    
    Конвертации данных
    
    :

    При использовании обработок

    
    Конвертация данных
    
    для загрузки существует параметр "Режим обмена" (или аналогичные настройки). Если он установлен (например,
    
    ОбменДанными.Загрузка = Истина
    
    ), то для ускорения процесса загрузки отключаются стандартные обработчики событий объектов (
    
    ПриЗаписи
    
    ,
    
    ПередЗаписью
    
    ). Это приводит к тому, что служебные регистры и зависимые данные не заполняются автоматически. После такой загрузки требуется дополнительная актуализация данных.

  3. Отключенные функциональные опции:

    В 1С:ERP многие функции управляются через функциональные опции (например, использование характеристик номенклатуры, соглашений с клиентами). Динамические списки в формах выбора могут учитывать эти опции. Если данные были перенесены для функционала, который в целевой базе отключен, то связанные с ним элементы могут не отображаться или отображаться некорректно.

  4. Кэширование:

    В редких случаях причиной некорректного отображения могут быть закэшированные данные форм или настроек на стороне клиента. Хотя это менее вероятно для данной проблемы, очистка кэша (через меню "Все функции" -> "Стандартные" -> "Удаление временных файлов") иногда помогает.

Почему полнотекстовый поиск работает, а выбор — нет?

Полнотекстовый поиск (ПТП) работает на совершенно другом принципе. Он индексирует текстовое содержимое объектов напрямую из базы данных, не применяя сложную бизнес-логику и отборы, характерные для динамических списков форм выбора. ПТП ищет по "сырым" данным, тогда как формы выбора оперируют "обогащенными" данными, прошедшими через логику конфигурации и связанные регистры. Поэтому, даже если ПТП находит элемент, это не гарантирует его видимость через стандартные механизмы выбора.

Универсальное решение: программная перезапись объектов

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

Мы можем создать простую внешнюю обработку или использовать консоль запросов/кода для выполнения следующего алгоритма:

  1. Получаем все перенесенные элементы нужного справочника (например,
    
    Контрагенты
    
    или
    
    Номенклатура
    
    ).
  2. В цикле получаем объект каждого элемента.
  3. Вызываем метод
    
    Записать()
    
    для каждого объекта.

Рассмотрим пример кода для программной перезаписи справочника


Контрагенты
:


&НаКлиенте
Процедура ПерезаписатьКонтрагентов(Команда)
    // Выполняем на сервере, чтобы иметь доступ к объектам базы данных
    ПерезаписатьКонтрагентовНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПерезаписатьКонтрагентовНаСервере()
    Сообщить("Начало перезаписи контрагентов...");

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Контрагенты.Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |    НЕ Контрагенты.ПометкаУдаления"; // Исключаем помеченные на удаление

    Выборка = Запрос.Выполнить().Выбрать();
    КоличествоПерезаписанных = 0;
    КоличествоОшибок = 0;

    Пока Выборка.Следующий() Цикл
        Попытка
            // Получаем объект по ссылке
            ОбъектКонтрагент = Выборка.Ссылка.ПолучитьОбъект();

            // Флаг ОбменДанными.Загрузка = Истина обычно используется при загрузке данных
            // для пропуска проверок и ускорения. В данном случае мы хотим именно запустить
            // стандартные обработчики, поэтому флаг НЕ устанавливаем, если только
            // какая-то часть логики не требует его. В большинстве случаев его не нужно ставить.
            // ОбменДанными.Загрузка = Истина; // Если требуется пропустить специфичные проверки

            ОбъектКонтрагент.Записать();

            // ОбменДанными.Загрузка = Ложь; // Сброс флага, если устанавливался

            КоличествоПерезаписанных = КоличествоПерезаписанных + 1;
            Если КоличествоПерезаписанных % 100 = 0 Тогда // Сообщаем о прогрессе каждые 100 элементов
                Сообщить("Перезаписано " + КоличествоПерезаписанных + " контрагентов...");
            КонецЕсли;

        Исключение
            КоличествоОшибок = КоличествоОшибок + 1;
            Сообщить("Ошибка при перезаписи контрагента " + Выборка.Ссылка + ": " + ОписаниеОшибки(), СтатусСообщения.Важное);
        КонецПопытки;
    КонецЦикла;

    Сообщить("Перезапись контрагентов завершена.");
    Сообщить("Всего перезаписано: " + КоличествоПерезаписанных);
    Сообщить("Ошибок: " + КоличествоОшибок);

    // После перезаписи можем очистить кэш для текущего пользователя,
    // чтобы изменения сразу отобразились в формах выбора.
    // ОчиститьКэшКлиента(); // Это гипотетическая функция, в реальной 1С нет такой одной команды
    // Для очистки кэша обычно требуется перезапуск клиента 1С или удаление файлов кэша вручную.
КонецПроцедуры

// Аналогичный код можно написать для справочника "Номенклатура":
&НаСервере
Процедура ПерезаписатьНоменклатуруНаСервере()
    Сообщить("Начало перезаписи номенклатуры...");
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    НЕ Номенклатура.ПометкаУдаления";

    Выборка = Запрос.Выполнить().Выбрать();
    КоличествоПерезаписанных = 0;
    КоличествоОшибок = 0;

    Пока Выборка.Следующий() Цикл
        Попытка
            ОбъектНоменклатура = Выборка.Ссылка.ПолучитьОбъект();
            ОбъектНоменклатура.Записать();
            КоличествоПерезаписанных = КоличествоПерезаписанных + 1;
            Если КоличествоПерезаписанных % 100 = 0 Тогда
                Сообщить("Перезаписано " + КоличествоПерезаписанных + " позиций номенклатуры...");
            КонецЕсли;
        Исключение
            КоличествоОшибок = КоличествоОшибок + 1;
            Сообщить("Ошибка при перезаписи номенклатуры " + Выборка.Ссылка + ": " + ОписаниеОшибки(), СтатусСообщения.Важное);
        КонецПопытки;
    КонецЦикла;

    Сообщить("Перезапись номенклатуры завершена.");
    Сообщить("Всего перезаписано: " + КоличествоПерезаписанных);
    Сообщить("Ошибок: " + КоличествоОшибок);
КонецПроцедуры

Важные замечания по программной перезаписи:

  1. Тестирование: Всегда тестируем такую обработку на тестовой базе данных перед применением на рабочей.
  2. Резервное копирование: Перед выполнением массовых операций с данными обязательно создаем полную резервную копию информационной базы.
  3. Производительность: Для очень больших объемов данных (десятки и сотни тысяч элементов) такая операция может занять значительное время и создать нагрузку на сервер. Рекомендуется выполнять ее в нерабочее время.
  4. Флаг
    
    ОбменДанными.Загрузка
    
    :
    В приведенном примере мы не устанавливаем
    
    ОбменДанными.Загрузка = Истина
    
    . Причина в том, что цель этой операции — именно запустить стандартные обработчики. Если же мы знаем, что какие-то проверки при записи могут препятствовать корректной записи (например, проверки уникальности или заполнения, которые были отключены при исходной загрузке), то можно временно установить этот флаг. Однако, в большинстве случаев для "актуализации" данных он не нужен.

Заключение

Проблема отсутствия перенесенных справочников в формах выбора 1С:ERP — это типичный симптом неполного переноса данных, а именно, отсутствия записей в связанных служебных регистрах или неактуальности обязательных реквизитов. Глубокий анализ архитектуры 1С:ERP, в частности взаимосвязей между


Партнерами
и

Контрагентами
, а также роль

Видов номенклатуры
, позволяет выявить и устранить корень проблемы. Программная перезапись всех перенесенных элементов является надежным и эффективным способом актуализации данных после миграции.

← На главную