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