7.7 Помогите с обработкой флагов НеВключатьВпрайс

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем cplusmax, 7 сен 2010.

  1. TopicStarter Overlay
    cplusmax
    Offline

    cplusmax Опытный в 1С

    Регистрация:
    7 сен 2010
    Сообщения:
    154
    Симпатии:
    2
    Баллы:
    29
    Есть задача периодически по нажатию кнопки в справочнике Номенклатура проверять флаг НеВключатьВпрайс у номенклатуры и если он установлен у номенклатуры с положительным остатком, то его снимать... и наоборот у номенклатуры с отрицательным остатком если он не установлен, то установить.
    написал вот такую обработку:
    Код:
        СтрПериод = ?(ТекущаяДата()>= ПолучитьДатуТА(),"", 
    "Период с ДатаКонца по ДатаКонца;");
    
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
    |" + СтрПериод +
    "
    |Фирма            = Регистр.ОстаткиТМЦ.Фирма,             
    |                 Регистр.РезервыТМЦ.Фирма;
    |УпрАналитика     = Регистр.ОстаткиТМЦ.Фирма.УпрАналитика,
    |                 Регистр.РезервыТМЦ.Фирма.УпрАналитика;
    |ЮрЛицо         = Регистр.ОстаткиТМЦ.Фирма.ЮрЛицо,      
    |                 Регистр.РезервыТМЦ.Фирма.ЮрЛицо;
    |Номенклатура    = Регистр.ОстаткиТМЦ.Номенклатура,      
    |                 Регистр.Заказы.Номенклатура,
    |                 Регистр.РезервыТМЦ.Номенклатура;
    |Склад            = Регистр.ОстаткиТМЦ.Склад,             
    |                 Регистр.РезервыТМЦ.Склад;
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Резерв     = Регистр.РезервыТМЦ.Количество;   
    |Условие(Номенклатура.ЭтоГруппа()=0);
    |Функция КоличествоКонОст = КонОст(Количество);
    |Группировка Номенклатура;"; 
    
    НетОш = 1; // нет ошибок при наложении фильтров
    НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Номенклатура",    "",         "ВыбТМЦ",         ТекстЗапроса, "","СвойстваНоменклатуры");
    НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Склад",           "",       "ВыбСклад",       ТекстЗапроса, "");
    
    Если НетОш = 0 Тогда
    Возврат;
    КонецЕсли;
    те=текстЗапроса;
    Запрос = СоздатьОбъект("Запрос");
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;                               
    КонецЕсли;
    тз=СоздатьОбъект("ТаблицаЗначений");
    спр=создатьОбъект("Справочник.Номенклатура");
    Запрос.Выгрузить(тз);
    тз.ВыбратьСтроки();
    Пока тз.ПолучитьСтроку()=1 цикл
    Если ПустоеЗначение(тз.Номенклатура)=0 Тогда
    Если тз.Номенклатура.ЭтоГруппа()=0 Тогда
    Если (тз.КоличествоКонОст>0) тогда
    Если тз.Номенклатура.НеВключатьВпрайс=1 Тогда    
    Если спр.НайтиЭлемент(тз.Номенклатура)=1 Тогда 
    спр.УстановитьАтрибут("НеВключатьВпрайс",0);
    Спр.Записать();                  
    сообщить("Снят флаг " +тз.Номенклатура);
    КонецЕсли;
    КонецЕсли;    
    Иначе
    Если тз.Номенклатура.НеВключатьВпрайс=0 Тогда
    Если спр.НайтиЭлемент(тз.Номенклатура)=1 Тогда 
    спр.УстановитьАтрибут("НеВключатьВпрайс",1);
    Спр.Записать();
    сообщить("Поставлен флаг " +тз.Номенклатура);
    КонецЕсли;                 
    КонецЕсли;                     
    КонецЕсли;
    КонецЕсли;             
    КонецЕсли;
    
    КонецЦикла;
    
    
    :unsure: Проблема в том, что запрос не всегда правильно возвращает количество номенклатуры, подскажите что может быть не так в запросе
  2. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    1) Зачем вы обрашаетесь в запросе к резервам и заказам если их не используете?
    2) + абсолютно не нужные переменные в запросе.
    3) не нужное условие на группу (по ней никогда остатков нет) м.б. только итоги - исключаются в группировке "без групп"
    В данном случае луче делать просто цико по справочнику. Перед ним проверитить актуальность итоков. В самом цикле использовать СводныйОстаток (вас же не интерисуют склады и фирмы)
  3. TopicStarter Overlay
    cplusmax
    Offline

    cplusmax Опытный в 1С

    Регистрация:
    7 сен 2010
    Сообщения:
    154
    Симпатии:
    2
    Баллы:
    29
    Попробую переписать код с учетом Ваших поправок:
    Код:
    СтрПериод = ?(ТекущаяДата()>= ПолучитьДатуТА(),"", 
    "Период с ДатаКонца по ДатаКонца;");
    
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
    |" + СтрПериод +
    "
    |Фирма            = Регистр.ОстаткиТМЦ.Фирма;             
    |УпрАналитика     = Регистр.ОстаткиТМЦ.Фирма.УпрАналитика;
    |ЮрЛицо         = Регистр.ОстаткиТМЦ.Фирма.ЮрЛицо;
    |Номенклатура    = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад            = Регистр.ОстаткиТМЦ.Склад;
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Функция КоличествоКонОст = КонОст(Количество);
    |Группировка Номенклатура;"; 
    
    НетОш = 1; // нет ошибок при наложении фильтров
    НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Номенклатура",    "",         "ВыбТМЦ",         ТекстЗапроса, "","СвойстваНоменклатуры");
    НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Склад",           "",       "ВыбСклад",       ТекстЗапроса, "");
    
    Если НетОш = 0 Тогда
    Возврат;
    КонецЕсли;
    те=текстЗапроса;
    Запрос = СоздатьОбъект("Запрос");
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;                               
    КонецЕсли;
    тз=СоздатьОбъект("ТаблицаЗначений");
    спр=создатьОбъект("Справочник.Номенклатура");
    Запрос.Выгрузить(тз);
    тз.ВыбратьСтроки();
    Пока тз.ПолучитьСтроку()=1 цикл
    Если ПустоеЗначение(тз.Номенклатура)=0 Тогда
    Если тз.Номенклатура.ЭтоГруппа()=0 Тогда
    Если (тз.КоличествоКонОст>0) тогда
    Если тз.Номенклатура.НеВключатьВпрайс=1 Тогда    
    Если спр.НайтиЭлемент(тз.Номенклатура)=1 Тогда 
    спр.УстановитьАтрибут("НеВключатьВпрайс",0);
    Спр.Записать();                  
    сообщить("Снят флаг " +тз.Номенклатура);
    КонецЕсли;
    КонецЕсли;    
    Иначе
    Если тз.Номенклатура.НеВключатьВпрайс=0 Тогда
    Если спр.НайтиЭлемент(тз.Номенклатура)=1 Тогда 
    спр.УстановитьАтрибут("НеВключатьВпрайс",1);
    Спр.Записать();
    сообщить("Поставлен флаг " +тз.Номенклатура);
    КонецЕсли;                 
    КонецЕсли;                     
    КонецЕсли;
    КонецЕсли;             
    КонецЕсли;
    
    КонецЦикла;
    
    
    В том то и дело что обработать номенклатуру нужно не всю, а только с остатками на определенных складах, и исключить из обработки некоторые группы номенклатуры, для этого в форме обработки добавлен фильтр по складам и номенклатуре, причем настройки фильтра при закрытии формы сохраняются, и пользователь в будущем сможет их изменить:
    Код:
    НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Номенклатура",    "",         "ВыбТМЦ",         ТекстЗапроса, "","СвойстваНоменклатуры");
    НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Склад",           "",       "ВыбСклад",       ТекстЗапроса, "");
    
    
    
    Из за "фильтра" и был выбран вариант с запросом.
    Спасибо за Ваш комментарий, гланьте, может еще что поправить нужно?
  4. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    1) Без итогов
    2) Группировка Номенклатура без групп;
    тогда уберутся условия на пустое значение и ЭтоГруппа
  5. TopicStarter Overlay
    cplusmax
    Offline

    cplusmax Опытный в 1С

    Регистрация:
    7 сен 2010
    Сообщения:
    154
    Симпатии:
    2
    Баллы:
    29
    Изменил код как Вы советуете, вот что получилось:
    Код:
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
    |" + СтрПериод +
    "
    |Фирма            = Регистр.ОстаткиТМЦ.Фирма;             
    |УпрАналитика     = Регистр.ОстаткиТМЦ.Фирма.УпрАналитика;
    |ЮрЛицо         = Регистр.ОстаткиТМЦ.Фирма.ЮрЛицо;
    |Номенклатура    = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад            = Регистр.ОстаткиТМЦ.Склад;
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Функция КоличествоКонОст = КонОст(Количество);
    |Без итогов;
    |Группировка Номенклатура Без Групп;"; 
    
    Но теперь в этот запрос не попадает номенклатура с нулевым остатком, а мне она нужна, чтобы проверить и при необходимости "поставить" флаг.
  6. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Без групп все ВошедшиеВЗапрос;

    И выбор периода мне не очень нравится... Там где пустая строка м.б. В этом случае кон остаток не рассчитается
  7. TopicStarter Overlay
    cplusmax
    Offline

    cplusmax Опытный в 1С

    Регистрация:
    7 сен 2010
    Сообщения:
    154
    Симпатии:
    2
    Баллы:
    29
    Пробовал без этой строки, при выполнении ошибка:
    Выгружаю результат запроса в таблицу значений, а там только позиции с положительным остатком... нулевых нет а они очень нужны :(
  8. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    у вас просто в УСЛОВИИ ошибка. Нужно так:
    Код:
    Если ДатаКонца>ПолучитьДатуТА() Тогда
    ДатаКонца=ПолучитьДатуТА();
    КонецЕсли;
    СтрПериод = "Период с ДатаКонца по ДатаКонца;";    
    
    
    
  9. TopicStarter Overlay
    cplusmax
    Offline

    cplusmax Опытный в 1С

    Регистрация:
    7 сен 2010
    Сообщения:
    154
    Симпатии:
    2
    Баллы:
    29
    Спасибо, теперь выполняется без ошибок!
    Только результат запроса: номенклатура только с положительным остатком, нулевые попрежнему не выводятся...
  10. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    еще раз покажите ваш запрос полностью
  11. TopicStarter Overlay
    cplusmax
    Offline

    cplusmax Опытный в 1С

    Регистрация:
    7 сен 2010
    Сообщения:
    154
    Симпатии:
    2
    Баллы:
    29
    Пожалуста:
    Код:
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
    |" + СтрПериод +
    "Фирма            = Регистр.ОстаткиТМЦ.Фирма;             
    |УпрАналитика     = Регистр.ОстаткиТМЦ.Фирма.УпрАналитика;
    |ЮрЛицо         = Регистр.ОстаткиТМЦ.Фирма.ЮрЛицо;
    |Номенклатура    = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад            = Регистр.ОстаткиТМЦ.Склад;
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Функция КоличествоКонОст = КонОст(Количество);
    |Без итогов;
    |Группировка Номенклатура Без Групп все ВошедшиеВЗапрос;"; 
    
  12. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Значит организовывать цикл по фильтру который используете и и применять НайтиЗначение к ТЗ
  13. TopicStarter Overlay
    cplusmax
    Offline

    cplusmax Опытный в 1С

    Регистрация:
    7 сен 2010
    Сообщения:
    154
    Симпатии:
    2
    Баллы:
    29
    Не совсем понял... к ТЗ в которую выгрузил результат запроса? .... так к нему уже фильтр применился :angry:
    вот в этих строках:
    Код:
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Номенклатура",    "",         "ВыбТМЦ",         ТекстЗапроса, "","СвойстваНоменклатуры");
    НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Склад",           "",       "ВыбСклад",       ТекстЗапроса, "");
    
    К переменной ТекстЗапроса добавляются условия фильтра
  14. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Для выборки просто второй запрос к справочнику номенклатуры (с наложением фильтра). В результат запроса попадают все элементы номенклатуры по фильтру.
    Пробегаем по нему и обращаемся к первому запросу (где количество)
  15. TopicStarter Overlay
    cplusmax
    Offline

    cplusmax Опытный в 1С

    Регистрация:
    7 сен 2010
    Сообщения:
    154
    Симпатии:
    2
    Баллы:
    29
    Благодарю за совет, буду пробовать! Если не трудно, гляньте так должен выглядеть второй запрос (который ворачивает номенклатуру с нулевыми остатками)?:
    Код:
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
    |" + СтрПериод +
    "Фирма            = Регистр.ОстаткиТМЦ.Фирма;             
    |Номенклатура    = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад            = Регистр.ОстаткиТМЦ.Склад;
    |Группировка Номенклатура Без Групп все ВошедшиеВЗапрос;"; 
    
    
    Или функция в этом запросе всеже нужна?
  16. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    я бы сделал запрос К СПРАВОЧНИКУ а не к регистру. Если не было движений по регистру, но есть в фильтре - товар в запрос не попадет, а как следствие не будет обработан
  17. TopicStarter Overlay
    cplusmax
    Offline

    cplusmax Опытный в 1С

    Регистрация:
    7 сен 2010
    Сообщения:
    154
    Симпатии:
    2
    Баллы:
    29
    Золотые слова :angry:
    Видимо из за этого у меня и невсегда правильно отрабатывал этот код (из за чего я и попросил помощи в первом сообщении) скорее всего те позиции по которым небыло движений в день формирования запроса и не попадали в запрос, соответственно и не обрабатывались!
    Попробую построить запрос с учетом Ваших рекомендаций.
    Код:
    "//{{ЗАПРОС(Сформировать)
    |" + СтрПериод +
    "Номенклатура    = Справочник.Номенклатура;
    |Склад            = Регистр.ОстаткиТМЦ.Склад;
    |Группировка Номенклатура Без Групп все ВошедшиеВЗапрос;"; 
    
    
    или всетаки нужно так? :
    Код:
    "//{{ЗАПРОС(Сформировать)
    |" + СтрПериод +
    "Номенклатура    = Справочник.Номенклатура.ПолнНаименование;
    |Склад            = Регистр.ОстаткиТМЦ.Склад;
    |Группировка Номенклатура Без Групп все ВошедшиеВЗапрос;"; 
    
    
  18. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    В обоих случаях не правильно.
    Минутку
  19. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Нет... В одном запросе не получится. Нужно делать ДВА запроса.
    1й к регистрам, 2й к справочнику
  20. TopicStarter Overlay
    cplusmax
    Offline

    cplusmax Опытный в 1С

    Регистрация:
    7 сен 2010
    Сообщения:
    154
    Симпатии:
    2
    Баллы:
    29
    Вы имеете ввиду разделить "второй" запрос еще на два?

Поделиться этой страницей