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