понедельник, 16 марта 2015 г.

Очистка периодических реквизитов на основе прямых запросов 1с 7.7



Привествую тебя о велики путешественник! Ты еще грядешь по пустыне 1с 7.7 как и я...
Погуглив я нашел решения своей проблемы для очистки справочника товара с периодическим реквизитом ЦенаР, но о ГОРЕ! Она работала супер по алгоритмик но ничего не давала на выходе так как немогла удалить реквизиты которые были установлены документами для решения этой проблемы пришлось обратиться к любимому костылю, палочке выручалочке 1с ++ http://www.script-coding.com/1cpp.html результат моих мучений и последующей радости привожу ниже.

//========================================
Процедура ВыполнитьУдалПериодЗнач(текЭлем ,метаРеквизит, тбУдалЗначение, ИтогСчетчик, Recordset, rsDelConst, MetaDataWork)  
текст="
|SELECT Row_ID НомерЗаписи,
|Date ДатаЗнач
|FROM _1sconst (nolock)
|WHERE (objid=:ТекЭлем) AND (id=:ИДОб) AND (Date < :выбДате) ORDER BY Date DESC";
Recordset.УстановитьТекстовыйПараметр("ТекЭлем",текЭлем);
Recordset.УстановитьТекстовыйПараметр("ИДОб",MetaDataWork.ИДОбъекта(метаРеквизит));
Recordset.УстановитьТекстовыйПараметр("выбДате",ткДатаОчистки);
тбПериодЗнач = Recordset.ВыполнитьИнструкцию(текст);
    // оставляем только одно значение периодического реквизита до даты свертки
    // остальные удаляем
тбУдалЗначение.УдалитьСтроки();
тбПериодЗнач.ВыбратьСтроки();
Пока тбПериодЗнач.ПолучитьСтроку() > 0 Цикл
тбУдалЗначение.НоваяСтрока();
тбУдалЗначение.НомерЗаписи = тбПериодЗнач.НомерЗаписи;
тбУдалЗначение.ДатаЗнач = тбПериодЗнач.ДатаЗнач;
КонецЦикла;
    СчетчикЗначений = 0;
тбУдалЗначение.ВыбратьСтроки();
Пока тбУдалЗначение.ПолучитьСтроку() > 0 Цикл
        Если СчетчикЗначений > 0 Тогда
rsDelConst.УстПараметр(1, тбУдалЗначение.НомерЗаписи);
rsDelConst.ВыполнитьСкалярный();
ИтогСчетчик = ИтогСчетчик + 1;
        КонецЕсли;
        СчетчикЗначений = СчетчикЗначений + 1;
КонецЦикла;      
КонецПроцедуры
 


//========================================
Процедура УдалитьИсториюПоРеквизиту()  
ИтогСчетчик = 0;                  

    MetaDataWork = СоздатьОбъект("MetaDataWork");
    Recordset    = СоздатьОбъект("ODBCRecordSet");
rsDelConst   = СоздатьОбъект("ODBCRecordSet");
ткЗапросУдалитьКонст = "DELETE FROM _1sconst WHERE _1sconst.Row_ID = ?";
rsDelConst.Подготовить(ткЗапросУдалитьКонст);
rsDelConst.ПостроитьПараметры();

тбУдалЗначение = СоздатьОбъект("ТаблицаЗначений");
тбУдалЗначение.НоваяКолонка("НомерЗаписи", "Число",10,0);
тбУдалЗначение.НоваяКолонка("ДатаЗнач", "Дата");
Сообщить(Строка(ТекущееВремя())+" Удаляем значения периодических реквизитов в справочниках до даты свертки");      
    Периодический = СоздатьОбъект("Периодический");
    Для т = 1 По Метаданные.Справочник() Цикл
        Состояние("Удаление значений периодических реквизитов справочника " + Метаданные.Справочник(т).Идентификатор);
        // Список периодических реквизитов
        ПериодическиеРеквизиты = СоздатьОбъект("СписокЗначений");
        Для п = 1 По Метаданные.Справочник(т).Реквизит() Цикл
            Если Метаданные.Справочник(т).Реквизит(п).Периодический = 1 Тогда
                // Есть периодический реквизит
  сообщить(Метаданные.Справочник(т).Реквизит(п).Идентификатор);
                ПериодическиеРеквизиты.ДобавитьЗначение(Метаданные.Справочник(т).Реквизит(п));
            КонецЕсли;
        КонецЦикла;
        Если ПериодическиеРеквизиты.РазмерСписка() > 0 Тогда
            Сообщить("Удаление значений периодических реквизитов справочника "+Метаданные.Справочник(т).Идентификатор);
            Справ = СоздатьОбъект("Справочник."+Метаданные.Справочник(т).Идентификатор);
            Если Метаданные.Справочник(т).Владелец.Выбран() = 1 Тогда
                // подчиненный справочник (необходимо сначала выбрать владельца)
                Владельцы = СоздатьОбъект("Справочник." + Метаданные.Справочник(т).Владелец.Идентификатор);
                Владельцы.ВыбратьЭлементы();
                Пока Владельцы.ПолучитьЭлемент() = 1 Цикл
                    Справ.ИспользоватьВладельца(Владельцы.ТекущийЭлемент());
                    Справ.ВыбратьЭлементы();
                    Пока Справ.ПолучитьЭлемент() = 1 Цикл
                        Для СчетчикЦикла = 1 По ПериодическиеРеквизиты.РазмерСписка() Цикл
                            ИдРекв = ПериодическиеРеквизиты.ПолучитьЗначение(СчетчикЦикла);
ВыполнитьУдалПериодЗнач(Справ.ТекущийЭлемент(), ИдРекв, тбУдалЗначение, ИтогСчетчик, Recordset, rsDelConst, MetaDataWork);  
                        КонецЦикла;
                    КонецЦикла;
                КонецЦикла;
            Иначе
                // обычный справочник
                Справ.ВыбратьЭлементы();
                Пока Справ.ПолучитьЭлемент() = 1 Цикл
                    Для СчетчикЦикла = 1 По ПериодическиеРеквизиты.РазмерСписка() Цикл
                        ИдРекв = ПериодическиеРеквизиты.ПолучитьЗначение(СчетчикЦикла);
ВыполнитьУдалПериодЗнач(Справ.ТекущийЭлемент(), ИдРекв, тбУдалЗначение, ИтогСчетчик, Recordset, rsDelConst,MetaDataWork );  
                    КонецЦикла;
                КонецЦикла;
            КонецЕсли;
КонецЕсли;    

КонецЦикла;  
rsDelConst.Закрыть();
Recordset.Закрыть();
сообщить("Итого удалил " + ИтогСчетчик);
КонецПроцедуры            

Комментариев нет:

Отправить комментарий