|
|||
simol
26.09.06 — 10:24 |
Есть регистр сведений имеющий 4 измерения. Мне надо в записях регистра сведений значения первого измерения равные ЗНАЧЕНИЕ1 заменить на ЗНАЧЕНИЕ2. Регистр непериодический. |
||
ZolotarevAA
1 — 26.09.06 — 10:39 |
(0) Ничего не удалять. Просто заменить значения. |
||
Рассада
2 — 26.09.06 — 10:46 |
НаборЗаписей = РегистрыСведений.Рр.СоздатьНаборЗаписей(); |
||
simol
3 — 26.09.06 — 12:40 |
(2)Я добавил строку Но при записи ошибка. Мне кажется в том, что отбор какраз по тому измерению, которое я меняю и при записи измерение наверно не соответсвует отбору. |
||
Рассада
4 — 26.09.06 — 13:51 |
Наверное, тогда могу предложить только менять в цикле. |
||
simol
5 — 26.09.06 — 14:52 |
Сделал так
НаборЗаписей = РегистрыСведений.КомплектующиеНоменклатуры.СоздатьНаборЗаписей(); |
||
simol
6 — 26.09.06 — 14:54 |
Так лучше:
НаборЗаписей = РегистрыСведений.КомплектующиеНоменклатуры.СоздатьНаборЗаписей(); |
||
simol 7 — 26.09.06 — 15:12 |
+(6) |
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку «Обновить» в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
В том случае, когда в каком-то регистре сведений нужно заменить несколько видов значений какого-то конкретного измерения на заданное значение, при простой попытке замены с помощью метода СоздатьНаборЗаписей(), возможно возникновение ситуации попытки записи неуникального набора измерений. При этом могут потеряться числовые значения ресурсов регистра. Код 1С, универсально решающий такую задачу:
// Процедура выполняет в независимом регистре сведений "ИмяРегистраСведений" замену // всех значений измерения "ИмяИзменяемогоИзмерения", // соответствующих массиву "МассивСтарыхЗначенийИзмерения" // на новое значение измерения "НовоеЗначениеИзмерения". // При этом для тех случаев, когда новый набор измерений оказывается совпадающим с уже существующим, // осуществляется сложение ресурсов "МассивИменСлагаемыхРесурсов" (эти ресурсы должны иметь тип "число") // В запрос можно передать дополнительное условие, ограничивающее выборку данных из регистра "ДопУсловие" Процедура ЗаменаИзмеренияНезависимогоРегистра(ИмяРегистраСведений, ИмяИзменяемогоИзмерения, МассивСтарыхЗначенийИзмерения, НовоеЗначениеИзмерения, МассивИменСлагаемыхРесурсов, ДопУсловие = "") // Подготовим таблицу значений для слагаемых ресурсов: тзСлагаемых = Новый ТаблицаЗначений; // составим набор колонок таблицы из переданного массива: Для каждого ИмяКолонки Из МассивИменСлагаемыхРесурсов Цикл тзСлагаемых.Колонки.Добавить(ИмяКолонки); КонецЦикла; // Создадим набор записей и для плана обмена определим, что выпоняется загрузка данных: НаборЗаписей = РегистрыСведений[ИмяРегистраСведений].СоздатьНаборЗаписей(); НаборЗаписей.ОбменДанными.Загрузка = Истина; // запрос к регистру: Запрос = Новый Запрос; Запрос.УстановитьПараметр("МассивСтарыхЗначенийИзмерения", МассивСтарыхЗначенийИзмерения); Запрос.УстановитьПараметр("НовоеЗначениеИзмерения", НовоеЗначениеИзмерения); // Подготовим таблицу значений для позиционирования (установки отбора) на нужных записях регистра: Запрос.Текст = "ВЫБРАТЬ * |ИЗ | РегистрСведений." + ИмяРегистраСведений + " КАК Регистр |ГДЕ | Регистр." + ИмяИзменяемогоИзмерения + " В (&МассивСтарыхЗначенийИзмерения)" + ДопУсловие; Сообщить("1 Приступаем к выполнению запроса к данным регистра """ + ИмяРегистраСведений + """ - " + ТекущаяДата()); ТаблицаЗаполнения = Запрос.Выполнить().Выгрузить(); Сообщить("2 Приступаем к обработке результата запроса к регистру """ + ИмяРегистраСведений + """ - " + ТекущаяДата()); МаксимальноеЗначениеИндикатора = ТаблицаЗаполнения.Количество(); // заполнение строки progress bar ЭлементыФормы.Индикатор2.Значение = 0; // обнуляем, чтобы при повторном запуске статусбар сбросился в 0 ЭлементыФормы.Индикатор2.МаксимальноеЗначение = МаксимальноеЗначениеИндикатора; // задаем значение для 100% Старт = ТекущаяДата(); ОчереднойСтарт = Старт; // переменные для организации прерывания(задержки) - подробнее про организацию цикла задержки выполнения модуля см. http://www.1c-h.ru/?p=2529 // ПроцентеВыполненния - это реквизит формы (доступный пользователю для редактирования), в котором хранится размер "порции", по порохождению которой нужно приостановить выполнение ШагПрерывания = 1; ЧислоПрерывания = МаксимальноеЗначениеИндикатора * ПроцентеВыполненния / 100; ШестьУтраТекущегоДня = (Дата(Год(ТекущаяДата()), Месяц(ТекущаяДата()), День(ТекущаяДата())) + 21600); ОдиннадцВечераТекДня = (Дата(Год(ТекущаяДата()), Месяц(ТекущаяДата()), День(ТекущаяДата())) + 82800); ШестьУтраСледующгДня = (Дата(Год(ТекущаяДата()), Месяц(ТекущаяДата()), День(ТекущаяДата())) + 108000); // для каждой строки таблицы значений установим отбор и перезапишем регистр Для Каждого СтрокаЗаполнения Из ТаблицаЗаполнения Цикл ТекущийПН = ЭлементыФормы.Индикатор2.Значение + 1; // - текущий порядковый номер обрабатываемой строки таблицы ЭлементыФормы.Индикатор2.Значение = ТекущийПН; // - указываем прирост внутри цикла для ползущего индикатора выполнения обработки // посчитаем, сколько времени затрачено и прикинем сколько времени осталось // для вывода на морду формы: уже затрачено времени: ЗатраченоВремени = ТекущаяДата() - Старт; // для вывода на морду формы: затрачено времени на обработку одной строки таблицы: ВремениНаЕдиницу = Окр(ЗатраченоВремени / ТекущийПН,8); // для вывода на морду формы: времени на выполнение еще требуется: ОсталосьВремени = Окр((МаксимальноеЗначениеИндикатора - ТекущийПН)*ВремениНаЕдиницу/60); Если ПрерватьНаПроцентахВыполнения И ТекущийПН > ЧислоПрерывания Тогда // ПрерватьНаПроцентахВыполнения - булево, галочка в форме о необходимости задержки выполнения // в дневное время цикл задержки: Если ТекущаяДата() > ШестьУтраТекущегоДня И ТекущаяДата() < ОдиннадцВечераТекДня Тогда // это день // сделаем паузу, чтобы рассосались блокировки // в этом цикле мы умножаем количество заданных секунд задержки для дня (СекундЗадержкиДнем) на номер шага прерывания, тем самым определяя, очередную порцию задержки относительно Текущего Времени Пока (ТекущаяДата() - Старт) < СекундЗадержкиДнем * ШагПрерывания Цикл КонецЦикла; // ночное время: ИначеЕсли ТекущаяДата() > ОдиннадцВечераТекДня И ТекущаяДата() < ШестьУтраСледующгДня Тогда // сделаем паузу, чтобы рассосались блокировки // в этом цикле мы умножаем количество заданных секунд задержки для ночи (СекундЗадержкиНочью) на номер шага прерывания, тем самым определяя, очередную порцию задержки относительно Текущего Времени Пока (ТекущаяДата() - Старт) < СекундЗадержкиНочью * ШагПрерывания Цикл КонецЦикла; КонецЕсли; //следующее число прерывания и очередной шаг прывания: ШагПрерывания = ШагПрерывания + 1; ЧислоПрерывания = МаксимальноеЗначениеИндикатора * ПроцентеВыполненния * ШагПрерывания / 100; КонецЕсли; // 1 - Сначала удалим записи, которые нужно удалить, запомнив слагаемые ресурсы во временной таблице значений "тзСлагаемых" // очистим таблицу слагаемых от строк: тзСлагаемых.Очистить(); // для каждого элемента отбора определяем отбор для нашего набора записей по значению этой же графы в текущей строке из таблицы - резултата запроса: Для Каждого ЭлементОтбора Из НаборЗаписей.Отбор Цикл ЭлементОтбора.Установить(СтрокаЗаполнения[ЭлементОтбора.Имя]) КонецЦикла; НаборЗаписей.Прочитать(); // - сейчас в этом наборе записей одна строка регистра с уникальным набором измерений и с данными для слагаемых ресурсов Для Каждого текЗаписьНабора Из НаборЗаписей Цикл // строка в наборе записей тут одна, ну да ладно, надо же ее как-то получить ,почему бы не в цикле СтрокаСлагаемых = тзСлагаемых.Добавить(); // запомним слагаемые в соответсвующих колонках: Для каждого ИмяКолонки Из МассивИменСлагаемыхРесурсов Цикл СтрокаСлагаемых[ИмяКолонки] = текЗаписьНабора[ИмяКолонки]; КонецЦикла; // все, на выходе из цикла строка заполнена // Удаление и перезапись делаем в одной транзакции НачатьТранзакцию(); НаборЗаписей.Удалить(текЗаписьНабора); // удаляем устаревшую запись из регистра НаборЗаписей.Записать(); // пока не запишем, удаление не подействует? // 2 - Теперь добавим новую строку с измененным значением измерения или приплюсуем суммируемые поля в уже существующую, если строка с таким набором измерений уже была // создаем менеджер записи текЗапись = РегистрыСведений[ИмяРегистраСведений].СоздатьМенеджерЗаписи(); // заполним все поля новой записи из текущей строки таблицы с результатом запроса ЗаполнитьЗначенияСвойств(текЗапись, СтрокаЗаполнения); ////// или то же самое можно сделать в цикле: ////Для Каждого КолонкаТЗ Из ТаблицаЗаполнения.Колонки Цикл //// текЗапись[КолонкаТЗ.Имя] = СтрокаЗаполнения[КолонкаТЗ.Имя]; // заполнили пока полным набором страых значений ////КонецЦикла; // подменим заменяемое измерение: текЗапись[ИмяИзменяемогоИзмерения] = НовоеЗначениеИзмерения; // ответственный момент: читаем эту запись (фактически пытаемся спозиционироваться - с проверкой, может уже существует), кстати, если эту команду не выполнить, то весь регистр очиститься как нечего делать, так что тут аккуратнее текЗапись.Прочитать(); Если текЗапись.Выбран() Тогда // спозиционироваться удалось, значит такая запись уже существует и нужно складывать слагаемые ресурсы //текЗапись.Количество = текЗапись.Количество + Количество; Для каждого ИмяРесурса Из МассивИменСлагаемыхРесурсов Цикл текЗапись[ИмяРесурса] = текЗапись[ИмяРесурса] + СтрокаСлагаемых[ИмяРесурса]; КонецЦикла; // записываем изменения в регистре текЗапись.Записать(); Иначе // спозиционироваться не удалось, нужно добавить новую запись, слагаемые ресурсы можно просто записать //текЗапись.Записать(); СтрокаЗаполнения[ИмяИзменяемогоИзмерения] = НовоеЗначениеИзмерения; // запишем новое значение в таблицу, чтобы установить по нему отбор и приплюсовать количество // создаем менеджер записи НовЗапись = РегистрыСведений[ИмяРегистраСведений].СоздатьМенеджерЗаписи(); // заполним все поля новой записи из текущей строки таблицы с результатом запроса ЗаполнитьЗначенияСвойств(НовЗапись, СтрокаЗаполнения); НовЗапись.Записать(); КонецЕсли; // Удаление и перезапись делаем в одной транзакции ЗафиксироватьТранзакцию(); КонецЦикла; // очищаем для следующего использования: НаборЗаписей.Очистить(); КонецЦикла; Сообщить("3 Окончание исправления регистра """ + ИмяРегистраСведений + """ - " + ТекущаяДата()); КонецПроцедуры //ЗаменаРесурсаНезависимогоРегистра()
Здесь можно скачать пример обработки замены ресурса и измерения (в зависимости от регистра) «ПартияТовара» во всех регистрах сведений на примере конфигурации логистики:
В этой обработке используется приведенная тут универсальная процедура — можно посмотреть пример ее использования.
Возможность скачивания заблокирована из соображений безопасности.
Для получения обработки напишите об этом в комментарии к этой статье, вышлем.
Next Post
-
v8
-
Программисту 1C
Чт Апр 14 , 2011
В том случае, когда в каком-то регистре сведений нужно заменить несколько видов значений какого-то конкретного ресурса на заданное значение, лучше использовать вот такую универсальную процедуру (при ее вызове достаточно подставить название регистра, название ресурса и передать старые заменяемые значения и новое, на которое они заменяются):
Breaking News
Анализируем вид регистра для выбора варианта редактирования записей
Регистры сведений по режиму записи подразделяются на независимые регистры и регистры с подчинением регистратору. Программная работа с этими регистрами имеет различия, поэтому вначале определите какой регистр Вам нужно изменить. Для этого откройте свойства регистра сведений и определите его режим записи:
Дополнительно обратите внимание на периодичность регистра сведений — если регистр периодический, все данные в нем записываются в разрезе по периоду. Более подробно этот момент мы рассмотрим ниже на примерах.
После того, как Вы определились с режимом записи изменяемого регистра сведений, Вы можете выбрать вариант изменения записей регистра.
Изменяем записи в независимом регистре сведений
Давайте рассмотрим пример изменения записей в регистре сведений КурсыВалют. Ниже показаны свойства этого регистра (сразу обращайте внимание на состав измерений регистра, режим записи и периодичность):
К примеру, нам необходимо перезаписать курс валюты. В первом варианте мы установим курс валюты без анализа уже записанных данных:
Процедура УстановитьКурсВалюты(Период, Валюта, Курс, Кратность)
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Запись.Период = Период;
Запись.Валюта = Валюта;
Запись.Курс = Курс;
Запись.Кратность = Кратность;
Запись.Записать();
КонецПроцедуры
Т.к. регистр сведений у нас периодический — дополнительно мы указываем период для курса валюты.
Теперь, используя объект МенеджерЗаписи, мы перезапишем только курс валюты. Для этого сперва установим отбор по периоду и валюте и прочитаем данные из регистра сведений:
Процедура УстановитьКурсВалюты(Период, Валюта, Курс)
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Запись.Период = Период;
Запись.Валюта = Валюта;
Запись.Прочитать();
Если Запись.Выбран() Тогда
Запись.Курс = Курс;
Запись.Записать();
КонецЕсли;
КонецПроцедуры
С помощью функции Выбран() мы проверяем, считана запись или нет. Если запись существует (по установленному периоду и валюте) — мы устанавливаем новый курс. В этом варианте уже не нужно устанавливать кратность т.к. ее значение не изменится и будет записано старое значение.
А теперь давайте выполним аналогичные действия с использованием объекта НаборЗаписей для изменения данных в регистре сведений:
Процедура УстановитьКурсВалюты(Период, Валюта, Курс)
Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(Период);
Набор.Отбор.Валюта.Установить(Валюта);
Набор.Прочитать();
Если Набор.Количество() Тогда
Запись = Набор[0];
Запись.Курс = Курс;
Набор.Записать();
КонецЕсли;
КонецПроцедуры
В примере выше мы создаем набор записей и устанавливаем для него отбор по измерениям и периоду. После установки отбора считываем записи. В результате в наборе будут ранее записанные записи. Т.к. мы установили полный отбор по измерениям (периоду и валюте) — максимальное количество записей в отборе равно 1. Поэтому мы проверяем набор на количество и если запись есть — устанавливаем новый курс валюты.
Все примеры, описанные выше, выполнят одинаковые действия по установке нового курса валют. Выбирайте вариант, который Вам более удобен и понятен.
Изменяем записи в регистре с подчинением регистратору
В отличие от независимого регистра сведений, все записи в таком регистре подчиненны конкретному регистратору. Поэтому для редактирования записей Вам нужно установить отбор по регистратору и прочитать данные. После этого можно изменять запись в регистре. Давайте выполним эти действия на примерах.
В качестве примера будем использовать регистр сведений ЦеныНоменклатуры. Ниже показаны свойства этого регистра:
В примере ниже мы будем увеличивать оптовую цену номенклатуры в записях по одному заданному регистратору:
Процедура УвеличитьЦенуНоменклатуры(Регистратор, Номенклатура, ВидЦеныОптовая)
Набор = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Регистратор);
Набор.Прочитать();
Для Каждого Запись Из Набор Цикл
Если Запись.Номенклатура = Номенклатура И Запись.ВидЦены = ВидЦеныОптовая Тогда
Запись.Цена = Запись.Цена * 1.3;
КонецЕсли;
КонецЦикла;
Если Набор.Модифицированность() Тогда
Набор.Записать();
КонецЕсли;
КонецПроцедуры
Вначале мы устанавливаем отбор по регистратору. После указания отбора считываем записи по этому регистратору и в обходе набора записей ищем записи по определенной номенклатуре и с оптовым видом цен. Если цена хоть в одной записи будет изменена — набор будет модифицирован. Таким образом мы будем записывать только изменившиеся данные.
А теперь увеличим все оптовые цены без указания конкретного регистратора. Для этого будем использовать запрос, чтобы определить все регистраторы, по которым есть нужные нам записи в регистре сведений:
Процедура УвеличитьЦенуНоменклатуры(Номенклатура, ВидЦеныОптовая)
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ЦеныНоменклатуры.Регистратор КАК Регистратор
|ИЗ
| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
|ГДЕ
| ЦеныНоменклатуры.Номенклатура = &Номенклатура
| И ЦеныНоменклатуры.ВидЦены = &ВидЦеныОптовая");
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("ВидЦеныОптовая", ВидЦеныОптовая);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
Набор.Прочитать();
Для Каждого Запись Из Набор Цикл
Если Запись.Номенклатура = Номенклатура И Запись.ВидЦены = ВидЦеныОптовая Тогда
Запись.Цена = Запись.Цена * 1.3;
КонецЕсли;
КонецЦикла;
Если Набор.Модифицированность() Тогда
Набор.Записать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если сравните этот пример с первым — изменилось только определение регистратора. Если первый пример изменял данные только в одном регистраторе — последний пример изменит записи по всем регистраторам в регистре сведений.
На этих небольших примерах мы рассмотрели основные особенности изменения отдельных записей в регистрах сведений. Каждый регистр требует своего особенного подхода — но если Вы поймете общую последовательность действий по изменению регистра сведений, сложностей по работе с регистрами у Вас не будет.
В дополнение приводим пример работы с нашей обработкой по изменению записей в произвольных регистрах сведений, скачать которую Вы можете по этой ссылке.
Наши разработки:
Регистры сведений в 1С — это прикладные объекты конфигурации для хранения данных в структурированном виде (в разрезе измерений). Например, в регистре сведений можно хранить курсы валют в разрезе валют, цены номенклатуры в разрезе номенклатур, ФИО физических лиц в разрезе физических лиц и т.д.
При проектировании разработчик указывает необходимость хранения данных в разрезе времени и минимальную периодичность, с которой записи будут храниться в регистре:
Регистры сведений, для которых указана периодичность, называются периодическими.
Изменение данных в регистре может осуществляться как вручную, так и при помощи документов. Режим записи в регистр определяет разработчик на этапе проектирования:
Физически регистр сведений представляет собой таблицу, в которой хранятся следующие данные:
- измерения — описывают разрезы, в которых хранится информация;
- период — поле, используемое для разворота данных по времени. Поле добавляется автоматически при указании свойства «Периодичность», отличного от «Непериодический»;
- регистратор — поле, используемое для хранения документа, с которым связана запись. Поле добавляется автоматически при указании свойства «Режим записи» в значение «Подчинение регистратору»;
- ресурсы — непосредственно хранят информацию для комбинации измерений;
- реквизиты — дополнительная произвольная информация, относящаяся к конкретной записи регистра.
Для всех регистров сведений обеспечивается контроль уникальности записей, т.е. в регистре не может быть двух одинаковых записей. Одинаковыми считаются записи, у которых совпадают значения измерений, период (если регистр периодический) и регистратор (если регистр подчинен регистратору).
Добавление записей
Программно добавить записи в регистр сведений можно при помощи:
- объекта
НаборЗаписей
; - объекта
МенеджерЗаписи
.
Объект МенеджерЗаписи
можно использовать только для работы с независимыми регистрами. Причем можно обрабатывать только одну запись. Объект предназначен в основном для интерактивной работы, но программно с ним также можно работать. На системном уровне МенеджерЗаписи
использует объект НаборЗаписей
.
Общая схема добавления записей в регистр сведений при помощи объекта НаборЗаписей выглядит так:
- создание объекта
НаборЗаписей
; - наложение отборов на измерения, период (если регистр периодический) и регистратора (если регистр подчинен регистратору);
- добавление и заполнение значений полей записей;
- запись набора записей.
// Добавление записи в независимый непериодический регистр сведений НаборЗаписей = РегистрыСведений.ВерсииПодсистем.СоздатьНаборЗаписей(); // Этап 1 НаборЗаписей.Отбор.ИмяПодсистемы.Установить(ИмяПодсистемы); // Этап 2 // Этап 3 НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.ИмяПодсистемы = ИмяПодсистемы; НоваяЗапись.Версия = НомерВерсии; НаборЗаписей.Записать(); // Этап 4
// Добавление записи в независимый периодический регистр сведений НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); // Этап 1 // Этап 2 НаборЗаписей.Отбор.Валюта.Установить(Доллар); НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДата())); // Этап3 НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Период = ТекущаяДата(); НоваяЗапись.Валюта = Доллар; НоваяЗапись.Курс = 57.92; НоваяЗапись.Кратность = 1; НаборЗаписей.Записать(); // Этап 4
Общая схема добавления записей в регистр сведений при помощи объекта МенеджерЗаписи
выглядит так:
- создание объекта
МенеджерЗаписи
; - заполнение значений полей записи;
- запись записи.
// Добавление записи в независимый непериодический регистр сведений Запись = РегистрыСведений.ВерсииПодсистем.СоздатьМенеджерЗаписи(); // Этап 1 // Этап 2 Запись.ИмяПодсистемы = ИмяПодсистемы; Запись.Версия = НомерВерсии; Запись.Записать(); // Этап 3
// Добавление записи в независимый периодический регистр сведений Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); // Этап 1 // Этап 2 Запись.Период = ТекущаяДата(); Запись.Валюта = Доллар; Запись.Курс = 57.92; Запись.Кратность = 1; Запись.Записать(); // Этап 3
Изменение записей
Изменять существующие записи регистров сведений возможно при помощи объектов НаборЗаписей
и МенеджерЗаписи
. Ограничения объекта МенеджерЗаписи
были описаны выше.
Общая схема редактирования записей регистров сведений:
- создание объекта
НаборЗаписей
илиМенеджерЗаписи
; - наложение отборов;
- чтение записей базы данных, соответствующих наложенным отборам;
- редактирование прочитанных записей;
- запись отредактированных записей.
// Редактирование записей с использованием объекта НаборЗаписей НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); // Этап 1 // Этап 2 НаборЗаписей.Отбор.Период.Установить(ДатаКурса); НаборЗаписей.Отбор.Валюта.Установить(Доллар); НаборЗаписей.Прочитать(); // Этап 3 Для Каждого Запись Из НаборЗаписей Цикл Запись.Курс = 57.84; // Этап 4 КонецЦикла; НаборЗаписей.Записать(); // Этап 5
// Редактирование записей с использованием объекта МенеджерЗаписи Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); // Этап 1 // Этап 2 Запись.Период = ДатаКурса; Запись.Валюта = Доллар; Запись.Прочитать(); // Этап 3 Если Запись.Выбран() Тогда // Проверка, что запись существует Запись.Курс = 57.92; // Этап 4 Запись.Записать(); // Этап 5 КонецЕсли;
Чтение записей
Чтение информации из базы данных рекомендуется выполнять при помощи запросов. Данный способ обеспечивает гибкое применение отборов и группировок, а также возможность выбора записей из нескольких таблиц.
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | КурсыВалют.Период, | КурсыВалют.Валюта, | КурсыВалют.Курс |ИЗ | РегистрСведений.КурсыВалют КАК КурсыВалют"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл // обход результата выполнения запроса КонецЦикла;
Для периодических регистров сведений есть возможность получить наиболее поздние записи, период которых меньше указанной даты — срез последних, и наиболее ранние записи, период которых больше указанной даты — срез первых. Для получения среза первых и среза последних запросом необходимо использовать одноименные виртуальные таблицы, в параметрах которых сразу можно задать дату среза и отборы. Отборы, если они необходимы, рекомендуется накладывать именно в параметрах виртуальных таблиц, т.к. это позволяет ускорить выполнение запроса.
// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта» // и период МЕНЬШЕ или равен значению из переменной «ВыбраннаяДата» Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | КурсыВалютСрезПоследних.Период, | КурсыВалютСрезПоследних.Валюта, | КурсыВалютСрезПоследних.Курс |ИЗ | РегистрСведений.КурсыВалют.СрезПоследних(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПоследних"; Запрос.УстановитьПараметр("Валюта", ВыбраннаяВалюта); Запрос.УстановитьПараметр("Период", ВыбраннаяДата); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл // обход результата выполнения запроса КонецЦикла;
// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта» // и период БОЛЬШЕ или равен значению из переменной «ВыбраннаяДата» Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | КурсыВалютСрезПервых.Период, | КурсыВалютСрезПервых.Валюта, | КурсыВалютСрезПервых.Курс |ИЗ | РегистрСведений.КурсыВалют.СрезПервых(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПервых"; Запрос.УстановитьПараметр("Валюта", ВыбраннаяВалюта); Запрос.УстановитьПараметр("Период", ВыбраннаяДата); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл // обход результата выполнения запроса КонецЦикла;
Кроме чтения запросом возможно использование методов объектной модели.
Для непериодических регистров сведений:
Выбрать(Отбор, Порядок)
— выбирает записи с указанным отбором;ВыбратьПоРегистратору(Регистратор)
— выбирает все записи указанного регистратора;Получить(Отбор)
— получает ресурсы записи с отбором по всем измерениям.
Для периодических регистров сведений:
Выбрать(НачалоИнтервала, КонецИнтервала, Отбор, Порядок)
— выбирает записи с указанным отбором, у которых период находится междуНачалоИнтервала
иКонецИнтервала
;ВыбратьПоРегистратору(Регистратор)
— выбирает все записи указанного регистратора;Получить(Период, Отбор)
— получает ресурсы записи с отбором по всем измерениям и периоду;ПолучитьПервое(НачалоПериода, Отбор)
— получает ресурсы наиболее ранней записи, соответствующей указанным периоду и отбору;ПолучитьПоследнее(КонецПериода, Отбор)
— получает ресурсы наиболее поздней записи, соответствующей указанным периоду и отбору;СрезПервых(НачалоПериода, Отбор)
— получает таблицу наиболее ранних записей, соответствующую указанным периоду и отбору;СрезПоследних(КонецПериода, Отбор)
— получает таблицу наиболее поздних записей, соответствующую указанным периоду и отбору.
Удаление записей
Для удаления записи (записей) в независимом регистре сведений необходимо:
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Валюта.Установить(Доллар); НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДата())); НаборЗаписей.Записать();
Для удаления записей в подчиненном регистре сведений необходимо:
- создать набор записей;
- наложить отбор на регистратора;
- записать набор записей без предварительного чтения.
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокументРегистратор); НаборЗаписей.Записать();
Очистка регистра сведений
Для удаления всех записей в независимом регистре сведений достаточно записать набор записей этого регистра без установки отборов:
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); НаборЗаписей.Записать();
Запись в регистр сведений, подчиненный регистратору, возможна только при установке отбора по регистратору, поэтому для очистки таких регистров необходимо:
- получить перечень ссылок всех регистраторов регистра сведений;
- последовательно записать пустой набор записей с отбором по регистраторам из первого пункта.
Запрос = Новый Запрос( "ВЫБРАТЬ | ЦеныНоменклатуры.Регистратор |ИЗ | РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры" ); Выборка = Запрос.Выполнить().Выбрать(); НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей(); Пока Выборка.Следующий() Цикл НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор); НаборЗаписей.Записать(); КонецЦикла;
+35
Как изменить запись регистра сведений?
НаборЗаписей = РегистрыСведений.НумерацияДоговоров.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(НачалоГода(Дата));
НаборЗаписей.Отбор.Организация.Установить(Организация);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() = 0 Тогда
НовыйНомер = НаборЗаписей.Добавить();
НовыйНомер.Организация = Организация;
НовыйНомер.Период = НачалоГода(Дата);
НовыйНомер.Номер = 2; ном=1;
ИначеЕсли НаборЗаписей.Количество() = 1 Тогда
НовыйНомер = НаборЗаписей[0];
ном = НовыйНомер.Номер;
НовыйНомер.Номер = ном+1;
КонецЕсли;
НаборЗаписей.Записать();
Номер = Организация.Префикс + "-" + Ном + "/" + Строка(Прав(Год(ТекущаяДата()),2));
Код 1C v 8.х
//Установить курс Валюты USD
КурсыВалют = РегистрыСведений.КурсыВалют;
НаборКурсов = КурсыВалют.СоздатьНаборЗаписей();
Доллар = Справочники.Валюты.НайтиПоНаименованию("USD");
НаборКурсов.Отбор.Валюта.Установить(Доллар);
НаборКурсов.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));
НаборКурсов.Прочитать();
Если НаборКурсов.Количество() = 0 Тогда
НовыйКурс = НаборКурсов.Добавить();
НовыйКурс.Валюта = Доллар;
НовыйКурс.Период = ТекущаяДата();
ИначеЕсли НаборКурсов.Количество() = 1 Тогда
НовыйКурс = НаборКурсов[0];
Иначе
Предупреждение("Курс валюты задается один раз в день.", 60);
Возврат;
КонецЕсли;
НовыйКурс.Курс = 31.44;
НовыйКурс.Кратность = 1;
НаборКурсов.Записать();
Код 1C v 8.х
//В регистр были ошибочно записаны штрихкоды.
// Нужно по заданным Номенклатуре (Товар) и Характеристике (ХарактеристикаТовара) найти эту запись и заменить там штрихкод.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура И
| ШтрихкодыНоменклатуры.Характеристика = &Характеристика";
Запрос.УстановитьПараметр("Номенклатура", Товар);
Запрос.УстановитьПараметр("Характеристика", ХарактеристикаТовара);
Выборка = Запрос.Выполнить().Выбрать();
Если НЕ Выборка.Следующий() Тогда
ТекЗапись = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
ТекЗапись.Номенклатура = Товар;
Если ЗначениеЗаполнено(ХарактеристикаТовара) Тогда
ТекЗапись.Характеристика = ХарактеристикаТовара;
Иначе
ТекЗапись.Характеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
КонецЕсли;
ТекЗапись.Штрихкод = ?(ПустаяСтрока(ШтрихКод),РегистрыСведений.ШтрихкодыНоменклатуры.СформироватьШтрихкодEAN13(), Штрихкод);
Попытка
ТекЗапись.Записать();
Исключение
КонецПопытки;
Иначе
НайденныйШтрихкод = Выборка.Штрихкод;
ТекЗапись = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
ТекЗапись.Штрихкод = НайденныйШтрихкод;
ТекЗапись.Прочитать();
ТекЗапись.Штрихкод = Штрихкод;
Попытка
ТекЗапись.Записать();
Исключение
КонецПопытки;
КонецЕсли;
Регистры сведений позволяют хранить произвольные данные в разрезе нескольких измерений. Они позволяют получить срез информации (текущее значение показателей) на любой момент времени.
Для регистров сведений связь с регистраторами не всегда обязательна.
Добавление записей в регистр сведений
Программно добавить записи в регистр сведений можно двумя способами:
- с помощью объекта МенеджерЗаписи;
- с помощью объекта НаборЗаписей.
Добавление записей с помощью объекта МенеджерЗаписи
Объект МенеджерЗаписи можно использовать только для работы с независимыми регистрами. Причем можно обрабатывать только одну запись. Таким образом, для того, чтобы в периодический, независимый регистр сведений “КурсыВалют” с измерением “Валюта” и ресурсами “Курс” и “Кратность” добавить одну запись – курс и кратность валюты на определенную дату – можно использовать следующий код:
КурсыВалютМенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); КурсыВалютМенеджерЗаписи.Период = ДатаУстановкиКурса; // Дата курса КурсыВалютМенеджерЗаписи.Валюта = Валюта; // СправочникСсылка.Валюты КурсыВалютМенеджерЗаписи.Курс = ЗначениеКурсаНаДату; // Устанавливаемый курс КурсыВалютМенеджерЗаписи.Кратность = 1; // Кратность КурсыВалютМенеджерЗаписи.Записать();
Добавление записей в независимый регистр сведений помощью объекта НаборЗаписей
Добавление записей в независимый регистр сведений с помощью НабораЗаписей выполняется по следующему алгоритму:
- Создание объекта НабораЗаписи;
- Установка отбора по измерениям и периоду (если регистр периодический);
- Добавление и заполнение значений полей записи;
- Запись набора.
Для примера выполним добавление записей в тот же регистр сведений “КурсыВалют“, предварительно установив отбор по измерению “Валюта” и периоду.
КурсыВалютНаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); КурсыВалютНаборЗаписей.Отбор.Валюта.Установить(Валюта); КурсыВалютНаборЗаписей.Отбор.Период.Установить(ДатаУстановкиКурса); Запись = КурсыВалютНаборЗаписей.Добавить(); Запись.Период = ДатаУстановкиКурса; Запись.Валюта = Валюта; // СправочникСсылка.Валюты Запись.Курс = ЗначениеКурсаНаДату; // Устанавливаемый курс Запись.Кратность = 1; // Кратность КурсыВалютНаборЗаписей.Записать();
Добавление записей в регистр сведений, подчиненный регистратору
Для добавление записей в регистр сведений, подчиненный регистратору, выполняется с помощью объекта НаборЗаписей по следующему алгоритму:
- Создание объекта НаборЗаписей;
- Установка отбора по определенному регистратору;
- Заполнение записей набора;
- Запись набора.
// ДанныеДляПроведения - хранит данные для заполнения регистра сведений (например, выгрузка результата запроса) НаборЗаписей = РегистрыСведений.МероприятияТрудовойДеятельности.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Регистратор); ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), ДанныеДляПроведения); НаборЗаписей.Записать();
Изменение записей в регистре сведений
Изменение записей в независимом регистре сведений
Изменять записи в независимом регистре сведений можно как с помощью МенеджераЗаписи, так и с помощью НабораЗаписей. Изменение записей выполняется по следующему алгоритму:
- Создание объекта МенеджерЗаписи или НаборЗаписи;
- Установить отборы;
- Чтение записей из базы данных, соответствующих наложенному отбору;
- Редактирование полученных записей;
- Запись измененных записей.
При изменении записей в независимом регистре сведений с помощью объекта МенеджерЗаписи, действуют такие же ограничения как и при добавлении. При изменении записи с помощью менеджера, после чтения значений выполним проверку – есть ли записи для изменения.
КурсыВалютМенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); КурсыВалютМенеджерЗаписи.Период = ДатаУстановкиКурса; // Дата курса КурсыВалютМенеджерЗаписи.Валюта = Валюта; // СправочникСсылка.Валюты КурсыВалютМенеджерЗаписи.Прочитать(); Если КурсыВалютМенеджерЗаписи.Выбран() Тогда КурсыВалютМенеджерЗаписи.Курс = ЗначениеКурсаНаДату; // Устанавливаемый курс КурсыВалютМенеджерЗаписи.Кратность = 1; // Кратность КурсыВалютМенеджерЗаписи.Записать(); КонецЕсли;
В отличии от менеджера записи, работа с набором записи позволяет изменять сразу несколько записей, полученных в результате установленного отбора. Поэтому изменение записей производим в цикле.
КурсыВалютНаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); КурсыВалютНаборЗаписей.Отбор.Валюта.Установить(Валюта); КурсыВалютНаборЗаписей.Отбор.Период.Установить(ДатаУстановкиКурса); КурсыВалютНаборЗаписей.Прочитать(); Для Каждого Запись Из КурсыВалютНаборЗаписей Цикл Запись.Курс = ЗначениеКурсаНаДату; // Устанавливаемый курс Запись.Кратность = 1; // Кратность КонецЦикла; КурсыВалютНаборЗаписей.Записать();
Изменение записей в регистрах сведений подчиненных регистраторам
Изменение записей регистров, подчиненных регистраторам, возможно только с помощью наборов записей. При этом всегда используется отбор по регистратору. Нельзя добавлять или удалять отдельные записи. Можно только считывать и записывать записи по регистратору.
Изменение записей выполняется по следующему алгоритму:
- Создать объект НаборЗаписей;
- Установить отбор по определенному регистратору;
- Прочитать набор;
- Изменить записи набора;
- Записать набор.
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | МероприятияТрудовойДеятельности.Регистратор КАК Регистратор |ИЗ | РегистрСведений.МероприятияТрудовойДеятельности КАК МероприятияТрудовойДеятельности"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Сообщить(СтрШаблон("Изменение записей по регистратору: %1", Выборка.Регистратор)); НаборЗаписей = РегистрыСведений.МероприятияТрудовойДеятельности.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Регистратор); Для каждого Запись Из НаборЗаписей Цикл Запись.ДатаМероприятия = Дата(2021, 12, 12); КонецЦикла; НаборЗаписей.Записать(); КонецЦикла;
Удаление записи в регистре сведений
Удаление записи из независимого регистра сведений
Для удаления записи из независимого регистра сведений выполняется по следующему алгоритму:
- Создать объект НаборЗаписей;
- Установить нужные отборы по измерениям и, если регистр периодический, периоду;
- Записать набор без предварительного чтения.
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Валюта.Установить(Валюта); НаборЗаписей.Отбор.Период.Установить(ДатаУстановкиКурса); НаборЗаписей.Записать();
Удаление записи из регистра сведений подчиненного регистратору
- Создать объект НаборЗаписей;
- Установить отбор по определенному регистратору;
- Прочитать набор;
- Удалить записи из набора (по условию);
- Записать набор.
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Регистратор); НаборЗаписей.Прочитать(); Для Каждого Запись Из НаборЗаписей Цикл Если Запись.Валюта = Валюта Тогда // Предположим, что хотим удалить записи по регистратору // с определенной Валютой НаборЗаписей.Удалить(Запись); КонецЕсли; КонецЦикла; НаборЗаписей.Записать(); НаборЗаписей.Записать();
На чтение 7 мин Просмотров 14.9к. Опубликовано 12.10.2017
Регистры сведений в 1С предназначены для хранения произвольных данных в разрезе нескольких измерений и, при необходимости, в разрезе времени. Рассмотрим подробнее работу с этим прикладным объектом.
- Предназначение регистра сведений
- Добавление записей
- Изменение записей
- Чтение записей
- Удаление записей
- Очистка регистра сведений
Содержание
- Предназначение регистра сведений
- Добавление записей
- Изменение записей
- Чтение записей
- Удаление записей
- Очистка регистра сведений
Предназначение регистра сведений
Регистры сведений в 1С — это прикладные объекты конфигурации для хранения данных в структурированном виде (в разрезе измерений). Например, в регистре сведений можно хранить курсы валют в разрезе валют, цены номенклатуры в разрезе номенклатур, ФИО физических лиц в разрезе физических лиц и т.д.
При проектировании разработчик указывает необходимость хранения данных в разрезе времени и минимальную периодичность, с которой записи будут храниться в регистре:
Регистры сведений, для которых указана периодичность, называются периодическими.
Изменение данных в регистре может осуществляться как вручную, так и при помощи документов. Режим записи в регистр определяет разработчик на этапе проектирования:
Физически регистр сведений представляет собой таблицу, в которой хранятся следующие данные:
- измерения — описывают разрезы, в которых хранится информация;
- период — поле, используемое для разворота данных по времени. Поле добавляется автоматически при указании свойства «Периодичность», отличного от «Непериодический»;
- регистратор — поле, используемое для хранения документа, с которым связана запись. Поле добавляется автоматически при указании свойства «Режим записи» в значение «Подчинение регистратору»;
- ресурсы — непосредственно хранят информацию для комбинации измерений;
- реквизиты — дополнительная произвольная информация, относящаяся к конкретной записи регистра.
Для всех регистров сведений обеспечивается контроль уникальности записей, т.е. в регистре не может быть двух одинаковых записей. Одинаковыми считаются записи, у которых совпадают значения измерений, период (если регистр периодический) и регистратор (если регистр подчинен регистратору).
Добавление записей
Программно добавить записи в регистр сведений можно при помощи:
- объекта НаборЗаписей;
- объекта МенеджерЗаписи.
Объект МенеджерЗаписи можно использовать только для работы с независимыми регистрами. Причем можно обрабатывать только одну запись. Объект предназначен в основном для интерактивной работы, но программно с ним также можно работать. На системном уровне МенеджерЗаписи использует объект НаборЗаписей.
Общая схема добавления записей в регистр сведений при помощи объекта НаборЗаписей выглядит так:
- создание объекта НаборЗаписей;
- наложение отборов на измерения, период (если регистр периодический) и регистратора (если регистр подчинен регистратору);
- добавление и заполнение значений полей записей;
- запись набора записей.
// Добавление записи в независимый непериодический регистр сведений
НаборЗаписей = РегистрыСведений.ВерсииПодсистем.СоздатьНаборЗаписей(); // Этап 1
НаборЗаписей.Отбор.ИмяПодсистемы.Установить(ИмяПодсистемы); // Этап 2
// Этап 3
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.ИмяПодсистемы = ИмяПодсистемы;
НоваяЗапись.Версия = НомерВерсии;
НаборЗаписей.Записать(); // Этап 4
// Добавление записи в независимый периодический регистр сведений
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); // Этап 1
// Этап 2
НаборЗаписей.Отбор.Валюта.Установить(Доллар);
НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));
// Этап3
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Валюта = Доллар;
НоваяЗапись.Курс = 57.92;
НоваяЗапись.Кратность = 1;
НаборЗаписей.Записать(); // Этап 4
Общая схема добавления записей в регистр сведений при помощи объекта МенеджерЗаписи выглядит так:
- создание объекта МенеджерЗаписи;
- заполнение значений полей записи;
- запись записи.
// Добавление записи в независимый непериодический регистр сведений
Запись = РегистрыСведений.ВерсииПодсистем.СоздатьМенеджерЗаписи(); // Этап 1// Этап 2
Запись.ИмяПодсистемы = ИмяПодсистемы;
Запись.Версия = НомерВерсии;Запись.Записать(); // Этап 3
// Добавление записи в независимый периодический регистр сведений
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); // Этап 1// Этап 2
Запись.Период = ТекущаяДата();
Запись.Валюта = Доллар;
Запись.Курс = 57.92;
Запись.Кратность = 1;Запись.Записать(); // Этап 3
Изменение записей
Изменять существующие записи регистров сведений возможно при помощи объектов НаборЗаписей и МенеджерЗаписи. Ограничения объекта МенеджерЗаписи были описаны в разделе Добавление записей.
Общая схема редактирования записей регистров сведений:
- создание объекта НаборЗаписей или МенеджерЗаписи;
- наложение отборов;
- чтение записей базы данных, соответствующих наложенным отборам;
- редактирование прочитанных записей;
- запись отредактированных записей.
// Редактирование записей с использованием объекта НаборЗаписей
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); // Этап 1
// Этап 2
НаборЗаписей.Отбор.Период.Установить(ДатаКурса);
НаборЗаписей.Отбор.Валюта.Установить(Доллар);
НаборЗаписей.Прочитать(); // Этап 3
Для Каждого Запись Из НаборЗаписей Цикл
Запись.Курс = 57.84; // Этап 4
КонецЦикла;
НаборЗаписей.Записать(); // Этап 5// Редактирование записей с использованием объекта МенеджерЗаписи
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); // Этап 1
// Этап 2
Запись.Период = ДатаКурса;
Запись.Валюта = Доллар;
Запись.Прочитать(); // Этап 3
Если Запись.Выбран() Тогда // Проверка, что запись существует
Запись.Курс = 57.92; // Этап 4
Запись.Записать(); // Этап 5
КонецЕсли;
Чтение записей
Чтение информации из базы данных рекомендуется выполнять при помощи запросов. Данный способ обеспечивает гибкое применение отборов и группировок, а также возможность выбора записей из нескольких таблиц.
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| КурсыВалют.Период,
| КурсыВалют.Валюта,
| КурсыВалют.Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют»;Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// обход результата выполнения запроса
КонецЦикла;
Для периодических регистров сведений есть возможность получить наиболее поздние записи, период которых меньше указанной даты — срез последних, и наиболее ранние записи, период которых больше указанной даты — срез первых. Для получения среза первых и среза последних запросом необходимо использовать одноименные виртуальные таблицы, в параметрах которых сразу можно задать дату среза и отборы. Отборы, если они необходимы, рекомендуется накладывать именно в параметрах виртуальных таблиц, т.к. это позволяет ускорить выполнение запроса.
// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта» и период МЕНЬШЕ или равен значению из переменной «ВыбраннаяДата»
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| КурсыВалютСрезПоследних.Период,
| КурсыВалютСрезПоследних.Валюта,
| КурсыВалютСрезПоследних.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПоследних»;Запрос.УстановитьПараметр(«Валюта», ВыбраннаяВалюта);
Запрос.УстановитьПараметр(«Период», ВыбраннаяДата);Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// обход результата выполнения запроса
КонецЦикла;// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта» и период БОЛЬШЕ или равен значению из переменной «ВыбраннаяДата»
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| КурсыВалютСрезПервых.Период,
| КурсыВалютСрезПервых.Валюта,
| КурсыВалютСрезПервых.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПервых(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПервых»;Запрос.УстановитьПараметр(«Валюта», ВыбраннаяВалюта);
Запрос.УстановитьПараметр(«Период», ВыбраннаяДата);Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// обход результата выполнения запроса
КонецЦикла;
Кроме чтения запросом возможно использование методов объектной модели.
Для непериодических регистров сведений:
- Выбрать(<Отбор>, <Порядок>) — выбирает записи с указанным отбором;
- ВыбратьПоРегистратору(<Регистратор>) — выбирает все записи указанного регистратора;
- Получить(<Отбор>) — получает ресурсы записи с отбором по всем измерениям.
Для периодических регистров сведений:
- Выбрать(<НачалоИнтервала>, <КонецИнтервала>, <Отбор>, <Порядок>) — выбирает записи с указанным отбором, у которых период находится между <НачалоИнтервала> и <КонецИнтервала>;
- ВыбратьПоРегистратору(<Регистратор>) — выбирает все записи указанного регистратора;
- Получить(<Период>, <Отбор>) — получает ресурсы записи с отбором по всем измерениям и периоду;
- ПолучитьПервое(<НачалоПериода>, <Отбор>) — получает ресурсы наиболее ранней записи, соответствующей указанным периоду и отбору;
- ПолучитьПоследнее(<КонецПериода>, <Отбор>) — получает ресурсы наиболее поздней записи, соответствующей указанным периоду и отбору;
- СрезПервых(<НачалоПериода>, <Отбор>) — получает таблицу наиболее ранних записей, соответствующую указанным периоду и отбору;
- СрезПоследних(<КонецПериода>, <Отбор>) — получает таблицу наиболее поздних записей, соответствующую указанным периоду и отбору.
Удаление записей
Для удаления записи(записей) в независимом регистре сведений необходимо:
- создать набор записей;
- наложить требуемые отборы на измерения и период (если регистр периодический);
- записать набор записей без предварительного чтения.
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Валюта.Установить(Доллар);
НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));НаборЗаписей.Записать();
Для удаления записей в подчиненном регистре сведений необходимо:
- создать набор записей;
- наложить отбор на регистратора;
- записать набор записей без предварительного чтения.
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокументРегистратор);
НаборЗаписей.Записать();
Очистка регистра сведений
Для удаления всех записей в независимом регистре сведений достаточно записать набор записей этого регистра без установки отборов:
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
Запись в регистр сведений, подчиненный регистратору, возможна только при установке отбора по регистратору, поэтому для очистки таких регистров необходимо:
- получить перечень ссылок всех регистраторов регистра сведений;
- последовательно записать пустой набор записей с отбором по регистраторам из пункта 1.
Запрос = Новый Запрос(«ВЫБРАТЬ
| ЦеныНоменклатуры.Регистратор
|ИЗ
| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры»);Выборка = Запрос.Выполнить().Выбрать();
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
Пока Выборка.Следующий() Цикл
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписей.Записать();
Регистр сведений в 1С Предприятии, предназначен для хранения периодической или не периодической информации в разрезе измерений. Данные в другие типы регистров могут быть записаны только с использованием «Документа регистратора». А в Регистр сведений данные могут быть записаны как с «Регистратором» так и без него.
Выбрать записи из регистра сведений
Используя метод «Выбрать» можно установить отборы и задать период для выбора записей, а также задать сортировку записей.
Валюта = Справочники.Валюты.НайтиПоНаименованию("EUR");
Отбор = Новый Структура("Валюта");
Отбор.Валюта = Валюта;
Выборка = РегистрыСведений.КурсыВалют.Выбрать(,,Отбор);Пока Выборка.Следующий() Цикл МенеджерЗаписи
= Выборка.ПолучитьМенеджерЗаписи();
МенеджерЗаписи.Прочитать();//Изменить существующую запись
МенеджерЗаписи.Валюта = Валюта;
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Курс = 10.00;
МенеджерЗаписи.Записать();//Удалить существующую запись
МенеджерЗаписи.Удалить();КонецЦикла;
Добавить, изменить, удалить запись
Менеджер записи позволяет добавлять, изменять, удалять запись регистра сведений не подчиненного регистратору.
МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Валюта = Справочники.Валюты.НайтиПоНаименованию("EUR");
МенеджерЗаписи.Валюта = Валюта;
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Прочитать();Если НЕ МенеджерЗаписи.Выбран() Тогда//Добавить новую запись
МенеджерЗаписи.Валюта = Валюта;
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Курс = 10.00;Иначе//Изменить существующую запись
МенеджерЗаписи.Валюта = Валюта;
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Курс = 10.00;КонецЕсли;//После добавления или изменения записи
//необходимо вызвать метод Записать
МенеджерЗаписи.Записать();//Удалить существующую запись
МенеджерЗаписи.Удалить();
Добавить, изменить, удалить набор записей
Через набор записей регистра сведений можно добавить или изменить сразу несколько записей. Набор записей позволяет устанавливать отборы.
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
Валюта = Справочники.Валюты.НайтиПоНаименованию("EUR");
НаборЗаписей.Отбор.Валюта.Установить(Валюта);
НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));
НаборЗаписей.Прочитать();Если НаборЗаписей.Количество() = 0 Тогда//Добавление новой записи
НоваяЗапсиь = НаборЗаписей.Добавить();
НоваяЗапсиь.Валюта = Валюта;
НоваяЗапсиь.Период = ТекущаяДата();
НоваяЗапсиь.Курс = 10.00;Иначе //Изменение существующей записи
НаборЗаписей[0].Валюта = Валюта;
НаборЗаписей[0].Период = ТекущаяДата();
НаборЗаписей[0].Курс = 10.00;КонецЕсли;//Удалить существующую запись
НаборЗаписей.Удалить(НаборЗаписей[0]);//После добавления, изменения, удаления записей
//необходимо вызвать метод Записать
НаборЗаписей.Записать();
Очистить регистр сведений
Полностью очистить регистр сведений можно несколькими способами.
Один из самых простых способов — это удалить регистр сведений из дерева метаданных, а затем заново его создать. В таком варианте перед удалением
необходимо запомнить или записать структуру данных и настройки регистра, чтобы потом создать аналогичный.
Если необходимо удалить все записи регистра сведений программно, то можно воспользоваться пустым набором записей.
//Удаление всех записей регистра сведений ЦеныНоменклатуры
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
/// Как прочитать записи регистра сведений /// в 1с 8.3, 8.2 &НаСервере Процедура КакПрочитатьЗаписиРегистраСведенийНаСервере() // Прочитаем все записи регистра сведений "ЦенаНаЕдуДляКлиентов" // для организации ООО "Ромашка", упорядоченные по дате. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЦенаНаЕдуДляКлиентов.Период, | ЦенаНаЕдуДляКлиентов.Регистратор, | ЦенаНаЕдуДляКлиентов.НомерСтроки, | ЦенаНаЕдуДляКлиентов.Активность, | ЦенаНаЕдуДляКлиентов.Номенклатура, | ЦенаНаЕдуДляКлиентов.Контрагент, | ЦенаНаЕдуДляКлиентов.Организация, | ЦенаНаЕдуДляКлиентов.Цена |ИЗ | РегистрСведений.ЦенаНаЕдуДляКлиентов КАК ЦенаНаЕдуДляКлиентов |ГДЕ | ЦенаНаЕдуДляКлиентов.Активность = Истина И | ЦенаНаЕдуДляКлиентов.Организация = &ВыбОрганизация |УПОРЯДОЧИТЬ ПО | ЦенаНаЕдуДляКлиентов.Период"; Запрос.УстановитьПараметр( "ВыбОрганизация", Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""") ); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить( "[" + Записи.Период + "] " + Записи.Контрагент + " " + Записи.Номенклатура + " " + Записи.Цена + " руб." ); КонецЦикла; КонецПроцедуры /// Как получить наиболее поздние записи (срез последних) /// регистра сведений на указанную дату (включительно) /// в 1с 8.3, 8.2 &НаСервере Процедура КакПолучитьНаиболееПоздниеЗаписиРегистраСведенийНаСервере() // За возможности выборки наиболее поздних записей регистра // сведений (среза последних) в разрезе заданной аналитики // отвечает виртуальная таблица СрезПоследних. // У неё есть следующие параметры: // 1. Период (включительно) // 2. Условие (например, Организация = &ВыбОрганизация) // Получим цены на бананы для каждого контрагента // на конец 1 квартала 2014 года (включительно) // по организации ООО "Ромашка". Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЦенаНаЕдуДляКлиентовСрезПоследних.Период, | ЦенаНаЕдуДляКлиентовСрезПоследних.Активность, | ЦенаНаЕдуДляКлиентовСрезПоследних.Номенклатура, | ЦенаНаЕдуДляКлиентовСрезПоследних.Контрагент, | ЦенаНаЕдуДляКлиентовСрезПоследних.Организация, | ЦенаНаЕдуДляКлиентовСрезПоследних.Цена |ИЗ | РегистрСведений.ЦенаНаЕдуДляКлиентов.СрезПоследних( | ДАТАВРЕМЯ(2014, 03, 31, 23, 59, 59), | Активность = Истина И | Организация = &ВыбОрганизация И | Номенклатура = &ВыбНоменклатура | ) КАК ЦенаНаЕдуДляКлиентовСрезПоследних |УПОРЯДОЧИТЬ ПО | ЦенаНаЕдуДляКлиентовСрезПоследних.Контрагент"; Запрос.УстановитьПараметр("ВыбОрганизация", Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""") ); Запрос.УстановитьПараметр("ВыбНоменклатура", Справочники.Номенклатура.НайтиПоНаименованию("Банан") ); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить( "[" + Записи.Контрагент + ", " + Записи.Период + "] " + Записи.Номенклатура + " " + Записи.Цена + " руб." ); КонецЦикла; КонецПроцедуры /// Как получить наиболее ранние записи (срез первых) /// регистра сведений на указанную дату (включительно) /// в 1с 8.3, 8.2 &НаСервере Процедура КакПрочитатьНаиболееРанниеЗаписиРегистраСведенийНаСервере() // За возможности выборки наиболее ранних записей регистра // сведений (среза первых) в разрезе заданной аналитики // отвечает виртуальная таблица СрезПервых. // У неё есть следующие параметры: // 1. Период (включительно) // 2. Условие (например, Организация = &ВыбОрганизация) // ! Нужно внимательно вдуматься. СрезПервых получает по каждой // комбинации измерений наиболее раннюю запись, но НЕ БОЛЕЕ // РАННЮЮ, чем указанная дата. // Получим самые первые цены, которые были установлены на бананы // для каждого контрагента в 2014 году (включительно) // по организации ООО "Ромашка". Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЦенаНаЕдуДляКлиентовСрезПервых.Период, | ЦенаНаЕдуДляКлиентовСрезПервых.Активность, | ЦенаНаЕдуДляКлиентовСрезПервых.Номенклатура, | ЦенаНаЕдуДляКлиентовСрезПервых.Контрагент, | ЦенаНаЕдуДляКлиентовСрезПервых.Организация, | ЦенаНаЕдуДляКлиентовСрезПервых.Цена |ИЗ | РегистрСведений.ЦенаНаЕдуДляКлиентов.СрезПервых( | ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00), | Активность = Истина И | Организация = &ВыбОрганизация И | Номенклатура = &ВыбНоменклатура | ) КАК ЦенаНаЕдуДляКлиентовСрезПервых |УПОРЯДОЧИТЬ ПО | ЦенаНаЕдуДляКлиентовСрезПервых.Контрагент"; Запрос.УстановитьПараметр("ВыбОрганизация", Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""") ); Запрос.УстановитьПараметр("ВыбНоменклатура", Справочники.Номенклатура.НайтиПоНаименованию("Банан") ); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить( "[" + Записи.Контрагент + ", " + Записи.Период + "] " + Записи.Номенклатура + " " + Записи.Цена + " руб." ); КонецЦикла; КонецПроцедуры /// Как найти и изменить програмно записи в регистр сведений /// документа в 1с 8.3, 8.2 &НаСервере Процедура КакНайтиИИзменитьЗаписиДокументаНаСервере() // Предположим, у нас есть ссылка на проведенный документ // "Установка цен на еду" № ВМБП-000001 УстановкаЦенСсылка = Документы.УстановкаЦенНаЕдуДляКлиентов.НайтиПоНомеру( "ВМБП-000001", '20141231' ); // Мы знаем, что этот документ делает записи в регистр // сведений "ЦенаНаЕдуДляКлиентов": // [Организация, Контрагент, Номенклатура] [Цена] // Наша задача: найти эти записи и изменит их (например, удвоим // цену) и записать вместо старых. // Используем объектную технику получения записей, // ведь мы будем их изменять. УстановкаЦен = УстановкаЦенСсылка.ПолучитьОбъект(); // Получим набор записей этого документа в регистр // "ЦенаНаЕдуДляКлиентов" НаборЗаписей = УстановкаЦен.Движения.ЦенаНаЕдуДляКлиентов; // Прочитаем записи из базы данных. НаборЗаписей.Прочитать(); Для Каждого Запись Из НаборЗаписей Цикл // Выведем старые значения. Сообщить( "[" + Запись.Организация + ", " + Запись.Контрагент + ", " + Запись.Номенклатура + "] " + "[" + Запись.Цена + "]" ); Запись.Цена = Запись.Цена * 2; КонецЦикла; // Добавим новую запись. НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Период = ТекущаяДата(); НоваяЗапись.Организация = Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка"""); НоваяЗапись.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("Петров Ю.В."); НоваяЗапись.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Банан"); НоваяЗапись.Цена = 500; // Разом запишем набор записей. НаборЗаписей.Записать( Истина // Удалим старые записи и запишем вместо них новые. ); // Теперь записи регистра "ЦенаНаЕдуДляКлиентов" для документа // № ВМБП000001, отличаются от тех, что были записаны // документом при проведении. Чтобы вернуть их к начальному виду // нужно заново провести документ. КонецПроцедуры /// Как прочитать записи документа в регистр сведений запросом /// в 1с 8.3, 8.2 &НаСервере Процедура КакПрочитатьЗаписиДокументаЗапросомНаСервере() // Этот прием используется, если не требуется изменять // найденные записи. // Предположим, у нас есть ссылка на проведенный документ // "Установка цен на еду" № ВМБП-000001 УстановкаЦенСсылка = Документы.УстановкаЦенНаЕдуДляКлиентов.НайтиПоНомеру( "ВМБП-000001", '20141231' ); // Мы знаем, что этот документ делает записи в регистр // сведений "ЦенаНаЕдуДляКлиентов". // Прочитаем эти записи запросом. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЦенаНаЕдуДляКлиентов.Период, | ЦенаНаЕдуДляКлиентов.Регистратор, | ЦенаНаЕдуДляКлиентов.НомерСтроки, | ЦенаНаЕдуДляКлиентов.Активность, | ЦенаНаЕдуДляКлиентов.Номенклатура, | ЦенаНаЕдуДляКлиентов.Контрагент, | ЦенаНаЕдуДляКлиентов.Организация, | ЦенаНаЕдуДляКлиентов.Цена |ИЗ | РегистрСведений.ЦенаНаЕдуДляКлиентов КАК ЦенаНаЕдуДляКлиентов |ГДЕ | ЦенаНаЕдуДляКлиентов.Регистратор = &ВыбРегистратор |УПОРЯДОЧИТЬ ПО | ЦенаНаЕдуДляКлиентов.НомерСтроки"; Запрос.УстановитьПараметр( "ВыбРегистратор", УстановкаЦенСсылка ); РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать(); Пока Записи.Следующий() Цикл Сообщить( "[" + Записи.Организация + ", " + Записи.Контрагент + ", " + Записи.Номенклатура + "] " + "[" + Записи.Цена + "] <" + Записи.Регистратор + ">" ); КонецЦикла; КонецПроцедуры /// Как создать записи в регистр сведений без привязки к /// документу в 1с 8.3, 8.2 &НаСервере Процедура КакСоздатьЗаписиБезПривязкиКДокументуНаСервере() // Создавать записи в регистре сведений без привязки // к документу можно только для регистров, у которых // выбран режим записи "Независимый". В нашей конфигурации // таким регистром является "КурсВалют". // Если бы мы захотели проделать такую же штуку для // регистра "ЦенаНаЕдуДляКлиентов", то нам бы пришлось // воспользоваться документом "ОперацияБух" или им подобным // для ручных операций (см. аналогичный пример в регистрах // накопления). // Пример №1. // Для единичных записей удобно пользоваться менеджером // записей. НоваяЗапись = РегистрыСведений.КурсВалют.СоздатьМенеджерЗаписи(); НоваяЗапись.Период = '20140101'; НоваяЗапись.Валюта = Справочники.Валюты.НайтиПоНаименованию("Доллар"); НоваяЗапись.Курс = 30; НоваяЗапись.Записать( Истина // замещать, если уже есть запись с такими же измерениями // и таким же периодом ); // Пример №2. // При помощи менеджера можно также легко // менять или удалять единичные записи. // Найдём, изменим, а затем удалим созданную запись. Выборка = РегистрыСведений.КурсВалют.Выбрать('20140101', '20140101'); Если Выборка.Следующий() Тогда Запись = Выборка.ПолучитьМенеджерЗаписи(); // изменим Запись.Прочитать(); Запись.Курс = 25; // запишем Запись.Записать(Истина); // и тут же удалим Запись.Удалить(); КонецЕсли; // Пример №3. // Если нужно изменить сразу много записей - // удобнее всего использовать набор записей. // Запишем курсы валют за первые 3 дня 2014 года. Доллар = Справочники.Валюты.НайтиПоНаименованию("Доллар"); НаборЗаписей = РегистрыСведений.КурсВалют.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Валюта.Установить(Доллар); Запись01 = НаборЗаписей.Добавить(); Запись01.Период = '20140101'; Запись01.Валюта = Доллар; Запись01.Курс = 30; Запись02 = НаборЗаписей.Добавить(); Запись02.Период = '20140102'; Запись02.Валюта = Доллар; Запись02.Курс = 40; Запись03 = НаборЗаписей.Добавить(); Запись03.Период = '20140103'; Запись03.Валюта = Доллар; Запись03.Курс = 60; // Запишем весь набор разом. НаборЗаписей.Записать( Истина // затрём все другие записи по // доллару (мы установили его в отборе) ); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере