Установка периодических реквизитов с точностью до секунды Ключевые слова: Периодический, реквизит, время, секунды
Как известно, время установки (секунда, минута, час) периодического реквизита появляется только, если дата документа и дата записи реквизита совпадают, поэтому такую ситуацию можно обойти путем создания дополнительного документа.
СлужебнаяУстановкаРеквизитов
Поле Шапки - ДокументОснование.
Поля ТЧ - Значение, Реквизит, Элемент.
Процедура ОбработкаПроведения()
Если ВыбратьСтроки() = 0 Тогда
Возврат;
КонецЕсли;
Пока ПолучитьСтроку() = 1 Цикл
Если ( ПустоеЗначение( Элемент ) = 1 ) или
( ПустоеЗначение( Реквизит) = 1 ) Тогда
Продолжить;
КонецЕсли;
УстановитьРеквизитСправочника( Элемент, СокрЛП( Реквизит ), Значение, ДатаДок );
КонецЦикла;
КонецПроцедуры
//Теперь самое интересное - нужно выявить факкты несоответсвия дат при записи периодических //реквизитов и провести их этим документом, я сделал это технологически так - в ОбработкеПроведения //добавляем конструкцию:
ТЗ_Позднее_Проведение = СоздатьОбъект( "ТаблицаЗначений" );
ТЗ_Позднее_Проведение.НоваяКолонка( "Дата", "Дата" );
ТЗ_Позднее_Проведение.НоваяКолонка( "Элемент", "Справочник" );
ТЗ_Позднее_Проведение.НоваяКолонка( "Реквизит" );
ТЗ_Позднее_Проведение.НоваяКолонка( "Значение" );
...
Если ДатаДляРеквизита <> ДатаДок Тогда
ТЗ_Позднее_Проведение.НоваяСтрока();
ТЗ_Позднее_Проведение.Дата = ДатаДляРеквизита;
ТЗ_Позднее_Проведение.Элемент = ТекЭлементСправочника;
ТЗ_Позднее_Проведение.Реквизит = ТекРеквизит;
ТЗ_Позднее_Проведение.Значение = ТекЗначение;
КонецЕсли;
...
Если ТЗ_Позднее_Проведение.КоличествоСтрок() > 0 Тогда
ТекСлужДок = СоздатьОбъект( "Документ.СлужебнаяУстановкаРеквизитов" );
ТекСлужДок.АвтоВремяКонецДня();
ТЗ_Позднее_Проведение.Сортировать( "Дата, Элемент" );
СтарДата = '..';
ТЗ_Позднее_Проведение.ВыбратьСтроки();
Пока ТЗ_Позднее_Проведение.ПолучитьСтроку() = 1 Цикл
Если ( ПустоеЗначение( ТЗ_Позднее_Проведение.Дата ) = 1 ) или
( ПустоеЗначение( ТЗ_Позднее_Проведение.Элемент) = 1 ) или
( ПустоеЗначение( ТЗ_Позднее_Проведение.Реквизит)= 1 ) Тогда
Продолжить;
КонецЕсли;
Если СтарДата <> ТЗ_Позднее_Проведение.Дата Тогда
СтарДата = ТЗ_Позднее_Проведение.Дата;
ТекСлужДок.Новый();
ТекСлужДок.ДатаДок = СтарДата;
ТекСлужДок.ДокументОснование = ТекущийДокумент();
ТекСлужДок.Записать();
глСписокДоковДействия.ДобавитьЗначение( ТекСлужДок.ТекущийДокумент(), "Провести" );
КонецЕсли;
ТекСлужДок.НоваяСтрока();
ТекСлужДок.Элемент = ТЗ_Позднее_Проведение.Элемент;
ТекСлужДок.Реквизит = ТЗ_Позднее_Проведение.Реквизит;
ТекСлужДок.НазначитьТип( "Значение", "Число", 14, 2 );
ТекСлужДок.Значение = ТЗ_Позднее_Проведение.Значение;
ТекСлужДок.Записать();
КонецЦикла;
ОбработкаОжидания( "ПроверкаРасписания", 2 );
КонецЕсли;
//Проведение этого служебного документа делается через гл. список значений глСписокДоковДействия
//подробности в ветке Книга знаний: Отмена проведения из открытой формы документа
//Дополнительно скажу, что при отмене основного должны удаляться и все служебные документы,
//подчиненные основному. |