7.7 Прайс

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

  1. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    Всем привет. Нужно сделать формирование прайса. Загвоздка в следующем: есть Справ. Номенклатура многоуровневый(5). Нужно чтобы прайс выводился только по первому уровню(тут проблем нету-
    Код:
    Если СпрН.ЭтоГруппа()=1 Тогда
    Если СпрН.Уровень()=1 Тогда
    Таб.ВывестиСекцию("Группа");
    ........................
    
    
    
    ). Проблема дальше, есть группы которые не нужно выводить в таблицу(со всеми элементами) и плюс нужно ещё сделать так: что-то на вроде "содержание"(нумеровать страницы следующим образом 1группа с 1 по30 стр. 2группа с 30 по 40 стр. и т.д.).Как это всё мне организовать?
    Конфа: ТиС
  2. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Используйте
    Код:
    .....
    Если Спр.ПринадлежтГруппе(ТЗ.Запрет)=0 Тогда
    
    
    ТЗ - ТаблицаЗначений запрещенных групп (можно использовать СписокЗначений)
  3. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Насколько я помню, в стандартной ТиС ведь есть обработка "ПечатьПрайса". Возьмите ее за основу. У каждого элемента справочника номенклатура есть реквизит "НеВключатьВпрайс", если у всех элементов в группе он снят, группа и так не попадет в прайс (опять таки насколько помню).
    Единственное вам надо доработать "содержание", для этого предложил бы сделать все строки в макете фиксированной высоты, т.е. чтобы знать сколько строк помещается на лист, и уже считать при выводе количество строк, и потом выводить отдельной таблицей "содержание".
  4. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Ага... А если группа содержит ну "кромненько" 500-1000 элементов. У каждого устанавливать флажек? (Даже если писать обработку - есть меремещение элементов. НЕУДОБНО)
  5. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Но ведь есть "ГрупповаяОбработкаНоменклатуры". Я же надеюсь человеку не каждый день надо будет устраивать выбор необходимой для прайса номенклатуры. Я предложил вариант с минимальными изменениями, точнее изменений и вовсе не требуется, в конфигурации.
  6. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    Ладно с нумерацией можно пока и в екселе заморочится, а вот
    Код:
    Если (Ном.ПринадлежитГруппе(Симв(34)+""+Симв(34)+"удаленые"+Симв(34))=0) 
    И
    (Ном.ПринадлежитГруппе(Симв(34)+"Запчасти"+Симв(34))=0) Тогда
    
    
    Не работает. Видимо все таки это из за того что группу которую мне надо исключить верхнего уровня?

    Код:
     
    Процедура Сформировать() 
    СпрН = СоздатьОбъект("Справочник.Номенклатура");
    СпрН.ВыбратьЭлементы();
    
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    Таб.ВывестиСекцию("Заголовок");
    
    Пока СпрН.ПолучитьЭлемент() = 1 Цикл
    Если СпрН.ПометкаУдаления()=0 Тогда
    Состояние(СпрН.ПолнНаименование);
    Ном = СпрН.ТекущийЭлемент();
    Если Ном.ЭтоГруппа() = 1 Тогда
    Если (СокрЛП(Ном) <> Симв(34)+""+Симв(34)+"удаленые"+Симв(34)) и (СокрЛП(Ном) <> Симв(34)+"Запчасти"+Симв(34)) Тогда
    Если Ном.Уровень() =1 Тогда
    Таб.ВывестиСекцию("Группа");
    КонецЕсли;
    КонецЕсли;
    Иначе 
    Если (Ном.ПринадлежитГруппе(Симв(34)+""+Симв(34)+"удаленые"+Симв(34))=0) и (Ном.ПринадлежитГруппе(Симв(34)+"Запчасти"+Симв(34))=0) Тогда
    СпрТц= СоздатьОбъект("Справочник.ТипыЦен");
    ТипыЦен = СпрТц.НайтиПоНаименованию("Прайсовая руб");
    Цена = глПолучитьЦену(СпрН.ТекущийЭлемент(),СпрТЦ.ТекущийЭлемент(),ТекущаяДата());
    Если Цена>0 Тогда
    Таб.ВывестиСекцию("Номенклатура");
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;		
    КонецЦикла;
    
    //Таб.Показать("Таблица");
    Таб.ТолькоПросмотр(0); 
    Таб.Записать("c:\Остатки","xls");
    Форма.Закрыть(); 
    ЗавершитьРаботуСистемы(0);
    КонецПроцедуры 
    
    Процедура ПриОткрытии()
    СпрСк = СоздатьОбъект("Справочник.Склады");
    Если СпрСк.НайтиПоНаименованию("Склад 1") = 1 Тогда
    ВыбСклад.ДобавитьЗначение(СпрСк.ТекущийЭлемент(),);
    КонецЕсли;
    Если СпрСк.НайтиПоНаименованию("Склад ХРАНЕНИЯ") = 1  Тогда
    ВыбСклад.ДобавитьЗначение(СпрСк.ТекущийЭлемент(),);
    КонецЕсли;
    РасчетОстатков=0;
    Сформировать();
    
    
    
    
    Полная схема моего кода, для наглядности
  7. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Потому что условие задаете неверно. Элемент не может одновременно принадлежать 2 группам. ИЛИ.


    Хотя не совсем понял что там за условие. Уточните. Я в логике не разбирался.

    Код:
    Если НЕ ((Ном.ПринадлежитГруппе(Симв(34)+""+Симв(34)+"удаленые"+Симв(34))=0)) и НЕ ((Ном.ПринадлежитГруппе(Симв(34)+"Запчасти"+Симв(34))=0)) Тогда
    
    возможно так
  8. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    СпрСк то список значений на форме, а флаг РасчетОстатков не нужен(это я делал выгрузку остатков,забыл удалить).

    Логично, ступил.


    Но не работает всё равно.Элементы этих групп выводятся. :unsure:
  9. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Я сообщение отредактировал, там пример, так попробуйте.
  10. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    Код:
    Если НЕ ((Ном.ПринадлежитГруппе(Симв(34)+""+Симв(34)+"удаленые"+Симв(34))=0)) и НЕ ((Ном.ПринадлежитГруппе(Симв(34)+"Запчасти"+Симв(34))=0)) Тогда
    
    
    Так наоборот должно выводить элементы этих групп, они мне как раз ненужны (хотя и все равно не выводятся)
  11. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    не понял.. :) так эти элементы надо выводить или нет?
  12. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    нет. но по:
    Код:
    Если НЕ ((Ном.ПринадлежитГруппе(Симв(34)+""+Симв(34)+"удаленые"+Симв(34))=0)) или НЕ ((Ном.ПринадлежитГруппе(Симв(34)+"Запчасти"+Симв(34))=0)) Тогда
    
    
    
    Зачем вообще использовать оператор
    Код:
    НЕ
    
    
    ? Смысл?
  13. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    почему у вас там ИЛИ? И должно быть.
  14. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    Если делаешь
    Код:
    И
    
    То вообще группы тока выводит, а элементы справочника нет.
    Т.е. получается тоже самое что :
    Код:
     Если (Ном.ПринадлежитГруппе(Симв(34)+""+Симв(34)+"удаленые"+Симв(34))=1) или Ном.ПринадлежитГруппе(Симв(34)+"Запчасти"+Симв(34))=1)
    
    
    Так смысл Оператора: "НЕ" Не понимаю :unsure:
  15. alp
    Offline

    alp Опытный в 1С

    Регистрация:
    8 янв 2009
    Сообщения:
    432
    Симпатии:
    0
    Баллы:
    26
    Используйте Рекурсивную функцию, она будет проверять всю иерархию:
    Код:
    Перем НенужнаяГруппа;
    Функция НайтиГруппа(Элемент)
    Если Элемент = НенужнаяГруппа Тогда
    Возврат 1;
    КонецЕсли;
    Если ПустоеЗначение(Элемент.Родитель) = 1 Тогда
    Возврат 0;
    Иначе
    Возврат НайтиГруппа(Элемент.Родитель);
    КонецЕсли;
    Возврат 0;
    КонецФункции
    
    
    
  16. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    ну как то же самое. в примере с ИЛИ код выполняется, когда у вас Ном в группе "удаленые" или в группе
    "Запчасти". В примере с НЕ-И, код выполняется когда у вас Ном не в группе "удаленые" и не в группе "Запчасти".

    Постройте таблицу истинности.


    И так, в общем замечание - это плохой стиль искать группы по наименованию. Заведите тогда для группы реквизит, назвав его допустим "ВключатьВВывод" и используйте его. Код так будет чище, и правильнее.
  17. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Только что дошло:
    Группа, это же не тип Строка должен быть, а тип Справочник.Номенклатура. Я так думаю.


    Т.е. вместо всего этого в аргументах функции:
    Код:
    Симв(34)+""+Симв(34)+"удаленые"+Симв(34)
    
    у вас должен быть элемент справочника Номенклатура. (ссылка на группу с эти именем).
  18. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    Есть способ проще:
    Код:
    СписИск = СоздатьОбъект("СписокЗначений");
    
    
    В список добовлям:
    Код:
    Если СпрН.НайтиПоНаименованию(Симв(34)+""+Симв(34)+"удаленые"+Симв(34)) = 1 Тогда
    СписИск.ДобавитьЗначение(СпрН.ТекущийЭлемент());
    Если СпрН.НайтиПоНаименованию(Симв(34)+"Запчасти"+Симв(34))=1 Тогда
    СписИск.ДобавитьЗначение(СпрН.ТекущийЭлемент());
    КонецЕсли;
    КонецЕсли;			                                                       
    
    
    А далее в цикле:
    Код:
    СпрН.ВыбратьЭлементы();
    Пока СпрН.ПолучитьЭлемент() = 1 Цикл 
    Если СписИск.Принадлежит(СпрН.ТекущийЭлемент()) = 1 Тогда
    Продолжить;
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/иначе')">		Иначе	</span>
    ............................... 
    
    
    И всё работает.(если нужно потом можно добавлять в список группы которые не нужно выводить).

    Теперь вопрос, встал как всё-таки мне организовать, авто нумерацию, содержания прайса?
    Тут вообще, чо-то завис, просчитать сколько строк в листе не вариант, т.к. на первом листе их меньше будет(минус заголовок(3-4строки). :unsure:
  19. Бухгалтерский угодник
    Offline

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

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

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    Я думаю не получится, так как например секция "Номенклатура" может быть и в 2 и в 50 строк, также и секция "группа"
    У меня тока секция "Заголовок заранее известно сколько строк займет.

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