Запись данных в независимый непериодический регистр сведений

Рассмотрим различные варианты записи данных в регистр сведений на примере независимого непериодического регистра сведений пр_АссортиментТоваров:

Данные регистра сведений
Очистка записей по определенному значению измерения регистра:
НаборЗаписей = РегистрыСведений.пр_АссортиментТоваров.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Партнер.Установить(Партнер); НаборЗаписей.Записать();
Добавление новых записей к уже имеющимся записям по определенному значению измерения регистра:
НаборЗаписей = РегистрыСведений.пр_АссортиментТоваров.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Партнер.Установить(Партнер); НаборЗаписей.Прочитать(); СтрокаНаборЗаписей = НаборЗаписей.Добавить(); СтрокаНаборЗаписей.Партнер = Партнер; СтрокаНаборЗаписей.Номенклатура = Номенклатура; СтрокаНаборЗаписей.Характеристика = Характеристика; СтрокаНаборЗаписей.НомерПоПорядку = 11; НаборЗаписей.Записать();
Добавление новых записей с затиранием (удалением) уже имеющихся записей по определенному значению измерения регистра:
НаборЗаписей = РегистрыСведений.пр_АссортиментТоваров.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Партнер.Установить(Партнер); СтрокаНаборЗаписей = НаборЗаписей.Добавить(); СтрокаНаборЗаписей.Партнер = Партнер; СтрокаНаборЗаписей.Номенклатура = Номенклатура; СтрокаНаборЗаписей.Характеристика = Характеристика; СтрокаНаборЗаписей.НомерПоПорядку = 1; НаборЗаписей.Записать();
Работа с набором записей регистра сведений 8.3 (8.2)
Разберем один из объектов, при помощи которого можно записывать данные в регистр сведений 1С. Набор записей регистра сведений. Если при помощи менеджера записей регистра сведений мы могли работать в регистре только с одной записью, то при помощи набора можно создавать (удалять, редактировать) любое количество записей.
Для создания набора записи регистра сведений необходимо использовать метод СоздатьНаборЗаписей менеджера регистра сведений.
МенеджерЦеныНаТопливо = РегистрыСведений . ЦеныНаТопливо ;
НаборЗаписей = МенеджерЦеныНаТопливо . СоздатьНаборЗаписей ();
После выполнения данного метода будет создан набор записей регистра сведений, т.е. переменная НаборЗаписей кода выше имеет тип РегистрСведенийНаборЗаписей.ЦеныНаТопливо. Причем он будет создан абсолютно пустым!
Заметьте, набор записей можно создать или в серверном контексте, или в клиентском контексте, но в режиме толстого клиента. Под тонким клиентом, код приведенный в этой статье работать не будет!
Вы можете работать с этим набором записей как с коллекцией: добавлять, удалять запись, очищать всю коллекцию. Причем, метод СоздатьНаборЗаписей создает пустой набор записей. В нашей переменной НаборЗаписей нет ни каких данных, даже если они имеются сейчас в регистре. И если мы запишем этот набор, то все данные, которые есть у нас в регистре будет уничтожены. Т.е. код ниже приведет к полной очистке моего регистра сведений.
МенеджерЦеныНаТопливо = РегистрыСведений . ЦеныНаТопливо ;
НаборЗаписей = МенеджерЦеныНаТопливо . СоздатьНаборЗаписей ();
Записать() – это метод объекта набор записей регистра сведений, которые записывает данные из созданного набора непосредственно в регистр сведений. Причем данный метод имеет параметр Замещать типа Булево, который по умолчанию всегда равен Истине. Если данный параметр принимает значение Истина, то после записи набор записей из созданного объекта заместит данные в регистре сведений. Поскольку мы не создали ни какие данные (наш набор пуст), то у нас просто все текущие записи в регистре сведений удалятся. Если мы не хотим этого, то нужно просто в параметр Замещать передать Ложь.
МенеджерЦеныНаТопливо = РегистрыСведений . ЦеныНаТопливо ;
НаборЗаписей = МенеджерЦеныНаТопливо . СоздатьНаборЗаписей ();
НаборЗаписей . Записать (Ложь);
В этом случае записи (которых нет) из набора не заместят записи из регистра, и данные не очистятся.
Если мы хотим создать новую запись, то необходимо воспользоваться методом Добавить() набора записей регистра сведений, который создает новую запись в нашем наборе.
МенеджерЦеныНаТопливо = РегистрыСведений . ЦеныНаТопливо ;
НаборЗаписей = МенеджерЦеныНаТопливо . СоздатьНаборЗаписей ();
НоваяЗапись = НаборЗаписей . Добавить ();
НоваяЗапись . Период = ТекущаяДата ();
НоваяЗапись . ВидТоплива = ВидТоплива ;
НоваяЗапись . ПоставщикТоплива = ПоставщикТоплива ;
НоваяЗапись . Цена = Цена ;
НаборЗаписей . Записать (Ложь);
Данный код создаст новую запись. В своем коде я работаю с регистром сведений, который создал для предыдущих статей.

