В практике разработки на платформе 1С:Предприятие часто возникает задача хранения периодических данных, таких как цены товаров, курсы валют или лимиты. Существует два основных способа организации таких регистров сведений: независимый и подчиненный регистратору. Рассмотрим ситуацию, когда необходимо перейти от независимого регистра к автоматическому формированию записей при проведении документа. Это критически важный навык для обеспечения целостности данных и соблюдения стандартов разработки 1С.
Проанализируем, почему руководители и ведущие разработчики часто настаивают на использовании подчиненных регистров. Независимый регистр сведений позволяет пользователю или программному коду вносить изменения напрямую. Это удобно для простых справочных данных, но опасно для учетных систем: пользователь может вручную удалить запись о цене, и вы никогда не узнаете, на основании какого документа эта цена появилась.
Регистр, подчиненный регистратору, жестко связан с документом. Выясним основные преимущества такого подхода:
Регистратор всегда указывает на первоисточник данных.Прежде чем писать код, необходимо правильно настроить свойства объектов в конфигураторе. Рассмотрим последовательность действий:
ПриходнаяНакладная или УстановкаЦен).СрезПоследних для получения актуальной цены на любую дату.Важно помнить: как только вы переключили регистр в режим подчинения, он исчезнет из стандартного интерфейса «как есть», потому что теперь записи нельзя добавлять кнопкой «Создать» в форме списка регистра. Это нормальное поведение системы.
Рассмотрим, как автоматизировать написание кода. Платформа 1С предоставляет мощный инструмент — Конструктор движений. Чтобы им воспользоваться, откройте окно редактирования документа, перейдите на вкладку «Движения» и нажмите кнопку «Конструктор движений».
В открывшемся окне выберем наш регистр сведений и сопоставим поля табличной части документа с измерениями и ресурсами регистра. После нажатия «ОК» система сама сформирует процедуру ОбработкаПроведения в модуле документа.
Проанализируем типовой код, который генерирует конструктор:
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
// регистр Цены
Движения.Цены.Записывать = Истина;
Для Каждого ТекСтрокаТовар Из Товар Цикл
Движение = Движения.Цены.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовар.Товар;
Движение.Цена = ТекСтрокаТовар.Цена;
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
Разберем, что здесь происходит. Строка Движения.Цены.Записывать = Истина; сообщает системе, что после завершения процедуры набор записей этого регистра для данного документа должен быть сохранен в базу данных. Метод Добавить() создает новую строчку в наборе записей, а поле Регистратор заполняется системой автоматически «под капотом».
Часто возникает вопрос: нужно ли что-то менять в автоматически созданном коде? Выясним ситуации, когда ручная правка необходима:
1. Сложные расчеты. Если цена в регистр должна попадать не напрямую из документа, а после каких-то вычислений (например, за вычетом НДС или с учетом курсовой разницы), мы добавляем эти расчеты внутрь цикла:
Для Каждого ТекСтрока Из Товары Цикл
ЦенаБезНалогов = ?(ТекСтрока.ВключатьНДС, ТекСтрока.Цена / 1.2, ТекСтрока.Цена);
Движение = Движения.Цены.Добавить();
Движение.Цена = ЦенаБезНалогов;
// ... остальные поля
КонецЦикла;
2. Очистка старых движений. Посмотрите на свойство документа «Удаление движений». Если там стоит «Удалять автоматически», то перед каждым перепроведением 1С сама очистит старые записи этого документа в регистре. Это избавляет нас от необходимости писать лишний код по поиску и удалению предыдущих цен, установленных этим же документом.
3. Момент времени. В периодических регистрах критически важно поле Период. Обычно туда записывается Дата документа. Если вы хотите, чтобы цены действовали со следующего дня, можно прописать Движение.Период = НачалоДня(Дата) + 86400;.
Проанализируем технический нюанс, о котором редко задумываются новички. В независимом регистре уникальность записи определяется набором измерений и периодом. В подчиненном регистре к этому набору добавляется Регистратор. Это означает, что два разных документа могут сделать записи на одну и ту же секунду с одинаковыми измерениями. Однако СрезПоследних вернет только одну запись — ту, чей регистратор имеет более высокую позицию в последовательности (обычно это определяется временем и уникальным идентификатором ссылки).
Для обеспечения стабильности системы 1С накладывает блокировки на записи регистра в момент проведения. Это гарантирует, что пока один документ пишет цену для «Товара №1», другой документ не сможет изменить эту же запись, пока транзакция первого не завершится. При использовании ОбработкаПроведения все это управляется платформой автоматически, что делает разработку более надежной.
Как убедиться, что всё работает правильно? Рассмотрим несколько способов проверки:
РегистрСведений.Цены.СрезПоследних. Если ваша новая цена отображается там правильно на текущую дату — задача выполнена.Совет эксперта: В современных типовых конфигурациях (таких как УТ 11 или ERP) логику проведения часто выносят в Модуль менеджера документа. Это считается хорошим тоном, так как позволяет переиспользовать код проведения без создания объекта документа в памяти, что значительно ускоряет групповую обработку данных.
Перевод регистра из независимого в подчиненный — это не просто прихоть руководителя, а переход к профессиональной архитектуре 1С. Использование Конструктора движений и понимание работы ОбработкиПроведения позволяют создавать надежные и производительные решения, которые легко поддерживать и развивать.