1с предприятие скд не видно отрицательных значений

Обновлено: 04.07.2024

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

Для наглядного представления реализации части трюков я сделал небольшие заготовки в виде внешних схем СКД. Описание трюков и скриншоты постарался делать так, чтобы суть и техника реализации трюка были понятны без необходимости скачивания схем. Для кого-то этого будет вполне достаточно, но если что-то непонятно, то всегда можно скачать соответствующую схему и посмотреть непосредственно реализацию.

Трюк №1. Многоликость правого значения.

Итак, для разогрева начнём с чего-нибудь попроще. В таких механизмах СКД, как "Отбор" или "Условное форматирование" вы наверняка сталкивались с колонками "Поле" (или "Левое значение") и "Значение" (или "Правое значение"). Профессионалы, наверняка знают этот трюк, но начинающим не всегда легко догадаться, что поле компоновки данных можно использовать как слева, так и справа (т.е. сравнивать не только заданные фиксированные значения, но и другие поля СКД в пределах одной строки). Для этого достаточно в поле правого значения зайти в режим редактирования, нажать кнопку очистки значения ("кретик"), затем нажать появившуюся кнопку выбора типа (буква "Т") и выбрать тип "Поле компоновки данных".

Пример.
В качестве примера я не стал изобретать велосипед, а взял самую обычную оборотно-сальдовую ведомость по счету 60 из демо-версии 1С:Бухгалтерии (я использую ред. 2.0.). Кто не знает, начиная с редакции 2.0 этот отчёт сделан на базе СКД.

Итак, зададим прямо в ней отбор для строк с условием "БУ Дт (оборот)" Равно "БУ Кт (оборот)", а также применим к отчёту условное оформление, подсветив жёлтым цветом ячейки строк, где "БУ Кт (кон. сальдо)" Больше "БУ Кт (оборот)". Если кто не знает, как включить панель "Оформление" - найдите кнопку "Параметры панели настроек" справа от надписи "Панель настроек".

Конечный результат должен получиться примерно таким:



Трюк №2. Отбор на группировках.

Все знают, что такое Отбор в СКД, но не все знают, что его можно применять не только для отчета в целом, но и на отдельных группировках строк и колонок. Прикладных задач для задействования такого средства много. Например, условная детализация (ограничение для каких группировок верхнего уровня выводить детализацию, а для каких нет), или вариативная детализация (для разных значений группировок верхнего уровня выводить разные расшифровки). На одном из проектов УПП, к примеру, пришлось делать форму калькуляции себестоимости с фиксированной структурой (отдельный справочник) и для разных статей калькуляции выводить расшифровки или по статьям затрат, или по конкретным затратам или не выводить ничего. Благодаря этому трюку не пришлось отказываться от СКД при разработке отчёта.

Пример.
Цель примера: отобразить ОСВ, в которой для взаиморасчетных счетов (60,62,76) показать расшифровку по контрагентам, а для затратных (20,23,25,26) - по статьям затрат.

Сама СКД реализована в виде набора данных, где используется запрос к виртуальной таблице остатков и оборотов регистра бухгалтерии "Хозрасчетный".
Размещаем вложенные группировки "Организация" и "Счет". В группировке "Счет" параллельно размещаем 2 группировки "Субконто1" и "Субконто2", для которых задаем соответствующие отборы.
Иллюстрацию настройки привожу в скриншоте:



Если в основных настройках отчёта на закладке "Другие настройки" вы не отключали вывод отборов, то это обязательно нужно будет сделать в "других настройках" наших группировок "Субконто1" и "Субконто2"

Трюк №3. Шапка-невидимка

Следующий трюк можно представить, как продолжение предыдущего. Если вы обратили внимание, в получившемся отчёте несмотря на то, что фактически у нас выводится только одно субконто, в шапку попадают оба (и "Субконто1" и "Субконто2"). К сожалению разработчики СКД не предусмотрели возможность регулирования видимостью шапки или использования какого-нибудь служебного символа, при установке которого в качестве заголовка, шапка поля бы не формировалась. Но, как вы уже, наверное, догадались есть трюк, который в какой-то степени поможет обойти данное ограничение.

При разработке схемы в предопределённом макете оформления добавьте макет группировки, с определением по имени группировки "Невидимка" так, как показано на скриншоте. Обратите внимание, что поле "Область" должно остаться пустым!


А затем задайте для группировки "Субконто2" имя "Невидимка":


И вуаля. шапка группировки "Субконто2" исчезает, а отчёт становится вот таким:


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

Да, есть ещё один ньюанс этого трюка: учитывайте, что "шапка-невидимка" накрывает не только эту группировку, но и все нижестоящие! Т.е. если вы назначите имя "Невидимка" группировке "Субконто1", то в шапке не будет видно ни "Субконто1", ни "Субконто2"!

Трюк №4. Называй меня как хочешь

Большинство разработчиков СКД знают, как можно задать заголовок поля запроса. На закладке СКД "Наборы данных", достаточно поставить галочку отмены автозаголовка и внести в поле "Заголовок" необходимый текст. Минус состоит в том, что в пользовательском режиме, этот способ недоступен, а переименовать заголовок хочется не прибегая к помощи конфигуратора. Так вот в настройках вариантов отчёта есть не только способ переименовать заголовки полей, но и "накрыть" их группировочной "шапкой". Для этого на закладке "Выбранные поля" необходимо выделить нужные поля и нажать правую кнопку мыши. Как видно на скриншоте для полей доступны опции "Установить заголовок" и "Сгруппировать поля".
Обратите внимание, что для полей группировок установку заголовка необходимо делать также именно через закладку "Выбранные поля", а не через контекстное меню "Установить имя" в верхней (структурной) части настройки варианта!




После всех настроек вариант отчёта выглядит вот так:




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

Странности начались когда мы перешли на 8.3(8.3.3.687) Когда было 8.2 отчеты работали как часы, к ним никто не лез т.е. человеческий фактор можно исключить, после перехода на 8.3 отчеты выдают чистый лист, хотя данные есть (я запрос из СКД исполнял в консоле запросов). Как я это делал: В модуле объекта отчета в процедуре ПриКомпоновкеРезультата получаю код запроса который генерит СКД, беру его из "СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос" вставляю в консоль запросов, консоль выдает данные, почему же СКД выдает чистый лист? P.S. Отбор в СКД никакой не установлен

какие настройки (которые могут повлиять на результат) могли слететь, если б настройки группировки слетели я б данные видел в любом случаи, а тут вообще нет данных, отбор я специально убрал (для чистоты эксперемента)

на закладке настройки есть что нибудь? Если там ничего не будет - то и данных не будет выведено. Оставь там только детальные записи, без группировок, выведет что нибудь?

вот что на закладке "настройки" "Оставь там только детальные записи, без группировок" не понял где это сделать?

у тебя там Строки, Колонки - в них ничего не указано

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

А где в Компоновщике настроек можно посмотреть данные ко каким производится группировка, я в отладчике смотрю отчет.КомпоновщикНастроек, но там куча всего, Настройки, ПользовательскиеНастройки, ФиксированыеНастройки

тут видно что просто есть группировка, а надо еще глянуть какие поля должны выводится под этой группировкой

что значит какие поля? на скрине видно ж колонку поля группировки

тут проблема более глубокая, более местическая так сказать, т.к. есть база с такой же конфой, но там эти отчеты работают, отчеты 1 в 1 такие же (с точки зрения конфигурации)

под полными правами пробовал? Есть кое-какие особенности с правами и СКД

да, пользователь под которым я пробую имеет все роли

Чисто "семёрочный" подход. Пора переучивать пользователей. Не изобретай велосипед. Сделай все нужные группировки предварительно. А затем пользователь пусть сам решает, через "Все действия - Изменить вариант".