Если мы попытаемся еще раз записать точно такой же набор данных, то возникнет ошибка «Запись с такими ключевыми полями существует!»

Причем такой проблемы ни когда не будет при работе с менеджером регистра сведений, так как при работе с менеджером мы получаем данные по измерениям и просто перезаписываем ресурсы и реквизиты.
И обратите внимание, если мы будет записывать с замещением, то проблем с ключевыми полями также не будет, поскольку мы своей записью заместим все имеющиеся данные, т.е. они будут очищены.
При помощи объекта набор записей можно записать в регистр практически неограниченное количество записей. Например, я сделаю выборку по поставщикам топлива и в цикле создам записи нашего набора.
МенеджерЦеныНаТопливо = РегистрыСведений . ЦеныНаТопливо ;
НаборЗаписей = МенеджерЦеныНаТопливо . СоздатьНаборЗаписей ();
Выборка = Справочники . ПоставщикиТоплива . Выбрать ();
Пока Выборка . Следующий () Цикл
НоваяЗапись = НаборЗаписей . Добавить ();
НоваяЗапись . Период = ТекущаяДата ();
НоваяЗапись . ВидТоплива = ВидТоплива ;
НоваяЗапись . ПоставщикТоплива = Выборка . Ссылка ;
НоваяЗапись . Цена = Цена ;
КонецЦикла;
НаборЗаписей . Записать (Ложь);
В этом коде мы создадим несколько записей набора, а потом запишем весь наш набор в регистр сведений.
Изучайте основы конфигурирования в 1С и учитесь программировать в «1С: Предприятии» с помощью моих книг: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы:
Работа с регистрами сведений
Регистры сведений позволяют хранить произвольные данные в разрезе нескольких измерений. Они позволяют получить срез информации (текущее значение показателей) на любой момент времени.
Для регистров сведений связь с регистраторами не всегда обязательна.
Добавление записей в регистр сведений
Программно добавить записи в регистр сведений можно двумя способами:
- с помощью объекта МенеджерЗаписи;
- с помощью объекта НаборЗаписей.
Добавление записей с помощью объекта МенеджерЗаписи
Объект МенеджерЗаписи можно использовать только для работы с независимыми регистрами. Причем можно обрабатывать только одну запись. Таким образом, для того, чтобы в периодический, независимый регистр сведений “КурсыВалют” с измерением “Валюта” и ресурсами “Курс” и “Кратность” добавить одну запись – курс и кратность валюты на определенную дату – можно использовать следующий код:
КурсыВалютМенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); КурсыВалютМенеджерЗаписи.Период = ДатаУстановкиКурса; // Дата курса КурсыВалютМенеджерЗаписи.Валюта = Валюта; // СправочникСсылка.Валюты КурсыВалютМенеджерЗаписи.Курс = ЗначениеКурсаНаДату; // Устанавливаемый курс КурсыВалютМенеджерЗаписи.Кратность = 1; // Кратность КурсыВалютМенеджерЗаписи.Записать();
Добавление записей в независимый регистр сведений помощью объекта НаборЗаписей
Добавление записей в независимый регистр сведений с помощью НабораЗаписей выполняется по следующему алгоритму:
- Создание объекта НабораЗаписи;
- Установка отбора по измерениям и периоду (если регистр периодический);
- Добавление и заполнение значений полей записи;
- Запись набора.
Для примера выполним добавление записей в тот же регистр сведений “КурсыВалют“, предварительно установив отбор по измерению “Валюта” и периоду.
КурсыВалютНаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); КурсыВалютНаборЗаписей.Отбор.Валюта.Установить(Валюта); КурсыВалютНаборЗаписей.Отбор.Период.Установить(ДатаУстановкиКурса); Запись = КурсыВалютНаборЗаписей.Добавить(); Запись.Период = ДатаУстановкиКурса; Запись.Валюта = Валюта; // СправочникСсылка.Валюты Запись.Курс = ЗначениеКурсаНаДату; // Устанавливаемый курс Запись.Кратность = 1; // Кратность КурсыВалютНаборЗаписей.Записать();
Добавление записей в регистр сведений, подчиненный регистратору
Для добавление записей в регистр сведений, подчиненный регистратору, выполняется с помощью объекта НаборЗаписей по следующему алгоритму:
- Создание объекта НаборЗаписей;
- Установка отбора по определенному регистратору;
- Заполнение записей набора;
- Запись набора.
// ДанныеДляПроведения - хранит данные для заполнения регистра сведений (например, выгрузка результата запроса) НаборЗаписей = РегистрыСведений.МероприятияТрудовойДеятельности.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Регистратор); ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), ДанныеДляПроведения); НаборЗаписей.Записать();
Изменение записей в регистре сведений
Изменение записей в независимом регистре сведений
Изменять записи в независимом регистре сведений можно как с помощью МенеджераЗаписи, так и с помощью НабораЗаписей. Изменение записей выполняется по следующему алгоритму:
- Создание объекта МенеджерЗаписи или НаборЗаписи;
- Установить отборы;
- Чтение записей из базы данных, соответствующих наложенному отбору;
- Редактирование полученных записей;
- Запись измененных записей.
При изменении записей в независимом регистре сведений с помощью объекта МенеджерЗаписи, действуют такие же ограничения как и при добавлении. При изменении записи с помощью менеджера, после чтения значений выполним проверку – есть ли записи для изменения.
КурсыВалютМенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); КурсыВалютМенеджерЗаписи.Период = ДатаУстановкиКурса; // Дата курса КурсыВалютМенеджерЗаписи.Валюта = Валюта; // СправочникСсылка.Валюты КурсыВалютМенеджерЗаписи.Прочитать(); Если КурсыВалютМенеджерЗаписи.Выбран() Тогда КурсыВалютМенеджерЗаписи.Курс = ЗначениеКурсаНаДату; // Устанавливаемый курс КурсыВалютМенеджерЗаписи.Кратность = 1; // Кратность КурсыВалютМенеджерЗаписи.Записать(); КонецЕсли;
В отличии от менеджера записи, работа с набором записи позволяет изменять сразу несколько записей, полученных в результате установленного отбора. Поэтому изменение записей производим в цикле.
КурсыВалютНаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); КурсыВалютНаборЗаписей.Отбор.Валюта.Установить(Валюта); КурсыВалютНаборЗаписей.Отбор.Период.Установить(ДатаУстановкиКурса); КурсыВалютНаборЗаписей.Прочитать(); Для Каждого Запись Из КурсыВалютНаборЗаписей Цикл Запись.Курс = ЗначениеКурсаНаДату; // Устанавливаемый курс Запись.Кратность = 1; // Кратность КонецЦикла; КурсыВалютНаборЗаписей.Записать();
Изменение записей в регистрах сведений подчиненных регистраторам
Изменение записей регистров, подчиненных регистраторам, возможно только с помощью наборов записей. При этом всегда используется отбор по регистратору. Нельзя добавлять или удалять отдельные записи. Можно только считывать и записывать записи по регистратору.
Изменение записей выполняется по следующему алгоритму:
- Создать объект НаборЗаписей;
- Установить отбор по определенному регистратору;
- Прочитать набор;
- Изменить записи набора;
- Записать набор.
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | МероприятияТрудовойДеятельности.Регистратор КАК Регистратор |ИЗ | РегистрСведений.МероприятияТрудовойДеятельности КАК МероприятияТрудовойДеятельности"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Сообщить(СтрШаблон("Изменение записей по регистратору: %1", Выборка.Регистратор)); НаборЗаписей = РегистрыСведений.МероприятияТрудовойДеятельности.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Регистратор); Для каждого Запись Из НаборЗаписей Цикл Запись.ДатаМероприятия = Дата(2021, 12, 12); КонецЦикла; НаборЗаписей.Записать(); КонецЦикла;
Удаление записи в регистре сведений
Удаление записи из независимого регистра сведений
Для удаления записи из независимого регистра сведений выполняется по следующему алгоритму:
- Создать объект НаборЗаписей;
- Установить нужные отборы по измерениям и, если регистр периодический, периоду;
- Записать набор без предварительного чтения.
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Валюта.Установить(Валюта); НаборЗаписей.Отбор.Период.Установить(ДатаУстановкиКурса); НаборЗаписей.Записать();
Удаление записи из регистра сведений подчиненного регистратору
- Создать объект НаборЗаписей;
- Установить отбор по определенному регистратору;
- Прочитать набор;
- Удалить записи из набора (по условию);
- Записать набор.
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Регистратор); НаборЗаписей.Прочитать(); Для Каждого Запись Из НаборЗаписей Цикл Если Запись.Валюта = Валюта Тогда // Предположим, что хотим удалить записи по регистратору // с определенной Валютой НаборЗаписей.Удалить(Запись); КонецЕсли; КонецЦикла; НаборЗаписей.Записать(); НаборЗаписей.Записать();
Похожие записи
- Создание объекта, определяющего способ передачи данных через ajax-запрос
- Обработка выполнения deferred.catch()
- Массивы в jQuery – создание и манипуляции
- .on() – установка обработчика событий
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; // Запишем весь набор разом. НаборЗаписей.Записать( Истина // затрём все другие записи по // доллару (мы установили его в отборе) ); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере
Регистры сведений в языке 1С 8.3, 8.2 (в примерах)
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).