7.7 не считаются итоги в регистре Продажи

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

  1. TopicStarter Overlay
    x0x0chu
    Offline

    x0x0chu

    Регистрация:
    2 апр 2009
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    1
    Подскажите, в чем может быть проблема, если при выгрузке итогов из регистра Продажи - результата нет.
    Вот код:
    Код:
    РП.ВыбратьИтоги();
    
    Пока РП.ПолучитьИтог()=1 Цикл
    ...
    КонецЦикла;
    
    
  2. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Значит
    1)их там нет)))) (что мало вероятно)
    2)не правильно своримировал запрос (что за код выслал? где и как определелил объект?)
    3)что за конфа

    Задавайте вопрос корректно - уважайте коллег
  3. TopicStarter Overlay
    x0x0chu
    Offline

    x0x0chu

    Регистрация:
    2 апр 2009
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    1
    Бухгалтерский угодник отвечаю также по пунктам

    1) итоги там реально есть (видны по движениям документов)
    2) код следующий:

    Код:
    СпрНом=СоздатьОбъект("Справочник.Номенклатура");
    РП=СоздатьОбъект("Регистр.Продажи");
    РП.ВыбратьИтоги();
    Пока РП.ПолучитьИтог()=1 Цикл
    Если СпрНом.НайтиЭлемент(РП.Номенклатура)=1 Тогда
    Если Строка(СпрНом.родитель)="КИРПИЧИ" Тогда
    КирпСум=КирпСум+РП.ПродСтоимость
    КонецЕсли;
    Если Строка(СпрНом.родитель)="БЛОКИ" Тогда
    БлокСум=БлокСум+РП.ПродСтоимость
    КонецЕсли;
    КонецЕсли;
    Таб.ПрисоединитьСекцию("Данные");
    КонецЦикла;
    
    

    Суть в том, что таким образом я хочу посчитать выручку по группам товаров (кирпичи, блоки и т.п.).
    Если есть более рациональный способ - прошу посоветовать мне его.

    3) Конфигурация Торговля и Склад ред. 9.2
  4. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Через запрос проще, правильнее, быстрее
    Код:
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать1)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ПродСтоимость = Регистр.Продажи.ПродСтоимость;
    |Родитель = Регистр.Продажи.Номенклатура.Родитель;
    |Функция ПродСтоимостьСумма = Сумма(ПродСтоимость);
    |Группировка Родитель;
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    
    
  5. TopicStarter Overlay
    x0x0chu
    Offline

    x0x0chu

    Регистрация:
    2 апр 2009
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    1
    Бухгалтерский угодник выполняю по аналогии с вашим примером запрос - результата нет
    Мой код:

    Код:
    Запрос=СоздатьОбъект("Запрос");
    ТекстЗапроса=
    "//{{ЗАПРОС(Сформировать1)
    |Период С НачДата по КонДата;
    |ПродСтоимость = Регистр.ОстаткиТМЦ.ЦенаПрод;
    |Товар = Регистр.ОстаткиТМЦ.Номенклатура;
    |Родитель = Регистр.ОстаткиТМЦ.Номенклатура.Родитель;
    |Склад = Регистр.ОстаткиТМЦ.Склад;
    |Кол = Регистр.ОстаткиТМЦ.Количество;
    |Функция ПродСтоимостьСумма = Сумма(ПродСтоимость);
    |Группировка Родитель;
    |";//}}ЗАПРОС
    
    Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
    Сообщить("Запрос не выполнен","!");
    Возврат;
    КонецЕсли;	
    
    ТекДата=ТекущаяДата();
    НП=ДобавитьМесяц(ТекДата,-24);
    
    Пока Запрос.Группировка("Родитель")=1 Цикл
    
    Наименование = Запрос.Товар; 
    
    Запрос2=СоздатьОбъект("Запрос");
    ТекстЗапроса=
    "//{{ЗАПРОС(Сформировать2)
    |Период С НП по КонДата;
    |Себестоимость = Регистр.Продажи.Себестоимость;
    |Тов = Регистр.Продажи.Номенклатура;
    |Функция СебестоимостьСумма = Сумма(Себестоимость);
    |Группировка Тов;
    |";//}}ЗАПРОС
    
    Если Запрос2.Выполнить(ТекстЗапроса)=0 Тогда
    Сообщить("Запрос не выполнен","!");
    Возврат;
    КонецЕсли;
    
    Пока Запрос2.Группировка("Тов")=1 Цикл
    Если Строка(Наименование)=Строка(Запрос2.Тов) Тогда
    ЦЗакуп = Запрос2.Себестоимость;
    КонецЕсли;
    КонецЦикла;
    
    
    Скл = Строка(Запрос.Склад);
    Количество = Запрос.Количество;
    ЦенаПрод = Запрос.ПродСтоимость;
    
    Таб.ПрисоединитьСекцию("Значения");
    
    КонецЦикла;
    
    
    Скажите пожалуйста, чем мой код ошибочен?
  6. WaRDeR
    Offline

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

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Не достаточно группировок. Например есть группировка по родителю.
    а тут пытаешься выбрать товар. Как думаешь, что комп должен выдать, если у одного родителя может быть несколько вложенных элементов?

    А запрос в цикле - это по определению не правильно. Надо от этого избавляться.
  7. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Для этого нужно отобранный в первом запросе товар выгрузить в СписокЗначений и использовать его в Условии второго запроса в качестве фильтра
  8. TopicStarter Overlay
    x0x0chu
    Offline

    x0x0chu

    Регистрация:
    2 апр 2009
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    1
    Попробовал выгрузку в Список Значений, результата нет.
    Мой код:
    Код:
    Запрос1=СоздатьОбъект("Запрос");
    ТекстЗапроса=
    "//{{ЗАПРОС(Сформировать1)
    |Период С НачДата по КонДата;
    |ПродСтоимость = Регистр.ОстаткиТМЦ.ЦенаПрод;
    |Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
    |Родитель = Регистр.ОстаткиТМЦ.Номенклатура.Родитель;
    |Склад = Регистр.ОстаткиТМЦ.Склад;
    |Кол = Регистр.ОстаткиТМЦ.Количество;
    |Функция ПродСтоимостьСумма = Сумма(ПродСтоимость);
    |Группировка Родитель;
    |//}}ЗАПРОС";
    
    Если Запрос1.Выполнить(ТекстЗапроса)=0 Тогда
    Сообщить("Запрос не выполнен","!");
    Возврат;
    КонецЕсли;	
    
    
    ТЗ=СоздатьОбъект("ТаблицаЗначений");
    СпЗ=СоздатьОбъект("СписокЗначений");
    
    Пока Запрос1.Группировка("Родитель")=1 Цикл
    Запрос1.Выгрузить(ТЗ);	    
    КонецЦикла;
    
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
    ТЗ.Выгрузить(СпЗ);
    КонецЦикла;
    
    Запрос2=СоздатьОбъект("Запрос");
    ТекстЗапроса=
    "//{{ЗАПРОС(Сформировать2)
    |Период С НачДата по КонДата;
    |Себестоимость = Регистр.Продажи.Себестоимость;
    |Тов = Регистр.Продажи.Номенклатура;
    |Род = Регистр.Продажи.Номенклатура.Родитель;
    |Условие (Тов в СпЗ);
    |Группировка Род;
    |//}}ЗАПРОС";
    
    Если Запрос2.Выполнить(ТекстЗапроса)=0 Тогда
    Сообщить("Запрос не выполнен","!");
    Возврат;
    КонецЕсли;
    
    ТЗ.ВыбратьСтроки(); 
    Пока ТЗ.ПолучитьСтроку()=1 Цикл
    
    Пока Запрос2.Группировка("Род")=1 Цикл
    Если Строка(Запрос2.Тов)=Строка(ТЗ.Номенклатура) Тогда
    ЦЗакуп = Запрос2.Себестоимость 
    КонецЕсли;
    КонецЦикла;	
    
    Наименование = ТЗ.Номенклатура; 
    
    Скл = Строка(ТЗ.Склад);
    Количество = ТЗ.Количество;
    ЦенаПрод = ТЗ.ПродСтоимость;
    
    
    Ном = Ном + 1;
    ОбщееКоличество = 0;
    СуммаПоЗакупке = ЦЗакуп*Количество;
    СуммаПоПродаже = ЦенаПрод*Количество;
    
    Если Число(ЦЗакуп)>0 Тогда
    Наценка = ЦенаПрод*100/ЦЗакуп - 100;
    Наценка = Окр(Наценка,2,1);
    КонецЕсли;
    
    
    Таб.ПрисоединитьСекцию("Значения");
    
    КонецЦикла;
    
    
  9. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Читай документацию по методу Выгрузить

    Код:
    ТЗ=СоздатьОбъект("ТаблицаЗначений");
    СпЗ=СоздатьОбъект("СписокЗначений");
    Запрос1.Выгрузить(ТЗ,1,0);	  
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку()=1 Цикл    
    СпЗ.ДобавитьЗначение(ТЗ.Номенклатура);
    КонецЦикла;
    
    
  10. WaRDeR
    Offline

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

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Не обязательно использовать перебор, для переноса значений из ТЗ в СЗ.
    Если в ТЗ уже отобраны только нужные значения, тогда можно так:
    Код:
    ТЗ=СоздатьОбъект("ТаблицаЗначений");
    СпЗ=СоздатьОбъект("СписокЗначений");
    Запрос1.Выгрузить(ТЗ,1,0);	  
    
    ТЗ.Выгрузить(СпЗ,,,1);
    
    
  11. TopicStarter Overlay
    x0x0chu
    Offline

    x0x0chu

    Регистрация:
    2 апр 2009
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    1
    Похоже что запрос1 не возращает ничего из регистра ОстаткиТМЦ.
    Вот он:
    Код:
    Запрос1=СоздатьОбъект("Запрос");
    ТекстЗапроса=
    "//{{ЗАПРОС(Сформировать1)
    |Период С НачДата по КонДата;
    |ПродСтоимость = Регистр.ОстаткиТМЦ.ЦенаПрод;
    |Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
    |Родитель = Регистр.ОстаткиТМЦ.Номенклатура.Родитель;
    |Склад = Регистр.ОстаткиТМЦ.Склад;
    |Кол = Регистр.ОстаткиТМЦ.Количество;
    |Функция ПродСтоимостьСумма = Сумма(ПродСтоимость);
    |Группировка Номенклатура;
    |//}}ЗАПРОС";
    
    Если Запрос1.Выполнить(ТекстЗапроса)=0 Тогда
    Сообщить("Запрос не выполнен","!");
    Возврат;
    КонецЕсли;	
    
    
    Содержимое регистра проверил через движения документов, информация там имеется.
    Запрос сей стандартный, из-за чего же тогда он не выводит ничего???
  12. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Потому что ОстаткиТМЦ это регитр остатков. И нужно использовать функцию

    Код:
    КонОст
    
    
    ...читай документацию по составлению запросов
  13. TopicStarter Overlay
    x0x0chu
    Offline

    x0x0chu

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

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

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Это смотря на чей взляд :unsure:

    ИМХО не нужно мешать обращение к регистрам через методы и запрос.

    Если знаешь, что конкретно тебе надо посмотреть (по конкретному складу или товару и т.п.) - используй методы.
    Если тебе надо перебрать всю инфу с определенными фильтрами - тогда запрос.

    В твоем случае запрос только замедляет работу, куда быстрее будет ВыбратьЭлементы().
    А остатки показывает неверно, т.к. у тебя нигде нет и близко проверки на ТА. так что будет работать только на ТА.
  15. TopicStarter Overlay
    x0x0chu
    Offline

    x0x0chu

    Регистрация:
    2 апр 2009
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    1
    Хорошо. с регистром остатков все заработало.но оборотный регистр Продажи итогов не дает.
    Вот код:

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

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Фильтруешь неправильно. Смотри пример к описанию
  17. WaRDeR
    Offline

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

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Думаю сложно получить остатки по оборотному регистру.... на то он и оборотный.

    Может надо сначала стандартную литературу почитать?
  18. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Остатки (если можно их так назвать)))))))))))) Получить можно на текущий момент (момент истины)
  19. TopicStarter Overlay
    x0x0chu
    Offline

    x0x0chu

    Регистрация:
    2 апр 2009
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    1
    2 WaRDeR : стандартную литературу я почитал=) и по оборотному регистру я считаю СводныйИтог, а не остаток. Хотя он то и не считается :unsure: Мне из регистра Продажи необходимо себестоимость взять.

    2 Бухгалтерский угодник:
    1) в чем ошибка фильтрации?? я ее по примеру из официального учебника по встроенному языку 1С 7.7 писал;
    2) итог по регистру продажи правильно считается??
  20. TopicStarter Overlay
    x0x0chu
    Offline

    x0x0chu

    Регистрация:
    2 апр 2009
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    1
    так товарищи WaRDeR и Бухгалтерский угодник
    несмотря на почти пять прошедших месяцев, мои вопросы к вам все еще актуальны!
    так что если есть какие-то соображения прошу их высказать.
    Заранее спасибо

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