1с скд автозаполнение отключить

Обновлено: 04.07.2024

Речь пойдет о флаге «Автозаполнение» в наборе данных Запрос Системы компоновки данных (СКД). Сразу хочу отметить, что флаг «Автозаполнение» доступен только в наборе данных - Запрос.

1. Vladimir Litvinenko 2636 26.02.20 16:41 Сейчас в теме
Как всегда при определении остатков не учитываете последнюю секунду. Потом программисты тотально методом копирования-вставки разносят это по всем конфигурациям. Не придирался бы, если бы не массовость явления. И тяжесть последствий. не для разработчиков, которые так пишут на подряде, а для тех, кто потом иголку в стоге сена ищет, исправляя результаты расчетов ;)) (1) Владимир, привет! :-)
Дельное замечание - согласен здесь надо быть внимательнее 3. Vladimir Litvinenko 2636 26.02.20 17:15 Сейчас в теме (2) Тут разработчики платформы, конечно, свинью подложили + не дали в СКД границу использовать. Но исправлять очевидно уже не будут. А ошибка частая и больная, особенно при применении стандартного периода. Допустив её почти всегда можно сдать отчет заказчику, так как она плавающая, но почти всегда она потом проявляется. А если СКД используется для заполнения документов, а не просто отчетности. Ох. (1) компоновка по-моему сама границу захватывает для виртуальных таблиц остатков, это уже в запросах в коде нужно ставить параметр = Граница(&КонецПериода, ВидГраницы.Включая), вроде автор про компоновку пишет, и текст РегистрНакопления.ДенежныеСредства.Остатки(, ) должно в компоновке нормально прокатывать или нет? 5. Vladimir Litvinenko 2636 26.02.20 18:15 Сейчас в теме

(4) Если поставите в качестве &КонецПериода начало следующего дня, то остатки за предыдущий день зацепятся. Но это не отменяет того факта, что обороты при этом начнут включать в себя и движения за первую секунду следующего для. То есть в целом запрос останется ошибочным.

СКД не оперирует типом "Граница". "Стандартный период" помогает устанавливать последнюю секунду периода в качестве верхней границы, но тип этого значения всё равно будет "Дата", а не "Граница".

Проверьте, это же дело пяти минут. Может быть это хороший повод, чтобы переписать старые отчёты? ;)) Хотя, если клиенты не заметили, то лучше не палиться. Вдруг они у себя сейчас одну сплошную выручку видят в отчёте по продажам без учета себестоимости и радуются, зачем людей радости лишать? ;))

Есть ещё таблица ОстаткиИОбороты. Вот она себя более адекватно ведёт. Но это больше к бухгалтерии или к разным ведомостям. В оперативном учёте и при заполнении документов она почти не используется, особенно в последних конфигурациях семейства УТ/ERP, ввиду отсутствия подходящей физической таблицы у регистров накопления и необходимости в оптимизации запросов.

