Как найти регистр сведений по сотруднику

Пользуемся сервисом 1сFresh. В базе необходимо проанализировать данные регистра накопления Расчеты налогоплательщиков с бюджетом по НДФЛ. Как это можно сделать?

Для того, чтобы проанализировать данные регистров, работая в сервисе 1сFresh, можно пойти двумя путями:

  1. Воспользоваться Универсальным отчетом (Администрирование – Печатные формы, отчеты, обработки – Универсальный отчет).
    Далее в нашем случае настроить отчет следующим образом:

    • В первом поле — указать тип выбираемого объекта (Регистр накопления);
    • Во втором поле – выбрать название объекта (Расчеты налогоплательщиков с бюджетом по НДФЛ);
    • В третьем поле – указать что необходимо вывести (Основные данные, Остатки и обороты, Остатки или Обороты). Например, мы выведем Основные данные;
    • Задать требуемый период для получения данных:
  2. Перейти к регистру по ссылке.

Обычно в локальной версии ЗУП 3 под правами Администратора можно перейти в форму требуемого объекта (в нашем примере в регистр накопления Расчеты налогоплательщиков с бюджетом по НДФЛ) через Главное меню (вверху справа две полоски с треугольником) – Все функции:

Если пункт Все функции недоступен, то предварительно следует в Главном меню выбрать пункт НастройкиПараметры:

В открывшейся форме установить флажок Отображать команду «Все функции»:

Далее в форме Все функции раскрыть ветку с искомым типом объекта и найти его по наименованию. В нашем примере потребуется открыть ветку Регистры накопления и найти регистр Расчеты налогоплательщиков с бюджетом по НДФЛ:

Или в форме Все функции для поиска объектов можно использовать строку Поиск, набрав в ней часть названия объекта:

Однако при работе в 1сFresh пункт Все функции в Главном меню недоступен. Это ограничение можно обойти.

Необходимо в локальной версии базы ЗУП 3 (любой, даже пустой или демо) после открытия формы объекта нажать справа кнопку в виде скрепки (кнопку Получить ссылку) или нажать сочетание «горячих» клавиши Ctrl+F11:

В форме Получения ссылки нажать кнопку Копировать в буфер:

Далее в базе, работающей в 1сFresh, в Главном меню нажать кнопку Перейти по ссылке или нажать сочетание «горячих» клавиш Shift+F11:

В форме Перехода по ссылке нажать кнопку Вставить из буфера, а затем кнопку Перейти:

Или же полученную ссылку можно вставить в строку глобального поиска, установив в ней курсор и нажав сочетание «горячих» клавиш Ctrl+V. Тут же появляется строка с результатом поиска, щелкнув по которой можно перейти в искомый объект:

После этого в нашем примере в базе, работающей в 1сFresh, откроется форма регистра накопления Расчеты налогоплательщиков с бюджетом по НДФЛ:

Для анализа других объектов базы, работающей в сервисе 1сFresh, можно пользоваться любым из описанных способов.

Подписывайтесь на наши YouTube и Telegram чтобы не пропустить
важные изменения 1С и законодательства

Помогла статья?

Получите еще секретный бонус и полный доступ к справочной системе БухЭксперт8 на 14 дней бесплатно

Оцените публикацию

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд

(1 оценок, среднее: 5,00 из 5)

Загрузка…

Учебник 1С РЕГИСТРЫ СВЕДЕНИЙ

Кроме фамилии имени и отчества нам желательно знать еще некоторые сведения о сотруднике, например, его должность.
Штатное расписание компании мы будем хранить в отдельном справочнике, назовем его Должности. Заведем его.
Процедура добавления должна быть вам знакома из прошлой главы , повторятся не буду. (pic 5.1)

8gl7g5001
Для подсистемы Бухгалтерия включим видимость команды Должности:создать (pic 5.2)

8gl7g5002
Каждому сотруднику теперь нужно назначить должность.
Можно создать отдельный реквизит в справочнике сотрудники с типом ссылки на справочник Должности.
Но не исключено, что кто-то из сотрудников окажется карьеристом и будет расти по карьерной лестнице.
Или водитель вначале будет стажером, потом перейдет в статус водителя-экспедитора.
При расчете зарплаты это обстоятельство нужно учитывать.
Так или иначе нам необходимо где-то хранить изменения в статусе сотрудника.
Для этой цели идеально подходит такой объект 1С, который называется периодическим регистром сведений.   Создадим его.
Находим в дереве ветвь Регистры сведений. Через контекстное меню добавляем новый регистр, называем его Должности,  периодичность – в пределах дня, режим записи – независимый.
Независимый означает, что мы его можем редактировать вручную.(pic 5.3)

