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


Урок 25.
"Объект "Периодический".

 

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

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

Hosted by uCoz