← вся теориятеория к собесу · Регистры 1С

Набор записей 1С: отбор и замещение

разбор писал Даниил, автор Сеньорчика

Зачем это спрашивают

Набор записей читает и пишет записи регистра пачкой по отбору. Его главная особенность в замещении: по умолчанию запись удаляет всё по отбору и кладёт содержимое набора. На собесе спрашивают, что будет с набором без отбора и когда писать менеджером записи.

// Так спрашивают: «Что делает Записать() у набора записей?» «Что будет, если записать набор без отбора?» «Как поправить движения документа вне проведения?» «Чем набор записей отличается от менеджера записи?»

Отбор и чтение

Набор создаёт менеджер регистра. Отбор ставят до чтения и до записи: он говорит, какие записи набор читает и какие заменит.

Набор независимого регистра без отбора при Прочитать() загрузит в память весь регистр. На регистре цен с миллионом строк это сразу гигабайты памяти сервера.

Набор = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
Набор.Отбор.Номенклатура.Установить(Товар);
Набор.Отбор.Период.Установить(НачалоДня(Дата));
Набор.Прочитать();      // только записи по отбору

Замещение

Записать() по умолчанию работает с замещением: удаляет записи по отбору и пишет содержимое набора. Записать(Ложь) только дописывает. Отбор решает, сколько будет удалено, и это главный источник аварий:

Одну запись по полному ключу безопаснее писать менеджером записи: он заменит ровно её. Набор берут, когда пишут много записей одного отбора.

Движения документа

Движения документа устроены как коллекция наборов, у каждого отбор по регистратору. Платформа сама ставит этот отбор, поэтому при проведении достаточно добавить записи и поставить Записывать = Истина. Вне проведения движения правят набором с явным отбором по регистратору:

Метод Загрузить(Таблица) переносит в набор строки таблицы значений одним вызовом, если имена колонок совпадают с полями регистра. В обработчике ПередЗаписью(Отказ, Замещение) модуля набора видно, пишется ли набор с замещением.

Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Документ);
Набор.Прочитать();
// правка записей
Набор.Записать();

Как отвечать: «Что будет, если записать набор записей регистра сведений без отбора?»

Записать по умолчанию работает с замещением: удаляет все записи, подходящие под отбор, и пишет содержимое набора. Без отбора под удаление попадает весь регистр, и в нём останется только то, что лежит в наборе. Поэтому отбор ставлю до записи, а одну запись по ключу пишу менеджером записи, он заменяет ровно её.

Кандидат знает механизм замещения и его худший случай, а вывод про менеджер записи показывает, как он этого избегает на практике.

На чём валят

  • −Пишут цену набором с отбором только по периоду. Затираются цены остальных товаров на эту дату. Отбор ставят по полному ключу или пишут менеджером записи.
  • −Читают набор независимого регистра без отбора. Весь регистр уезжает в память. Отбор ставят до Прочитать().
  • −Правят движения документа набором без отбора по регистратору. Затрутся движения всех документов. Отбор по регистратору обязателен.

Проверь себя

Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.

  1. #oc_record_sets1 / 5
    Что делает Набор.Записать(Истина)?
    A)Удаляет набор из памяти после записи
    B)Добавляет записи к существующим
    C)Заменяет записи по отбору содержимым набора
    D)Записывает и блокирует регистр до конца сеанса
    показать ответ и разбор
    +C)Заменяет записи по отбору содержимым набора

    // разбор: Параметр Замещение = Истина: записи базы, подходящие под отбор набора, удаляются и заменяются тем, что в наборе. Ложь — записи добавляются к существующим. Пустой набор с Замещение = Истина просто удаляет записи по отбору.

  2. #oc_record_sets2 / 5
    Что такое Движения в модуле документа?
    A)Таблица значений с будущими проводками документа
    B)Коллекция наборов записей регистров с отбором по документу
    C)Журнал изменений документа по версиям
    D)Список регистров, где документ выступает измерением
    показать ответ и разбор
    +B)Коллекция наборов записей регистров с отбором по документу

    // разбор: Движения — коллекция наборов записей по регистрам, где документ указан регистратором. У каждого набора уже установлен отбор по регистратору, поэтому Движения.Остатки.Записать() заменит движения именно этого документа. Набор заполняется в обработке проведения.

  3. #oc_record_sets3 / 5
    Что вернёт Набор.Прочитать() на только что созданном наборе с установленным отбором?
    A)Загрузит в набор записи из базы по отбору
    B)Вернёт число записей, найденных по отбору
    C)Прочитает весь регистр, отбор применится при записи
    D)Ничего: метод есть только у менеджера записи
    показать ответ и разбор
    +A)Загрузит в набор записи из базы по отбору

    // разбор: Прочитать() заполняет набор записями из базы, подходящими под отбор. Если отбор не установлен, прочитается весь регистр — на большом регистре это гарантированные проблемы с памятью. Сам метод ничего не возвращает, он меняет содержимое набора.

  4. #oc_record_sets4 / 5
    Найди проблему:
    Набор = РегистрыСведений.Цены
      .СоздатьНаборЗаписей();
    З = Набор.Добавить();
    З.Товар = Т;
    З.Цена = 100;
    Набор.Записать();
    Регистр независимый, непериодический.
    A)Отбор не установлен: запись с замещением сотрёт весь регистр
    B)Набор нужно сначала прочитать
    C)Добавить() недоступен у независимого регистра
    D)Цена должна задаваться через менеджер записи
    показать ответ и разбор
    +A)Отбор не установлен: запись с замещением сотрёт весь регистр

    // разбор: Записать() по умолчанию идёт с замещением, а набор без установленного отбора замещает все записи регистра. После такого кода в регистре останется одна цена. Нужно Набор.Отбор.Товар.Установить(Т) или менеджер записи. Классическая авария в продакшене.

  5. #oc_record_sets5 / 5
    Как записать движения документа в регистр вне проведения, например обработкой исправления?
    A)Только перепроведением документа целиком
    B)Через менеджер записи регистра накопления
    C)Через Док.Движения у ссылки документа
    D)Набор с Отбор.Регистратор.Установить(Док) и запись
    показать ответ и разбор
    +D)Набор с `Отбор.Регистратор.Установить(Док)` и запись

    // разбор: Набор записей регистра с отбором по регистратору заменит движения именно этого документа, не затрагивая остальные. Менеджера записи у регистров накопления нет, а Движения есть только у объекта документа. Перепроведение тоже вариант, но иногда нужно точечно поправить один регистр.

дальше

Теорию прочитал. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, бесплатная часть практики — одна сессия дня в сутки.