В процессе разработки или интеграции в 1С:Управление нашей фирмой (УНФ) программисты часто сталкиваются с ситуацией, когда стандартное обращение к реквизитам объекта Номенклатура, таким как Высота, Ширина или Глубина, не приносит желаемого результата. В конфигураторе реквизиты могут присутствовать, в отладчике значения присваиваются, но после вызова метода Записать() в пользовательском интерфейсе (в режиме "Предприятие") поля остаются пустыми или равными нулю. Разберем подробно, почему так происходит и как правильно решить эту задачу.
Проанализируем архитектуру хранения данных в 1С:УНФ. В этой конфигурации существует два способа хранения габаритов:
Номенклатура на уровне метаданных. Однако их видимость и использование часто зависят от настроек функциональных опций (например, настроек доставки или складского учета).Рассмотрим ситуацию, когда в конфигураторе мы видим реквизиты, но на форме элемента их нет. Это первый сигнал того, что форма отображает не системные поля, а динамически созданные элементы из набора дополнительных реквизитов. Если мы программно заполняем Объект.Высота, мы записываем данные в системное поле, которое "скрыто", в то время как пользователь видит значение из табличной части ДополнительныеРеквизиты. Именно поэтому в интерфейсе мы продолжаем видеть нули.
Если мы выяснили, что нужные нам поля являются дополнительными реквизитами, нам необходимо работать непосредственно с табличной частью объекта номенклатуры. Разберем по шагам алгоритм, предложенный в обсуждении. Основная сложность здесь заключается в том, что строка для конкретного свойства в табличной части может еще не существовать.
Проанализируем следующий программный код:
// Сначала найдем ссылку на само свойство (доп. реквизит) в Плане видов характеристик
ВысотаСв = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Высота (""Общие"")");
// Получаем объект номенклатуры для редактирования
ТекНом = СсылкаНаНоменклатуру.ПолучитьОбъект();
// Флаг, который поможет определить, нашли ли мы уже существующую строку
ФлагНайден = Ложь;
// Перебираем существующие доп. реквизиты
Для каждого СтрокаРеквизита Из ТекНом.ДополнительныеРеквизиты Цикл
Если СтрокаРеквизита.Свойство = ВысотаСв Тогда
СтрокаРеквизита.Значение = 123; // Устанавливаем новое значение
ФлагНайден = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
// Если строки с таким свойством не было, создаем новую
Если Не ФлагНайден Тогда
НоваяСтр = ТекНом.ДополнительныеРеквизиты.Добавить();
НоваяСтр.Свойство = ВысотаСв;
НоваяСтр.Значение = 123;
КонецЕсли;
// Записываем объект
ТекНом.Записать();
В этом примере мы сначала проверяем наличие записи о высоте в таблице ДополнительныеРеквизиты. Если запись найдена, мы обновляем значение. Если нет — добавляем новую строку, связывая её с нужным свойством из ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.
Работа через прямой поиск по наименованию НайтиПоНаименованию("Высота (""Общие"")") крайне ненадежна. Если пользователь изменит заголовок или группу в интерфейсе, код перестанет работать. Правильнее использовать штатные механизмы БСП, которые управляют наборами свойств.
Рассмотрим более продвинутый подход. Вместо ручного перебора таблицы, можно воспользоваться методами программного интерфейса БСП. Посмотрим на алгоритм:
Для конфигураций на базе БСП (какой является УНФ) рекомендуется использовать процедуры модуля УправлениеДополнительнымиРеквизитамиИСведениями. Это гарантирует, что все связанные индексы и проверки типов данных будут выполнены корректно.
При программном заполнении габаритов важно учитывать еще несколько факторов, которые могут повлиять на корректность данных:
1. Типы данных: Дополнительные реквизиты могут иметь разные типы (Число, Строка, Ссылка). Если в настройках свойства указан тип Число, убедитесь, что вы передаете именно числовое значение, а не строку, иначе при попытке записи или отображения в форме может произойти ошибка или обнуление.
2. Единицы измерения и упаковки: В 1С:УНФ габариты могут храниться не только в карточке товара, но и в справочнике ЕдиницыИзмерения (упаковки). Если ваша логика предполагает учет разных габаритов для коробок и паллет, заполнять данные нужно в подчиненном справочнике единиц измерения, а не в самой номенклатуре.
3. Расчет объема: Часто в системе настроена зависимость, где Объем = Высота * Ширина * Глубина. Если вы заполняете эти поля программно через табличную часть ДополнительныеРеквизиты, автоматического пересчета объема может не произойти, так как обработчики событий формы при программной записи не срабатывают. В таком случае вам необходимо рассчитать и записать значение объема так же программно.
4. Поиск свойства: Вместо поиска по имени, старайтесь использовать поиск по уникальному идентификатору (GUID) или через предопределенные наборы свойств, если это возможно. Это защитит ваш код от поломок при изменении пользовательских настроек программы.
Подведем итог: если вы столкнулись с тем, что реквизиты номенклатуры в УНФ не заполняются "в лоб", скорее всего, вы имеете дело с механизмом дополнительных реквизитов. Используйте обход табличной части ДополнительныеРеквизиты или штатные методы БСП для корректной работы с данными.