8gl7g5003
Заходим на вкладку Подсистемы, устанавливаем видимость для подсистемы Бухгалтерия.
Заходим на вкладку Данные и добавляем измерение Сотрудники тип СправочникСотрудники.
Ссылка (pic 5.4) Именно по этому измерению система будет определять какому сотруднику какая должность соответствует.

8gl7g5004
Добавляем ресурс должность, в нем будем хранить должность сотрудника на определенную дату.(pic 5.4a)

8gl7g5004a
Должно получиться так (pic 5.5)
Отредактируем справочник сотрудники.
Зайдем в свойства справочника на вкладку формы.
Вызовем конструктор формы элемента, щелкнув напротив соответствующей записи на значок лупы.
Появится конструктор формы, нажмем готово. (pic 5.7)

8gl7g5006
Появится окно разделенное на три части.
В правом верхнем окне добавим два реквизита ДатаДолжности (pic 5.8а) с заголовком Актуальная дата
Обратите внимание, что Тип должен быть “Дата” и состав даты “Дата”

8gl7g5007
И ДолжностьСотрудника (pic 5.8)

8gl7g5008
Захватим мышкой и последовательно перетащим влево.
Внизу можно видеть, что добавленные реквизиты появились в форме элемента.
Давайте немного поправим размещение. Сейчас у нас наши реквизиты размещены друг под другом.
Лучше разместить их в одну линию.
Для этого нажмем на кнопку добавить (зеленый кружок с плюсом) и выберем Группа-обычная группа (pic 5.9)

8gl7g5009
В свойствах группы укажем группировка Горизонтальная (pic 5.10)

8gl7g5010
И мышкой перетащим наши вновь созданные реквизиты в новую группу (pic 5.11)

8gl7g5011
Теперь наши реквизиты выстроились в линию (pic 5.12)

8gl7g5012
Т.к. должность сотрудника храниться в регистре сведений, нам необходимо ее оттуда извлечь.
Регистр сведений Должности периодический, т.е. значение его зависит от даты на которую мы хотим его прочитать.
Дату мы будем брать из реквизита ДатаДолжности, которая при открытии справочника будет устанавливаться в текущую дату.
Внизу редактирования формы есть закладка, которая называется Модуль. (pic 5.13)

8gl7g5013
Перейдем на нее. Пока здесь нет ничего. Вернемся на вкладку Форма.
В верхнем окне станем на Форма и вызовем через контекстное меню палитру свойств. (pic 5.14)

8gl7g5014
Внизу в группе События напротив события ПриОткрытии щелкнув на значок лупы, мы окажемся в модуле формы и там будет сформирована заготовка процедуры ПриОткрытии.
Все, что мы напишем в этой процедуре будет выполнено при открытии формы. (pic 5.15)

8gl7g5015
Т.е мы написали, что при открытии формы ДатаДолжности при открытии формы устанавливается в текущую дату.
Если вы помните, ранее мы создали периодический регистр сведений, где договорились хранить должности сотрудника.
Чтобы выковырять из регистра сведений необходимую должность нужно знать первое, чью должность мы хотим получить и второе, на какую дату мы хотим увидеть её.
Для этого мы используем метод  регистра сведений ПолучитьПоследнее(КонецПериода, Отбор), где КонецПериода
Определяет момент времени, по который необходимо получить значения ресурсов.
Может задаваться значениями типа Дата, МоментВремени или Граница.
Если параметр не указан, то будут возвращены значения ресурсов самой последней записи регистра.
Отбор
Тип: Структура. Структура, содержащая отбор по измерениям регистра.
Имя ключа структуры должно совпадать с именем измерения регистра, заданного в конфигураторе, а значение элемента структуры – задает отбираемое по данному измерению значение.
Если параметр не указан, то отбор не используется.
Возвращаемое значение:
Тип: Структура. Возвращает структуру, содержащую значения ресурсов.
Представляет собой коллекцию пар КлючИЗначение. При этом ключ может быть только строковым.
К значениям структуры можно обращаться как к свойствам объекта. При этом ключ используется как имя свойства.
Структура используется обычно для хранения небольшого количества значений, каждое из которым имеет некоторое имя.
Итак, чтобы сделать отбор нам необходимо создать структуру с ключем «Сотрудник» и значением: справочник.Сотрудники (строго говоря ссылки на элемент справочника сотрудники)
Т.к. читать из регистра сведений нам придется часто, разумнее поместить процедуру чтения в общий модуль из которого наша процедура будет видна для всех.
Назовем этот общий модуль ЧтениеРегистраСведений.
Для этого в контекстном меню на ветке общие модули нажимаем добавить и вводим в палитре свойств его название. (pic 5.16)

