Зачем вообще трогать измерения
Иногда запись в регистре сведений завели «как‑нибудь, лишь бы работало», а потом бизнес‑логика меняется, и нужно поправить именно измерения, а не просто реквизиты. Кажется мелочью. Но от комбинации измерений зависит уникальность записи и то, как потом отрабатывают запросы и отчёты. Если просто создать новую запись и забыть про старую — можно получить дубль, а можно и сломать аналитику.
Менеджер записи: точечный доступ к строке
Для независимых регистров сведений в конфигураторе у нас есть удобный инструмент — менеджер записи регистра сведений. Это объект, у которого свойства — те же измерения, ресурсы и реквизиты, что и у строки регистра. Через него можно считать существующую запись, изменить и записать обратно, в том числе с новыми значениями измерений. Работает он именно с одной конкретной записью, а отбор и набор записей нужны только чтобы эту строку сначала найти.
Разберём пример кода
Возьмём ваш фрагмент с ПланОтправкиЭлектронныхПисем. Здесь как раз хороший шаблон изменения существующей записи по измерениям:
ТекЗапись = РегистрыСведений.ПланОтправкиЭлектронныхПисем.СоздатьМенеджерЗаписи(); ТекЗапись.Период = Выборка.Период; ТекЗапись.Лид = Выборка.Лид; ТекЗапись.Шаблон = Выборка.Шаблон; ТекЗапись.Контрагент = Выборка.Контрагент; ТекЗапись.Реализация = Выборка.Реализация; ТекЗапись.АдресЭлектроннойПочты = Выборка.АдресЭлектроннойПочты; ТекЗапись.Прочитать(); ТекЗапись.Лид = Лид; ТекЗапись.Контрагент = Лид.Контрагент; ТекЗапись.АдресЭлектроннойПочты = Лид.АдресаЭлектроннойПочты.Получить(0).АдресЭлектроннойПочты; ТекЗапись.Комментарий = СтрШаблон("%1; %2: заменили дубль лида с кодом %3 на %4", ТекЗапись.Комментарий, ТекущаяДатаСеанса(), СтрЗаменить(ЛидДубль.Код, Символы.НПП, ""), СтрЗаменить(Лид.Код, Символы.НПП, "")); ТекЗапись.Записать();
Сначала по ключевым полям (обычно это все измерения + период) мы заполняем свойства Период, Лид, Шаблон и т.д., а потом вызываем Прочитать(). Если такая комбинация найдена — объект менеджера «привязывается» к конкретной строке регистра, и дальше мы уже меняем нужные поля и вызываем Записать(). Просто и честно.
Нюанс: измерения как ключевые поля
Главный вопрос: можно ли в существующей записи тупо изменить измерения и всё будет красиво? Платформа разрешает менять значения ключевых полей при модификации через менеджер записи, но делает это аккуратно: фактически старая строка удаляется, а новая создаётся с обновлённой комбинацией ключа. То есть логически это одна запись эволюционировала, но технически — уже другая строка. Для запросов это не страшно, зато могут всплыть:
- нарушения уникальности (если вы попали в уже существующую комбинацию измерений);
- ломка внешних ссылок, если кто‑то где‑то хранит ссылку на запись регистра (да, так тоже делают, хоть и не надо бы).
Вот почему многие разработчики предпочитают явно создавать новую запись, а старую помечать как «закрытую» реквизитом‑флагом. Да, чуть больше кода, зато прозрачнее.
Как правильно менять измерения через менеджер записи
Алгоритм для практики обычно такой, особенно в независимом регистре:
- Находим запись через запрос (по старым измерениям и, если надо, реквизитам).
- Создаём менеджер записи, выставляем в нём старые значения измерений.
- Вызываем
Прочитать()и проверяем, что запись реально считалась. - Меняем измерения на новые значения, аккуратно проверяем, что такой комбинации ещё нет.
- Вызываем
Записать(), ловим возможную ошибку уникальности.
По сути, ваш код уже делает первые четыре шага, только вы сейчас больше правите реквизиты (Контрагент, АдресЭлектроннойПочты) и комментарий, а не сами измерения. Но паттерн тот же, тот же самый.
Альтернатива: набор записей и массовые правки
Если менять нужно не одну строку, а пачку, удобнее сначала вычитать набор записей с нужным отбором, а потом по каждой строке использовать менеджер записи. Типичный шаблон:
Набор = РегистрыСведений.ПланОтправкиЭлектронныхПисем.СоздатьНаборЗаписей(); Набор.Отбор.Лид.Установить(СтарыйЛид); Набор.Прочитать(); Менеджер = РегистрыСведений.ПланОтправкиЭлектронныхПисем.СоздатьМенеджерЗаписи(); Для Каждого СтрокаИзНабора Из Набор Цикл ЗаполнитьЗначенияСвойств(Менеджер, СтрокаИзНабора); Менеджер.Прочитать(); Менеджер.Лид = НовыйЛид; Менеджер.Контрагент = НовыйЛид.Контрагент; Менеджер.Записать(); КонецЦикла;
Набор здесь используется как «список кандидатов», а реальное изменение делаем уже через менеджер записи, чтобы не ругался отбор по измерениям. Такое разделение часто спасает нервы в боевых базах.
Немного житейщины из практики
Чуть в сторону. Многие начинающие 1С‑ники пытаются сделать массовые изменения измерений прямо в наборе записей, без захода в менеджер. Оно вроде бы и работает, пока не встретишь отбор или периодический регистр, где период входит в ключ. Потом в один прекрасный день набор перестаёт записываться, пишет что‑то невнятное про несоответствие отборам, и на поиски решения улетает вечер. Я обычно предлагаю простой тест: если меняете ключевые поля — почти всегда разумнее перейти на менеджер записи и работать с каждой строкой отдельно. Чуть длиннее код, зато куда предсказуемее поведение.
Итог: изменить можно, но стоит ли
Формально изменить измерения в существующей записи можно: менеджер записи это поддерживает, платформа с этим живёт и в документации это подтверждено. Важно лишь помнить, что вы фактически перекраиваете уникальный ключ строки и можете попасть в дубликаты или логические несостыковки. Поэтому в прикладном коде я всегда задаю простой вопрос: вы действительно хотите переписать прошлое, или лучше аккуратно создать новую запись и корректно закрыть старую?
А вы как сами чаще делаете в своих задачах: честно переносите измерения у старой записи или уже пришли к схеме «новая запись, старая — в архив»?













































