7.7 Очистка справочника номенклатура от неиспользуемых элементов

Тема в разделе "Отчеты и обработки для "1С:Предприятие 7.7"", создана пользователем GuitaristNSK, 13 дек 2011.

  1. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.627
    Симпатии:
    542
    Баллы:
    204
    Но согласись... Это самый короткий и быстрый вариант.
    Если писать обработку с поиском ссылок на объекты с учетом подчиненности.... Не мне тебе говорить сколько она будет "лопатить")))
  2. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Соглашусь. Я, мало того, его предлагал во втором посте данного топика. :angry:
  3. NovInNik
    Offline

    NovInNik Опытный в 1С

    Регистрация:
    12 ноя 2007
    Сообщения:
    235
    Симпатии:
    2
    Баллы:
    29
    где до в недрах инета (вроде infostart.ru), когда-то попадалась обработка, которая переносила номенклатуру в подгруппу, у которой отсутствовало движение за определенный период времени и на дату формирования имела нулевые остатки. Затем штатными обработками можно проверить стоит удалять данный элемент или нет.
  4. koka278
    Offline

    koka278

    Регистрация:
    8 май 2014
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Ситуация похожая, только очистить нужно не всю номенклатуру, а только некоторые группы. Справочник номенклатуры связан со справочником НоменклатураПрайса, а тот со справочником Связи. Вот в справочнике связи есть дата создания позиции у поставщиков. Хочется по самой ранней дате отобрать элементы и удалить. Т.е. есть порядка 30 групп товаров, и по каждой свои временные рамки, есть товары которые нужно оставить, даже если они были добавлены 5-6 лет назад. Каждая позиция имеет код начинающийся с символа "S" затем цифры, каждая новая позиция инкремент. Будь код из чисел, задал бы цикл с первой позиции до последней и поудалял, что меньше определенного значения.

    А через выборку из базы на псевдокоде представляю примерно так:

    ВЫБРАТЬ ИЗ Справочник.Номенклатура ГДЕ
    Группа такая-то && ДатаСоздания.Справочник.Связи < Даты такой то
    ИЛИ Группа такая-то и свои условия
    Дать команду на удаление




    Сильно не бейте, человек я вообще далекий от 1С но задание дали, подскажите хотя бы в каком направление копать
    --- Объединение сообщений, 8 май 2014 ---
    Вот немного переделанная обработка, которую написал Бухгалтерский угодник, здесь удаляются все позиции по 1.01.2014, вот нужно примерно тоже самое, только для каждой группы свои промежутки временные

    Процедура Сформировать()
    Запрос = СоздатьОбъект("Запрос");

    ТекстЗапроса =

    "//{{ЗАПРОС(Сформировать)

    |Период с НачПериода по КонПериода;

    |Без итогов;

    |Номенклатура = Справочник.Номенклатура;
    |НоменклатураПрайса=Справочник.НоменклатураПрайса;
    |Связи=Справочник.Связи;
    |Группировка Номенклатура;

    |"//}}ЗАПРОС

    ;

    // Если ошибка в запросе, то выход из процедуры

    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

    Возврат;

    КонецЕсли;



    // Подготовка к заполнению выходных форм данными запроса

    Таб = СоздатьОбъект("ТаблицаЗначений");

    Запрос.Выгрузить(Таб,0,0);



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

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

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

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

    Продолжить;

    КонецЕсли;


    Спр.Удалить(0);



    КонецЦикла;

    ЗафиксироватьТранзакцию();

    КонецПроцедуры
    Последнее редактирование: 8 май 2014
  5. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.627
    Симпатии:
    542
    Баллы:
    204
    На МДшник можно глянуть? Из вашего поста не ясна до конца структура.. Там просто в реквизите ссылка на элемент или это подчиненный справочник?
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.627
    Симпатии:
    542
    Баллы:
    204
    Вот примерный запрос по дате создания

    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Номенклатура = Справочник.Связи.Владелец;
    |ТекущийЭлемент = Справочник.Связи.ТекущийЭлемент;
    |ДатаСоздания = Справочник.Связи.ДатаСоздания;
    |Группировка Номенклатура;
    |Группировка ТекущийЭлемент;
    |Группировка ДатаСоздания;
    |Условие(ДатаСоздания <= ВыбДатаСоздания);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    koka278 нравится это.
  7. koka278
    Offline

    koka278

    Регистрация:
    8 май 2014
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    А разграничение по группам можно сделать еще, например

    Запрос
    {...}

    Если Группа такая ТО
    ВыбДатаСоздания=1;
    ИначеЕсли Группа Такая То
    ВыбДатаСоздания=2;
    ...
    Иначе Группа Такая То
    ВыбДатаСоздания=n;
    КонецЕсли
  8. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.627
    Симпатии:
    542
    Баллы:
    204
    сделать группировку ДатаСоздания в запросе первой
  9. koka278
    Offline

    koka278

    Регистрация:
    8 май 2014
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    В смысле группировку, по группам из Номенклатуры, Видеокарты, Процессоры и тд. Для них просто различаются "даты устаревания"
  10. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.627
    Симпатии:
    542
    Баллы:
    204
    Это же сколько реквизитов то на форме нужно?
    Может проще добавить на форму выбор группы еще? Тогда запрос примет вид

    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Номенклатура = Справочник.Связи.Владелец;
    |ТекущийЭлемент = Справочник.Связи.ТекущийЭлемент;
    |ДатаСоздания = Справочник.Связи.ДатаСоздания;
    |Группировка Номенклатура;
    |Группировка ТекущийЭлемент;
    |Группировка ДатаСоздания;
    |Условие(ДатаСоздания <= ВыбДатаСоздания);
    |Условие(Номенклатура в ВыбТМЦ);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    koka278 нравится это.
  11. koka278
    Offline

    koka278

    Регистрация:
    8 май 2014
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Осталось разобраться почему условие отбора по дате создания не выполняется
    Код:
    //*******************************************
    Процедура Сформировать()
    
       Запрос = СоздатьОбъект("Запрос");
    
       ТекстЗапроса =
       "//{{ЗАПРОС(Сформировать)
       |Номенклатура = Справочник.Связи.Владелец;
       |ТекущийЭлемент = Справочник.Связи.ТекущийЭлемент;
       |ДатаСоздания = Справочник.Связи.ДатаСоздания;
       |Группировка Номенклатура;
       |Группировка ТекущийЭлемент;
       |Группировка ДатаСоздания;
       |Условие(ДатаСоздания<ВыбДатаСоздания);
       |"//}}ЗАПРОС
       ;
    // Если ошибка в запросе, то выход из процедуры
    
       Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
          Возврат;
       КонецЕсли;
    
    
    
    // Подготовка к заполнению выходных форм данными запроса
    
       Таб = СоздатьОбъект("ТаблицаЗначений");
       Запрос.Выгрузить(Таб);
    
       Спр=СоздатьОбъект("Справочник.Номенклатура");
    
    //Перебор элементов группы
       Спр.НайтиПоКоду("a0000001");
       a0000001=Спр.ТекущийЭлемент();
       Спр.ИспользоватьРодителя(a0000001);
       Спр.ВыбратьЭлементы();
    
    
       Пока Спр.ПолучитьЭлемент()=1 Цикл
          Если Спр.ЭтоГруппа()=1 Тогда
             Продолжить;
          КонецЕсли;
    
         Спр.Удалить(1);
       КонецЦикла;
    
    КонецПроцедуры
  12. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.627
    Симпатии:
    542
    Баллы:
    204
    в коде не вижу где вы применяете результаты запроса...
    Ну пробежались циклом с учетом родителя... Что тут такого?
    Нужно перебирать таблицу в цикле!
  13. koka278
    Offline

    koka278

    Регистрация:
    8 май 2014
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    А как обратиться к результату запроса, сохранив цикл с учетом родителя, я так понял нужно использвать группировку по дате создания, что-то типа
    Код:
        Пока Запрос.Группировка("ДатаСоздания") =1 Цикл
            Спр.Удалить(1);  
        КонецЦикла;
    
  14. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.627
    Симпатии:
    542
    Баллы:
    204
    Запрос.Выгрузить(Таб);
    Таб.ВыбратьСтроку();

    может так вам понятнее будет....
    koka278 нравится это.
  15. koka278
    Offline

    koka278

    Регистрация:
    8 май 2014
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Попробывал через найтиэлемент - поле агрегатного объекта не обнаружено
    Код:
       Таб = СоздатьОбъект("ТаблицаЗначений");
       Запрос.Выгрузить(Таб); 
       
        Спр=СоздатьОбъект("Справочник.Номенклатура");
           
    //        Пока Таб.ПолучитьСтроку() Цикл;
           
            Спр.НайтиПоКоду("S0009896");
            S0009896=Спр.ТекущийЭлемент();
            Спр.ИспользоватьРодителя(S0009896);
            Спр.ВыбратьЭлементы();
           
           
            Пока Спр.ПолучитьЭлемент()=1 Цикл
               Если Спр.ЭтоГруппа()=1 Тогда
                    Продолжить;
                КонецЕсли;
                Если Таб.НайтиЭлемент(Спр.ТекущийЭлемент)=1 Тогда
                   Спр.Удалить(1);  
               КонецЕсли;
            КонецЦикла;
    
  16. koka278
    Offline

    koka278

    Регистрация:
    8 май 2014
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Можно конечно вот так вот грохнуть всю номенклатуру на определенное число, но важно именно что для разных групп свои даты
    Код:
    Процедура Сформировать()
     
       Запрос = СоздатьОбъект("Запрос");
    
       ТекстЗапроса =
       "//{{ЗАПРОС(Сформировать)
       |Номенклатура= Справочник.Связи.Владелец;
       |ДатаСоздания = Справочник.Связи.ДатаСоздания;
       |Группировка Номенклатура;
       |Условие(ДатаСоздания<ВыбДатаСоздания);
       |Без Итогов;
       |";
    
       Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
          Возврат;
       КонецЕсли;
       
       Спр = СоздатьОбъект("Справочник.Номенклатура");
       
       Пока Запрос.Группировка()=1 Цикл
          Если Спр.НайтиЭлемент(Запрос.Номенклатура)=1 Тогда
             Спр.Удалить();
           КонецЕсли;
        КонецЦикла;
    
    КонецПроцедуры
    
  17. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.627
    Симпатии:
    542
    Баллы:
    204
    Для разных групп... Для этого я вам предлагал фильтр на форме - см. выше.
    + НИ В КОЕМ СЛУЧАЕ не удаляйте с параметром 1. У вас же тогда полетят ссылки.
  18. koka278
    Offline

    koka278

    Регистрация:
    8 май 2014
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Такой еще вариант предложили, но тоже игнорирует дату создания и сносит всю группу
    Код:
    Процедура Сформировать()
    
       Запрос = СоздатьОбъект("Запрос");
    
       ТекстЗапроса =
       "//{{ЗАПРОС(Сформировать)
       |Номенклатура= Справочник.Связи.Владелец;
       |ДатаСоздания = Справочник.Связи.ДатаСоздания;
       |Группировка Номенклатура;
       |Условие(ДатаСоздания<ВыбДатаСоздания);
       |Без Итогов;
       |";
       Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
          Возврат;
        КонецЕсли;
       Спр = СоздатьОбъект("Справочник.Номенклатура"); 
       
       Пока Запрос.Группировка()=1 Цикл  
    
            Если Спр.НайтиЭлемент(Запрос.Номенклатура)=1 Тогда
                Если Спр.ПринадлежитГруппе(выбРодитель)=1 Тогда 
                  Спр.Удалить(0);
                КонецЕсли;
            КонецЕсли;
       КонецЦикла;
    КонецПроцедуры
    
  19. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.627
    Симпатии:
    542
    Баллы:
    204
    Выложите саму обработку, а не код
  20. koka278
    Offline

    koka278

    Регистрация:
    8 май 2014
    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Обработка

    Вложения:

    • ert.rar
      Размер файла:
      19,9 КБ
      Просмотров:
      14