Привествую тебя о велики путешественник! Ты еще грядешь по пустыне 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.Закрыть();
сообщить("Итого удалил " + ИтогСчетчик);
КонецПроцедуры