7.7 Нужно правильно составить запрос

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

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

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    А если так:
    Код:
    Опер=СоздатьОбъект("Операция");
    Опер.НайтиОперацию(Запрос.РасходнаяНакладная.ТекущийДокумент());
    Опер.ВыбратьПроводки();
    Пока Опер.ПолучитьПроводку()=1 Цикл
    Если (Опер.Дебет.Счет<>СчетПоКоду("902")) и (Опер.Кредит.Счет<>СчетПоКоду("281")) Тогда
    Продолжить;
    КонецЕсли;
    Кол=?(Опер.Количество=0,1,Опер.Количество);
    
    Сообщить("Себестоимость товара "+Опер.Дебет.Субконто(2)+" = "+(Опер.Сумма/Кол));
    КонецЦикла;
    
    
  2. TopicStarter Overlay
    warayg
    Offline

    warayg Опытный в 1С

    Регистрация:
    1 июл 2011
    Сообщения:
    104
    Симпатии:
    0
    Баллы:
    26
    себестоимость получил)), но идет повтор, одинаковая на каждом товаре по накладной((, как привязать эту операцию к ТМц?
  3. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Имеем документ (по которому вычислили себестоимость).
    Вместо вывода через сообщить складываем наш товар в ТаблицуЗначений. При выводе товара (следующая группировка) получаем себестоимость из ТЗ и выводим в отчет
  4. TopicStarter Overlay
    warayg
    Offline

    warayg Опытный в 1С

    Регистрация:
    1 июл 2011
    Сообщения:
    104
    Симпатии:
    0
    Баллы:
    26
    Блин, трудно быть деревянным (( не получается вывести строку2

    Код:
        Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("З");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл
    // Заполнение полей РасходнаяНакладная
    Таб.ВывестиСекцию("Строка");
    Пока Запрос.Группировка(2) = 1 Цикл
    Таб.ВывестиСекцию("Строка1");
    Опер=СоздатьОбъект("Операция");
    Опер.НайтиОперацию(Запрос.РасходнаяНакладная.ТекущийДокумент());
    Опер.ВыбратьПроводки();
    Пока Опер.ПолучитьПроводку()=1 Цикл
    Если (Опер.Дебет.Счет<>СчетПоКоду("902")) и (Опер.Кредит.Счет<>СчетПоКоду("281")) Тогда
    Продолжить;
    КонецЕсли;
    Кол=?(Опер.Количество=0,1,Опер.Количество);
    СуммаСеб = ?(Опер.Сумма=0,"",Формат(Опер.Сумма,"Ч12.2"));
    ЦенаСеб = (Опер.Сумма/Кол);
    КонецЦикла;
    
    Т = СоздатьОбъект("ТаблицаЗначений");
    Т.НоваяКолонка("ТМЦ","Справочник.ТМЦ");
    Т.НоваяКолонка("Кво","Число",14,2);
    Т.НоваяКолонка("ЦенаБезНДС","Число",14,2);
    Т.НоваяКолонка("НДС","Число",14,2);
    Т.НоваяКолонка("СуммаСНДС","Число",14,2);
    Т.НоваяКолонка("СуммаБезНДС","Число",14,2);
    Т.НоваяКолонка("Контрагент","Справочник.Контрагент");
    Т.НоваяКолонка("РасходнаяНакладная","Док.РасходнаяНакладная");
    Т.НоваяКолонка("НомерДок","Число",10,0);
    Т.НоваяКолонка("ДатаДок","Дата");
    Т.НоваяКолонка("СуммаСеб","Число",14,2);
    Т.НоваяКолонка("ЦенаСеб","Число",14,2);
    
    Т.ТМЦ = Запрос.ТМЦ;
    Т.Кво = Запрос.КолДок;
    Т.ЦенаБезНДС = Запрос.ЦенаБезНДС;
    Т.НДС = Запрос.НДС;
    Т.СуммаСНДС = Запрос.СуммаСНДС;
    Т.СуммаБезНДС = Запрос.СуммаБезНДС;
    Т.Контрагент = Запрос.Контрагент;
    Т.РасходнаяНакладная = Запрос.РасходнаяНакладная;
    Т.НомерДок = Запрос.НомерДок;
    Т.ДатаДок = Запрос.ДатаДок;
    Т.СуммаСеб = СуммаСеб;
    Т.ЦенаСеб = ЦенаСеб;
    
    
    Т.ВыбратьСтроки();
    
    Пока Т.ПолучитьСтроку()=1 Цикл
    Пока Запрос.Группировка(3) = 1 Цикл
    Таб.ВывестиСекцию("Строка2");
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("З", "");
    
    
  5. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    1) ТЗ должна быть создана ДО цикла по группировкам запроса
    2) Перед циклом по операциям документа используем УдалитьСтроки для очистки ТЗ
    3) В цикле группировки ТМЦ используя НайтиЗначения устанавливаем значение себестоимости
  6. TopicStarter Overlay
    warayg
    Offline

    warayg Опытный в 1С

    Регистрация:
    1 июл 2011
    Сообщения:
    104
    Симпатии:
    0
    Баллы:
    26
    Все равно не получается (((

    Код:
    	Т = СоздатьОбъект("ТаблицаЗначений");
    Т.НоваяКолонка("ТМЦ","Справочник.ТМЦ");
    Т.НоваяКолонка("Кво","Число",14,2);
    Т.НоваяКолонка("ЦенаБезНДС","Число",14,2);
    Т.НоваяКолонка("НДС","Число",14,2);
    Т.НоваяКолонка("СуммаСНДС","Число",14,2);
    Т.НоваяКолонка("СуммаБезНДС","Число",14,2);
    Т.НоваяКолонка("Контрагент","Справочник.Контрагент");
    Т.НоваяКолонка("РасходнаяНакладная","Док.РасходнаяНакладная");
    Т.НоваяКолонка("НомерДок","Число",10,0);
    Т.НоваяКолонка("ДатаДок","Дата");
    Т.НоваяКолонка("СуммаСеб","Число",14,2);
    Т.НоваяКолонка("ЦенаСеб","Число",14,2);
    
    
    //Т.ТМЦ = Запрос.ТМЦ;
    //Т.Кво = Запрос.КолДок;
    //Т.ЦенаБезНДС = Запрос.ЦенаБезНДС;
    //Т.НДС = Запрос.НДС;
    //Т.СуммаСНДС = Запрос.СуммаСНДС;
    //Т.СуммаБезНДС = Запрос.СуммаБезНДС;
    //Т.Контрагент = Запрос.Контрагент;
    //Т.РасходнаяНакладная = Запрос.РасходнаяНакладная;
    //Т.НомерДок = Запрос.НомерДок;
    //Т.ДатаДок = Запрос.ДатаДок;
    
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = 
    "//{{ЗАПРОС(З)
    |Период с Дата1 по Дата2;
    |Обрабатывать НеПомеченныеНаУдаление;
    |РасходнаяНакладная = Документ.РасходнаяНакладная.ТекущийДокумент;
    |Контрагент = Документ.РасходнаяНакладная.Контрагент;
    |Валюта = Документ.РасходнаяНакладная.Валюта;
    |ТМЦ = Документ.РасходнаяНакладная.ТМЦ.Наименование;
    |Кво = Документ.РасходнаяНакладная.Кво;
    //	|Себестоимость = Документ.РасходнаяНакладная.Себестоимость;
    |ЦенаБезНДС = Документ.РасходнаяНакладная.ЦенаБезНДС;
    |НДС = Документ.РасходнаяНакладная.НДС;
    |СуммаСНДС = Документ.РасходнаяНакладная.СуммаСНДС;
    |СуммаБезНДС = Документ.РасходнаяНакладная.СуммаБезНДС;
    |НомерДок = Документ.РасходнаяНакладная.НомерДок;
    |ДатаДок = Документ.РасходнаяНакладная.ДатаДок;
    |Функция Итого1 = Сумма(СуммаСНДС);
    |Функция Итого2 = Сумма(СуммаБезНДС);
    |Функция Итого3 = Сумма(НДС);
    |Функция КолДок= Сумма(Кво);
    |Группировка  Контрагент;
    |Группировка  РасходнаяНакладная;
    |Группировка  ТМЦ;	
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    // Подготовка к заполнению выходных форм данными запроса
    
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("З");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл
    // Заполнение полей РасходнаяНакладная
    Таб.ВывестиСекцию("Строка");
    Пока Запрос.Группировка(2) = 1 Цикл
    Таб.ВывестиСекцию("Строка1");
    
    Т.УдалитьСтроки();
    Пока Запрос.Группировка(3) = 1 Цикл
    
    Опер=СоздатьОбъект("Операция");
    Опер.НайтиОперацию(Запрос.РасходнаяНакладная.ТекущийДокумент());
    Опер.ВыбратьПроводки();
    Пока Опер.ПолучитьПроводку()=1 Цикл
    Если (Опер.Дебет.Счет<>СчетПоКоду("902")) и (Опер.Кредит.Счет<>СчетПоКоду("281")) Тогда
    Продолжить;
    КонецЕсли;
    Кол=?(Опер.Количество=0,1,Опер.Количество);
    СуммаСеб = ?(Опер.Сумма=0,"",Формат(Опер.Сумма,"Ч12.2"));
    ЦенаСеб = (Опер.Сумма/Кол);
    КонецЦикла;
    
    
    Т.НайтиЗначение(ЦенаСеб);
    Т.ЦенаСеб = ЦенаСеб;
    Т.НайтиЗначение(СуммаСеб);
    Т.СуммаСеб = СуммаСеб;
    
    Т.ВыбратьСтроки();
    Пока Т.ПолучитьСтроку()=1 Цикл
    
    Таб.ВывестиСекцию("Строка2");
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("З", "");
    КонецПроцедур
    
  7. TopicStarter Overlay
    warayg
    Offline

    warayg Опытный в 1С

    Регистрация:
    1 июл 2011
    Сообщения:
    104
    Симпатии:
    0
    Баллы:
    26
    строку вывел, но выходит тоже самое что было и до создание ТЗ

    Код:
    	Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("З");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    
    Т = СоздатьОбъект("ТаблицаЗначений");
    Т.НоваяКолонка("СуммаСеб","Число",14,2);
    Т.НоваяКолонка("ЦенаСеб","Число",14,2);
    
    
    Пока Запрос.Группировка(1) = 1 Цикл
    // Заполнение полей РасходнаяНакладная
    Таб.ВывестиСекцию("Строка");
    Пока Запрос.Группировка(2) = 1 Цикл
    Таб.ВывестиСекцию("Строка1");
    
    
    Пока Запрос.Группировка(3) = 1 Цикл
    
    Т.УдалитьСтроки();	
    
    Опер=СоздатьОбъект("Операция");
    Опер.НайтиОперацию(Запрос.РасходнаяНакладная.ТекущийДокумент());
    Опер.ВыбратьПроводки();
    Пока Опер.ПолучитьПроводку()=1 Цикл
    Если (Опер.Дебет.Счет<>СчетПоКоду("902")) и (Опер.Кредит.Счет<>СчетПоКоду("281")) Тогда
    Продолжить;
    КонецЕсли;
    Кол=?(Опер.Количество=0,1,Опер.Количество);
    СуммаСеб = ?(Опер.Сумма=0,"",Формат(Опер.Сумма,"Ч12.2"));
    ЦенаСеб = (Опер.Сумма/Кол);
    КонецЦикла;
    
    Т.НайтиЗначение(ЦенаСеб,,"ЦенаСеб");
    Т.НайтиЗначение(СуммаСеб,,);
    Т.НоваяСтрока();
    Т.ЦенаСеб = ЦенаСеб;
    Т.СуммаСеб = СуммаСеб;
    Т.ВыбратьСтроки();
    Пока Т.ПолучитьСтроку()=1 <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/цикл')">Цикл	</span>
    Таб.ВывестиСекцию("Строка2");
    
    КонецЦикла;
    
    [​IMG]
  8. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    потратайтесь включить мозг или читайте синтаксический1 помошник...
    Вот это зачем????
    Код:
    Т.НайтиЗначение(ЦенаСеб,,"ЦенаСеб");
    
    
    Читаем....

    НайтиЗначение(<Знач>,<Строка>,<Колонка>)
    Назначение:
    Найти заданное значение в таблице значений. Возвращает число: 0 - значение не найдено; 1 - значение найдено
    Параметры:
    <Знач> - значение для поиска.
    <Строка> - идентификатор переменной, куда возвращается номер найденной строки. Если при вызове метода передать в этот параметр номер строки, то поиск будет осуществляться только по указанной строке.
    <Колонка> - номер или идентификатор колонки, возвращает номер найденной колонки. Идентификатор переменной, куда возвращается номер найденной колонки. Если при вызове метода передать в этот параметр номер или идентификатор колонки, то поиск будет осуществляться только по указанной колонке.


    Т.е. в ТЗ вы аккумулировали себестоимость по всем товарам....
    Теперь в цикле группировки ТМЦ ИЩЕМ в таблице значений ПО ТОВАРУ (а не первый элемент берем)

    + Для чего вот это в коде???
    Код:
    СуммаСеб = ?(Опер.Сумма=0,"",Формат(Опер.Сумма,"Ч12.2"));
    
    
  9. TopicStarter Overlay
    warayg
    Offline

    warayg Опытный в 1С

    Регистрация:
    1 июл 2011
    Сообщения:
    104
    Симпатии:
    0
    Баллы:
    26
    блин не могу врубится, как найти в таблице значений по товару???

    Код:
    Т = СоздатьОбъект("ТаблицаЗначений");
    Т.НоваяКолонка("Сумма","Число",14,2);
    Т.НоваяКолонка("Цена","Число",14,2);
    Т.НоваяКолонка("ТМЦ","Запрос.ТМЦ");
    
    
    Пока Запрос.Группировка(1) = 1 Цикл
    // Заполнение полей РасходнаяНакладная 
    Таб.ВывестиСекцию("Строка");
    
    Пока Запрос.Группировка(2) = 1 Цикл
    Таб.ВывестиСекцию("Строка1");
    
    Пока Запрос.Группировка(3) = 1 Цикл
    
    Т.УдалитьСтроки();	
    
    Опер=СоздатьОбъект("Операция");
    Опер.НайтиОперацию(Запрос.РасходнаяНакладная.ТекущийДокумент());
    Опер.ВыбратьПроводки();
    Пока Опер.ПолучитьПроводку()=1 Цикл
    Если (Опер.Дебет.Счет<>СчетПоКоду("902")) и (Опер.Кредит.Счет<>СчетПоКоду("281")) Тогда
    Продолжить;
    КонецЕсли;
    Кол=?(Опер.Количество=0,1,Опер.Количество);
    Сумма = ?(Опер.Сумма=0,"",Формат(Опер.Сумма,"Ч12.2"));
    //Цена = (Опер.Сумма/Кол);
    КонецЦикла;
    
    Т.НоваяСтрока();	
    Т.НайтиЗначение(Сумма,,);
    
    Т.Сумма = Сумма;
    Т.Цена = Т.Сумма/Кол;
    Т.ВыбратьСтроки();
    Пока Т.ПолучитьСтроку()=1 <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/цикл')">Цикл	</span>
    Таб.ВывестиСекцию("Строка2");
    
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    
  10. TopicStarter Overlay
    warayg
    Offline

    warayg Опытный в 1С

    Регистрация:
    1 июл 2011
    Сообщения:
    104
    Симпатии:
    0
    Баллы:
    26
    мне кажется, что надо в операции получить сумму в проводке по каждому из товаров, их ведь там может быть несколько (в расходной накладной может быть несколько товаров), а у меня вытягивается сумма только по последнему товару.
  11. TopicStarter Overlay
    warayg
    Offline

    warayg Опытный в 1С

    Регистрация:
    1 июл 2011
    Сообщения:
    104
    Симпатии:
    0
    Баллы:
    26
    это то, что в проводке:

    [​IMG]

    а это то, что у меня получается (то, что вытягивает операция из проводки):

    [​IMG]
  12. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Заполняем ТМЦ так:
    Код:
    Опер.ВыбратьПроводки();			
    Пока Опер.ПолучитьПроводку()=1 <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/цикл')">Цикл			</span>
    Если (Опер.Дебет.Счет<>СчетПоКоду("902")) и (Опер.Кредит.Счет<>СчетПоКоду("281")) Тогда  				Продолжить;			
    КонецЕсли;
    Кол=?(Опер.Количество=0,1,Опер.Количество);        
    //Сумма = ?(Опер.Сумма=0,"",Формат(Опер.Сумма,"Ч12.2")); УБРАТЬ!!
    Т.НоваяСтрока();
    Т.Сумма= Опер.Сумма/Кол; //это себестоимость
    Т.ТМЦ=Опер.Дебет.Субконто(2);
    //Т.Цена ...  там не нужно совсем - берем из документа!
    ....
    
    
  13. TopicStarter Overlay
    warayg
    Offline

    warayg Опытный в 1С

    Регистрация:
    1 июл 2011
    Сообщения:
    104
    Симпатии:
    0
    Баллы:
    26
    С себестоимостью получилось, но почему то идет повтор строчек

    [​IMG]

    Код:
    Пока Запрос.Группировка(1) = 1 Цикл
    // Заполнение полей РасходнаяНакладная 
    Таб.ВывестиСекцию("Строка");
    
    Пока Запрос.Группировка(2) = 1 Цикл
    Таб.ВывестиСекцию("Строка1");
    
    Пока Запрос.Группировка(3) = 1 Цикл
    
    Т.УдалитьСтроки();	
    
    Опер=СоздатьОбъект("Операция");
    Опер.НайтиОперацию(Запрос.РасходнаяНакладная.ТекущийДокумент());
    Опер.ВыбратьПроводки();			
    Пока Опер.ПолучитьПроводку()=1 <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/цикл')">Цикл			</span>
    Если (Опер.Дебет.Счет<>СчетПоКоду("902")) и (Опер.Кредит.Счет<>СчетПоКоду("281")) Тогда
    Продолжить;			
    КонецЕсли;
    Кол=?(Опер.Количество=0,1,Опер.Количество);        
    Т.НоваяСтрока();
    Т.Сумма= Опер.Сумма/Кол; //это себестоимость
    Т.ТМЦ=Опер.Дебет.Субконто(2);
    
    //Т.ВыбратьСтроки();
    //Пока Т.ПолучитьСтроку()=1 Цикл	
    Таб.ВывестиСекцию("Строка2");
    //КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    
  14. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Потому что масло-масляное...
    Вы внутри цикла по товару организовали цикл по операции...

    Не внимательно читаете что вам пишут - это факт.

    1) Заполняем себестоимость в таблицу значений В ПЕРВОЙ ГРУППИРОВКЕ (там где документ)
    2) В группировке по ТМЦ просто используем НайтиЗначение из ТЗ и выводим
  15. TopicStarter Overlay
    warayg
    Offline

    warayg Опытный в 1С

    Регистрация:
    1 июл 2011
    Сообщения:
    104
    Симпатии:
    0
    Баллы:
    26
    Большое спасибо!! Все получилось. Опять вопрос ))), как получить общую сумму себестоимости всех товаров по накладной?
  16. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Завести еще одну колонку в ТЗ. Скажем СуммаСебестоимости. Заполняем в нее

    Код:
    Т.НоваяСтрока(); 
    Т.Сумма= Опер.Сумма/Кол; //это себестоимость 
    Т.ТМЦ=Опер.Дебет.Субконто(2);
    Т.СуммаСебестоимости=Опер.Сумма;
    
    
    
    
    в итоговой строке по наклодной получаем: Т.Итог("СуммаСебестоимости");
  17. TopicStarter Overlay
    warayg
    Offline

    warayg Опытный в 1С

    Регистрация:
    1 июл 2011
    Сообщения:
    104
    Симпатии:
    0
    Баллы:
    26
    Извините за наглость, а по контрагенту как вывести сумму себестоимости всех накладных?
  18. TopicStarter Overlay
    warayg
    Offline

    warayg Опытный в 1С

    Регистрация:
    1 июл 2011
    Сообщения:
    104
    Симпатии:
    0
    Баллы:
    26
    блин, и с суммой с ндс, таже фигня что и с себестоимостью было, если в печатной форме забивать Запрос.СуммаСНДС, то она повторяется по всем товарам в накладной. Пробовал через ТЗ, тоже самое.
  19. TopicStarter Overlay
    warayg
    Offline

    warayg Опытный в 1С

    Регистрация:
    1 июл 2011
    Сообщения:
    104
    Симпатии:
    0
    Баллы:
    26
    создал другую ТЗ и через неё получил сумму (по цене реал.), как вывести данные из двух ТЗ в одну строку?
  20. TopicStarter Overlay
    warayg
    Offline

    warayg Опытный в 1С

    Регистрация:
    1 июл 2011
    Сообщения:
    104
    Симпатии:
    0
    Баллы:
    26
    Можно из проводки получить цену без ндс?

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