Как реализовать ручную сортировку свойств характеристик в 1С:УПП 1.3 и исправить ошибку «Поле объекта не обнаружено (Ссылка)»

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

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

Анализируем причину возникновения ошибки

Для начала давайте разберем, почему в справочниках Подразделения или ПодразделенияОрганизаций типовой код работает без проблем. В этих объектах реализована иерархия и добавлен специальный реквизит Порядок. Когда мы вызываем процедуру:

ОбщегоНазначенияЗК.ИзменитьПорядок(ДанныеСтроки.Ссылка, "Вверх");

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

Ситуация со свойствами в справочнике ХарактеристикиНоменклатуры принципиально иная. В 1С:УПП 1.3 для отображения дополнительных реквизитов и сведений используется вспомогательный объект — обработка ЗначенияИСвойстваОбъекта. Данные, которые вы видите в табличном поле на форме, — это не ссылки на элементы справочника, а строки коллекции (Табличной части или Таблицы значений). У отдельной строки таблицы нет свойства Ссылка, так как она не является самостоятельным объектом базы данных. Именно поэтому попытка обращения к ДанныеСтроки.Ссылка вызывает закономерный отказ системы.

Решение проблемы через метод Сдвинуть()

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

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

Пример кода для кнопки «Вверх»:


Процедура КоманднаяПанельСвойстваВверх(Кнопка)
    
    // Получаем текущие данные из элемента формы (Табличного поля)
    ТекущаяСтрока = ЭлементыФормы.СвойстваИЗначения.ТекущиеДанные;
    
    Если ТекущаяСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Получаем индекс текущей строки
    ИндексТекущейСтроки = СвойстваИЗначения.Индекс(ТекущаяСтрока);
    
    // Проверяем, не является ли строка первой
    Если ИндексТекущейСтроки > 0 Тогда
        // Используем метод Сдвинуть(Строка, Смещение)
        // Отрицательное число сдвигает строку вверх
        СвойстваИЗначения.Сдвинуть(ТекущаяСтрока, -1);
        
        // Обязательно обновляем форму, если это необходимо
        ЭлементыФормы.СвойстваИЗначения.ОбновитьСтроки();
    КонецЕсли;
    
КонецПроцедуры

Аналогично реализуется кнопка «Вниз», где смещение будет положительным (1):


Процедура КоманднаяПанельСвойстваВниз(Кнопка)
    
    ТекущаяСтрока = ЭлементыФормы.СвойстваИЗначения.ТекущиеДанные;
    
    Если ТекущаяСтрока <> Неопределено Тогда
        ИндексТекущейСтроки = СвойстваИЗначения.Индекс(ТекущаяСтрока);
        
        // Проверяем, не является ли строка последней
        Если ИндексТекущейСтроки < СвойстваИЗначения.Количество() - 1 Тогда
            СвойстваИЗначения.Сдвинуть(ТекущаяСтрока, 1);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Особенности работы со свойствами в УПП

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

Разберем по шагам, что нужно сделать, чтобы изменения вступили в силу:

  1. Программное перемещение: Сдвигаем строку в коллекции СвойстваИЗначения (как показано выше).
  2. Пересчет индексов: Если в таблице есть колонка НомерСтроки или скрытый реквизит Порядок, необходимо после сдвига пройти циклом по всей коллекции и обновить эти значения.
  3. Обновление наименования: В УПП за это отвечает типовой механизм. После перемещения строк рекомендуется вызвать процедуру, которая заново соберет строку наименования на основе нового порядка свойств. Обычно это процедура типа СформироватьНаименование(), расположенная в модуле формы или объекта.

Когда все же нужна Ссылка?

Рассмотрим ситуацию, когда вам действительно нужно использовать типовую функцию ИзменитьПорядок. Это допустимо только в том случае, если вы редактируете не состав свойств конкретной характеристики, а сам План видов характеристик (ПВХ) «Свойства объектов». В этом случае в ДанныеСтроки действительно будет содержаться ссылка на элемент ПВХ. Но помните: изменив порядок там, вы измените его для всех пользователей и всех объектов в системе, где используется это свойство.

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

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

← На главную