1с 77 получить периодический реквизит

Обновлено: 04.07.2024

Назначение периодических реквизитов
Включение опции «Периодический» позволяет указать для реквизита справочника хранение истории изменений его значения. Такой реквизит в системе 1С:Предприятие называется периодическим и обладает следующим свойством: в отличие от «обычных» (не периодических) реквизитов, система 1С:Предприятие хранит значения такого реквизита по датам их изменения. При обращении к значению такого реквизита на некоторую дату выдается его значение на эту дату, либо, если таковое отсутствует, — на ближайшую предыдущую дату, на которую устанавливалось значение реквизита.

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

К периодическому реквизиту можно обращаться при помощи встроенного языка системы 1С:Предприятие — получать и записывать значение реквизита на указываемую дату. Однако, следует иметь в виду, что при получении значения реквизита на какую-то дату извлекается его значение на указанную или (если значение на указанную дату отсутствует) на ближайшую предыдущую дату, а запись значения периодического реквизита выполняется всегда на указанную дату.

В режиме использования конфигурации для периодического реквизита можно вызвать окно «История». Это окно представляет собой таблицу, состоящую из двух граф: дата изменения значения реквизита справочника и значение на эту дату. Окно «История» позволяет редактировать историю изменений значения реквизита напрямую: вводить новые строки, редактировать или удалять существующие.

Методы периодических реквизитов

Внимание! Эти методы можно применять, если ранее не применялся метод ИспользоватьДату

Установка даты выборки периодических реквизитов

Объект "Периодический"
Для работы с историей периодического реквизита очень удобно использовать объект "Периодический".

Пример, вывести историю карьеры сотрудника за текущий год:

С помощью объекта Периодический можно также редактировать и удалять значения.

Проведение документов
При проведении документа часто требуется установить новое значение периодического реквизита на определенную дату. Это называется движение документа. В этом случае следует применять метод УстановитьРеквизитСправочника:

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

Чтение и запись периодических реквизитов.
Установка даты выборки периодических реквизитов для всего справочника.

Разместил: E_Migachev  Версии: | 7.x |  Дата: 23.08.2009   Прочитано: 29023

Распечатать

Похожие FAQ

Ввод записей в журнал расчетов  1
Добавление записи в журнал расчетов: Метод Новая может быть вызван где угодно, в глобальном модуле, модуле обработок, документов и т.д. Данный метод проверяет корректность заполненных реквизитов журнала расчетов. При вводе новых записей журнал Внешние источники данных  0
Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес пр Выборка (перебор) бизнес-процессов  0
Выбрать( , , , ) отбора отбора (необязательный) - Структура. Задает реквизит вида расчета и значение этого реквизита, по которому будет создана выборка. Ключ структуры задает имя реквизита, а значение структуры - значение отбора по этому рекви Выборка (перебор) видов расчета  0
Выбрать( , ) (необязательный) - Структура. Задает реквизит вида расчета и значение этого реквизита, по которому будет создана выборка. Ключ структуры задает имя реквизита, а значение структуры - значение отбора по этому реквизиту. В качестве рекви Выборка запросом, перебор задач  1
Выбрать( Отбор , Порядок ) Отбор (необязательный) - Структура. Задает реквизит вида расчета и значение этого реквизита, по которому будет создана выборка. Ключ структуры задает имя реквизита, а значение структуры - значение отбора по этому рекви Посмотреть все результаты поиска похожих

Еще в этой же категории