8gl7g5016
Обратите внимание, галочка в свойстве Глобальный должна быть снята, а в свойствах Сервер и Вызов сервера – установлена. (pic 5.17)

8gl7g5017
Пишем функцию чтения должности из регистра сведений и указываем, что она должна выполняться на сервере.(pic 5.18)

8gl7g5018
Теперь вернемся в модуль формы элемента справочника сотрудники и допишем процедуру ПриОткрытии (pic 5.19)

8gl7g5019
Здесь, чтобы присвоить реквизиту ДолжностьСотрудника значение должности мы обращаемся по имени к общему модулю ЧтениеРегистраСведений и через точку к функции этого модуля ПрочитатьЗначениеДолжности.
В качестве ссылки на элемент справочника  сотрудники передаем Объект.Ссылка, а в качестве даты текущую дату.
ОК. Прочитать должность мы теперь можем, но только на текущую дату. Но, что, если мы захотим узнать, а какая должность у сотрудника была вчера?
Для этого вызываем свойства реквизита ДатаДолжности (pic 5.20)

8gl7g5020
В палитре свойств в События нажимаем на значок лупы напротив события ОбработкаВыбора (pic 5.21)

8gl7g5021
В открывшейся заготовке процедуры ДатаДолжностиОбработкаВыбора пишем (pic 5.22)

8gl7g5022
Т.е. практически тоже самое, что и в процедуре при открытии формы, только в качестве даты передаем ВыбранноеЗначение.
Теперь почти готово, осталось только создать механизм записи в регистр сведений, а то читать будет нечего.
Запись в регистр сведений сделаем с помощью менеджера записи регистра сведений.
У нас уже имеется общий модуль для работы с регистром сведений, там и будем продолжать. (pic 5.23)

8gl7g5023
Здесь должно быть все понятно.
Не забудьте в процедуре поставить ключевое слово Экспорт, иначе она будет не видна вне общего модуля.
В модуле формы становимся на Форма, вызываем свойства находим событие ПриЗаписиНаСервере, нажимаем на значок лупы.(pic 5.24)

8gl7g5024
В сформированной заготовке пишем (pic 5.25)

8gl7g5025
Перед записью проверяем изменилась ли значение должности и, если изменилось записываем новое значение в регистр сведений.
Осталось только проверить как это все работает. Жмем F5.
Заходим в подсистему Бухгалтерия и добавляем несколько должностей (pic 5.26)

8gl7g5026
Заходим в справочник сотрудников и выбираем сотрудника Рожков, выставим дату 10.03.2011, выберем должность стажер, запишем.
Выберем дату 14.03.2011 и установим должность водитель-экспедитор, запишем.
Закроем и снова откроем элемент справочника сотрудники Рожков, посмотрим на его должность (pic 5.27)

8gl7g5027
Попробуйте изменить дату на 10.03.2011 (pic 5.28)

8gl7g5028
Замечание: чтобы должности выбирались вот таким компактным списком (pic 5.29)

8gl7g5029
Нужно в свойствах справочник должности за закладке Формы установить галочку Быстрый выбор (pic 5.30)

8gl7g5030
Если присмотреться, то панели навигации, эта та которая в 1С у нас слева, видны два одинаковых пункта Должности, если нажать первый, то мы перейдем к списку справочника должности, второй выведет нас к записям регистра сведений должности (pic 5.31)

8gl7g5031
Что бы не было путаницы в конфигураторе зайдем в свойства регистра сведений Должности и в поле Представление списка запишем Записи должностей.(pic 5.32)

8gl7g5032
Перейдем в 1С, панель навигации у нас изменилась.(pic 5.33)

8gl7g5033
Творение наше работает.
Конечно, по уму перемещение на должность лучше делать приказами, возможно позже мы так и сделаем, а пока и так неплохо.

Существует несколько видов регистров в 1С:

  • Накопления, хранящие остатки или обороты в числовом виде;
  • Расчета, хранящие виды расчетов и сами расчеты, обычно используются для расчета зарплаты;
  • Бухгалтерии с данными о бухгалтерских расчетах в виде Дт-Кт;
  • Регистры сведений.

Планшет

Приглашаем на
бесплатный вебинар!

06 июня в 11:00 мск

1 час

На последних мы остановимся поподробнее, поскольку они позволяют компилировать данные из БД по разрезам измерений. Например, в «Ценыноменклатуры» хранятся данные для конкретной номенклатуры и характеристики по определенному виду цен.

Рис.1 Регистр «Ценыноменклатуры»
Рис.1 Регистр «Ценыноменклатуры»

Характеристики

Регистр бывает как периодическим, так и непериодическим, когда не нужно сохранять последовательность изменений. Но если все-таки хранить нужно, то устанавливается, в пределах какого периода программа установит контроль уникальности записей: посекундно, за день, месяц, за квартал и год.

