Почему в 1С 7.7 изменения подчиненного элемента отображаются у других элементов-владельцев?

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

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

Разберем детально механизм функционирования подчиненных справочников в 1С 7.7, выясним причины такого поведения интерфейса и рассмотрим способы исправления ситуации как интерактивно, так и программным путем.

Причина 1: Отключение иерархического просмотра в форме списка

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

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

Если в подчиненном справочнике создан всего один элемент, то при отключенной иерархии в карточке абсолютно любого владельца в окне подчиненного справочника будет отображаться именно эта единственная строка. Любое ее изменение отразится везде, создавая иллюзию глобальной подмены.

Решение: Нажмем кнопку Иерархический просмотр в командной панели формы списка подчиненного справочника. Чтобы пользователи не могли случайно отключить фильтрацию, зафиксируем режим в модуле формы списка подчиненного справочника:


Процедура ПриОткрытии()
    // Принудительно включаем режим иерархического просмотра
    ИерархическийСписок(1, 0);
КонецПроцедуры

Причина 2: Специфика единого окна и активного контекста владельца

Проанализируем интерфейсное поведение окон в 1С 7.7. Стандартная форма списка подчиненного справочника функционирует по принципу единого окна (singleton). Она автоматически переключает контекст на тот элемент-владелец, окно которого стало активным в текущий момент времени.

Рассмотрим распространенный сценарий:

  1. Открываем форму элемента Номенклатура 1 и переходим в ее подчиненный справочник.
  2. Не закрывая подчиненный справочник, переключаемся на окно Номенклатура 2.
  3. Окно подчиненного справочника динамически перенастраивает фильтр и начинает отображать данные для Номенклатуры 2.
  4. Возвращаясь к предыдущим окнам, пользователь видит одну и ту же форму подчиненного списка, которая всегда следует за текущим активным окном.

Решение: Для проверки закроем все открытые окна в программе, после чего откроем только один конкретный элемент-владелец и вызовем его подчиненный справочник. Если отображаются корректные данные, значит, база данных не повреждена, а имело место обычное визуальное переключение контекста окон.

Причина 3: Ошибки заполнения реквизитов типа «Справочник» в коде

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

Для выявления таких дублей и проверки привязки владельца выполним проверку значения через программный код:


Если ПустоеЗначение(ЭлементНоменклатуры.НужныйРеквизит) = 0 Тогда
    Сообщить("Владелец подчиненного элемента: " + ЭлементНоменклатуры.НужныйРеквизит.Владелец);
    Сообщить("Текущая номенклатура: " + ЭлементНоменклатуры.ТекущийЭлемент());
КонецЕсли;

Программная работа с подчиненными справочниками без выгрузки пользователей

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


СпрПодч = СоздатьОбъект("Справочник.КодыПоставщика");
// Явно устанавливаем владельца перед созданием новой записи
СпрПодч.ИспользоватьВладельца(ВыбраннаяНоменклатура);
СпрПодч.Новый();
СпрПодч.КодПоставщика = "ART-12345";
СпрПодч.Наименование = "Артикул поставщика";
СпрПодч.Записать();

Если в распределенной информационной базе (УРИБ) произошел сбой синхронизации и подчиненные элементы временно потеряли связь с владельцем, исправим это внешней обработкой без монопольного доступа и блокировки пользователей:


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

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

← На главную