Создание и запись нового элемента справочника  12
НаКлиенте Процедура ПоКнопкеНовыйКонтрагент(Команда) // Вставить содержимое обработчика. Перем НовыйКонтрагент; НовыйКонтрагент = Новый Структура(" Наименование, ПолноеНаименование, ИНН" ); НовыйКонтрагент.Наименование = " РиК ООО" ; НовыйКон Как для Выбора Элемента Справочника Открыть Форму Выбора с нужной Открытой Группой?  8
Порядок действий такой: 1. В поле ввода " Номенклатура" добавь событие ПриНачалеВыбора. 2. Установи в них СтандартнаяОбработка = Ложь; 3. Получи форму выбора нужного справочника 4. Установи отбор по родителю 5. Открой форму для выбора Теп Перебрать, выбрать элементы справочника  7
Выборка = Справочники.Сотрудники.Выбрать(); //или Выборка = Справочники.Сотрудники.ВыбратьИерархически(); Пока выборка.Следующий() = 1 Цикл . //действия с очередным элементом . Сообщить(" Сотрудник " + выборка.Наименование); КонецЦикла; / Перебрать, выбрать элементы подчиненного справочника  7
Перебор элементов справочника принадлежащих элементу другого справочника, т.е когда один справочник подчинен другому справочнику. // Получить выборку по указанному контрагенту. Выборка = Справочники.КонтактныеЛица.Выбрать( , Контрагент); Пока Вы Как программно открыть и выбрать элемент справочника, выбор элемента справочника?  7
Просто открыть: // Получить форму выбора справочника как подчиненную форме документа ФормаСписка = Справочники.Номенклатура.ПолучитьФормуСписка( , ЭтаФорма); // Открыть полученную форму ФормаСписка.Открыть(); Открыть для выбора элемента: Ф Посмотреть все в категории Справочники

"Немногие думают чаще, чем два или три раза в год. Я добился мировой
известности благодаря тому, что думаю раз или два в неделю".
Бернард Шоу

Как я и обещал, сегодня мы рассмотрим работу с объектом, который имеет самое непосредственное отношение к периодическим реквизитам. Я думаю, что Вы уже твердо усвоили, что для работы с периодическими реквизитами всегда используется дата: вы всегда указываете дату на которую хотите получить значение и всегда указываете дату с которой хотите изменить значение периодического реквизита справочника или константы. Но попробуйте решить следующую простую задачу: необходимо определить когда менялось значение реквизита и какие значения принимались. Используя материалы предыдущих выпусков, легко получается следующая процедура:

Процедура Сформировать()
НачДата='01.01.2001'; КонДата='01.12.2002'; ///даты могут быть любыми
ПредыдущееЗначение="";
для к=НачДата по конДата цикл //пробежимся по всем датам между НачДата и КонДата
сейчас=Константа.Руководитель.Получить(к);
Если сейчас<>ПредыдущееЗначение тогда //простое условие сравнения
сообщить(к+" "+Строка(сейчас)); //сообщаем, если значение изменилось
ПредыдущееЗначение=сейчас; //
конецЕсли;
конецЦикла;
КонецПроцедуры

Прим.: я надеюсь, что цикл по датам не вызывает у Вас затруднений?
Процедура простая, но трудоемкая для 1С - ранее я уже говорил, что работа с периодикой очень медлительна.

Знакомьтесь! Объект "Периодический". Он решит Ваши проблемы. Этот объект не имеет визуального представления. Доступ к его атрибутам и методам осуществляется после создания объекта с помощью метода "СоздатьОбъект". Основное назначение объекта - доступ к значениям периодических реквизитов.

Атрибуты объекта "Периодический":

Значение - доступ к значению периодического реквизита или периодической константы.
ДатаЗнач - доступ к дате значения периодического реквизита или периодической константы.

Методы, применяемые к объект, достаточно просты и понятны, но особого внимания заслуживает метод ИспользоватьОбъект.

ИспользоватьОбъект(имяРеквизита, Объект) - метод назначает объекту Периодический - реквизит объекта для работы. Что это означает? Есть объект - элемент справочника сотрудники - "Петров". У этого Петрова - куча периодических реквизитов, но нас интересует только один - "Оклад". Вот этот метод и ждет от нас, что мы ему скажем ИспользоватьОбъект("Оклад", спр.ТекущийЭлемент()) , где спр.ТекущийЭлемент() - тот элемент на котором мы стоим (не важно как мы его получили, возможно, спр.НайтиПоНаименованию("Петров")). Предостерегаем от ошибок: ИспользоватьОбъект("Оклад", "Справочник.Сотрудники"); ИспользоватьОбъект("Оклад", "Справочник.Сотрудники.Петров");
Если вместо наименования реквизита передать пустую строку, то дальнейшая работа будет выполняться со всеми периодическими реквизитами справочника.