Рис.2 Периодичность и режим записи
Рис.2 Периодичность и режим записи

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

Также можно указать режим записи. Первый с «Подчинением регистратору», при котором записи будут регистрироваться документами и в каждой из них будет указан документ-регистратор. Если выбирать второй – независимый режим, то данные регистрируются не регистратором, а добавляются, например, непосредственно из списка или как обработка.

Рис.3 Режимы записи
Рис.3 Режимы записи

Особенность периодического регистра в том, что можно использовать срез крайних или первых, получая готовые значения из базы данных о последнем/первом установленном значении на определенную дату.

Запись в регистр сведений 1С

Строки в регистре с периодом и регистратором, содержащие информацию о ресурсах в разрезе измерений, называются записями.

Чтобы добавить запись в регистр используются или менеджер записей, или набор записей. Если у записей в регистре имеется общий ключ, то необходимо использовать НаборЗаписей. А для записи одной единственной записи, если в регистре все записи уникальны, необходимо использовать МенеджерЗаписи.

Пример записи при использовании объекта РегистрСведенийНаборЗаписей.

Использование менеджера записи:


	НоваяЗапись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
	НоваяЗапись.Валюта =     Справочники.Валюты.НайтиПоНаименованию(«USD»);
	НоваяЗапись.Период = Дата(31,12,2016);
	НоваяЗапись.Курс = 100;
	НоваяЗапись.Кратность = 1;
	НоваяЗапись.Записать();
	

При использовании набора записей и метода «Записать» происходит запись в регистр сведений набора записей. При этом может происходить как просто добавление строк, так и замещение уже имеющихся строк в регистре. Для независимых регистров, без установки отборов, будет произведено удаление всех записей в регистре и замещение на добавляемые записи.

Если записать без отбора данные в подчиненны регистр, возникнет ошибка.

Пример записи с использованием набора записей в подчиненный регистратору регистр сведений ЦеныНоменклатуры:


	НовыйНаборЗаписей =     РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
	НовыйНаборЗаписей.Отбор.Регистратор.Установить(Ссылка);
	НоваяЗаписьНабора = НовыйНаборЗаписей.Добавить();
	НоваяЗаписьНабора.Период = Ссылка.Дата;
	НоваяЗаписьНабора.Номенклатура = Ссылка.Номенклатура;
	НоваяЗаписьНабора.Цена = Ссылка.Цена;
	НовыйНаборЗаписей.Записать();
	

Пример записи через менеджер записи:


	Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
	Запись.Период = Дата;
	Запись.Курс = Курс;
	Запись.Валюта = Валюта;
	Запись.Записать();
	

Поиск и чтение в регистре сведений

Чтобы найти в регистре сведений запись и прочитать ее, нужна помощь запросов. Например, нам надо получить цены, внесенные определенным регистратором:


	ВЫБРАТЬ
              ЦеныНоменклатуры.Номенклатура,
              ЦеныНоменклатуры.Цена
	ИЗ
              РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
	ГДЕ
              ЦеныНоменклатуры.Регистратор = &Регистратор
	

Изменение и удаление записей

Чтобы удалить запись регистра сведений, например, все курсы валюты EUR, воспользуйтесь следующим кодом:


	СтруктураОтбора = новый Структура("Валюта",     Справочники.Валюты.НайтиПоНаименованию("EUR"));
        	Выборка = РегистрыСведений.КурсыВалют.Выбрать(,,СтруктураОтбора);
        	Пока Выборка.Следующий() Цикл
                    	МенеджерЗаписи = Выборка.ПолучитьМенеджерЗаписи();
                    	Выборка.ПолучитьМенеджерЗаписи().Удалить();
        	КонецЦикла;
	

Для быстрой и полной очистки регистра можно использовать следующий код:


	НоваяЗапись = РегистрыСведений.ТестовыйРегистр.СоздатьНаборЗаписей();
	НоваяЗапись.Записать();
	

Чтобы скорректировать и изменить регистр, а также быстро заполнить регистр данными, можно написать универсальную обработку.

В статье рассмотрено описание и предназначение регистров сведений, а также примеры работы с регистрами сведений средствами встроенного языка 1С – создание и редактирование наборов записей, отдельных записей, работа с ключом записи.

Содержание

Регистры сведений в 1С 8

Что такое регистр сведений

Регистр сведений – это объект конфигурации, который предназначен для хранения произвольной информации в разрезе нескольких измерений. Например, можно хранить соответствие материально-ответственных лиц и складов, курсы валют или цену на товары. Можно представить регистр сведений как многомерную таблицу, где на каждом пересечении измерений хранятся значения, которые называются Ресурсы.

