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

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

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

Анализ механизма записи набора записей

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

Разберем по шагам, как проверить, не является ли ваш набор записей «пустышкой» перед его записью:

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

Проблема преобразования типов в функции поиска значений

Часто ошибку вызывает функция НайтиИлиСоздатьЗначениеСвойстваОбъекта, которая должна приводить значения, полученные из формы, к формату, ожидаемому регистром. Рассмотрим пример кода, который часто становится «узким местом»:


Функция НайтиИлиСоздатьЗначениеСвойстваОбъекта(СвойствоСайта, Значение) Экспорт
    // ... определение типа справочника ...
    Если СвойствоСайта.ТаблицаДляСвойства = Перечисления.CMS1C_ПринадлежностьСвойстваКТаблице.Double Тогда
        Попытка
            ТекЗначение = Число(Значение);
        Исключение
            ВызватьИсключение "Невозможно преобразовать значение в число";
        КонецПопытки;
        Запрос.УстановитьПараметр("Значение", ТекЗначение);
    КонецЕсли;
    // ... продолжение логики ...
КонецФункции

Если в переменную Значение попадает пустое значение или строка с некорректным форматом, вызов функции Число() провоцирует исключение. Если обработка этого исключения не доведена до логического завершения, функция может вернуть Неопределено или пустое значение, которое впоследствии записывается в регистр как «пустое». Убедитесь, что вы корректно обрабатываете такие ситуации, возвращая безопасные значения по умолчанию.

Рекомендации по исправлению

Чтобы стабилизировать процесс записи, воспользуемся следующими практическими советами:

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

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

← На главную