Рассмотрим примеры, отражающий основные методики работы с объектом.

Задача 1. Перебрать все значения курса доллара за заданный период.

Процедура Перебор()
п=СоздатьОбъект("Периодический"); //создали объект
спр=СоздатьОбъект("Справочник.Валюты"); //создаем справочник, чтобы спозиционироваться на объекта
если Спр.НайтиПоНаименованию("USD")=0 тогда //ищем доллары
сообщить("не нашли валюту"); //если не нашли, уходим
возврат;
конецЕсли;
п.ИспользоватьОбъект("Курс", спр.ТекущийЭлемент()); //вот этот метод
НачДата='01.01.2001'; КонДата='01.12.2002'; //даты могут быть любые
п.выбратьЗначения(НачДата, КонДата); //выбираем периодику курса
пока п.ПолучитьЗначение()=1 цикл //получаем значения
Сообщить(" "+п.ДатаЗнач+" "+п.Значение); //сообщаем
конецЦикла;
конецПроцедуры

Помните таблицу в выпуске №23, где слева были даты, а справа значения на дату. Фактически эта процедура бежит по таблице. В общем все достаточно просто. В выборке можно использовать метод "ОбратныйПорядок" и "ВыбратьПоДокументу".

Задача 2. Удалить все значения курса доллара, которые меньше 30 рублей. В предыдущее решение требуется добавить несколько строк

.
пока п.ПолучитьЗначение()=1 цикл //получаем значения
если п.Значение<30 тогда
Сообщить(" "+п.ДатаЗнач+" "+п.Значение);
п.Удалить();
конецЕсли;
КонецЕсли;
.

Задача 3. Очистить всю историю в справочнике "Валюты" до 2001 года. Самостоятельно.

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

В жизни, как в такси: счетчик отмечает пройденное
даже тогда, когда мы стоим на месте.

Напомню Вам, что в прошлом выпуске речь шла о периодических константах. Как оказалось - одним из интереснейших моментов была фраза "Примечание: на самом деле тут я не прав: есть в 1С, один баг, когда возникает 2 значения на 1 дату." Пришло много заявок с просьбой рассказать об этом. Обещаю Вам, что в ближайшем выпуске, я это сделаю. Но сегодня речь пойдет о периодических реквизитах справочников.

Необходимость периодических реквизитов никто не отрицает. Классическим примером может служить справочник "Валюты", где существует два периодических реквизита - "Курс" и "Кратность". Но рекордсменами, на мой взгляд, все -таки является справочники "Основные средства" и "Сотрудники".

Включение опции «Периодический» у реквизита справочника, позволяет указать для реквизита справочника хранение истории изменений его значения. Такой реквизит в системе 1С:Предприятие называется периодическим. Этот реквизит обладает следующим свойством: в отличие от «обычных» (не периодических) реквизитов, система 1С:Предприятие хранит значения такого реквизита по датам их изменения. При обращении к значению такого реквизита на некоторую дату выдается его значение на эту дату, либо, если таковое отсутствует, — на ближайшую предыдущую дату, на которую устанавливалось значение реквизита.

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

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

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

Ручное изменение.
При просмотре списка справочника (или элемента справочника) Вы всегда видите значение периодических реквизитов на рабочую дату. По этому для ручного изменения значения реквизитов лучше пользоваться клавишей F5 (или меню "Действия" ->"История значения"). При этом Вам потребуется выбрать реквизит, который Вы хотите изменить. После этого открывается окно истории в котором две колонки: "Дата" и "Значение". Здесь Вы сможете изменить любое значение и любую дату, добавить строки или удалить строки. Этот способ является встроенным в систему и не зависит от компоненты и конфигурации.
В некоторых конфигурациях существует программно реализованная возможность работы с периодическими реквизитами. Чаще всего эта возможность "прячется" под кнопкой "История". При нажатии на эту кнопку открывается окно, в котором Вы получаете много дополнительных возможностей. Но большая часть из них сводится к удалению значений/дат и чистку истории. По крайней мере, в 4.26 конфигурации бухгалтерии я не смог изменить значения реквизита через кнопку "История".

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