Помимо измерений и ресурсов, у регистров сведений могут быть определены реквизиты – вспомогательная информация, служащая для уточнения данных – например, ответственный пользователь, комментарий и т.п.

Значения в регистре сведений могут храниться не только в разрезах измерений, но также они могут быть развернуты во времени. В этом случае к записям добавляется стандартное измерение Период. Регистры с информацией, развернутой во времени, называются периодическими.

Периодические регистры сведений позволяют получить информацию о срезе наиболее ранних или наиболее поздних записей.

Строки в многомерной таблице регистра сведений называются записями. Уникальность записей регистра сведений определяется как комбинация измерений и периода. В случае, если регистр сведений не периодический, то период будет не заполнен, и уникальные записи будут отличаться по комбинации измерений. Платформа не допускает создания двух записей с одинаковым набором измерений и периодом. Измерения и период образуют т.н. составной ключ, и называются ключевыми полями.

Записи в регистр сведений могут вноситься как вручную, независимо одна от другой, так и при помощи документов, единым набором. Документ, которым вносится запись в регистр сведений, называется регистратором.

Свойства регистра сведений. Основные настройки

Основные свойства регистра сведений, уникальные только для этого объекта метаданных – это Периодичность и Режим записи. Рассмотрим создание и настройку регистра сведений на примере хранения тарифов работников.

Периодичность регистра сведений

Данное свойство отвечает за доступность стандартного реквизита Период. Периодичность может быть

  • В пределах секунды
  • В пределах дня
  • В пределах месяца
  • В пределах квартала
  • В пределах года

В случае, если регистр сведений подчинен регистратору (см. ниже), становится доступным еще один вариант периода – по позиции регистратора.

Поле Период входит в составной ключ записи; можно добавлять записи с одинаковым составом измерений, но с разным периодом. Если периодичность – по позиции регистратора, то дата документа может совпадать с точностью до секунды – все равно это будут разные записи, т.к. в этом случае позиция регистратора будет определяться как момент времени (Дата + ссылка на документ). В зависимости от выбранной периодичности, период записи будет автоматически приводиться к началу периода в свойстве Периодичность. Например, если указана периодичность “В пределах дня”, то к началу суток, если “В пределах месяца” – то соответственно к первому числу месяца, и т.д.

Режим записи регистра сведений 1С

Режим записи определяет, можно ли редактировать записи регистра сведений вручную, или они будут вноситься движениями документа-регистратора. Для регистров сведений с режимом записи “Независимый” можно указывать основной отбор для измерений. В случае, если при этом регистр сведений периодический, становится возможным указание флажка Основной отбор по периоду.

Что такое ведущее измерение и основной отбор?

Флаг Ведущее у измерения регистра сведений означает, то данная запись имеет смысл пока существует объект, ссылка на который хранится в данном измерении. Например, если удалить из базы данных сотрудника “Иванов Иван”, то автоматически из регистра сведений будут удалены все записи по тарифам, где в измерении “Сотрудник” был указан Иванов Иван. Если данный флаг не установлен, то при удалении объекта, записи остались бы в регистре с битой ссылкой на него.

Также свойство “Ведущее” у измерения отвечает за построение пользовательского интерфейса. В карточке объекта, который является ведущим измерением, появляется гиперссылка для быстрого перехода к регистру сведений с отбором по текущему объекту.

Если регистр независимый, по этим измерениям будет устанавливаться регистрация изменений для плана обмена. Аналогично использование Основной отбор по периоду включает основной отбор для период для периодических регистров.

Проектирование структуры регистра сведений

Следует стараться избегать архитектурных решений, когда значение одного ресурса регистра сведений меняется значительно чаще чем значение другого. В этом случае целесообразно выделить такие ресурсы в отдельный регистр сведений. Это связано с тем, что в момент записи записываются все ресурсы, а не только измененный, что приводит к неоправданной нагрузке на СУБД.

Получение данных из нескольких ресурсов одного регистра сведений выполняется быстрее, чем получение одного ресурса из нескольких регистров

Следует внимательно отнестись к вопросу – какие поля многомерной таблицы должны быть измерениями, а какие – ресурсами. В зависимости от прикладной задачи, подход может быть различным.

Например, мы хотим знать, какие материально ответственные лица закреплены за тем или иным складским помещением. Если таких МОЛ более одного человека, то правильная архитектура регистра будет такая:

Измерения: МОЛ
Ресурсы: Склад

Если же нам требуется гарантировать, что у одного склада может быть только одно материально ответственное лицо, то состав регистра сведений будет следующий:

Измерения: Склад
Ресурсы: МОЛ

Примеры работы с регистрами сведений в 1С

Программная запись в регистр сведений 1С