(5) Я так и не понял - как же тогда корректно "захватить" последнюю секунду? (6)
1. сделать скрытый параметр КонецПериодаДляОстатков и из стандартного периода конец периода брать с плюс секундой.
2. заменить &КонецПериода на ДОБАВИТЬКДАТЕ(&КонецПериода, СЕКУНДА, 1) (7) А это не будет начало следующего дня? И как написано в (5) "обороты при этом начнут включать в себя и движения за первую секунду следующего дня". 9. Vladimir Litvinenko 2636 26.02.20 21:05 Сейчас в теме (8) Для оборотов нужно использовать прежний параметр. Для остатков - отдельный вычисляемый параметр. Они должны быть разными. Среди вариантов, которые привёл выше Данил лучше выбрать вариант №1, так как это позволит гарантировано задействовать индекс по периоду в таблице итогов и движений. Вариант №2 может привести скану по таблицам. На MS SQL вроде бы не должен приводить, но всё таки лучше избегать вычислений над параметрами виртуальных таблиц, которые для работы с индексами заточены.
Впервые задумался об этом, как-то всегда на автопилоте писал ДобавитьКДате, а вот вы навели на раздумья. Да, хз, может и правда так быть. Спасибо, учту. (9) т.е. Для таблиц Вида Остатки задавать параметр Конца периода следует вот так? (5) я "Стандартный период" использую везде, вероятно, меня это и спасает в СКД (спасибо за ответ) (10) тоже его стараюсь использовать всегда, ещё с базового курса по разработке в 1С от 1С именно так и учат, заводить стандартный период, но не объясняя зачем, говоря - так удобнее :) По идее если вы используете начало следующего дня, то движения за первую секунду следующего дня НЕ захватит.
так как период будет установлен на начало секунды. а все движения будут после начала секунды. (5) обходил этот косяк СКД так - в документе при проведении явно ставил дату на одну секунду меньше конца периода. По задаче требовалось раз в месяц проводить управленческие расходы. Сажал их на конец месяца за минусом одной секунды, не зависимо от указанной даты в документе. В СКД далее собирал информацию по всем периодам.
Без этой дописки СКД некорректно брала итоги. (1) за 11 лет работы ни разу не встретил описанной проблемы.
Если но так серьезно, набросайте статью с примерами, поделитесь с сообщестом.
ИМХО, использование стандартного периода решает вопрос.
У меня решает. (13) Эээ. А за что минус? За то что человек не видел? За предложение написать статью? 16. Vladimir Litvinenko 2636 27.02.20 12:12 Сейчас в теме

(14) Ок. Только ради Вас, пускай лучше плюс будет )) Я тут чуть материться не стал вот за это

за 11 лет работы ни разу не встретил описанной проблемы
ИМХО, использование стандартного периода решает вопрос.
У меня решает.

Очень толерантное отношение к халатности в сообществе 1С, каждый за собой грешок чувствует и читать документацию не хочет. На Хабре ей богу более профессиональное отношение.

Вот врачу напиши - " работа без дезинфекции инструментов может привести к заражению пациента болезнью с инкубационным периодом в 11 лет ". А он тебе в ответ " я за 11 лет ни разу не встретил описанной проблемы", ИМХО поплевать на руки - решает описанную проблему, у меня решает " ))

Проблема в том, что он то не встретил. А за ним исправляли. Или не исправляли, потому что поздно было. Или он 11 лет в одной компании работает? И пользователи данные не проверяют при приемке работ и программисты наивными глазами смотрят "Ну а чо, оно же работает!" ))

P.S. Статьи пишу если что, с ленью в этом плане не дружу )) Но вопрос уже разжёван выше в комментариях. Извините, если слишком резко, но слишком часто подтирать прходилось. и убеждать что надо ошибки исправлять. иногда безуспешно. Иногда кажется, что проще забить на это и продолжать подтирать.

19. Vladimir Litvinenko 2636 27.02.20 15:21 Сейчас в теме Косячный код - это код который косячит. Если в базе код не косячит, то код не косячный.

Так он и косячит. Халатность принимающего задачу помноженная на халатность разработчика не избавляет от факта ошибки. Писал уже выше - за те же 11 лет работы в 1С мне пришлось много раз исправлять эту ошибку. В реальных базах, на реальных суммах. Вот коллега тоже 11 лет как раз в 1С работает )) "Совпадение? Не думаю".

Зря вы делаете такой вывод. Мне не нравится только та его часть, которая халатно относится к своей работе или оправдывает халатное отношение к работе и предпочитает прикрываясь "бизнес-программированием" и "решением реальных проблем" заваливать базы ошибками.

Согласен, об этом и речь. В то же время не отмахиваться от них.

Помню. У каждого врача своё кладбище. И благодарен тем, кто исправляет за мной косяки. Стараюсь зафиксировать их причину и не считаю, что имею при этом право писать "а у меня работает".

Ладно, согласен, слишком сильно пригорело ))

Стоимость 1 часа пользователя 100 р.
Стоимость 1 часа программиста 500 р.

Цена исправления ошибки 1000р. = 10 часов работы пользователя = 600 минут работы пользователя => количество документов, позиционированных после 23.59:59, должно быть больше 600 или штраф за неправильный документ (для фирмы. ) больше 1000 рублей.