Получить(ДатаЗн) - этот метод позволяет получить значение на указанную дату. Наиболее просто объяснит его работу на небольшом примере:
Процедура Сформировать()
спр=СоздатьОбъект("Справочник.Валюты");
спр.ВыбратьЭлементы(); //перебираем элементы
Пока спр.ПолучитьЭлемент()=1 цикл
курсВалюты=спр.курс.Получить('01.01.2002'); //получаем значение курса на 1 января 2002 года
КратностьВалюты=спр.кратность.Получить('01.01.2002'); //получаем кратность на 1 янв. 2002 г.
Сообщить(спр.Наименование);
Сообщить(курсВалюты);
Сообщить(КратностьВалюты);
конецЦикла;
конецПроцедуры

Комментарий к примеру: "Курс" и "Кратность" - это реквизиты справочника "Валюты". Процедура перебирает элементы справочника и сообщает наименование валюты, курс и кратность на 1 января 2002 года. Обращаю Ваше внимание на использование метода Получить: метод применяется к реквизиту.

Установить(датаУстановки, .Значение) - метод позволяет устанавливать значение периодического реквизита на любую дату. Предыдущий пример легко изменить, чтобы процедура устанавливала значение курса и кратности для всех валют в какое-то одно значение:
Процедура Сформировать()
спр=СоздатьОбъект("Справочник.Валюты");
спр.ВыбратьЭлементы(); //перебираем элементы
Пока спр.ПолучитьЭлемент()=1 цикл
// устанавливаем значение курса на 1 января 2002 года равным единице
спр.курс.Установить('01.01.2002', 1);
//устанавливаем кратность на 1 янв. 2002 г. равной 2.
спр.кратность.Установить('01.01.2002', 2);
конецЦикла;
конецПроцедуры

Обратите внимание: в этом способе, при записи истории не нужно использовать метод Записать(). Вообще, обращение к периодическим реквизитам - трудоемкая операция для 1С. И чем больше Вы получаете значений периодических реквизитов для одного объекта, тем дольше все это работает. В том случае, если приходится обрабатывать много реквизитов на одну дату у одного объекта, я рекомендую использовать метод ИспользоватьДату()

ИспользоватьДату(Дата, УстСразу) - метод позволяет задать дату для работы со всеми периодическими реквизитами сразу для всего справочника, созданного с помощью СоздатьОбъект(). После его применения, обращение к периодическими реквизитам происходит так же как к обычным реквизитам. Важно. После метода ИспользоватьДату() нельзя использовать методы Установить() и Получить().
Особого внимания заслуживает флаг УстСразу. Если УстСразу=0, тогда метод начинает работать со следующей выборки элементов. Если устСразу=1, тогда метод начинает работать уже в текущей выборке

//*******************************************
Процедура Сформировать()
спр=СоздатьОбъект("Справочник.Валюты");
спр.ИспользоватьДату('01.01.2002');
спр.ВыбратьЭлементы(); //перебираем элементы
Пока спр.ПолучитьЭлемент()=1 цикл
спр.курс=121; // обращаемся к курсу как к простому реквизиту
спр.кратность=233;
спр.записать(); //теперь обязательно надо записать изменения.
конецЦикла;
КонецПроцедуры

Получение значений периодических реквизитов после метода ИспользоватьДату() - выполняется аналогичным образом:

Процедура Сформировать()
спр=СоздатьОбъект("Справочник.Валюты");
спр.ИспользоватьДату('01.01.2002', 1);
спр.ВыбратьЭлементы(); //перебираем элементы
Пока спр.ПолучитьЭлемент()=1 цикл
курсВалюты=спр.курс;
КратностьВалюты=спр.кратность;
Сообщить(спр.Наименование);
Сообщить(курсВалюты);
Сообщить(КратностьВалюты);
конецЦикла;
конецПроцедуры

