8.х Отчет и движения

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

Статус темы:
Закрыта.
  1. TopicStarter Overlay
    mhl
    Offline

    mhl Опытный в 1С

    Регистрация:
    23 июн 2007
    Сообщения:
    418
    Симпатии:
    0
    Баллы:
    26
    Вот код отчета ОстаткиИДвиженияМатериалов:
    Код:
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    ХозрасчетныйОстаткиИОбороты.Счет КАК Счет,
    |    ПРЕДСТАВЛЕНИЕ(ХозрасчетныйОстаткиИОбороты.Счет),
    |    ХозрасчетныйОстаткиИОбороты.Субконто1,
    |    ПРЕДСТАВЛЕНИЕ(ХозрасчетныйОстаткиИОбороты.Субконто1),
    |    ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Субконто2,
    |    ПРЕДСТАВЛЕНИЕ(ХозрасчетныйОстаткиИОбороты.Субконто2),
    |    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток,
    |    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток,
    |    ХозрасчетныйОстаткиИОбороты.СуммаОборотДт,
    |    ХозрасчетныйОстаткиИОбороты.СуммаОборотКт,
    |    ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстаток,
    |    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток,
    |    ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт,
    |    ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт
    |ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачДата, &КонДата, , , , , ) КАК ХозрасчетныйОстаткиИОбороты
    |ГДЕ
    |    ХозрасчетныйОстаткиИОбороты.Счет.Родитель = &Счет";
    Если Номенклатура.Пустая()=Ложь ТОгда
    Запрос.Текст = Запрос.Текст +
    "
    |И    ХозрасчетныйОстаткиИОбороты.Субконто1 = &Номенклатура";
    КонецЕсли;
    Если Склад.Пустая()=Ложь ТОгда
    Запрос.Текст = Запрос.Текст +
    "
    |И    ХозрасчетныйОстаткиИОбороты.Субконто2 = &Склад";
    КонецЕсли;
    Запрос.Текст = Запрос.Текст +
    "
    |УПОРЯДОЧИТЬ ПО
    |    Субконто1
    |ИТОГИ ПО
    |    Счет,
    |    Субконто2
    |АВТОУПОРЯДОЧИВАНИЕ";
    ...................................................................................................
    ...................................................................................................
    ...................................................................................................
    ВыборкаСчет = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаСчет.Следующий() Цикл
    ОбластьСчет.Параметры.Заполнить(ВыборкаСчет);
    ОбластьСчет.Параметры.СчетПредставление = ВыборкаСчет.Счет.Наименование;
    ТабДок.Вывести(ОбластьСчет, ВыборкаСчет.Уровень());
    ВыборкаСубконто2 = ВыборкаСчет.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаСубконто2.Следующий() Цикл
    ОбластьСубконто2.Параметры.Заполнить(ВыборкаСубконто2);
    ТабДок.Вывести(ОбластьСубконто2, ВыборкаСубконто2.Уровень());
    ВыборкаДетали = ВыборкаСубконто2.Выбрать();
    Пока ВыборкаДетали.Следующий() Цикл
    ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
    
    Субконто1 = ВыборкаДетали.Субконто1;
    Счет1 = ВыборкаДетали.Счет;
    Субконто2 = ВыборкаСубконто2.Субконто2;
    
    ЗаполнитьПараметрыРасшифровки(ОбластьДетальныхЗаписей, Счет1, Субконто1, Субконто2);
    ТабДок.Вывести(ОбластьДетальныхЗаписей);
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;
    
    А вот процедура ОбработкаПроведения документа ОтгрузкаПродукции
    Код:
        СчетКонтрагента = ПланыСчетов.Хозрасчетный.РасчетыСПокупателями;
    СпрСоотв = Справочники.Соответствие;
    Для каждого стр из ТаблЧасть Цикл
    НовоеДвиж                             = Движения.Хозрасчетный.Добавить();
    НовоеДвиж.Период                     = Дата;
    НовоеДвиж.Организация                 = Константы.ОсновнаяОрганизация.Получить();
    НовоеДвиж.СчетДт                     = Стр.Счет;
    НовоеДвиж.СчетКт                     = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
    НовоеДвиж.СубконтоКт.Номенклатура     = Стр.Номенклатура;
    НовоеДвиж.СубконтоКт.Склады         = Склад;
    НовоеДвиж.КоличествоКт                 = Стр.Колво;
    НовоеДвиж.Сумма                     = Стр.Номенклатура.ЦенаПокупки*Стр.Колво;
    
    НовоеДвиж                                 = Движения.Хозрасчетный.Добавить();
    НовоеДвиж.Период                         = Дата;
    НовоеДвиж.Организация                     = Константы.ОсновнаяОрганизация.Получить();
    НовоеДвиж.СчетДт                         = СчетКонтрагента;
    НовоеДвиж.СубконтоДт.Контрагенты         = Контрагент;
    НовоеДвиж.СубконтоДт.ВариантыРеализаций = ВариантыРеализаций;
    НовоеДвиж.СубконтоДт.СрокПлатежа         = СрокОплаты;
    НовоеДвиж.СчетКт                         = Стр.Счет;
    НовоеДвиж.Сумма                          = Стр.Сумма;        
    
    
    Если Контрагент = Константы.КонтрагентМетакПродакшн.Получить() ТОгда
    
    НовоеДвиж                                 = Движения.Хозрасчетный.Добавить();
    НовоеДвиж.Период                         = Дата;
    НовоеДвиж.Организация                     = Константы.ОсновнаяОрганизация.Получить();
    НовоеДвиж.СчетДт                         = ПланыСчетов.Хозрасчетный.СырьеИМатериалы;
    НовоеДвиж.СубконтоДт.Номенклатура         = Стр.Номенклатура;
    НовоеДвиж.СубконтоДт.Склады             = Константы.СкладМетакПродакшн.Получить();
    
    НовоеДвиж.СчетКт                         = СчетКонтрагента;
    НовоеДвиж.СубконтоКт.Контрагенты         = Контрагент;
    НовоеДвиж.СубконтоКт.ВариантыРеализаций = ВариантыРеализаций;
    НовоеДвиж.СубконтоКт.СрокПлатежа         = СрокОплаты;
    
    НовоеДвиж.Сумма                          = Стр.Сумма;        
    
    КОнецЕсли;
    
    
    Если Контрагент = Константы.КонтрагентМетакОтводы.Получить() ТОгда
    
    НовоеДвиж                                 = Движения.Хозрасчетный.Добавить();
    НовоеДвиж.Период                         = Дата;
    НовоеДвиж.Организация                     = Константы.ОсновнаяОрганизация.Получить();
    НовоеДвиж.СчетДт                         = ПланыСчетов.Хозрасчетный.СырьеИМатериалы;
    НовоеДвиж.СубконтоДт.Номенклатура         = Стр.Номенклатура;
    НовоеДвиж.СубконтоДт.Склады             = Константы.СкладМетакОтводы.Получить();
    
    НовоеДвиж.СчетКт                         = СчетКонтрагента;
    НовоеДвиж.СубконтоКт.Контрагенты         = Контрагент;
    НовоеДвиж.СубконтоКт.ВариантыРеализаций = ВариантыРеализаций;
    НовоеДвиж.СубконтоКт.СрокПлатежа         = СрокОплаты;
    
    НовоеДвиж.Сумма                          = Стр.Сумма;        
    
    КОнецЕсли;
    
    
    
    Движения.Хозрасчетный.Записать();
    КонецЦикла;
    
    ВарРеал = Справочники.ВариантыРеализаций;
    СрОпл = Справочники.СрокПлатежа;
    
    Если ЕстьДопРасходы=Истина ТОгда
    
    НовоеДвиж                             = Движения.Хозрасчетный.Добавить();
    НовоеДвиж.Период                     = Дата;
    НовоеДвиж.Организация                 = Константы.ОсновнаяОрганизация.Получить();
    НовоеДвиж.СчетДт                    = СчетКонтрагента;
    НовоеДвиж.СчетКт                    = ПланыСчетов.Хозрасчетный.ТранспортныеУслуги;
    НовоеДвиж.СубконтоДт.Контрагенты         = Контрагент;
    НовоеДвиж.СубконтоДт.ВариантыРеализаций = ВарРеал.НайтиПоНаименованию("Транспортные услуги");
    НовоеДвиж.СубконтоДт.СрокПлатежа     = СрОпл.НайтиПоНаименованию("0.По отгрузке");
    НовоеДвиж.Сумма                     = СуммаДопРасходов;
    
    Движения.Хозрасчетный.Записать();
    
    КонецЕсли;
    
    Проблема в том, что в отчет не попадает количество если движение в регистре было сделано этим документом.
  2. TopicStarter Overlay
    mhl
    Offline

    mhl Опытный в 1С

    Регистрация:
    23 июн 2007
    Сообщения:
    418
    Симпатии:
    0
    Баллы:
    26
    Количество в некоторых случаях все-таки попадает. Только мне не совсем понятен механизм передачи данных из регистра в отчет. И откуда-то в количестве появляются отрицательные числа.
  3. lazy
    Offline

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

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Не вникая глубоко в твой отчет, могу подсказать, что коли используешь в запросе конструкцию ГДЕ, то группируй и суммируй результаты, а по человечески - используй параметры виртуальной таблицы.
  4. x_under
    Offline

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

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    Что-то и отчет и проведение документа оставляет желать лучшего. НУ про параметры уже сказали. Потому что, при использовании "ГДЕ" отчет работает дольше.
    А при проведении СубконтоДт нет вообще? Ты точно все поля заполняешь?
  5. lazy
    Offline

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

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Дело не только в том, что использование виртуальных таблиц убыстряет работу. Может произойти случай, когда под одно определение ГДЕ попадут две или более записей с одинаковым измерением по условию, но не одинаковым измерением использующимся в выборке. Тогда начнутся "непонятные глюки", когда на одних данных отчет работает идеально, а надругих творит нечто невообразимое. Если использовать в таких запросах(с ГДЕ) группировку и суммирование - такого побочного эффекта можно избежать. Ну а использование виртуальных таблиц вообще от такой проблемы избавляет....
  6. TopicStarter Overlay
    mhl
    Offline

    mhl Опытный в 1С

    Регистрация:
    23 июн 2007
    Сообщения:
    418
    Симпатии:
    0
    Баллы:
    26
    объясните пожалуйста поподробнее как использовать виртуальные таблицы.
  7. TopicStarter Overlay
    mhl
    Offline

    mhl Опытный в 1С

    Регистрация:
    23 июн 2007
    Сообщения:
    418
    Симпатии:
    0
    Баллы:
    26
    У меня подозрение что проблема в самом документе. В другом отчете та же проблема с количеством. Но ведь с другой стороны это количество попадает в регистр.
Статус темы:
Закрыта.

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