согласен, но не я это решаю, да и не это является причиной поломки отчета. Я сейчас ковыряю "Все действия - Изменить вариант" все там нормально, как на форме выбрать группировку так в Изменить вариант и отображается, пробовал прям там редактировать, ему пофиг (( P.S. у нас на базе включено разделение данных, по идеи какая разница но я уже не знаю на что смотреть и что может быть причиной.

на скрине видно группировку. а если зайти дальше, то в поле выбор должны быть перечислены поля, которые выводить в отчет. Вы ж программно группировки создаёте

а если вариантов группировки 5 - 6 и разный порядок следования, то что для каждого варианта сохранять настройку

разве это "семёрочный" подход разместить на форме отчета список значений с группировками и исходя из отмеченного пользователем программно формировать отчет?

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

По-моему трабл в том что настроики варианта где-то кешируются, я убрал код который динамически сознает группировки, заполняет значение параметров, вообще все что не стандартно, изменяю макет, присваиваю значение параметра в макете и создаю там группировку, запускаю мне отчет орет что не заполнено значение параметра (вариант выбран основной), захожу в изменить вариант, и действительно не заполнен нужный параметр, а вот какого х он не заполнен, загадка, в макете для варианта "Основной" я параметр заполнен, кстате и группировки нет если смотреть в изменить вариант, как сказать отчету что бы он взял настройки макета такие как я задал в конфигураторе?

Есть ещё пользовательские настройки. Они сильнее, чем те, что заданы в схеме. Их-то СКД и подгружает из кэша.

так он не воспринимает ни фига если я вношу изменения в "изменить вариант" если выгрузить настройки в файл из конфигуратора и загрузить их в предприятии, то он съедает настройки и все ок, и дальше если я их правлю то изменения тоже видны, но это на корню рубит то что у нас в отчет натройки программно задаются

Я программно подставлял значения параметров в ПриЗагрузкеВариантаНаСервере. Если этого не делать, то параметры не инициализировались. К примеру, так:

Это правда для случая "своей" формы для отчёта на СКД. Для случая полностью программно нарисованного отчёта на СКД играют пользовательские настройки.

на третий день проблему удалось решить. У меня при загрузке варианта вызывались процедуры которые переносили настройки с формы в макет, там обращение было к Отчет.КомпоновщикНастроек.Настройки.Структура, а надо было к настройкам которые приходят праметром в ПриЗагрузкеВариантаНаСервере. 8.3 оказалась привередливой в этом вопросе.

+ но странности все равно присутствуют в СКД 8.3 долго писать, но они есть

Ок, лезем на любой ресурс, коих полно, копируем код, правим под свои нужды и вуаля! Отчет работает, только при попытке расшифровать выскакивает какое то окошко с цифрами :( Что делать?

Решение

На самом деле в этом окошке нам сообщается идентификатор расшифровки компоновки данных. Имея этот идентификато и данные расшифровки, мы можем сделать все, что душе угодно.

Рассмотрю случай формирования СКД из обработки (см. в скрепке). Добавил макет СКД, на форму вывел два реквизита "Контрагент" и "ТабДок". Важно иметь доступ к данным расшифровки при обработке расшифровки табличного документа, поэтому добавим переменную, которую будет перебрасывать в процедуру программного формирования отчета. Ну и опишем саму процедуру обработки расшифровки.

Обработка расшифровки открывает значение, но вы можете прописать любое действие.

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

(1) Да, сорри этот код можно выполнить в толстом клиенте упр. приложения. Я когда выкладывал статью делал пример как раз на базе. которая переходит на тонкие формы и там был период когда режим работы обычное приложение, а форма управляемая.
Тут самое главное смысл получения расшифровки по идентификатору.

На УФ надо положить "Данные расшифровки" во временное хранилище. Далее:

Если ТипЗнч(Структура.Расшифровка) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") тогда
ЭлементРасшифровки = Данные.Элементы[Структура.Расшифровка];
Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
Для каждого Поле Из ЭлементРасшифровки.ПолучитьПоля() Цикл
Возврат Поле.Значение;
КонецЦикла;
КонецЕсли;
КонецЕсли;

На форму добавить реквизит "ДанныеРасшифровки" с типом "Строка"

&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)

&НаСервере
Процедура КонтрагентПриИзмененииНаСервере()

Если Контрагент.Ссылка.Пустая() Тогда
Возврат;
КонецЕсли;

// Создаем СКД. Устанавливаем параметры
СхемаКД = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");

ПараметрКД = Настройки.ПараметрыДанных.Элементы.Найти("Контрагент");
ПараметрКД.Значение = Контрагент;

// Создаем Макет КД
КомпоновщикМакетаКД = Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровкиКомпоновкиДанных = Новый ДанныеРасшифровкиКомпоновкиДанных;
МакетКД = КомпоновщикМакетаКД.Выполнить(СхемаКД, Настройки, ДанныеРасшифровкиКомпоновкиДанных);

// Создаем Процесор КД
ПроцессорКД = Новый ПроцессорКомпоновкиДанных;
ПроцессорКД.Инициализировать(МакетКД,, ДанныеРасшифровкиКомпоновкиДанных);

// Выводим
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.НачатьВывод();
ПроцессорВывода.Вывести(ПроцессорКД);
ДанныеРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровкиКомпоновкиДанных);

&НаКлиенте
Процедура ТабДокОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;
Данные = Сервер(Расшифровка);
ОткрытьЗначение(Данные);

&НаСервере
Функция Сервер(Расшифровка)

Если ТипЗнч(Расшифровка) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") тогда
ЭлементРасшифровки = Данные.Элементы[Расшифровка];
Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
Для каждого Поле Из ЭлементРасшифровки.ПолучитьПоля() Цикл
Возврат Поле.Значение;
КонецЦикла;
КонецЕсли;
КонецЕсли;

Описание ошибки:
Платформа 1С: Предприятие 8.3.16.1063. Клиент-серверный вариант работы базы. Конфигурация не указана, т.к., забегая вперед, не в ней проблема.

Столкнулся с проблемой при реализации отчета на СКД. При этом, как привычно - запрос для сбора данных тестировался с помощью обработки "Консоль запросов" для 1С 8. Удивительно, но получилось так, что выводимые данные результата запроса в консоли и реализованном отчете отличались. В консоли результат был верный, в СКД - не верный.

В частности, на примере, видно, что сумма из колонки "Полная оплата" в результате запроса консоли в результате отчета на СКД содержится в колонке "Без оплаты".

1C 8 в консоли запросов и скд разные данные

Было предположено, что возможно интерпретатор СКД и консоли все-таки по-разному воспринмают текст запроса. Т.е. СКД что-то еще проделывает с запросом, в результате чего получается, что в 1С 8 один и тот же запрос возвращает разные данные в консоли и СКД.

1c 8 скд и консоль разные данные

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

1с 8 КонсольЗапросов И Отчет СКД выводят разные данные

В моем случае "хитрым полем" оказалось не Минимум(), а Максимум() для поля с типом значений "Дата" (дата со временем): МАКСИМУМ(РасчетыСКонтрагентамиОбороты.Период) КАК Период

На скрине ниже видно, что СКД его не обрабатывает прямо совсем.

1С 8 в консоли запросов данные правильные, а в СКД нет, не правильные

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

1C 8 Различаются результаты запроса и отчета в СКД

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

1С 8 почему разные данные результата запроса в СКД и консоли запросов

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

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