Если учесть:
1. Есть групповое изменение реквизитов (снижает время пользователя)
2. Отчет может быть не один (увеличивает время программиста)
То можно сделать вывод: в большинстве ситуаций исправление данной ошибки экономически не целесообразно.

Александр, разработчик 1С, исследовал подвохи флага «Автозаполнение» в СКД и рассказывает, как их обойти.

О чем речь

Речь пойдет о флаге «Автозаполнение» в наборе данных Запрос Системы компоновки данных (СКД). Сразу хочу отметить, что флаг «Автозаполнение» доступен только в наборе данных-Запрос.

Для чего нужен флаг «Автозаполнение» в СКД

Что делает автозаполнение

Флаг «Автозаполнение» добавляет все выбранные поля последнего пакета запроса, а также поля измерений виртуальных таблиц из всех пакетов запроса. Всегда создает параметры периода в СКД для всех виртуальных таблиц (Обороты и ОстаткиИОбороты – &НачалоПериода, &КонецПериода, Остатки, СрезПервый, СрезПоследних – &Период). Другими словами, эта настройка облегчает процесс составления схемы.

В чем подвох?

Иногда возникает ситуация, при которой автозаполнение устанавливает параметры и приводит к наложению отборов в тех местах, где это не требуется.

Пример 1

Создадим схему, выбирающую объединением двух запросов обороты за текущий и за прошлый период:

«Автозаполнение» создаст параметры &НачалоПериода, &КонецПериода для виртуальной таблицы ДвиженияДенежныхСредств.Обороты

Для чего нужен флаг «Автозаполнение» в СКД

Настройка схемы будет выглядеть следующим образом:

Для чего нужен флаг «Автозаполнение» в СКД

Но в результате выполнения схемы получим результат, в котором обороты что за текущий период, что за предыдущий показывают одно и тоже:

Для чего нужен флаг «Автозаполнение» в СКД

Разобраться в причинах не составит особого труда, если взглянуть на запрос, который был сформирован компоновщиком макета СКД — одни и те же параметры были подставлены в оба запроса объединения:

Решить можно двумя способами:

  • Не использовать параметры с именами &НачалоПериода, &КонецПериода
  • Отключить «Автозаполнение» и прописать все поля и параметры вручную

В случае с отключенным флагом «Автозаполнение» запрос в СКД будет выглядеть следующим образом:

Пример 2

Нам нужно получить обороты по определенным счетам и остатки по всем счетам. Создаем набор данных запрос с флагом «Автозаполнение»:

Получаем результат, в котором общий остаток на самом деле является остатком по счетам, указанным в отборе:

Для чего нужен флаг «Автозаполнение» в СКД

Что подтверждает запрос из компоновщика макета:

Решить данный кейс можно двумя способами:

Без использования «Автозаполнения» запрос в наборе данных будет выглядеть следующим образом:

Для чего нужен флаг «Автозаполнение» в СКД

В платформе 8.3.13 были проведены следующие доработки поведения СКД:

Таким образом, если мы создаем объединение запросов по двум регистрам, в одном из которых нет определенных полей…

…и накладываем отбор по такому полю (СтатьяДвиженияДенежныхСредств), то компоновщик макета нам добавит условие Null = &П4, которые мы ну никак не ожидали

И действительно, если отключить «Автозаполнение» и расставить поля отборов вручную, то компоновщик макета строит следующий запрос:

Параметры могут использоваться практически в любом месте запроса и выполнять самые различные функции.

Параметры обозначаются знаком & после которого следует имя параметра.

Параметр может быть полем запроса, частью произвольного выражения поля запроса, условием для виртуальной таблицы, частью выражения в отборе запроса и так далее:

При построении запроса конструктором на вкладке “Условия” если не стоит галочка “Произвольное”, то конструктор считает что в правом значении параметр и он записывается без символа &.


Таким образом этот блок настраивается в конструкторе.

