Регистры сведений в языке 1С 8.3, 8.2 (в примерах)

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 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С программистов и разработчик обновлятора).



Владимир Милькин
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться: