8.х Остаток конкретного товара на данную секунду получить

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

  1. TopicStarter Overlay
    Geek
    Offline

    Geek Опытный в 1С

    Регистрация:
    3 апр 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    Я прошу прощения что задаю легкие вопросы, но кроме Вас мне некому помочь

    Мне нужно в табличную часть документа вывести остаток на данный момент времени, выбранной в табличном поле номенклатуры на данном складе.
    Вот что я написал.

    Код:
    СтрокаТабличнойЧасти=ЭлементыФормы.Товары.ТекущиеДанные;
    Остатки = РегистрыНакопления.ОстаткиТоваровКомпании;
    Фильтр = Новый Структура;
    Фильтр.Вставить("Номенклатура",СтрокаТабличнойЧасти.Номенклатура);
    Фильтр.Вставить("СкладКомпании", ЭтаФорма.ЭлементыФормы.СкладКомпании);
    СтрокаТабличнойЧасти.ОстаткиТоваров = Остатки.Остатки(Дата,Фильтр,
    "Номенклатура,СкладКомпании","Количество");
    Сообщить(СтрокаТабличнойЧасти.ОстаткиТоваров);
    

    Вот результат.
    {Документ.ПоступлениеТоваров.Форма.ФормаДокумента(318)}: Ошибка при вызове метода контекста (Остатки): Недопустимое значение параметра (параметр номер "2")
    СтрокаТабличнойЧасти.ОстаткиТоваров = Остатки.Остатки(Дата,Фильтр,



    Может есть еще способ получить эти остатки 7
  2. gamser
    Offline

    gamser Опытный в 1С

    Регистрация:
    27 окт 2006
    Сообщения:
    112
    Симпатии:
    0
    Баллы:
    26
    RE: Фильтр.Вставить("СкладКомпании", ЭтаФорма.ЭлементыФормы.СкладКомпании);
    Внимательно смотри на код:
    ЭтаФорма - твоя форма;
    ЭтаФорма.ЭлементыФормы - коллекция элементов УПРАВЛЕНИЯ формы
    ЭтаФорма.ЭлементыФормы.СкладКомпании - Элемент коллекции элементов управления т.е. поле ввода

    Правильно будет так
    Фильтр.Вставить("СкладКомпании", ЭтаФорма.ЭлементыФормы.СкладКомпании.Значение);

    Удачи
  3. TopicStarter Overlay
    Geek
    Offline

    Geek Опытный в 1С

    Регистрация:
    3 апр 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    Спасибо большое. Ошибки уже нет. Но
    Сообщить(СтрокаТабличнойЧасти.ОстаткиТоваров); собщает 0
    Хотя остатки там есть
  4. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Вы попробуйте или запросом или задать все параметры (измерения). Может сработает. Скорее всего не так фильтры передаете, гляньте в отладчике что там!
  5. TopicStarter Overlay
    Geek
    Offline

    Geek Опытный в 1С

    Регистрация:
    3 апр 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    В запросе все выходит . Я вынес в модуль документа проведения
    Код:
    // Установка минимальной цены продажи
    Если НЕ Отказ И ХозОперация=Справочники.ХозОперации.ПоступлениеТоваров 
    И СкладКомпании.Розничный 
    И Контрагент.ФормаСобственности=Перечисления.ФормыСобственности.ЧастноеЛицо Тогда    
    Запрос=Новый Запрос();
    ТекстЗапроса="
    |ВЫБРАТЬ
    |    ОстаткиТоваровКомпанииОстатки.Номенклатура КАК Номенклатура,
    |    ОстаткиТоваровКомпанииОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    |    ОстаткиТоваровКомпанииОстатки.СкладКомпании КАК СкладКомпании,
    |    ВЫБОР 
    |        КОГДА ОстаткиТоваровКомпанииОстатки.КоличествоОстаток ЕСТЬ NULL
    |        ТОГДА 0
    |        ИНАЧЕ ОстаткиТоваровКомпанииОстатки.КоличествоОстаток
    |        КОНЕЦ
    |    -
    |    ВЫБОР 
    |        КОГДА ОстаткиТоваровКомпанииОстатки.РезервОстаток ЕСТЬ NULL
    |        ТОГДА 0
    |        ИНАЧЕ ОстаткиТоваровКомпанииОстатки.РезервОстаток
    |        КОНЕЦ
    |    КАК Остаток
    |ИЗ 
    |    РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&Момент,(Номенклатура В (&Номенклатура)) 
    |                   И (ХарактеристикаНоменклатуры В (&ХарактеристикаНоменклатуры)) 
    |                   И (СкладКомпании В (&СкладКомпании))) КАК ОстаткиТоваровКомпанииОстатки
    |";
    Запрос.Текст=ТекстЗапроса;
    Запрос.УстановитьПараметр("Момент",МоментВремени());
    Запрос.УстановитьПараметр("Номенклатура",Товары.ВыгрузитьКолонку("Номенклатура"));
    Запрос.УстановитьПараметр("ХарактеристикаНоменклатуры",Товары.ВыгрузитьКолонку("ХарактеристикаНоменклатуры"));
    Запрос.УстановитьПараметр("СкладКомпании",СкладКомпании);
    Выборка=Запрос.Выполнить().Выбрать();
    СтруктураОтбора=Новый Структура;
    Для каждого СтрокаТоваров Из Товары Цикл
    СтруктураОтбора.Вставить("Номенклатура",СтрокаТоваров.Номенклатура);
    СтруктураОтбора.Вставить("ХарактеристикаНоменклатуры",СтрокаТоваров.ХарактеристикаНоменклатуры);
    СтруктураОтбора.Вставить("СкладКомпании",СкладКомпании);
    Если Выборка.НайтиСледующий(СтруктураОтбора) Тогда
    Остаток=Выборка.Остаток;
    Иначе
    Остаток=0;
    КонецЕсли;
    СредСебест=(Остаток*СтрокаТоваров.ФиксЦена + 
    СтрокаТоваров.Количество*СтрокаТоваров.Цена)/(Остаток+СтрокаТоваров.Количество);
    МЦенаПродажи=СредСебест*1.2;
    ЦенаРозничная=СредСебест*2.2;
    КатегорияЦен1=МЦенаПродажи+(ЦенаРозничная-МЦенаПродажи)/5;
    КатегорияЦен2=МЦенаПродажи+2*(ЦенаРозничная-МЦенаПродажи)/5;
    КатегорияЦен3=МЦенаПродажи+3*(ЦенаРозничная-МЦенаПродажи)/5;
    КатегорияЦен4=МЦенаПродажи+4*(ЦенаРозничная-МЦенаПродажи)/5;
    Сообщить(МЦенаПродажи);
    Сообщить(КатегорияЦен1);
    Сообщить(КатегорияЦен2);
    Сообщить(КатегорияЦен3);
    Сообщить(КатегорияЦен4);
    Сообщить(ЦенаРозничная);
    
    
    КонецЦикла;
    
    КонецЕсли;
    
    
    
    
    Как мне теперь все это в регистр сведений записать по типам цен
  6. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Как записать в регистр сведений - это отдельная тема.
    Вообще в регистр сведений по ценам номенклатуры все записывается специальными документами "Установка цен номенклатуры". Вам надо будет придумать как лучше сделать - или такой документ сформировать или отдельный регистр для своих целей строить.

    Вообще я бы открыл на вашем месте другую тему, где вопрос поконкретнее сформулировал.
  7. TopicStarter Overlay
    Geek
    Offline

    Geek Опытный в 1С

    Регистрация:
    3 апр 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    У меня цель зделать так что бы документом поступление товаров формировались и записывались все типы цен в регистр сведений Цены, расчет от цены закупки.
    Документ переоценка цен есть ,но мне нежелательно давать к ней доступ менеджерам. А вот документ поступления если бы формировал все типы цен( я уже ее описал выше) и записывал их сразу в регистр. Вот что мне нужно. Если это возможно.
  8. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Подождите, кажется в типовой системе есть возможность включения регистрировать цены поставщика при покупке! Посмотрите внимательно по описанию, может это то, что вам нужно!
  9. Melanto
    Offline

    Melanto Опытный в 1С

    Регистрация:
    28 ноя 2007
    Сообщения:
    204
    Симпатии:
    0
    Баллы:
    26
    Позвольте вклиниться и задать вопрос рядом с темой?

    Код:
    Спр=Справочники.Номенклатура.Выбрать();
    Пока Спр.Следующий() Цикл
    ФильтрОтбораПоГТД=Новый Структура;
    ФильтрОтбораПоГТД.Вставить("Номенклатура", Спр.Ссылка);
    ФильтрОтбораПоГТД.Вставить("Организация", Организация);
    ТаблицаГТД=ОстаткиПоГТД.Остатки(КонецДня(ТекущаяДата()),
    ФильтрОтбораПоГТД,"Номенклатура, ГТДОрганизации, СтранаПроисхождения", "Количество");
    
    Для Каждого СтрокаГТД ИЗ ТаблицаГТД Цикл
    Сообщить(""+СтрокаГТД.Номенклатура+"  "+СтрокаГТД.ГТДОрганизации+"  "+СтрокаГТД.Количество);
    КонецЦикла;
    
    
    Такой простой кусочек кода, я не пойму только одно - как он може возвращить вот это:

    MCO Модуль контр и управления 10122011/200907/0008641/1 -4
    MCO Модуль контр и управления 10122011/200907/0008641/1 4

    На самом деле по этому ГТД уже давно остаток 0
    По движениям по ГТД вроде все ровно 5 пришло, списали 1, потом 4.
    Как же возникает подобная ерунда и как с этим бороться?

    Уже нашла. Но может, кто-то тоже столкнется.
    Это просто "девочки" забыли в Реализации Страну проставить. ГТД - одна, страны - разные, записи не сторнируются... Блин, столько нервов убили
  10. TopicStarter Overlay
    Geek
    Offline

    Geek Опытный в 1С

    Регистрация:
    3 апр 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    Эмин да есть в типовой регистрировать цены при покупке , НО
    Мне нужно записать минцену продажи исходя из остатков их цен и вновь поступивших товаров и потом расчет разных категорий цен от новой средней себестоимости
  11. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Учтите, если у вас в день 50 приходов товара, а регистры эти, кстати, все с периодичностью день пишут, то как вы будете поступать? Менять цены 50 раз в день? Это что-то вроде, с утра продали по одной. А вечером по другой?

    Вы и так можете контролировать цены с учетом себестоимости (подсчитывая ее).
  12. TopicStarter Overlay
    Geek
    Offline

    Geek Опытный в 1С

    Регистрация:
    3 апр 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    Цена розницы меняться не будет.
    Предполагал менять мин.цену продажи если придет товар. который уже есть на складе.Нужно предположить что такое редко но может быть и 3 раза в день.

    а как Вы посоветуете высчитывать мин цену продажи в таком случаея предпологал как среднюю- остатолк складе*цена себест +Цена прихода*колво прихода / общее количество * коффициент ( для миним. цены.)
    Подскажите как еще можно?
  13. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Ну вообще себестоимость можно считать динамически - есть такой регистр "Партии товаров на складах". Вот по нему и получать остатки по сумме и количеству (текущие на момент времени документа) и получать себестоимость единицы.

    Мырешали такую проблему на УТ когда-то. И никакого перерасчета цен не потребовалось. Все что нужно - это получать в момент проведения (или записи) документа себестоимость и сравнивать с ценой!
  14. TopicStarter Overlay
    Geek
    Offline

    Geek Опытный в 1С

    Регистрация:
    3 апр 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    Может есть идея как реализовать такие установки:

    Менеджеры имеют право закупать товар сами и продавать, сами назначив розницу.

    Необходимо.
    Что бы товар обязательно продавался не ниже с наценкой 20 процентов,
    менеджеры хотят видеть при выборе товара категории 4 цен на данный товар. (виды опта)
    Они имеют право делать ручные скидки вплоть до мин цены продажи.
    При этом они не имеют право переоценивать самостоятельно уже оприходованный товар.

    Я хотел все это реализовать документом поступления. сразу прописать минцену продажи( которую потом введу в документы реализации)
    категории ети этим же документом установить.


    Проблемы. Процветает у них машенничество разного рода по документации, не стоит 1с у них. а стоит оракл .

    Отдали на комиссию по 5 рублей .. Товар поступил новый по 3 рубля - пришел возврат из комиссии - документ возврата должен переоценить мин цену продажи самостоятельно. Эх )
    Может есть идеи как реализовать это изящно?:)
    При этом при закупке товаров часто бывает совпадение номенклатуры, тк доступа у них не должно быть к переоценке должно делаться все автоматически, при этом учитываться товар в резерве по какой цене зарезервирован, случаи возврата товара должны учитываться и переоцениваться минцена продажи.


    С магазином проще -есть товар есть цена розницы есть фиксированные скидки - все - нет комиссии ( тоесть они еще и отдают товар на комиссию потом возвраты и переоценка.)

    Может есть идеи как это реализовать изящно? :)
  15. TopicStarter Overlay
    Geek
    Offline

    Geek Опытный в 1С

    Регистрация:
    3 апр 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    Да, есть регистр накопления ПартииТоваровКомпании

    Измерения

    СкладКомпании
    Номенклатура
    ХарактеристикаНоменклатуры
    СтатусПартии
    Партия

    Ресурсы
    Количество
    Сумма
    СуммаУпр
    СуммаНДС

    Есть еще регистры
    ПартииТоваровОтданные
    ТоварыВПроизводстве
    ОстаткиТоваровКомпании

    Так вот как мне динамически в табличное поле документа получить среднюю себестоимость Если партий с таким товаром было скажем 10
    Если можно сам запрос.
  16. TopicStarter Overlay
    Geek
    Offline

    Geek Опытный в 1С

    Регистрация:
    3 апр 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    Зделал динамически :)
    Теперь встал вопрос другой.
    Есть контрагенты от которых наценка и соответсвенно мин цена продажи плюс 38%
    а есть от которых наценка и мин цена продажи при реализации их товара плюс 20 %

    Вот в документе реализации (чек или реализация товаров) я получил динамическую себестоимость. Как теперь мне товарам от разных поставщиков присвоить разную мин цену .( если бы одна то понятно - себестоимость+20%) мне нужно каждый товар в таблице запрашивать не оттого ли поставщика пришел товар который по 38 ?
    Посоветуйте.
    Как запросить.
    Вроде Если Номенклатура партия контрагент - такой то то плюс 38 иначе плюс 20
    или как?
  17. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    ВЫБОР КОГДА ТОГДА ИНАЧЕ КОНЕЦ
  18. TopicStarter Overlay
    Geek
    Offline

    Geek Опытный в 1С

    Регистрация:
    3 апр 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    Тоесть в модуле формы документа (чек и реализация товаров) зделать запрос? (при изменении номенклатуры).
    Было бы хорошо сам запрос :) я только осваиваюсь
    И еще вопрос. Данные в табличном поле документа (чек и реализация товаров) меняются корректно если делается выбор вручную (цены или оменклатуры) Но если добавляются данные путем выгрузки из другого табличного поля или например когда все выбрано есть обрабртка изменить данные данные ( скидки и тд) то процедуры прописанные в форме при изменении строк табличного поля не воспринимают что произошли изменения и не пересчитывают данные. Как зделать так что бы такие добавления считались программой как добавление или изменения полей табличного поля.
  19. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Я бы на вашем месте не делал при изменении номенклатуры, а конкретно при проведении документа анализировал все строки на соответствие цены. И если что - отказывался бы проводить.

    Вот примерно так мы делали давно. еще на УТ 10.1
    В обработку проведения вставлялся такой код:
    Код:
    ТС = вфСебестоимостьОрг(СписокНоменклатуры,Ссылка.МоментВремени(), Организация);
    ТЦ = вфТаблицаЦен(Ссылка);
    Отказ = НЕ вфЦеныВышеСебестоимости(ТС, ТЦ);
    
    
    
    
    Теперь процедуры, вставилось кривовато, но суть вы поймете, да, себестоимость я бы сейчас считал по-другому, а в вашем случае надо вообще минимальную цену считать:
    Код:
    // Возвращает себестоимость номенклатуры на дату
    //
    // Параметры
    //  Номенклатура   СправочникСсылка.Номенклатура или список номенклатуры
    //  Дата             Дата, момент времени
    //
    // Возвращаемое значение:
    //  ТаблицаЗначений - Номенклатура|Себестоимость|Количество|Сумма
    //
    Функция вфСебестоимостьОрг(Номенклатура, Дата, Организация = Неопределено) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    ПартииТоваровКомпанииОстатки.Номенклатура,
    |    СУММА(ПартииТоваровКомпанииОстатки.СтоимостьОстаток) КАК Стоимость,
    |    СУММА(ПартииТоваровКомпанииОстатки.КоличествоОстаток) КАК Количество
    |ИЗ
    |    РегистрНакопления.ПартииТоваровКомпании.Остатки(&Дата, Номенклатура В (&Номенклатура)) 
    |                        КАК ПартииТоваровКомпанииОстатки
    |ГДЕ
    |    ПартииТоваровКомпанииОстатки.ДокументПоставки.Организация = &Организация
    |
    |СГРУППИРОВАТЬ ПО
    |    ПартииТоваровКомпанииОстатки.Номенклатура";
    Запрос.УстановитьПараметр("Дата",Дата);
    Запрос.УстановитьПараметр("Номенклатура",Номенклатура);
    Запрос.УстановитьПараметр("Организация",Организация);
    
    ТЗ = Новый ТаблицаЗначений;
    ТЗ = Запрос.Выполнить().Выгрузить();
    ТЗ.Колонки.Добавить("Себестоимость");
    Для каждого Стр Из ТЗ Цикл
    Стр.Себестоимость = ?(Стр.Количество = 0, 0,Стр.Стоимость/Стр.Количество); 
    //ВОТ ТУТ ЛЮБАЯ ВАША ФОРМУЛА РАСЧЕТА СЕБЕСТОИМОСТИ + 20%, + 38% и т.д.
    КонецЦикла; 
    
    Возврат ТЗ;
    
    КонецФункции // вфСебестоимость()
    
    
    // Сверяет цены с себестоимостью
    //
    // Параметры
    //  ТС   Таблица себестоимости
    //  ТЦ  - Таблица цен
    //
    // Возвращаемое значение:
    //  Булево - Выше - истина, ниже - ложь
    //
    Функция вфЦеныВышеСебестоимости(ТС, ТЦ) Экспорт
    
    Результат = Истина;
    
    Для каждого Стр Из ТЦ Цикл
    Цена = Стр.Цена;
    СтрокаС = ТС.Найти(Стр.Номенклатура,"Номенклатура");
    Если СтрокаС = Неопределено Тогда
    Продолжить;
    КонецЕсли;
    Себестоимость = СтрокаС.Себестоимость;
    Результат = (Цена >= Себестоимость);
    Если Не Результат Тогда
    // Тут мы ругались на конкретные строчки
    КонецЕсли; 
    КонецЦикла; 
    
    Возврат Результат;
    
    КонецФункции // вфЦеныВышеСебестоимости()
    
    
    
  20. TopicStarter Overlay
    Geek
    Offline

    Geek Опытный в 1С

    Регистрация:
    3 апр 2008
    Сообщения:
    105
    Симпатии:
    0
    Баллы:
    26
    "при проведении документа анализировал все строки на соответствие цены. И если что - отказывался бы проводить."

    Тут такое дело ... Если менеджер наберет цену ниже минимальной ,но программа только при проведении укажет на это , будут недовольны. Они хотят что бы в процессе набора программа ругалась на нарушение мин . цены ..Но то я подумаю..

    Так Вы советуете как зделать ? при проведении документа поступление товаров сразу назначить мин.Цену продажи и записать в регистр подчиненный регистратору как тип цен- минимальная цена продажи? И потом получать в документах реализации згначения актуальные на момент документа?
    или высчитывать мин цену в самих документах реализации при проведении .

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

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