Если значение параметра не задано, то построение СКД будет невозможно и будет выдана ошибка, поэтому такие параметры называют “обязательными” или “жесткими”.

Выбрать.

Этот блок располагается в запросе типа выборка данных пакета запросов СКД в первом запросе объединения между перечнем полей и “ИЗ” и заключается в фигурные скобки.


Таким образом этот блок настраивается в конструкторе.

При автоматическом заполнении полей набора данных, для не включенных в блок расширения “ВЫБРАТЬ”, добавляются все поля списка выборки и их дочерние поля. Они становятся доступными для выбора, упорядочивания, группировки, отбора. Также добавляются поля, которые упомянуты в параметре “Условия” виртуальных таблиц как доступные для отбора.

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

Блок расширения “ГДЕ” может быть расположен после или вместо обычного блока “ГДЕ” в любом запросе, подзапросе, запросах объединения и заключается в фигурные скобки. Для присвоения отбору псевдонима используется конструкция “КАК”. Псевдоним нужно использовать чтобы отбор производился конструкцией расширения языка запросов, но не происходил автоматически по наименованию поля.

Если автозаполнение полей набора отключено, поля из этого блока попадают в перечень полей набора доступными только для отбора, использование дочерних полей зависит от наличия конструкции “.*”.

Если автозаполнение включено, и это поле включено в блок расширения “ВЫБРАТЬ” тогда настройки обоих блоков объединяются. Если не включено в “ВЫБРАТЬ” то поля попадают доступными для вывода, группировки, отбора и упорядочивания.


В случае если нужно дополнительно установить какое то ограничение полю, то можно вручную установить галочку в соответствующее поле перечня полей набора данных СКД.

Также в блоке “ГДЕ” вместо параметра может быть произвольное выражение с использованием конструкции ВЫБОР или параметров со страницы “Параметры” СКД. Правда в последнем случае вид сравнения необходимо указывать конкретно.

Нужно с осторожностью использовать вид сравнения МЕЖДУ поскольку:

Если параметры НачалоПериода и КонецПериода не будут заданы, то система получит документы за весь период.

Если параметры НачалоПериода и КонецПериода будут заданы, то система получит документы за указанный период.

Если какой-то один из параметров не будет задан, то система выдаст ошибку.

Один из вариантов решения это разбить МЕЖДУ на два условия чтобы система не выдавала ошибку в случае одного незаполненного параметра.

Это же замечание относится к любым выражением с использованием нескольких параметров.

Параметры виртуальных таблиц.

В параметрах виртуальных таблиц в отличие от предыдущих блоков, каждый параметр заключается в фигурные скобки. В полях относящихся к периоду название параметра ставится с &. Пример &ДатаНачала. В поле “Условие” параметры оформляются аналогично блоку “ГДЕ”.

Параметры из полей периода попадают на страницу “Параметры” СКД. Если автозаполнение включено и в поле периода параметр не вписан, параметры с именем поля периода будут автоматически созданы на странице “Параметры” СКД.


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

В параметрах виртуальных таблиц возможно совместное использование “жестких” параметров запросов и “мягких” параметров компоновки данных.

В этом примере если в настройках установлено значение параметра &НачалоПериода, то будет использоваться его значение. В противном случае в качестве значения параметра виртуальной таблицы будет использоваться значение “жесткого” параметра “&Начало”.

Если автозаполнение включено и в поля периода не вписаны “мягкие” параметры компоновки данных то параметры с именем поля периода будут автоматически созданы на странице “Параметры” СКД и текст запроса:

будет соответствовать следующему:

В этом случае “мягкие” параметры также будут иметь приоритет над “жесткими”.


Обзорный вид страницы.


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

Строка параметра имеет следующие реквизиты:


Таким же образом можно указать формат числа для численного параметра и длину строки для строкового.

А для того чтобы введенные значения интерпретировались в отчете как начало и конец дня следует в запросе использовать функции НачалоПериода() и КонецПериода() .

Также в примере к реквизиту “Тип” можно было в выражениях использовать функции встроенного языка запросов, особенность применения этих функций в данном месте такова, что строковые параметры функций надо брать в кавычки.

