Из данной подборки вы узнаете, как СКД рассчитывает итоги для набора данных “Объект” и как программно работать с полями расшифровки при необходимости. Информация будет полезна и для начинающих разработчиков 1С, и для специалистов с опытом.
Вопрос №1: Что означает роль “Измерение” для поля набора данных в СКД?
Ответ
Роль “Измерение” тоже используется для расчета остатков при помощи механизмов СКД. Чтобы разобраться, нужно вспомнить 2 тезиса:
- СКД не допускает использования предложения ИТОГИ в тексте запросов наборов данных, потому что СКД считает итоги самостоятельно.
- В схеме компоновки могут присутствовать не только наборы данных – запросы, для которых по тексту запроса можно определить связь с объектами метаданных. Например, в запросе используется регистр накопления “ТоварыНаСкладах”, значит, поле “Номенклатура” – это измерение.
В схеме компоновки могут быть наборы данных – объекты, в которых есть только список полей, но нет никакой связи с объектами метаданных. Для наборов данных – объектов СКД тоже должна иметь возможность рассчитать итоги. Поэтому системе нужно “подсказать”, как считать итоги. Для этого и предназначены указанные роли. Поэтому среди полей набора данных выделяются 3 класса:
- Ресурсы (итоговые поля, например, “КоличествоНачальныйОстаток”, “КоличествоПриход”, “КоличествоРасход”, “КоличествоКонечныйОстаток”)
- Измерения (в разрезе чего нам нужно подсчитать итоги, например, “Номенклатура”, “Склад”)
- Периоды (как изменялись значения во времени, например, “Регистратор”, “ПериодСекунда”)
Таким образом, кратко алгоритм по указанной Вами ссылке можно сформулировать так – СКД подсчитывает итоги для ресурсов, группируя данные в разрезе измерений, используя упорядочивание данных по полям-периодам.
Уточняющий вопрос
Ответ
СКД не будет учитывать такие поля при расчете итогов, потому что не понятно, как их интерпретировать – как измерения, в разрезе которых требуется получить итоги, или как поля-периоды, которые будут определять хронологию.
Вопрос №2: Как программно получить список полей расшифровки?
Ответ
Для этого предназначен метод ПолучитьПоля(). Примерный код выглядит следующим образом:
&НаКлиенте Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ДанныеРасшифровкиКомпоновки = ПолучитьИзВременногоХранилища(ДанныеРасшифровки); ПоляРасшифровки = ДанныеРасшифровкиКомпоновки.Элементы.Получить(Расшифровка).ПолучитьПоля(); КонецПроцедуры
Также в одном из практических заданий курса рассматривается, как рекурсивно определять родительские элементы расшифровки, получать из них значения полей расшифровки.
Уточняющий вопрос
Ответ
Можно таким образом поступить – при помощи кода из решения практического задания получаем список вышележащих группировок. Затем из схемы компоновок получаем перечень всех полей. Удаляем из этого списка поля вышележащих группировок, получится как раз список из интересующих Вас полей.
Либо альтернатива – анализировать структуру отчета из настроек компоновки, как Вы предлагаете.
Уточняющий вопрос
Ответ
Когда в настройках компоновки используется кросс-таблица. Тогда получится 2 родителя: один из группировки строк, другой – из группировки колонок, на пересечении которых находится расшифровываемое значение.
Профессиональная разработка отчетов в 1С 8.3 на СКД.
Не могу сделать отчет по регистру продажи-обороты с двумя произвольными периодами. Вседа получаю данные на первый период.
Добрый день!
Если для виртуальной таблицы Обороты указать периодичность Авто, то можно в запросе выбирать несколько полей-периодов:
ВыручкаИСебестоимостьПродажОбороты.ПериодГод КАК ПериодГод,
ВыручкаИСебестоимостьПродажОбороты.ПериодМесяц КАК ПериодМесяц,
ВыручкаИСебестоимостьПродажОбороты.Подразделение КАК Подразделение,
ВыручкаИСебестоимостьПродажОбороты.КоличествоОборот КАК КоличествоОборот,
ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот КАК СуммаВыручкиОборот
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(, , Авто, ) КАК ВыручкаИСебестоимостьПродажОбороты
Это понятно, а два произвольных для сравнения – за май чтобы сравнить с апрелем а ещё неплохо май прошлого года -третий период. Но реально надо один произволный и два – месяц назад за те же дни и год назад за теже дни. Неделю бьюсь всх друзей обзвонил гугл в помощь и никак
Можно использовать объединение наборов данных: в первом получать данные за текущий месяц, во втором – за предыдущий и т.д.
В курсе по СКД такой прием рассматриваем.
Посмотрел содержание курсов. Записался. Давно хотел СКД какие нибудь приличные курсы пройти. И сраза поспешил реализовать ваш вариант. Меня вчера тоже посетила такая мысль. Но результат тотже. Если раньше мог выводить два периода, не результат был как будто они одинаковые. То теперь второй период не появляется полях группировки. Нужная таблица не получается.
То, что записали на курс по СКД – отлично! Это поможет систематизировать знания.
Прикрепил пример отчета Сравнение продаж за 2 периода. Выводим номенклатуру, а также сумму продаж за 2 периода, разницу между этими суммами. Посмотрите, пожалуйста, должно быть очень похоже на Вашу задачу.
Спасибо огромное. К сожалению отчет напрямую не подошел, у вас видимо какая то учебная база. Я чуточку приблизился к решению. Я вдвух отчетах почему то не разводил имена количество и выручка. У меня было пости как у вас, только и менами проблема. Всё сделал по образу и подобию. И… опять пот же цирк, никаких изменений. Я больше 20 лет программирую на 1С. С СКД делал много простеньких отчетов. Всегда казалось что он какой то мутный и очередной раз подтверждается. Да мощьный, красивый, но мутный…
Могу только порекомендовать воспользоваться для отладки консолью компоновок, чтобы понять, какой конкретно запрос выбирает данные из базы, для каких значений параметров.
Воспользовался отладочной консолью, убедился что СКД создал параметры П и П2. Присвоил им значения первого периода и оба запроса формирует по эти параметрам. Остаёся понять “самую малость” как на это безобразие влиять…
Отлично, что получилось диагностировать проблему!
Вы столкнулись с особенностью автозаполнения. Для решения проблемы можно использовать в тексте запроса из набора данных конструкции в фигурных скобках. В статье 17 вопросов и ответов по СКД, проектированию форм, навигации, панелям и т.п. есть вопрос 5 по СКД, он может помочь Вам.
Спасибо. Разобрался. Правда 17 вопросов и ответов по СКД вопрос 5 по СКД – вопрос оказался не в тему. А вот фраза особенности автозаполнеия, очень помогла. Помотрел как люди это делают, отключил автозаполнение, настоил поля, и всё получилось.
Отлично, что разобрались!
Про 5-й вопрос не согласен – он именно про автозаполнение, про подобную ситуацию с получением данных за 2 периода.
Вопрос 5
В процессе выполнения кода создается текстовый файл. По окончании формирования файла используется метод ПоказатьОповещениеПользователя().
Можно ли в этом методе создать гиперссылку, при переходе по которой будет открываться созданный файл? И где тут про автозаполнение?
Вы смотрите вопросы по интерфейсам.
Спуститесь ниже в раздел по СКД, найдите 5-й вопрос по СКД, а не по интерфейсам и формам
И всё таки в итоге ничего не работает. За это время руками без скд написал бы 10 отчетов… Жаль только время потерял…
Добрый день! А Как получить корректные остатки и обороты при этом исключив из оборотов документ перемещение товаров?
Добрый день!
Рекомендую посмотреть в УТ 11, как сделан отчет ВедомостьПоПартиямТоваров. В схеме компоновки реализован параметр ИсключаемыеХозОперации, по его значениям фильтруются записи регистра накопления СебестоимостьТоваров.
Добрый день! Спасибо за ответ! Я примерно так и сделал, я в запросе объединил две таблицы “ТоварыНаСкладахОстаткиИОбороты” из нее берется начальный и конечный остаток, “ТоварыНаСкладахОбороты” из нее берется приход и расход и в этой же таблице установлено условие по регистратору “НЕ ТоварыНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПеремещениеТоваров”, в обеих таблицах период установлен авто, а так же выбираются поля периоды “Регистратор,ПериодСекунда,ПериодМесяц”,данные выводятся так, в строках номенклатура, в колонках ПериодМесяц. Если я формирую отчет за один месяц , то все формируется корректно (Начальный и Конечный Остаток), а если выбираю период квартал, то выводятся не корректные данные по начальному и конечному остатку: к примеру выбираем в период 3 квартал, в июле корректные остатки, в августе неверные Начальный и Конечный остаток, в сентябре тоже все корректно. Подскажите пожалуйста, что я делаю не так?
Добрый день!
Для проверки попробуйте сделать отчет только по виртуальной таблице ТоварыНаСкладахОстаткиИОбороты сначала без ограничений по типу регистратора. Сделайте требуемую структуру отчета, проверьте, что все остатки выводятся корректно.
Потом добавьте отбор по типу регистратора, проверьте остатки после этого.
По идее достаточно только одной виртуальной таблицы ТоварыНаСкладахОстаткиИОбороты для получения всех нужных данных, возможно, получится упростить, обойтись без объединения.
Также посмотрите сами исходные данные – детальные записи. Возможно исключение перемещений из оборотов дает некорректные данные, из-за которых СКД не может правильно посчитать итоги. Например, ордерная схема или какие-то доработанные движения, которые искажают остатки.
Добрый день! Спасибо за ответ! “Простым” способом не получается решить вопрос(использовать только одну таблицу ТоварыНаСкладахОстаткиИОбороты с условием на регистратор). Сделал по другому, использовал набор данных объединение двух таблиц ТоварыНаСкладахОстаткиИОбороты и ТоварыНаСкладахОбороты, в каждой из этих таблиц получил остаток на каждый день (в вашем курсе по запросам есть пример) и условие на регистратор сделал в таблице “Оборотов” и все заработало! Спасибо!
Отлично, что получилось решить задачу!