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