Изменение периодических реквизитов справочника документами.
Периодические реквизиты могут быть изменены не только вручную и программно из обработки, но и при проведении документа. Я это считаю отдельным способом, так как методика работы в этом случае несколько отличается от обычной ситуации. Все дело в том, что при проведении документа, значение реквизита устанавливается в нужное значение, а при распроведении документа - восстанавливается предыдущее значение. Восстановление происходит автоматически. Нет необходимости в использовании процедуры отмены обработки проведения. Обращаю Ваше внимание на то, что такая манипуляция возможна только с периодическими реквизитами. Для обычных реквизитов это не работает. Для установки значений используется метод УстановитьРеквизитСправочника(). Этот метод можно применять только в модуле документа. Синтаксис метода:
УстановитьРеквизитСправочника(Элем,Рекв,Зн,ДатаУст,ИмяТ,Длина,Точность);
где Элем - элемент справочника, для которого меняется значение периодического реквизита
Рекв - имя изменяемого реквизита (как оно задано в конфигураторе)
Зн - устанавливаемое значение
ИмяТ, Длина, Точность - используются для реквизитов неопределенного типа. В остальных случаях - их применение не обязательно.
Пример применения этого метода Вы может найти в типовой бухгалтерии (у меня 4.2) в документах: "Приказ о приеме на работу", "Приказ о кадровых изменениях", "Ввод в эксплуатацию ОС", "Перемещение ОС", "Принятие к учету НМА" и других документах.

Наблюдение: на собственном опыте знаю, что бухгалтеры делают миллион ошибок, когда сталкиваются с периодическими реквизитами. Им очень трудно объяснить, что изменять значения надо через кнопку F5, что значение в расчетах может использоваться не то, которое они видят в справочнике, а какое-то другое, которое было "тогда". Универсального рецепта для борьбы с этим не знаю. В своей практике стараюсь заставлять бухгалтера менять периодическое значение только через документ. В этом случае резко уменьшается количество записи ошибок "не на ту" дату. Из-за периодических элементов очень страдает, на мой взгляд, программа Зарплата и кадры.

Задание для самостоятельной работы:

1. Создайте документ, предназначенный для изменения курсов валют в справочнике Валюты.

2. В справочнике "Основные средства" есть надпись "Значения периодических реквизитов указаны на дату. ". Рядом кнопка для изменения даты. Как изменение даты влияет на отображаемые значения реквизитов.

Для работы с периодическими реквизитами справочников и периодическими константами в системе используется специальный агрегатный тип данных — «Периодический». Объекты данного типа предназначены для возможности записи, редактирования и удаления значений периодических реквизитов справочников и периодических констант непосредственно из программного модуля, без необходимости прибегать к интерактивным операциям.

Контекст работы с объектом Периодический

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

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

Англоязычный синоним ключевого слова Периодический — Periodic .

Атрибуты объекта Периодический

Значение

Значение периодического реквизита справочника или константы.

Англоязычный синоним:

Атрибут Значение предоставляет доступ к значению выбранного периодического реквизита справочника или константы.

// Позиционируем созданный объект Вал по известному коду

Если Вал.Выбран() = 1 Тогда

Предупреждение("Не найдена валюта!");

Пока ПерВал.ПолучитьЗначение() = 1 Цикл

ДатаЗнач

Дата значения периодического реквизита справочника или константы.

Англоязычный синоним:

Атрибут ДатаЗнач предоставляет доступ к дате значения выбранного периодического реквизита справочника или константы.

См. предыдущий пример

Методы объекта Периодический

ИспользоватьОбъект

Задать объект применения.

Англоязычный синоним:

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

Необязательный параметр. Значение элемента справочника, для которого задается применение объекта «Периодический». Данный параметр требуется задавать только в случае, если < ИмяРеквизита > — периодический реквизит справочника.

Возвращаемое значение:

Число: 1 — если вызов метода закончился успешно, 0 — если нет.

Метод ИспользоватьОбъект задает соответствие созданного ранее объекта типа «Периодический» тому периодическому реквизиту справочника или периодической константе, для которой он будет применяться. Если параметр < ИмяРеквизита > не задан (пустая строка), а параметр < Объект > задает элемент справочника, то выборка будет осуществляться по всем периодическим реквизитам справочника.

Читайте также: