Получить дату значения периодического реквизита

  Маркет42 - Место для твоих разработок  

Я
   mastodont

25.11.12 — 11:24

Подскажите как в 7-ке получить дату последнего изменения периодического реквизита справочника?

И можно ли вообще такое сделаит программно?

Хочется посмотреть в торговле все цены, которые не менялись, например, пол года. И не пойму как это сделать. С 7-й ужк давно не работал.

  

Партнерская программа EFSOL Oblako

   miki

1 — 25.11.12 — 12:05

Начал бы с ЖКК, если типовых под рукой нет, а поиск юзать западло.

   Heckfy

2 — 25.11.12 — 12:33

Кури СоздатьОбъект(«Периодический»);

   mastodont

3 — 27.11.12 — 18:43

(1) а в типовых это где-то используется?

   Злопчинский

4 — 27.11.12 — 18:45

(3) поищи в конфигурации поиск по вусем текстам «Периодический» — получишь ответ

   mastodont

5 — 27.11.12 — 18:47

(2) спасибо! то что надо!

   vova1122

6 — 27.11.12 — 18:50

пер=создатьобъект(«Периодический»);

   Контр=СоздатьОбъект(«Справочник.Контрагенти»);

   Контр.ВыбратьЭлементы();

   Пока Контр.ПолучитьЭлемент()=1 цикл  

       Если Контр.ЭтоГруппа()=1 тогда

       Продолжить;

       КонецЕсли;  

       ссс=Контр.ТекущийЭлемент();

       пер.ИспользоватьОбъект(«МойПериодическийРеквизит»,Контр.ТекущийЭлемент());

       пер.выбратьзначения();

       наявна=0;  

           ВремТЗ.УдалитьСтроки();

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

            Наявна=Наявна+1;

            ВремТЗ.НоваяСтрока();

            ВремТЗ.ДатаЗн= пер.ДатаЗнач;

            ВремТЗ.СамоЗначение=пер.Значение;

          КонецЦикла;  

Вот кусок кода из моей базы, чтоб долго не мучился

   1sevgene

7 — 27.11.12 — 19:18

Функция ПолучитьПоследнююДатуВводаПериодическогоРеквизита(ИмяРеквизита,спрЭлементСправочника)

ДатаПерЗначения = ПолучитьПустоеЗначение(«Дата»);

Пер = СоздатьОбъект(«Периодический»);

Пер.ИспользоватьОбъект(ИмяРеквизита,спрЭлементСправочника);

Если Пер.ВыбратьЗначения() = 1 Тогда

Если Пер.ПолучитьЗначение() = 1 Тогда

   ДатаПерЗначения = Пер.ДатаЗнач;

КонецЕсли;

КонецЕсли;

Пер = 0;

Возврат ДатаПерЗначения;

КонецФункции

   vova1122

8 — 27.11.12 — 19:30

(7) И получите первую, а не последнюю дату…..

   miki

9 — 27.11.12 — 19:33

(8)+1 про ОбратныйПорядок() тоже не мешало бы почитать…

  

1sevgene

10 — 27.11.12 — 19:40

Функция ПолучитьПоследнююДатуВводаПериодическогоРеквизита(ИмяРеквизита,спрЭлементСправочника)

ДатаПерЗначения = ПолучитьПустоеЗначение(«Дата»);

Пер = СоздатьОбъект(«Периодический»);

Пер.ИспользоватьОбъект(ИмяРеквизита,спрЭлементСправочника);

Пер.ОбратныйПорядок(1);

Если Пер.ВыбратьЗначения() = 1 Тогда

Если Пер.ПолучитьЗначение() = 1 Тогда

   ДатаПерЗначения = Пер.ДатаЗнач;

КонецЕсли;

КонецЕсли;

Пер = 0;

Возврат ДатаПерЗначения;

КонецФункции

TurboConf — расширение возможностей Конфигуратора 1С

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

Контекст работы с объектом

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

При создании объекта данного типа функции СоздатьОбъект() в качестве параметра передаётся ключевое слово «Периодический» (англоязычный синоним — «Periodic»):

ВремРеквизиты = СоздатьОбъект("Периодический");

или

TempProp = CreateObject("Periodic");

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

Доступ к значению выбранного периодического реквизита справочника или константы предоставляет атрибут Значение объекта "Периодический". Англоязычный синоним имени атрибута — Value.

Доступ к дате значения выбранного периодического реквизита справочника или константы предоставляет атрибут ДатаЗнач объекта "Периодический". Англоязычный синоним имени атрибута — DateVal.

Пример использования атрибутов:

Вал = СоздатьОбъект("Справочник.Валюты");

Вал.НайтиПоКоду(1);
Если Вал.Выбран() = 1 Тогда
   Доллар = Вал.ТекущийЭлемент();
Иначе
   Предупреждение("Не найдена валюта!");
   Возврат;
КонецЕсли;
ПерВал = СоздатьОбъект("Периодический");
ПерВал.ИспользоватьОбъект("ТекущКурс", Доллар);

ПерВал.ОбратныйПорядок(1);
ПерВал.ВыбратьЗначения();
Пока ПерВал.ПолучитьЗначение() = 1 Цикл
   Курс = ПерВал.Значение;
   ДатаКурса = ПерВал.ДатаЗнач;
КонецЦикла;

Как видно из вышеприведённого примера, методика работы с периодическими реквизитами и константами проста:

  1. С помощью функции СоздатьОбъект() создаём объект типа "Периодический".
  2. С помощью метода ИспользоватьОбъект() (см. описание метода ниже) связываем созданный объект "Периодический" с конкретным периодическим реквизитом или константой.
  3. Используя атрибуты и методы объекта "Периодический", начинаем работать с выбранным периодическим реквизитом или константой.

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

Связать созданный объект типа "Периодический" с конкретным реквизитом или константой позволяет метод ИспользоватьОбъект(). Англоязычный синоним имени метода — UseObject().

Синтаксис метода:

ИспользоватьОбъект(<ИмяРеквизита>, <Объект>)

где

  • <ИмяРеквизита> — строковое выражение, задающее название (идентификатор) периодического реквизита справочника или название (идентификатор) периодической константы, как они названы в Конфигураторе;
  • <Объект> — необязательный параметр. Значение элемента справочника, для которого задаётся применение объекта "Периодический". Данный параметр требуется задавать только в случае, если <ИмяРеквизита> — периодический реквизит справочника.

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

Задать тип периодическому реквизиту справочника или периодической константе неопределённого типа позволяет метод НазначитьТип(). Англоязычный синоним имени метода — SetType().

Синтаксис метода:

НазначитьТип(<ИмяТипа>, <Длина>, <Точность>)

где

  • <ИмяТипа> — строковое выражение — название типа данных, который назначается периодическому реквизиту справочника или периодической константе неопределённого типа, например, "Строка", "Число", "Справочник.Товары", "Документ.РасходнаяНакладная" и т.п.;
  • <Длина> — необязательный параметр. Числовое выражение — длина поля представления данных. Имеет смысл только при задании числового или строкового типа;
  • <Точность> — необязательный параметр. Числовое выражение — число знаков числа после десятичной точки. Имеет смысл только при задании числового типа.

Пример использования:

Тов = СоздатьОбъект("Справочник.Номенклатура");

Тов.НайтиПоКоду(51);
Если Тов.Выбран() = 1 Тогда
   ВыбТМЦ = Тов.ТекущийЭлемент();
Иначе
   Предупреждение("Не найден товар!");
   Возврат;
КонецЕсли;
ПерТМЦ = СоздатьОбъект("Периодический");
ПерТМЦ.ИспользоватьОбъект("ТМЦ", ВыбТМЦ);
ПерТМЦ.НазначитьТип("Справочник.Товары");

Получить значение реквизита или константы, актуальное на заданную дату позволяет метод ЗначениеНаДату(). Англоязычный синоним имени метода — ValueOnDate().

Синтаксис метода:

ЗначениеНаДату(<Дата>)

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

Примечание: При использовании данного метода текущая позиция выборки, ранее открытая методом ВыбратьЗначение(), не сдвигается и не сбрасывается.

Пример использования:

К = ПерВал.ЗначениеНаДату(ДатаП);

Найти периодическое значение на заданную дату позволяет метод НайтиЗначение() (англоязычный синоним — FindValue()). Метод возвращает 1, если вызов закончился успешно, или 0, если нет. Режим поиска в случае, если на заданную дату не существует значения периодического реквизита, задаётся параметром <Режим>. Само же полученное при этом значение следует считывать из атрибута Значение объекта "Периодический" (то есть данный метод выполняет позиционирование, как и методы выборки).

Синтаксис метода:

НайтиЗначение(<Дата>, <Режим>)

где

  • <Дата> — выражение, задающее значение даты, на которую требуется найти значение периодического реквизита справочника или периодической константы;
  • <Режим> — числовое выражение, значение которого задаёт режим поиска, если на заданную дату не существует значения периодического реквизита. Если −1 (минус единица) — возвращается значение на предыдущую дату, если 0 — возвращается код завершения неуспешной операции, если 1 — возвращается значение на последующую дату.

Пример использования:

Если ПерВал.НайтиЗначение(ДатаП, -1 ) = 1 Тогда
   К = ПерВал.Значение;
Иначе
   Предупреждение("Значение не найдено!", 3);
   Возврат;
КонецЕсли;

Открыть выборку периодических значений за указанный период позволяет метод ВыбратьЗначения() (англоязычный синоним — SelectItems()). Выборка будет происходить при помощи метода ПолучитьЗначение() среди периодических значений текущего объекта применения, заданного методом ИспользоватьОбъект(). Возвращаемым значением метода ВыбратьЗначения() является число: 1 — если вызов метода закончился успешно, 0 — если нет.

Синтаксис метода:

ВыбратьЗначения(<ДатаНачала>, <ДатаКонца>)

где

  • <ДатаНачала> — необязательный параметр. Выражение типа "Дата", задающее дату начала периода выборки периодических значений. Если параметр не задан, то выборка начинается с самой ранней имеющейся даты;
  • <ДатаКонца> — необязательный параметр. Выражение типа "Дата", задающее дату конца периода выборки периодических значений. Если параметр не задан, то выборка заканчивается самой последней имеющейся датой.

Пример использования метода:

Вал = СоздатьОбъект("Справочник.Валюты");

Вал.НайтиПоКоду(1);
Если Вал.Выбран() = 1 Тогда
   Доллар = Вал.ТекущийЭлемент();
Иначе
   Предупреждение("Не найдена валюта!");
   Возврат;
КонецЕсли;
ПерВал = СоздатьОбъект("Периодический");
ПерВал.ИспользоватьОбъект("ТекущКурс", Доллар);

ПерВал.ОбратныйПорядок(1);
ПерВал.ВыбратьЗначения();
Пока ПерВал.ПолучитьЗначение() = 1 Цикл
   Курс = ПерВал.Значение;
   ДатаКурса = ПерВал.ДатаЗнач;
КонецЦикла;

Установить порядок выборки значений, открытой методом ВыбратьЗначения(), позволяет метод ОбратныйПорядок() (англоязычный синоним — BackwardOrder()), вызов которого должен происходить до вызова метода ВыбратьЗначения(). Возвращаемым значением метода является число: 1 — если вызов метода закончился успешно, или 0 — если нет. Пример использования метода приведён выше.

Синтаксис:

ОбратныйПорядок(<Режим>)

где <Режим> — числовое выражение, результирующее значение которого задаёт режим выборки периодических значений. Если значение равно 0, устанавливается прямой порядок выборки; если значение отлично от 0 — обратный порядок выборки. Параметр является необязательным. Значение по умолчанию — 1.

Открыть выборку периодических значений, установленных указанным документом, позволяет метод ВыбратьПоДокументу() (англоязычный синоним — SelectByDoc()). Выборка будет происходить при помощи метода ПолучитьЗначение() по всем справочникам и реквизитам. То есть при использовании данного метода игнорируется установка объекта применения, задаваемая методом ИспользоватьОбъект(). Возвращаемым значением метода ВыбратьПоДокументу() является число: 1 — если вызов метода закончился успешно, 0 — если нет.

Синтаксис метода:

ВыбратьПоДокументу(<Документ>)

где <Документ> — выражение со значением типа "Документ", указывающее, по какому документу будет производиться выборка.

Пример использования метода:

Процедура ПечатьУстановокДокумента(Док)
   Если Док.Выбран() = 0 Тогда
      Возврат;
   КонецЕсли;
   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("ПечатьИстории");
   Таб.ВывестиСекцию("Отчет");
   Ист = СоздатьОбъект ("Периодический");
   Ист.ВыбратьПоДокументу(Док);
   Пока Ист.ПолучитьЗначение() = 1 Цикл
      Таб.ВывестиСекцию("Строка");
   КонецЦикла;
   Таб.Опции(0, 0, 0, 0);
   Таб.ТолькоПросмотр(1);
   Таб.Показать("Отчет");
КонецПроцедуры

Выбрать очередное значение из выборки, предварительно открытой методом ВыбратьЗначения() или ВыбратьПоДокументу(), позволяет метод ПолучитьЗначение() (англоязычный синоним — GetValue()). Само полученное значение следует считывать из атрибута Значение, а дату этого значения — из атрибута ДатаЗнач.

