Набор записей 1С: отбор и замещение
Набор записей читает и пишет записи регистра пачкой по отбору. Его главная особенность в замещении: по умолчанию запись удаляет всё по отбору и кладёт содержимое набора. На собесе спрашивают, что будет с набором без отбора и когда писать менеджером записи.
// Так спрашивают: «Что делает Записать() у набора записей?» «Что будет, если записать набор без отбора?» «Как поправить движения документа вне проведения?» «Чем набор записей отличается от менеджера записи?»
Отбор и чтение
Набор создаёт менеджер регистра. Отбор ставят до чтения и до записи: он говорит, какие записи набор читает и какие заменит.
Набор независимого регистра без отбора при Прочитать() загрузит в память весь регистр. На регистре цен с миллионом строк это сразу гигабайты памяти сервера.
Набор = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
Набор.Отбор.Номенклатура.Установить(Товар);
Набор.Отбор.Период.Установить(НачалоДня(Дата));
Набор.Прочитать(); // только записи по отборуЗамещение
Записать() по умолчанию работает с замещением: удаляет записи по отбору и пишет содержимое набора. Записать(Ложь) только дописывает. Отбор решает, сколько будет удалено, и это главный источник аварий:
Одну запись по полному ключу безопаснее писать менеджером записи: он заменит ровно её. Набор берут, когда пишут много записей одного отбора.
Движения документа
Движения документа устроены как коллекция наборов, у каждого отбор по регистратору. Платформа сама ставит этот отбор, поэтому при проведении достаточно добавить записи и поставить Записывать = Истина. Вне проведения движения правят набором с явным отбором по регистратору:
Метод Загрузить(Таблица) переносит в набор строки таблицы значений одним вызовом, если имена колонок совпадают с полями регистра. В обработчике ПередЗаписью(Отказ, Замещение) модуля набора видно, пишется ли набор с замещением.
Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Документ);
Набор.Прочитать();
// правка записей
Набор.Записать();Как отвечать: «Что будет, если записать набор записей регистра сведений без отбора?»
Записать по умолчанию работает с замещением: удаляет все записи, подходящие под отбор, и пишет содержимое набора. Без отбора под удаление попадает весь регистр, и в нём останется только то, что лежит в наборе. Поэтому отбор ставлю до записи, а одну запись по ключу пишу менеджером записи, он заменяет ровно её.
Кандидат знает механизм замещения и его худший случай, а вывод про менеджер записи показывает, как он этого избегает на практике.
На чём валят
- −Пишут цену набором с отбором только по периоду. Затираются цены остальных товаров на эту дату. Отбор ставят по полному ключу или пишут менеджером записи.
- −Читают набор независимого регистра без отбора. Весь регистр уезжает в память. Отбор ставят до Прочитать().
- −Правят движения документа набором без отбора по регистратору. Затрутся движения всех документов. Отбор по регистратору обязателен.
Проверь себя
Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.
- Что делает
Набор.Записать(Истина)?A)Удаляет набор из памяти после записиB)Добавляет записи к существующимC)Заменяет записи по отбору содержимым набораD)Записывает и блокирует регистр до конца сеансапоказать ответ и разбор
+C)Заменяет записи по отбору содержимым набора// разбор: Параметр Замещение = Истина: записи базы, подходящие под отбор набора, удаляются и заменяются тем, что в наборе. Ложь — записи добавляются к существующим. Пустой набор с Замещение = Истина просто удаляет записи по отбору.
- Что такое
Движенияв модуле документа?A)Таблица значений с будущими проводками документаB)Коллекция наборов записей регистров с отбором по документуC)Журнал изменений документа по версиямD)Список регистров, где документ выступает измерениемпоказать ответ и разбор
+B)Коллекция наборов записей регистров с отбором по документу// разбор: Движения — коллекция наборов записей по регистрам, где документ указан регистратором. У каждого набора уже установлен отбор по регистратору, поэтому Движения.Остатки.Записать() заменит движения именно этого документа. Набор заполняется в обработке проведения.
- Что вернёт
Набор.Прочитать()на только что созданном наборе с установленным отбором?A)Загрузит в набор записи из базы по отборуB)Вернёт число записей, найденных по отборуC)Прочитает весь регистр, отбор применится при записиD)Ничего: метод есть только у менеджера записипоказать ответ и разбор
+A)Загрузит в набор записи из базы по отбору// разбор: Прочитать() заполняет набор записями из базы, подходящими под отбор. Если отбор не установлен, прочитается весь регистр — на большом регистре это гарантированные проблемы с памятью. Сам метод ничего не возвращает, он меняет содержимое набора.
- Найди проблему:
Регистр независимый, непериодический.Набор = РегистрыСведений.Цены .СоздатьНаборЗаписей(); З = Набор.Добавить(); З.Товар = Т; З.Цена = 100; Набор.Записать();A)Отбор не установлен: запись с замещением сотрёт весь регистрB)Набор нужно сначала прочитатьC)Добавить() недоступен у независимого регистраD)Цена должна задаваться через менеджер записипоказать ответ и разбор
+A)Отбор не установлен: запись с замещением сотрёт весь регистр// разбор: Записать() по умолчанию идёт с замещением, а набор без установленного отбора замещает все записи регистра. После такого кода в регистре останется одна цена. Нужно Набор.Отбор.Товар.Установить(Т) или менеджер записи. Классическая авария в продакшене.
- Как записать движения документа в регистр вне проведения, например обработкой исправления?A)Только перепроведением документа целикомB)Через менеджер записи регистра накопленияC)Через
Док.Движенияу ссылки документаD)Набор сОтбор.Регистратор.Установить(Док)и записьпоказать ответ и разбор
+D)Набор с `Отбор.Регистратор.Установить(Док)` и запись// разбор: Набор записей регистра с отбором по регистратору заменит движения именно этого документа, не затрагивая остальные. Менеджера записи у регистров накопления нет, а Движения есть только у объекта документа. Перепроведение тоже вариант, но иногда нужно точечно поправить один регистр.
дальше
Теорию прочитал. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, бесплатная часть практики — одна сессия дня в сутки.