Программно добавить записи в независимый регистр сведений можно двумя способами: при помощи менеджера записи, и при помощи набора записей.

//Использование менеджера записи регистра сведений
НоваяЗапись = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
//Сотрудник - это переменная, реквизит формы, параметр и т.п. с типом СправочникСсылка.Сотрудники
НоваяЗапись.Сотрудник = Сотрудник;
НоваяЗапись.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
НоваяЗапись.Тариф = 1500;
НоваяЗапись.Записать();

//Использование набора записей
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Сотрудник.Установить(Сотрудник);

ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
ЗаписьНабора.Тариф = 1500;

ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.ПоДням;
ЗаписьНабора.Тариф = 6000;

НаборЗаписей.Записать();

Следует иметь в виду, что если не установить отбор для набора записей, при записи такого набора будет заменен весь регистр сведений!

Набор записей регистра сведений

Общий порядок добавления новых записей в регистр сведений:

  1. Создать набор записей
  2. Установить у него отбор по тем измерениям и периоду (если регистр периодический), по которым нужно добавить новые записи
  3. Добавить в набор необходимое количество новых записей
  4. Записать набор записей

Рассмотрим на примерах работу с набором записей средствами языка 1С

// работа с набором записей
	
//создание набора записей
НаборТарифы = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
 
//количество записей набора
Колво = НаборТарифы.Количество(); //0
 
//чтение набора записей из базы
//если не вызвать метод Прочитать и не добавить записи, то запишется пустой набор записей!
НаборТарифы.Прочитать();
Колво = НаборТарифы.Количество(); //вернет количество записей в наборе
 
//добавление записей
ЗаписьНабора = НаборЗаписей.Добавить();
ЗаписьНабора.Сотрудник = Сотрудник;
ЗаписьНабора.ВидТарифа = Перечисления.ВидыТарифов.ПоДням;
ЗаписьНабора.Период = ТекущаяДата();
ЗаписьНабора.Тариф = 6000;
 
//выгрузка в таблицу значений
ТаблицаТарифов = НаборТарифы.Выгрузить();
 
//удаление всех записей набора
НаборТарифы.Очистить();
 
//загрузка из таблицы значений
НаборТарифы.Загрузить(ТаблицаТарифов);
 
//удаление первой записи набора
НаборТарифы.Удалить(0);
 
//выгрузка одной колонки в массив
МассивТоваров = НаборТарифы.ВыгрузитьКолонку("Сотрудник");

//загружаем обратно
НаборТарифы.ЗагрузитьКолонку(МассивТоваров, "Сотрудник");
 
//сумма всех значений ресурса, если его тип содержит тип Число
Итог = НаборТарифы.Итог("СуммаТарифа");
 
//запись набора
НаборТарифы.Записать();

Изменение записей регистра сведений

Для того, чтобы изменить существующие записи регистра сведений, нужно сначала прочитать их через набор записей, потом перебрать в цикле, изменить и записать набор записей.

Изменим, например, все часовые оклады, добавив 10%.

//Изменение записей регистра сведений
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидТарифа.Установить(Перечисления.ВидыТарифов.Почасовой);
НаборЗаписей.Прочитать();
//Переберем в цикле все записи набора
Для Каждого ЗаписьНабора из НаборЗаписей Цикл
	//Добавим 10%
	ЗаписьНабора.Тариф = ЗаписьНабора.Тариф*1.1;
КонецЦикла;
НаборЗаписей.Записать();

Удаление записей регистра сведений

//Удаление записей из регистра сведений

//1. Удалить записи с определенным отбором
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидТарифа.Установить(Перечисления.ВидыТарифов.ПоДням);
НаборЗаписей.Отбор.Период.Установить(ДатаФильтра);
//Запишем пустой набор записей
НаборЗаписей.Записать();

//2. Очистить регистр сведений программно
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
//Все записи регистра сведений будут удалены

//3. Выборочное удаление записей по какому-нибудь условию
//Здесь рассмотрим пример обработки записей с учетом значения реквизитов
//Наложить отбор непосредственно на реквизиты нельзя, поэтому следует использовать другой способ
НаборЗаписей = РегистрыСведений.ТарифыРаботников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидТарифа.Установить(Перечисления.ВидыТарифов.Почасовой);
НаборЗаписей.Прочитать();
//Переберем в цикле все записи набора
МассивЗаписейКУдалению = Новый Массив;
Для Каждого ЗаписьНабора из НаборЗаписей Цикл
	Если ЗаписьНабора.Примечание = "Служебная запись" Тогда
		МассивЗаписейКУдалению.Добавить(ЗаписьНабора);
	КонецЕсли;
КонецЦикла;
//Вторым циклом удалим ненужные записи из набора регистра сведений
Для Каждого ЗаписьКУдалению Из МассивЗаписейКУдалению Цикл
	НаборЗаписей.Удалить(ЗаписьКУдалению);