У метода ПолучитьЗначение() нет параметров, а возвращаемым значением является число: 1 — если элемент выбран успешно, 0 — если элемент не выбран (достигнут конец выборки).

Пример использования метода:

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

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

Пример использования:

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

Получить значение текущего элемента справочника позволяет метод ТекущийОбъект() (англоязычный синоним — CurrentObj()). Данный метод не имеет параметров и используется после получения очередного значения из выборки с помощью метода ПолучитьЗначение(). Особенно он полезен при выборке по документу (см. описание метода ВыбратьПоДокументу()).

Пример использования метода:

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

Получить наименование текущего реквизита справочника позволяет метод ТекущийРеквизит() (англоязычный синоним — CurrentAttribute()). Метод не имеет параметров и возвращает строковое значение — наименование текущего реквизита справочника.

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

Пример использования метода:

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

Получить номер строки документа, изменившей периодическое значение реквизита справочника, позволяет метод НомерСтроки() (англоязычный синоним — LineNum()). Он не имеет параметров и используется после получения очередного значения из выборки. Особенно полезен при выборке по документу или по всем реквизитам.

Пример использования метода:

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

Выполнить запись периодического значения на заданную дату позволяет метод Записать() (англоязычный синоним — Write()). Если на заданную дату уже существует запись, то она модифицируется. Возвращаемым значением метода будет число: 1 — если вызов метода закончился успешно, 0 — если нет.

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

Пример использования метода:

Процедура ЗаписьКурсаДоллара(Курс)
   Вал = СоздатьОбъект("Справочник.Валюты");
   
   Вал.НайтиПоКоду(1);
   Если Вал.Выбран() = 1 Тогда
      Доллар = Вал.ТекущийЭлемент();
   Иначе
      Предупреждение("Не найдена валюта!");
      Возврат;
   КонецЕсли;
   ПерВал = СоздатьОбъект("Периодический");
   ПерВал.ИспользоватьОбъект("Текущ_курс", Доллар);
   ПерВал.Значение = Курс;
   ПерВал.ДатаЗнач = РабочаяДата();
   ПерВал.Записать();
КонецПроцедуры

Удалить периодическое значение на заданную дату позволяет метод Удалить() (англоязычный синоним — Delete()). Возвращаемым значением метода будет число: 1 — если вызов метода закончился успешно, 0 — если нет. До вызова данного метода атрибут ДатаЗнач должен содержать дату удаляемого периодического значения.

Пример использования метода:

Процедура ЧисткаКурсов()
   Вал = СоздатьОбъект("Справочник.Валюты");
   
   Вал.НайтиПоКоду(1);
   Если Вал.Выбран() = 1 Тогда
      Доллар = Вал.ТекущийЭлемент();
   Иначе
      Предупреждение("Не найдена валюта!");
      Возврат;
   КонецЕсли;
   ПерВал = СоздатьОбъект("Периодический");
   ПерВал.ИспользоватьОбъект("Текущ_курс", Доллар);
   ПерВал.ВыбратьЗначения();
   Пока ПерВал.ПолучитьЗначение() = 1 Цикл
      Курс = ПерВал.Значение;
      ДатаКурса = ПерВал.ДатаЗнач;
      Если Курс < 1000 Тогда
         ПерВал.Удалить();
      КонецЕсли;
   КонецЦикла;
КонецПроцедуры

Другие статьи по схожей тематике

  • Работа с константами
  • Работа с датами
  • Работа с журналами документов
  • Работа со справочниками в 1С
  • Работа с формами
  • Работы с табличными формами

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


Внешние источники данных 0
Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес пр


Выборка (перебор) бизнес-процессов 0
Выбрать( , , , )
отбора
отбора
(необязательный) — Структура. Задает реквизит вида расчета и значение этого реквизита, по которому будет создана выборка. Ключ структуры задает имя реквизита, а значение структуры — значение отбора по этому рекви


Выборка (перебор) видов расчета 0
Выбрать( , )
(необязательный) — Структура. Задает реквизит вида расчета и значение этого реквизита, по которому будет создана выборка. Ключ структуры задает имя реквизита, а значение структуры — значение отбора по этому реквизиту. В качестве рекви


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


Посмотреть все результаты поиска похожих

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

ЗначениеНаДату
Получить актуальное значение на заданную дату.

Синтаксис:

ЗначениеНаДату(<Дата>)

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

ValueOnDate

Параметры:
<Дата> Выражение, задающее значение даты, на которую требуется получить периодический реквизит справочника или периодическую константу.

Возвращаемое значение:
Полученное актуальное значение на заданную дату.

Описание:
С помощью метода ЗначениеНаДату можно получить значение, актуальное на заданную дату. Причем текущая позиция выборки (см. ВыбратьЗначение) не сдвигается и не сбрасывается.

Я написал функцию, которая получает значение периодического:

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

Эта функция заполняет переменные модуля.

Перем ПереодическийЭлемент; 
Перем Спр; 
Перем ЗначениеРеквизита;

Дальше я перебираю элементы справочника, потом периодические реквизиты в справочнике и удаляю ошибку перенося реквизит на нужную дату.

Процедура Выполнить()     
	Перем Т;
	Т = СоздатьОбъект("Таблица");
	Т.ИсходнаяТаблица("Таблица");

	Спр =СоздатьОбъект("Справочник.ОсновныеСредства");
	Спр.ВыбратьЭлементы();
	Пока Спр.ПолучитьЭлемент()>0 Цикл 
		ПолучениеЗначенияПереодического("МОЛ");
		МолТек=ЗначениеРеквизита; 
		ЛиквидацияОшибкиПереодического(МолТек);

		ПолучениеЗначенияПереодического("Подразделение");
		ПодразделениеТек= ЗначениеРеквизита; 
		ЛиквидацияОшибкиПереодического(ПодразделениеТек);

		ПолучениеЗначенияПереодического("Состояние");
		СостояниеТек= ЗначениеРеквизита;
		ЛиквидацияОшибкиПереодического( СостояниеТек);

		ПолучениеЗначенияПереодического("СчетЗатрат");
		СчетЗатратТек= ЗначениеРеквизита;
		ЛиквидацияОшибкиПереодического(СчетЗатратТек);     

		ПолучениеЗначенияПереодического("СрокПолезногоИспользования");
		СрокПолезногоИспользованияТек= ЗначениеРеквизита;
		ЛиквидацияОшибкиПереодического( СрокПолезногоИспользованияТек);

		Т.ВывестиСекцию("Секция_1");
	КонецЦикла;
	Т.ТолькоПросмотр(1);
	Т.Показать()
КонецПроцедуры      

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

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

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

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

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

//так мы узнаем, какая была у сотрудника категория на определенную дату
Катег = СпрСотр.Категория.Получить(НекаяДата); 
//так мы установим сотруднику категорию на определенную дату
СпрСотр.Категория.Установить(НекаяДата, НоваяКатегория);

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

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

//можно установить дату выборки периодических реквизитов для всего справочника
СпрСотр.ИспользоватьДату(НекаяДата); 
//тогда ниже уже нельзя использовать методы Установить и Получить 
//доступ к периодическим реквизитам становится такой же, как к обычным реквизитам
Катег = СпрСотр.Категория; 
СпрСотр.Оклад = 6000;

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

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

ИсторияКарьеры = СоздатьОбъект("Периодический");
ИсторияКарьеры.ИспользоватьОбъект("Должность",ВыбрСотрудник);
ИсторияКарьеры.ВыбратьЗначения(НачГода(РабочаяДата(),КонГода(РабочаяДата()));
Пока ИсторияКарьеры.ПолучитьЗначение()=1 Цикл
....Сообщить(Строка(ИсторияКарьеры.ДатаЗнач) + " " + Строка(ИсторияКарьеры.Значение));
КонецЦикла; 

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

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

Процедура ОбработкаПроведения()
УстановитьРеквизитСправочника(Сотрудник, "Должность", НоваяДолжность, ДатаПеремещения);
КонецПроцедуры

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

Процедура ОбработкаПроведения()
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
ПривязыватьСтроку(НомерСтроки);
УстановитьРеквизитСправочника(Сотрудник, "Должность", НоваяДолжность, ДатаПеремещения);
КонецЦикла;
КонецПроцедуры

Strazik


2012-01-13 • Просмотров [ 6508 ]

 

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

Процедура Сформировать() 
    НачДата=’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
значения. Когда возникает 2 значения: если вы
изменяете периодические реквизит документом (в
модуле проведения)  и с помощью объекта
периодический. Попробуйте это проделать для
одной и той же даты! Система не ругнется и молча
создаст 2 строки в истории реквизита.  Как это
использовать технологически не знаю, но точно
знаю, что можно наступить на это и искать ошибку
долго. 

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии