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