КонецЦикла;
НаборЗаписей.Записать();

Менеджер записи регистра сведений

//Создание при помощи менеджера записи регистра сведений
ЗаписьМенеджер = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
ЗаписьМенеджер.Сотрудник = Сотрудник;
ЗаписьМенеджер.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
ЗаписьМенеджер.Период = ПериодЗаписиУдаления;
ЗаписьМенеджер.Записать();

//Изменение записи через менеджер записи
ЗаписьМенеджер = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
ЗаписьМенеджер.Сотрудник = Сотрудник;
ЗаписьМенеджер.ВидТарифа = Перечисления.ВидыТарифов.ПоДням;
ЗаписьМенеджер.Период = ПериодЗаписиУдаления;
ЗаписьМенеджер.Прочитать();

Если ЗаписьМенеджер.Выбран() Тогда
	ЗаписьМенеджер.Тариф = 7000;
	ЗаписьМенеджер.Записать();
КонецЕсли;

//Удаление при помощи менеджера записи
ЗаписьМенеджер = РегистрыСведений.ТарифыРаботников.СоздатьМенеджерЗаписи();
ЗаписьМенеджер.Сотрудник = Сотрудник;
ЗаписьМенеджер.ВидТарифа = Перечисления.ВидыТарифов.Почасовой;
ЗаписьМенеджер.Период = ПериодЗаписиУдаления;
ЗаписьМенеджер.Удалить();

Ключ записи регистра сведений

// создать ключ записи
//пустой ключ	
ПустойКлюч = Новый("РегистрСведенийКлючЗаписи.ТарифыРаботников");
//используя менеджер
ПустойКлюч = РегистрыСведений.ТарифыРаботников.ПустойКлюч();
 
//ключ на определенную запись регистра
ЗначенияКлюча = Новый Структура;
ЗначенияКлюча.Вставить("Период", Дата(2021,01,31));
ЗначенияКлюча.Вставить("Сотрудник", СсылкаНаСотрудника);
ЗначенияКлюча.Вставить("ВидТарифа", Перечисления.ВидыТарифов.ПоДням);
КлючЗаписи = РегистрыСведений.ТарифыРаботников.СоздатьКлючЗаписи(ЗначенияКлюча);

Изменение записей в регистр сведений с подчинением регистратору

Рассмотрим пример. Допустим, у нас есть документ “Назначение материально ответственных лиц”, в котором мы в табличной части указываем склад и соответствующее ему МОЛ. Этот документ записывает движения в регистр сведений МОЛПоСкладам, со следующими настройками:

  • Измерения: Склад, тип СправочникСсылка.Склады
  • Ресурсы: МОЛ, тип СправочникСсылка.Сотрудники
  • Реквизиты: Примечание, тип Строка(100)
  • Периодичность: в пределах месяца
  • Режим записи: Подчинение регистратору

Для изменения записей регистра сведений, подчиненного регистратору, нужно иметь ссылку на документ-регистратор. После этого необходимо получить движения объекта по этой ссылке, по нужному регистру. Далее мы получаем набор записей, и работа с ним аналогична работе при использовании метода СоздатьНаборЗаписей. Для того чтобы изменить движения документа, также следует вызвать метод Прочитать. Второй вариант – заново добавить нужные записи в движения, в этом случае новый набор полностью заменит старый.

ОбъектРегистратор = СсылкаНаДокумент.ПолучитьОбъект();
ДвиженияПоРегистру =ОбъектРегистратор.Движения.МОЛПоСкладам;
ДвиженияПоРегистру.Прочитать();
Для Каждого ЗаписьДокумента Из ДвиженияПоРегистру Цикл
	ЗаписьДокумента.Примечание = "Запись обработана программно";
КонецЦикла;
ДвиженияПоРегистру.Записать();

Примеры работы с периодическим регистром сведений

Периодический регистр сведений позволяет получать данные о самых первых и самых последних записях. Для этого платформа предусматривает две виртуальные таблицы – СрезПервых и СрезПоследних. В определенных случаях можно включить итоги для среза первых и/или последних. Это может многократно ускорить получение данных, так как при этом будут созданы физические таблицы, откуда данные будут извлекаться гораздо быстрее, чем из виртуальных.

Для работы с виртуальными таблицами периодического регистра сведений можно использовать два подхода – объектные методы и язык запросов. Рассмотрим каждый из этих способов. Для наглядности срез первых мы получим при помощи объектной техники, а срез последних – при помощи запроса.

Получить самые ранние записи (Срез первых)

Получим самые ранние записи тарифов с видом тарифа “ПоДням”

//Как получить самые первые записи
Отбор = Новый Структура("ВидТарифа", Перечисления.ВидыТарифов.ПоДням);
СрезПервых = РегистрыСведений.ТарифыРаботников.СрезПервых(ДатаСреза, Отбор);
//Получим таблицу значений со структурой колонок, аналогичной структуре регистра сведений
//В результат попадут наиболее ранние записи регистра, соответствующие установленным значениям ключевых полей.
//Записи подбираются для каждой комбинации из всех имеющихся значений измерений регистра.
//При этом, если есть записи с датой реньше, чем начало периода, они учитываться не будут.
Для Каждого СтрСреза Из СрезПервых Цикл
	Сообщить(СтрШаблон("Самый ранний тариф по дням для сотрудника %1: %2", СтрСреза.Сотрудник, СтрСреза.Тариф)); 
КонецЦикла;

Получить самые поздние записи (Срез последних)

//Как получить последние записи регистра сведений на дату
//В случае работы с запросом, можно накладывать более сложные фильтры, и извлекать только необходимые данные,
// например, только сотрудника и тариф, без лишних полей
ЗапросПоследних = Новый Запрос("ВЫБРАТЬ
|	ПРЕДСТАВЛЕНИЕ(ТекущиеТарифы.Сотрудник) КАК Сотрудник,
|	ТекущиеТарифы.Тариф КАК Тариф
|ИЗ
|	РегистрСведений.ТарифыРаботников.СрезПоследних(&ДатаСреза, ВидТарифа = ЗНАЧЕНИЕ(Перечисление.ВидыТарифов.Почасовой)) КАК ТекущиеТарифы");
ЗапросПоследних.УстановитьПараметр(ДатаСреза, ДатаСреза);
Выборка = ЗапросПоследних.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(СтрШаблон("Текущий почасовой тариф для сотрудника %1: %2", Выборка.Сотрудник, Выборка.Тариф)); 
КонецЦикла;

В ЗУП есть регистр сведений “состояния сотрудников”, из которого срезом мы хотим выдрать всех работающих на нужную дату. У уволенных в срезе последняя запись будет “увольнение”. И вот тут у меня вопрос. ЗАпрос такого плана не работает:

    ЗапросСотрудники.Текст =

    “ВЫБРАТЬ

    |    СостоянияСотрудниковСрезПоследних.Сотрудник КАК Сотрудник,

    |    СостоянияСотрудниковСрезПоследних.Сотрудник.Код КАК ТабельныйНомер,

    |    СостоянияСотрудниковСрезПоследних.Год КАК Год,

    |    СостоянияСотрудниковСрезПоследних.Состояние КАК Состояние

    |ИЗ

    |    РегистрСведений.СостоянияСотрудников.СрезПоследних(

    |            &ДатаНачалаСобытия,

    |            Сотрудник.ГоловнаяОрганизация = &Организация

    |                И Год = &НачалоРасчетногоГода

    |                И Состояние <> ЗНАЧЕНИЕ(Перечисление.СостоянияСотрудника.Увольнение)) КАК СостоянияСотрудниковСрезПоследних

    |

    |УПОРЯДОЧИТЬ ПО

    |    Сотрудник

    |АВТОУПОРЯДОЧИВАНИЕ”;

Он вкидывает уволенных, и при этом даже не записью увольнение. Такое ощущение, что запрос смотрит срез, видет “увольнение”, и начинает смотреть еще раньше, пока не найдет нечто не-“увольнение”

А вот этот отфильтровывает нормально, уволенные не попадают в выборку вообщ:

    ЗапросСотрудники.Текст =

    “ВЫБРАТЬ

    |    СостоянияСотрудниковСрезПоследних.Сотрудник КАК Сотрудник,

    |    СостоянияСотрудниковСрезПоследних.Сотрудник.Код КАК ТабельныйНомер,

    |    СостоянияСотрудниковСрезПоследних.Год КАК Год,

    |    СостоянияСотрудниковСрезПоследних.Состояние КАК Состояние

    |ИЗ

    |    РегистрСведений.СостоянияСотрудников.СрезПоследних(

    |            &ДатаНачалаСобытия,

    |            Сотрудник.ГоловнаяОрганизация = &Организация

    |                И Год = &НачалоРасчетногоГода) КАК СостоянияСотрудниковСрезПоследних

    |ГДЕ

    |    СостоянияСотрудниковСрезПоследних.Состояние <> ЗНАЧЕНИЕ(Перечисление.СостоянияСотрудника.Увольнение)

    |

    |УПОРЯДОЧИТЬ ПО

    |    Сотрудник

    |АВТОУПОРЯДОЧИВАНИЕ”;

Я правильно понимаю между ними разницу?

Добавить комментарий