8.х Вывод информации из справочника в Макет

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем deman_ru, 11 апр 2013.

  1. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Уважаемые форумчане! Подкиньте идейку реализации проверки истечения срока годности товаров.
    Допустим у меня есть справочник товаров. Есть документ приходная накладная. Вот как я думаю...
    В табличной части "Товары", документа "Приходная накладная", есть реквизиты:
    • товар (из справочника),
    • единица измерения,
    • количество,
    • дата истечения срока годности.
    Вот как мне, допустим, при запуске программы, осуществить проверку истечения срока годности товаров на текущую дату? Подскажите пожалуйста алгоритм, или может как-нибудь по другому мне расставить реквизиты?
  2. mialord
    Offline

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Со сроком годности товара все не так просто.
    Для учета срока годности используется партионный учет, сам срок годности каждой партии закладывается в серию. Таким образом на один и тот же товар может на складе быть несколько серий и у каждой партии будет свой срок годности. Тогда да, можно узнать просроченные товары. Если Вы не делите партионно товары, при нескольких поступлениях ТМЦ у Вас не будет понятно где какой срок годности.
  3. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    С этой базой не работает реальное предприятие, она учебная. Так что тут можно что то попроще и не вести партионный учет:)
  4. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Так, что я придумал)
    Документ "ПоступлениеПродукции" имеет следующие реквизиты:
    • Склад,
    • Поставщик.
    Табличная часть "Товары"
    • Наименование,
    • Единица измерения,
    • Количество,
    • Срок годности,
    • Срок истекает (дата истечения срока годности)
    • Годен\Не годен (идентификатор того, годна продукция или нет) устанавливается "годен" при регистрации документа.
    Далее, примерно вот таким запросом:

    Код:
    ВЫБРАТЬ *
    ИЗ Документ.ПоступлениеПродукции.Товары
    ГДЕ Документ.ПоступлениеПродукции.Товары.СрокИстекает<=&ТекущаяДата
    Я выберу товары с "истекшим сроком годности":)
    Потом мне надо пройтись по выбранным записям и в документах, по этим товарам изменить значение реквизита "Годен\Не годен" на "Не годен" и в идеале, после сформировать новый документ "Списание продукции" и передать в его табличную часть с аналогичными реквизитами, данные по этим товарам.
    Но сначала, хотелось бы узнать, как обойти результат выборки и изменить значение реквизита?
  5. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    а вы храните данные о товарах в регистрах? тогда наверное стоит еще в обработку проведения вашего документа включить момент работы с реквизитом Годен/Не годен по типу актуальна запись или нет?

    а так результат запроса обходите в цикле, у вас же будет ссылка и на документ и конкретную запись вы будите знать. После этого записывайте документ.
  6. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Нет, данные о товарах не хранятся в регистрах.
    Пытаюсь сделать вот такую обработку:
    Код:
    Функция СменаЗначРеквизита()
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Товары.Ссылка,
    |    Товары.СрокИстекает,
    |    Товары.ГоденНеГоден
    |ИЗ
    |    Документ.ПоступлениеПродукции.Товары  КАК Товары 
    |ГДЕ
    |    Товары.СрокИстекает<=&ТекущаяДата";
    //Параметры запроса   
    Запрос.УстановитьПараметр("ТекущаяДата",ТекущаяДата());
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл	   
    Объект = Выборка["Ссылка"].ПолучитьОбъект();
    ЗначениеБыло = Объект["ГоденНеГоден"];
    ГоденНеГоден = СтрЗаменить (ЗначениеБыло, "Годен", "Не годен");
    Объект["ГоденНеГоден"]=ГоденНеГоден;
    Объект.Записать();
    КонецЦикла;
    Возврат 0;
    КонецФункции
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    СменаЗначРеквизита();
    КонецПроцедуры
    
    Получаю вот такую ошибку:

    Код:
    {Обработка.Обработка1.Форма.Форма(23)}: Поле объекта не обнаружено (ГоденНеГоден)
    ЗначениеБыло = Объект["ГоденНеГоден"];
    
    Что не так?
  7. mialord
    Offline

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Я бы наверное зашел немного с другой стороны.
    1. Заводим регистр накопления "Качество товара"
    2. Добавляем реквизиты "Номенклатура", "Срок годности" (тут например 60 дней, хотя можно и дату)
    3. Добавляем ресурс "Качество" (Новый, просрочен)
    4. При оприходовании товара из таб части пишем реквизиты и ресурс, а также сам регистратор, по регистратору мы всегда сможем узнать когда товар пришел. Вид движения ПРИХОД
    5. При списании можно сделать подбор по данным регистра какие именно позиции мы списываем и с каким сроком годности, акже можно в регистр добавить количественный ресурс, тогда будем знать в каком количестве с данным сроком ТМЦ осталось. Вид движения РАСХОД
    6. Добавить документ Инвентаризации ТМЦ который по этому регистру определит какие ТМЦ нужно перевести в просроченные. Документ делает движение и в ПРИХОД и в РАСХОД меняя состояние ТМЦ, такие ТМЦ можно запретить продавать
    7. Добавить документ Списания товаров в нем предусмотреть кнопку заполнить просроченными
    Что то в таком виде!
  8. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    потому что обЪект в данном случае - это документ, а у вас реквизит Годен0-негоден у строки табчасти

    +1 mialord


    З.Ы. без регистра думаю никак не обойтись. Вам же надо будет наверняка остатки товара выводить, что опять будите городить запросы по документам? проще завести регистр и смотреть остатки на дату штатной функцией
  9. mialord
    Offline

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Код:
    Выборка["Ссылка"].ПолучитьОбъект()
    возвращает Вам документ, а "ГоденНеГоден" это реквизит табличной части
  10. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29

    Пошел по Вашему пути.
    1. Сделал.
    2. Сделал.
    3. Добавил как реквизит, а не как ресурс, ресурсы же принимают только числовое значение.
    4. Сделал.
    5. Количество тоже добавил.
    Тут не совсем понял как этот документ будет переводить ТМЦ в просроченные. То есть я создаю документ с реквизитами допустим:
    • Дата,
    • Ответственный.
    Табличная часть:
    • Наименование,
    • Количество,
    • Качество.
    Затем, при регистрации документа я САМ буду добавлять записи и ставить статус просрочен, или надо писать алгоритм, чтобы СИСТЕМА это делала?

    7. Пока не дошел, вопросов нетJ
  11. mialord
    Offline

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    6. Так лучше чтобы система заполнила ТМЦ которые рекомендуется уже перевести в состояние просрочены. В регистре происходит списание со старым качеством и оприходование с новым, только новое качество это просрочен, когда мы их будем списывать это уже дело второе.
    Я начинал писать для РС, а потом подумал что РН будет лучше по-этому и тип ресурса не подходит :D
  12. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Запутался...
    Как при помощи документа "Инвентаризация ТМЦ" перевести ТМЦ в состояние просрочены? Обойти в цикле записи по регистру накопления, и занести в табличную часть документа "Инвентаризация ТМЦ" те ТМЦ, у которых срок годности уже истек, т.е., дата истечения срока меньше текущей даты?
  13. mialord
    Offline

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Ну так просто, сначала списали ТМЦ с этого регистра этим документом, т.е. сделали проводки расхода, а потом в этот же регистр этим же документом оприходовали. Это стандартная ситуация, часто используется в типовом ПО.
    У Вас проводки будут отличаться только видом движения "Приход" или "Расход" и качеством "Новый" или "Просроченный"
  14. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Ну вроде бы со все я подразобрался

    Сделал регистр, пишу в него данные из документа приходная накладная.
    Потом из этого регистра выбираю товары у которых уже истек срок годности, используя следующий запрос:
    Код:
    Функция ВыборкаПросроченых()
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Период,
    |    Наименование,
    |    ЕдИзмер,
    |    Количество,
    |    СрокГодности,
    |    Качество
    |ИЗ
    |    РегистрНакопления.КачествоТовара
    |ГДЕ
    |    Период>=&ДатНач И Период<=&ДатОкон И СрокГодности<=&ТекДата";
    //Параметры запроса  
    Запрос.УстановитьПараметр("ДатНач", ДатаНач);
    Запрос.УстановитьПараметр("ДатОкон",ДатаОкончан);
    Запрос.УстановитьПараметр("ТекДата",ТекущаяДата());
    Результат = Запрос.Выполнить().Выгрузить();
    ЭлементыФормы.Товары.Значение.Загрузить(Результат);
    КонецФункции
    Но, в конфигурации еще будет присутствовать документ продажи, который так же формирует в этом регистре записи с видом расход.
    И получается так что этот запрос мне выдает записи с видом расход.
    Я так понимаю при выборе надо внести еще условия, вот такие:


    Код:
    ГДЕ
    |    Период>=&ДатНач И Период<=&ДатОкон И СрокГодности<=&ТекДата И ВидДвижения=&ВидДвижения И Качество=&Качество";
    Но как указать что мне нужен вид движения именно приход?
  15. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    думаю и так можно, а в УстановитьПараметр "ВидДвиженияНакопления.Приход"
  16. mialord
    Offline

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    В запросе
    ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
  17. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    +1 совсем забыла, что в запросе тоже можно указать
  18. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Добрый день!
    С прошлой задачкой я разобрался, всем большое спасибо! Возникла следующая, прошу Вас, подкиньте мне пожалуйста идейку.
    Нужно вести учет посещений в спортивные заллы.
    Допустим есть расписание (кстати, как лучше делать расписание, в регистре сведений или документе?). С реквизитами:
    • Дата,
    • Всемя начала занятия,
    • Время окончания занятия,
    • Помещение,
    • Вид занятия,
    • Инструктор.
    Потом документ учет посещений с реквизитами:
    • Дата,
    • Клиент,
    • Расписание
    Основная проблема в том, что я не знаю как вести учет того какие помещения заняты, а какие нет? И еще в справочнике помещения, для каждого помещения указыкается его вместительность.
    Вообщем при регистрации посещений, надо учитывать наполняемость, в тот или иной зал, показать остаток если наполнен, дать информацию что он занят.
    Как лучше всего и правильнее это реализовать?
  19. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    я бы сделала само утверждение расписания документом, который уже делает движения по регистрам сведений и накопления. Статистику вы уже по регистрам соберете, там быстрее будет.
  20. TopicStarter Overlay
    deman_ru
    Offline

    deman_ru Опытный в 1С

    Регистрация:
    27 дек 2011
    Сообщения:
    165
    Симпатии:
    1
    Баллы:
    29
    Добрый день!
    Есть справочник Помещения, у него есть реквизиты: Наименование и ВместимостьЧел
    На форме у меня есть два поля:
    • Помещение (Справочник.Помещения)
    • Вместимость чел. (Справочник.Помещения)
    Хочу сделать так, чтобы при выборе помещения, автоматически заполнялось поле ВместимостьЧел, делаю вот так:

    Код:
    Процедура ВыбратьВместимостьЧел()
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | СпортивныеПомещения.ВместимостьЧел
    |ИЗ
    | Справочник.СпортивныеПомещения КАК СпортивныеПомещения
    |ГДЕ
    | СпортивныеПомещения.Наименование = &Наименование";
    Запрос.УстановитьПараметр("Наименование", Помещение);
    Выборка = Запрос.Выполнить().Выбрать();
    ЭлементыФормы.ВместимостьЧел.Значение = Выборка.ВместимостьЧел;
    КонецПроцедуры
    
    Процедура ПомещениеПриИзменении(Элемент)
    ВыбратьВместимостьЧел();
    КонецПроцедуры
    
    Либо вот так:

    Код:
     ВыборкаВместимости = Справочники.СпортивныеПомещения.Выбрать(,Помещение);
    ЭлементыФормы.ВместимостьЧел.Значение=ВыборкаВместимости.ВместимостьЧел;
    Поле вместимость чел принимает значение 0, что я не так делаю?

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