рубрики: Регистры | Дата: 12 февраля, 2017
В этой статье рассмотрим как правильно удалять и записывать записи регистра сведений. Причем в первую очередь рассмотрим именно удаление записей, т.к. не столько важно насоздавать новых записей, сколько сохранить имеющиеся.
А при неосторожном обращении с регистром сведений очень легко удалить все имеющиеся записи, что будет показано ниже. В качестве примера будем использовать вот такой регистр сведений
Как известно для работы с регистром сведений используется набор записей. Напишем две простейшие строчки кода для нашего регистра и запустим их на выполнение
НаборЗаписпей = РегистрыСведений.Цена.СоздатьНаборЗаписей();
НаборЗаписпей.Записать();
Поздравляю! Мы только что грохнули все записи в регистре сведений. Хотя казалось бы, что при записи пустого набора записей ничего криминального произойти не может. Но если обратиться к синтакс-помощнику, то можно увидеть, что никакого противоречия нет. Если мы записываем набор записей и в методе Записать() в параметрах не указано Ложь (а по умолчанию подставляется Истина), то происходит замещение существующего набора записей тем, который мы записываем, в соответствии с установленным отбором. А поскольку мы отбор не устанавливали, то для замещения выбираются все записи регистра, и успешно замещаются пустым набором записей. И это грабли на которые иной раз наступают разработчики, которые не первый день в 1С. Кстати, если мы умышленно хотим полностью очистить регистр, то как раз именно этим методом и надо пользоваться. Заостряю на этом внимание, потому что достаточно часто встречается код, когда перед удалением набор записей прочитывается, потом очищается и только потом записывается. Хотя чтение и очистка набора записей здесь абсолютно излишни.
Теперь представим, что нам надо удалить не все записи регистра, а только с конкретными значениями измерений. Алгоритм действия в этом случае такой же, только перед записью необходимо для нашего пустого набора записей установить соответствующий отбор. В статье про срез последних мы в качестве примера рассматривали этот же регистр сведений – Цена. Напомню, что там у нас были следующие записи
Период | Товар | Поставщик | Сумма |
---|---|---|---|
01.01.2017 | Карандаш | ООО «Леспром» | 10 |
25.01.2017 | Карандаш | ООО «Леспром» | 15 |
01.01.2017 | Карандаш | ПАО «Канцтовары» | 27 |
01.02.2017 | Карандаш | ПАО «Канцтовары» | 31 |
03.01.2017 | Ручка | ПАО «Канцтовары» | 137 |
01.02.2017 | Ручка | ПАО «Канцтовары» | 145 |
Допустим, что мы хотим удалить записи, где Товар – Карандаш, а Период – 01.01.2017. Напомню, что для периодических регистров сведений отбор можно устанавливать не только по измерениям, но и по периоду. В этом случае код у нас будет выглядеть вот так
НаборЗаписпей = РегистрыСведений.Цена.СоздатьНаборЗаписей();
НаборЗаписпей.Отбор.Период.Установить('20170101');
НаборЗаписпей.Отбор.Товар.Установить(Справочники.Товары.НайтиПоНаименованию("Карандаш"));
НаборЗаписпей.Записать();
Хочу также обратить внимание на метод Установить(). В том случае, когда вид сравнения в отборе – Равно этот метод позволяет установить отбор с минимальным количеством кода.
После выполнения этого кода в нашем регистре останутся следующие записи
Период | Товар | Поставщик | Сумма |
---|---|---|---|
25.01.2017 0:00:00 | Карандаш | ООО «Леспром» | 15 |
01.02.2017 0:00:00 | Карандаш | ПАО «Канцтовары» | 31 |
03.01.2017 0:00:00 | Ручка | ПАО «Канцтовары» | 137 |
01.02.2017 0:00:00 | Ручка | ПАО «Канцтовары» | 145 |
Могут быть конечно и более сложные случаи при удалении записей. Например, когда нужно удалить записи по определенным значениям ресурсов или реквизитов.
Здесь использовать отбор уже не получиться, т.к. его можно устанавливать только для измерений, регистраторов и периодов. И вот тут уже придется перебирать один или несколько наборов записей, удалять отдельные записи и перезаписывать набор.
В качестве примера по созданию записей регистра сведений, восстановим удаленные ранее записи
НаборЗаписпей = РегистрыСведений.Цена.СоздатьНаборЗаписей();
НаборЗаписпей.Отбор.Период.Установить('20170101');
НаборЗаписпей.Отбор.Товар.Установить(Справочники.Товары.НайтиПоНаименованию("Карандаш"));
НоваяЗапись = НаборЗаписпей.Добавить();
НоваяЗапись.Период = '20170101';
НоваяЗапись.Поставщик = Справочники.Контрагенты.НайтиПоНаименованию("ООО ""Леспром""");
НоваяЗапись.Товар = Справочники.Товары.НайтиПоНаименованию("Карандаш");
НоваяЗапись.Сумма = 10;
НоваяЗапись = НаборЗаписпей.Добавить();
НоваяЗапись.Период = '20170101';
НоваяЗапись.Поставщик = Справочники.Контрагенты.НайтиПоНаименованию("ПАО ""Канцтовары""");
НоваяЗапись.Товар = Справочники.Товары.НайтиПоНаименованию("Карандаш");
НоваяЗапись.Сумма = 27;
НаборЗаписпей.Записать(Ложь);
В методе Записать() параметр отвечающий за замещение существующих записей установлен в Ложь. Это означает, что наш набор записей будет только добавляться к существующему. В первый раз код отрабатывает успешно. Если же мы повторно попытаемся выполнить этот код, то получим окно с сообщением об ошибке, т.к. у нас уже есть записи с таким набором измерений и добавить еще одни такие же невозможно.
А вот если мы установим режим замещения в Истину, то при повторной записи никакой ошибки возникать не будет, т.к. существующие записи будут перезаписываться.
В случае работы с одной записью вместо набора записей можно использовать менеджер записи.
Добавить комментарий