и в запросе можно было бы писать проще поскольку в параметрах уже будет содержаться начало и конец периода:



Даты начала и конца стандартного периода также содержат и время. ДатаНачала имеет время 00:00:00, а ДатаОкончания 23:59:59. Получится что пользователь выберет стандартный период в “Период” а разработчик будет использовать корректные “ПериодНачало” и “ПериодОкончание”.




В настройках варианта мы можем установить галочку “Отображать недоступные параметры”, это можно использовать если для разных вариантов мы хотим использовать разный набор параметров.

У параметров в табличной части мы можем установить значение по умолчанию для варианта, включить использование по умолчанию установив галочку слева. Нажав на кнопку, расположенную справа внизу, мы открываем окно пользовательских настроек параметра.



Если Режим редактирования установить Быстрый доступ, то параметр появится на форме.


Если у параметра “Период” представление заполнить строкой “ПеРиОд”, то вместо название будет показано содержания поля представление.

Если у отчета СКД нет формы, то платформа создаст автоматическую, на которой будут табличный документ результата, кнопки управления и быстрые пользовательские настройки.


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


Для этого в созданной форме в конфигураторе вытаскиваем на форму Пользовательские настройки из Компоновщика отчета.


В некоторых случаях параметр не прост, и для его расчета нужен некий алгоритм с циклом или ветвлениями. К примеру если отчет формируем в понедельник то в отчете сравниваются продажи по дням позапрошлой и прошлой недели, а в остальные дни недели сравниваются продажи по дням прошлой и текущей недели. Получается у нас от значения дня недели текущего дня зависит сразу четыре параметра: &НачалоПрошлойНедели, &КонецПрошлойНедели, &НачалоТекущейНедели и &КонецТекущейНедели. А еще нам надо дать возможность пользователю формировать отчет как будто он сформирован вчера или неделю назад. В таком случае мы создаем реквизит формы ТекДата типа Дата. Выводим его на форму. В событии ПриИзменении() пишем.

Таким образом можно программно менять параметры из формы.

Параметры это ключевой инструмент для управления отчетом. Использование параметров дает возможность решить множество прикладных задач, таких как калькуляция на основе информации в базе и значений введенных интерактивно для конкретной калькуляции и многих других. В данной статье рассмотрены практически все относящиеся к параметрам механизмы и особенности. Рамках статьи не рассмотрен блок “Характеристики” Расширения языка запросов для СКД поскольку он не касается параметров. Не рассмотрена настройка параметра “Параметр функциональной опции” поскольку ее описание лучше включить в статью по функциональным опциям.

Язык выражений СКД

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); // Получаем схему компоновки данных

СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ""; // Очищаем запрос в наборе данных

ДокументыКонфигурации = Метаданные.Документы; // Получаем коллекцию метаданных документов

КоличествоДокументов = ДокументыКонфигурации.Количество(); // Определяем общее количество документов в конфигурации

Сч = 1;
ТекстЗапроса = "";
Для Каждого Док Из ДокументыКонфигурации Цикл
ТекстЗапроса = ТекстЗапроса + // Для каждого документа формируем текст запроса к его таблице

"ВЫБРАТЬ
| Док.Номер КАК Номер,
| Док.Дата КАК Дата,
| Док.Проведен КАК Проведен
|ИЗ
| Документ."+Док.Имя+" КАК Док"; // В текст запроса нам необходимо лишь подставить имя таблицы документа в дереве метаданных

Если Сч < КоличествоДокументов Тогда // Если документ не последний в коллекции - добавляем инструкцию "ОБЪЕДИНИТЬ ВСЕ" для

ТекстЗапроса = ТекстЗапроса + // объединения результатов запросов по документам в единый список

"
|ОБЪЕДИНИТЬ ВСЕ
|";
КонецЕсли;
Сч = Сч + 1;
КонецЦикла;
СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Компоновщик Настроек.ПолучитьНастройки(),ДанныеРасшифровки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры

Читайте также: