Регистры сведений в языке 1С 8.3, 8.2 (в примерах)
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
2018-10-10T10:23:56+00:00<<< Документы Константы Перечисления РегистрыБухгалтерии
<<< РегистрыНакопления РегистрыСведений Справочники
Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
/// Как прочитать записи регистра сведений /// в 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 (в примерах)
<<< Документы Константы Перечисления РегистрыБухгалтерии
<<< РегистрыНакопления РегистрыСведений Справочники